From 6d437b815662c5d3df44458a45e65f14fbf5c80f Mon Sep 17 00:00:00 2001 From: Sean Wells Date: Mon, 27 Jul 2015 16:56:00 -0700 Subject: [PATCH] fix(bug fix): added proper string conversion for R numeric/integer inputs For R inputs, added: - parseInt() and parseFloat() for JavaScript strings that are of type number. Closes #5 --- browser/deployr.js | 21 +++++++++------------ browser/deployr.min.js | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/browser/deployr.js b/browser/deployr.js index d91f621..1da26b8 100644 --- a/browser/deployr.js +++ b/browser/deployr.js @@ -7909,6 +7909,9 @@ module.exports = Base.extend(RTypes, { }, numeric: function () { + // support `String` numbers (e.g. "1.2") + this.value = parseFloat(this.value); + return this.assert({ type: this.deployr.RNUMERIC, name: this.name, @@ -7918,6 +7921,9 @@ module.exports = Base.extend(RTypes, { }, integer: function () { + // support `String` integer (e.g. "15") + this.value = parseInt(this.value, 10); + return this.assert({ type: this.deployr.RINTEGER, name: this.name, @@ -8354,19 +8360,9 @@ module.exports = Base.extend({ switch (rinput.type) { case deployr.RNUMERIC : case deployr.RNUMERIC_VECTOR : - case deployr.RNUMERIC_VECTOR : - fn = Lang.isNumber; - // support string numbers - var val = parseFloat(value); - value = isNaN(val) ? value : val; - break; - case deployr.RINTEGER : case deployr.RINTEGER_VECTOR : fn = Lang.isNumber; - // support string numbers - var val = parseFloat(value); - value = isNaN(val) ? value : val; break; case deployr.RBOOLEAN : @@ -8398,7 +8394,8 @@ module.exports = Base.extend({ if (fn && !fn(value)) { throw new Error('RInputFormatError: ' + '"' + value + - '" is not a valid "' + rinput.type + '" type.'); + '" is not a valid "' + rinput.type + '" type for input ' + + '"' + rinput.name + '"'); } } @@ -10531,4 +10528,4 @@ module.exports={ },{}]},{},[1])(1) }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkZXBsb3lyLmpzIiwiYXBpcy5qc29uIiwibGliL2RlcHJlY2F0ZWQuanMiLCJsaWIvZW1pdHRlci5qcyIsImxpYi9lbmNvZGVyLmpzIiwibGliL2VzLmpzIiwibGliL2xhbmcuanMiLCJsaWIvbG9nZ2VyLmpzIiwibGliL29wdGlvbmFsLmpzIiwibGliL3F1ZXVlLmpzIiwibGliL3JpbnB1dC5qcyIsImxpYi9yaW5wdXRzLmpzIiwibGliL3J0eXBlcy5qcyIsImxpYi9zZWxmaXNoLmpzIiwibGliL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbGliL19lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvZC5qcy9saWIvRC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9jbGllbnQuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9ub2RlX21vZHVsZXMvY29tcG9uZW50LWVtaXR0ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9ub2RlX21vZHVsZXMvcmVkdWNlLWNvbXBvbmVudC9pbmRleC5qcyIsInBhY2thZ2UuanNvbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOTJDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL2FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3R5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUhBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE1IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxudmFyIHdpbiAgICAgICAgID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSwgICBcbiAgICByZXF1ZXN0ICAgICA9IHJlcXVpcmUoJ3N1cGVyYWdlbnQnKSxcbiAgICBEICAgICAgICAgICA9IHJlcXVpcmUoJ2QuanMnKSxcbiAgICBmcyAgICAgICAgICA9IHJlcXVpcmUoJ2ZzJyksXG4gICAgYXBpcyAgICAgICAgPSByZXF1aXJlKCcuL2FwaXMuanNvbicpLCBcbiAgICBFdmVudFN0cmVhbSA9IHJlcXVpcmUoJy4vbGliL2VzJyksXG4gICAgdXRpbHMgICAgICAgPSByZXF1aXJlKCcuL2xpYi91dGlscycpLFxuICAgIExhbmcgICAgICAgID0gcmVxdWlyZSgnLi9saWIvbGFuZycpLCAgIFxuICAgIExvZ2dlciAgICAgID0gcmVxdWlyZSgnLi9saWIvbG9nZ2VyJyksICAgXG4gICAgUXVldWUgICAgICAgPSByZXF1aXJlKCcuL2xpYi9xdWV1ZScpLFxuICAgIEVtaXR0ZXIgICAgID0gcmVxdWlyZSgnLi9saWIvZW1pdHRlcicpLFxuICAgIGVuY29kZXIgICAgID0gcmVxdWlyZSgnLi9saWIvZW5jb2RlcicpLFxuICAgIEJhc2UgICAgICAgID0gcmVxdWlyZSgnLi9saWIvc2VsZmlzaCcpLkJhc2UsXG4gICAgUklucHV0ICAgICAgPSByZXF1aXJlKCcuL2xpYi9yaW5wdXQnKSwgICAgXG4gICAgUklucHV0cyAgICAgPSByZXF1aXJlKCcuL2xpYi9yaW5wdXRzJyksXG4gICAgbWVyZ2UgICAgICAgPSB1dGlscy5tZXJnZTtcblxuLypcbiAqIFR1cm4gZ2xvYmFsIGxvZ2dpbmcgb2ZmIGJ5IGRlZmF1bHRcbiAqL1xuTG9nZ2VyLnNldExldmVsKExvZ2dlci5PRkYpO1xuXG4vKlxuICogR2xvYmFsIG9wdGlvbnMgdGhhdCBwZXJzaXN0IHRocm91Z2ggYWxsIERlcGxveVIgcmVxdWVzdHMuXG4gKi9cbnZhciBnbG9iYWxPcHRpb25zID0geyBcbiAgY29yczogZmFsc2UsXG4gIGxvZ2dpbmc6IGZhbHNlLFxuICBzdGlja3k6IGZhbHNlLFxuICBjb29raWVzOiBudWxsLFxuICBob3N0OiAnJyxcbiAgYWxsb3dTZWxmU2lnbmVkU1NMQ2VydDogZmFsc2UsXG4gIG1heFJlcXVlc3RzOiBudWxsLCAvLyBubyBzb2NrZXQgcG9vbGluZyBpbiBodHRwLkFnZW50XG4gIGV2ZW50czp7fSxcbiAgc2V0OiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgeyBcbiAgICBpZiAocHJvcCAhPT0gJ3NldCcpIHsgXG4gICAgICBpZiAocHJvcCA9PT0gJ2hvc3QnICYmIHZhbHVlKSB7ICAgICAgICAgXG4gICAgICAgICAvLyBCZSBtb3JlIGZvcmdpdmluZyBvbiB0aGUgZW50ZXJlZCBEZXBsb3lSICdlbmRwb2ludCc6XG4gICAgICAgICAvLyAgIC0gaHR0cChzKTovL2Rob3N0OnBvcnRcbiAgICAgICAgIC8vICAgLSBodHRwKHMpOi8vZGhvc3Q6cG9ydC9kZXBsb3lyXG4gICAgICAgICAvLyAgIC0gZGhvc3Q6cG9ydFxuICAgICAgICAgLy8gICAtIGRob3N0OnBvcnQvZGVwbG95ciAgICAgICAgIFxuICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXC8qJHxcXC8qZGVwbG95clxcLyokLywgJycpO1xuICAgICAgICAgdmFsdWUgPSAobmV3IFJlZ0V4cCgnXihodHRwfGh0dHBzKTovLycsICdpJykpLnRlc3QodmFsdWUpID8gdmFsdWUgOiBcbiAgICAgICAgICAgICdodHRwOi8vJyArIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzW3Byb3BdID0gdmFsdWU7IFxuICAgIH0gXG4gIH1cbn07XG5cbi8qXG4gKiBUaGUgdG9wLWxldmVsIERlcGxveVIgQVBJIHJlc3BvbnNlIGVudGl0aWVzLlxuICovXG52YXIgVE9QTEVWRUxfRU5USVRJRVMgPSBbXG4gICd1c2VyJywgXG4gICdwcm9qZWN0JywgXG4gICd3b3Jrc3BhY2UnLCBcbiAgJ2V4ZWN1dGlvbicsIFxuICAnZGlyZWN0b3J5JywgXG4gICdyZXBvc2l0b3J5JywgXG4gICdwYWNrYWdlcycgXG5dO1xuXG4vKlxuICogTm90aWZ5IGdsb2JhbCBJTyBlcnJvciBldmVudHMgYWNjZXNzaWJsZSBieSBhbGwgc3Vic2NyaWJlcnMgYWNyb3NzIHJlcXVlc3RzLlxuICovXG5mdW5jdGlvbiByYWlzZUdsb2JhbEVycm9ycyhhcGksIHJlcykge1xuICB2YXIgY29kZSAgICA9IHJlcy5kZXBsb3lyID8gcmVzLmRlcGxveXIucmVzcG9uc2UuZXJyb3JDb2RlIDogcmVzLnN0YXR1cyxcbiAgICAgIGNvbnRleHQgPSB0aGlzO1xuXG4gIC8vIC0tIGdsb2JhbCBldmVudHMgaWYgcHJvdmlkZWQgLS1cbiAgaWYgKGdsb2JhbE9wdGlvbnMuZXZlbnRzKSB7XG4gICAgaWYgKCFyZXMuZGVwbG95cikge1xuICAgICAgcmVzID0gcmVzLnRleHQ7XG4gICAgfVxuXG4gICAgY29udGV4dCA9IGdsb2JhbE9wdGlvbnMuZXZlbnRzLmN0eCB8fCBjb250ZXh0O1xuXG4gICAgLy8gLS0gZ2VuZXJhbCBnbG9iYWwgZmFpbHVyZSAtLVxuICAgIGlmIChnbG9iYWxPcHRpb25zLmV2ZW50cy5lcnJvcikge1xuICAgICAgZ2xvYmFsT3B0aW9ucy5ldmVudHMuZXJyb3IuYXBwbHkoY29udGV4dCwgW2FwaSwgcmVzXSk7XG4gICAgfVxuXG4gICAgLy8gLS0gSFRUUCBvciBEZXBsb3lSIGdsb2JhbCBlcnJvcnMgLS0gICAgXG4gICAgaWYgKGdsb2JhbE9wdGlvbnMuZXZlbnRzW2NvZGVdKSB7XG4gICAgICBnbG9iYWxPcHRpb25zLmV2ZW50c1tjb2RlXS5hcHBseShjb250ZXh0LCBbYXBpLCByZXNdKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgYERlcGxveVJgIHJlcXVlc3QgY2xhc3MgaXMgYSB1dGlsaXR5IHRoYXQgYnJva2VycyBIVFRQIHJlcXVlc3RzIHRocm91Z2ggYSBcbiAqIHNpbXBsaWZpZWQgZmx1aWQgaW50ZXJmYWNlIHRvIERlcGxveVIuXG4gKlxuICogQG1vZHVsZSBkZXBsb3lyXG4gKiBAZm9yIGRlcGxveXJcbiAqL1xudmFyIERlcGxveVIgPSBCYXNlLmV4dGVuZChFbWl0dGVyLCBSSW5wdXRzLCB7XG5cbiAgLyoqXG4gICAqIFRoZSBgRGVwbG95UmAgUmVxdWVzdCBjbGFzcyBpcyBhIHV0aWxpdHkgdGhhdCBicm9rZXJzIEhUVFAgcmVxdWVzdHMgdGhyb3VnaCBcbiAgICogYSBzaW1wbGlmaWVkIGZsdWlkIGludGVyZmFjZSB0byBEZXBsb3lSLlxuICAgKiBcbiAgICogQGNsYXNzIFxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFwaSBUaGUgRGVwbG95UiBBUElcbiAgICogQHBhcmFtIHtPYmplY3R9IGxpbmsgVGhlIG9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcgdGhlIHByZXZpb3VzIHJlcXVlc3QuXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShhcGksIGxpbmspIHtcbiAgICAgRW1pdHRlci5pbml0aWFsaXplLmNhbGwodGhpcywge30pO1xuICBcbiAgICAgdmFyIG9wdHMgPSBnbG9iYWxPcHRpb25zO1xuXG4gICAgIGlmICghYXBpc1thcGldKSB7IHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBUEkgXCInICsgYXBpICsgJ1wiJyk7IH1cbiAgICBcbiAgICAgdGhpcy5hcGkgICAgICAgID0gbWVyZ2UoeyAnY2FsbCc6IGFwaSB9LCBhcGlzW2FwaV0pOyAgICBcbiAgICAgdGhpcy5saW5rICAgICAgID0gbGluayB8fCB7fTtcbiAgICAgdGhpcy5xICAgICAgICAgID0gdGhpcy5saW5rLnF1ZXVlIHx8IG5ldyBRdWV1ZSgpO1xuICAgICB0aGlzLmRlZmVycmVkICAgPSB0aGlzLmxpbmsuZGVmZXJyZWQgfHwgRCgpO1xuICAgICB0aGlzLmNvb2tpZXMgICAgPSB0aGlzLmxpbmsuY29va2llcztcbiAgICAgdGhpcy5sb2dnZXIgICAgID0gTG9nZ2VyLmdldChhcGksIExvZ2dlci5PRkYpOyAvLyB0cmFuc2FjdGlvbi1sZXZlbCBsb2dnaW5nXG4gICAgIHRoaXMucGFyYW1zICAgICA9IHt9O1xuICAgICB0aGlzLmlucHV0cyAgICAgPSBbXTsgLy8gcmlucHV0cyBsaXN0IFxuICAgICB0aGlzLm91dHB1dHMgICAgPSBbXTsgLy8gcm91dHB1dCBvYmplY3QgbGlzdFxuICAgICB0aGlzLnJzdHJlYW0gICAgPSBmYWxzZTtcbiAgICAgdGhpcy5kZWxheWVkICAgID0gZmFsc2U7XG4gICAgIHRoaXMuZ2xvYmFsRXZ0cyA9IHRydWU7IC8vIHN1cHByZXNzfHJhaXNlIGdsb2JhbCBldmVudHMgZm90IHRoaXMgYGlvYCAgICAgXG4gICAgIHRoaXMuZmlsZSAgICAgICA9IG51bGw7IFxuICAgICB0aGlzLmVudGl0aWVzICAgPSBudWxsOyBcbiAgICAgdGhpcy5pb0ZpbHRlciAgID0gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9O1xuXG4gICAgIC8vIHByZXNldCBkZXBsb3lyJ3MgYXNzaWduZWQgcmVzcG9uc2UgZm9ybWF0IGZvciBgdGhpc2AgYXBpXG4gICAgIHRoaXMuZGF0YSh7IGZvcm1hdDogdGhpcy5hcGkuZm9ybWF0IH0pO1xuXG4gICAgIC8vIHdyYXAgc3VwZXJhZ2VudCBmb3IgdGhlIGhlYXZ5IGxpZnRpbmcgICAgIFxuICAgICB0aGlzLnJlcSA9IFxuICAgICAgICByZXF1ZXN0W3RoaXMuYXBpLm1ldGhvZC50b0xvd2VyQ2FzZSgpXShvcHRzLmhvc3QgKyAnL2RlcGxveXInICsgYXBpKTtcbiAgICAgdGhpcy5yZXEudGltZW91dCgyMCAqIDYwICogMTAwMCk7IC8vIGRlZmF1bHQgdGltZW91dCAtLT4gMjAgbWludXRlc1xuXG4gICAgIC8vIEFsbCBDT1JTIGRlcGxveXIgY2FsbHMgcmVxdWlyZSBzdGlja3kgc2Vzc2lvbnNcbiAgICAgaWYgKHdpbiAmJiBnbG9iYWxPcHRpb25zLmNvcnMpIHsgdGhpcy5yZXEud2l0aENyZWRlbnRpYWxzKCk7IH1cblxuICAgICAvLyBOb2RlLmpzIC0gYWNjZXNzIGFuIFNTTCBlbmRwb2ludCB3aXRoIHNlbGYgc2lnbmVkIGNlcnRzIGZvciB0ZXN0aW5nfGRldlxuICAgICBpZiAoIXdpbiAmJiBnbG9iYWxPcHRpb25zLmFsbG93U2VsZlNpZ25lZFNTTENlcnQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9ICcwJzsgICAgICAgIFxuICAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBzY29wZSBjb250ZXh0IGZvciB0aGUgY29uZmlndXJlZCBgLmVuZCgpYCBhbmQgYC5lcnJvcigpYCBldmVudCAgICBcbiAgICogaGFuZGxlciBjYWxsYmFja3Mgb24gdGhpcyByZXF1ZXN0LlxuICAgKlxuICAgKiBAbWV0aG9kIGN0eFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBUaGUgYHRoaXNgIG9iamVjdCBmb3IgdGhlIGNvbmZpZ3VyZWQgYC5lbmQoKWAgYW5kXG4gICAqIGAuZXJyb3IoKWAgZXZlbnQgaGFuZGxlcnMgb24gdGhpcyByZXF1ZXN0LlxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi8gXG4gIGN0eDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB0aGlzLnNjb3BlID0gY29udGV4dCB8fCB0aGlzO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFN1cHByZXNzIG9yIHJhaXNlIGdsb2JhbCBldmVudHMgZm9yIHRoaXMgYGlvYCByZXF1ZXN0LlxuICAgKlxuICAgKiBAbWV0aG9kIGdsb2JhbFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJhaXNlIGB0cnVlYCB0byByYWlzZSBnbG9iYWwgZXZlbnRzLCBgZmFsc2VgIHRvIHN1cHJlc3MgXG4gICAqIGV2ZW50IGZpcmluZyBnbG9iYWxseS5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLlxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi8gIFxuICBnbG9iYWw6IGZ1bmN0aW9uKHJhaXNlKSB7XG4gICAgdGhpcy5nbG9iYWxFdnRzID0gTGFuZy5pc0Jvb2xlYW4ocmFpc2UpID8gcmFpc2UgOiB0aGlzLmdsb2JhbEV2dHM7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSwgIFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZXRhaWxzIGFib3V0IHVzZXIuXG4gICAqICAgXG4gICAqIEBtZXRob2QgYWJvdXRcbiAgICogQHJldHVybiB7T2JqZWN0fSBkZXRhaWxzIGFib3V0IHVzZXIgb3RoZXJ3aWVzIGBudWxsYC5cbiAgICogQGFwaSBwdWJsaWMgICBcbiAgICovXG4gIGFib3V0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzcG9uc2UgPSB0aGlzLnJlcS5yZXM7XG5cbiAgICByZXR1cm4gdGhpcy5hcGlbJ2NhbGwnXSA9PT0gJy9yL3VzZXIvbG9naW4nICYmIHJlc3BvbnNlID8gXG4gICAgICAgICAgIHJlc3BvbnNlLmJvZHkuZ2V0KCd1c2VyJykgOiBudWxsO1xuICB9LCAgXG5cbiAgLyoqXG4gICAqIFNoYXJlcyB0aGUgY29va2llcyBmcm9tIGEgZGlmZnJlbnQgYC5pbygpYCBhZ2VudCB0byBwcmVzZXJ2ZSBzZXNzaW9uIHN0YXRlXG4gICAqIGFjcm9zcyBgdGhpc2AgcmVxdWVzdCBhbmQgYWxsIHJlcXVlc3RzIGNoYWluZWQgdG8gaXQuXG4gICAqXG4gICAqIEBtZXRob2Qgc2hhcmVcbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLlxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi8gIFxuICBzaGFyZTogZnVuY3Rpb24gKGNvb2tpZXMpIHtcbiAgICBpZiAoZ2xvYmFsT3B0aW9ucy5zdGlja3kpIHtcbiAgICAgIGlmIChnbG9iYWxPcHRpb25zLmNvb2tpZXMpIHtcbiAgICAgICAgdGhpcy5jb29raWVzID0gZ2xvYmFsT3B0aW9ucy5jb29raWVzLnNsaWNlKDApOyBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb29raWVzKSB7IFxuICAgICAgICAgIHRoaXMuY29va2llcyA9IGNvb2tpZXMuc2xpY2UoMCk7IFxuICAgICAgICAgIGdsb2JhbE9wdGlvbnMuc2V0KCdjb29raWVzJywgdGhpcy5jb29raWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPSAoY29va2llcyA/IGNvb2tpZXMuc2xpY2UoMCkgOiB0aGlzLmNvb2tpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBIVFRQIGNvb2tpZSBwcmV2aW91c2x5IHNlbnQgYnkgdGhlIHNlcnZlciB3aXRoIFNldC1Db29raWUuXG4gICAqIFRoaXMgdmFsdWUgY2FuIGJlIHBhc3NlZCB0byBgLnNoYXJlKHJ1c2VyLmdldENvb2tpZXMoKSlgIG9mIGEgZGlmZnJlbnRcbiAgICogYC5pbygpYCBhZ2VudCB0byBwcmVzZXJ2ZSBzZXNzaW9uIHN0YXRlIGFjcm9zcyByZXF1ZXN0cy5cbiAgICpcbiAgICogQG1ldGhvZCBnZXRDb29raWVzXG4gICAqIEByZXR1cm4ge0FycmF5fSBUaGUgSFRUUCBjb29raWUgcHJldmlvdXNseSBzZW50IGJ5IHRoZSBzZXJ2ZXIgd2l0aCBcbiAgICogU2V0LUNvb2tpZS5cbiAgICogQGFwaSBwdWJsaWMgICBcbiAgICovICBcbiAgZ2V0Q29va2llczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmNvb2tpZXM7XG4gIH0sIFxuXG4gIGRlbGF5OiBmdW5jdGlvbiAobXMpIHtcbiAgICAvLyBUT0RPOiBzdXBwb3J0IGRlbGF5ZWQgcmVxdWVzdHMgYmFzZWQgb24gbXMgZm9yIG5vdyB0aGlzIGlzIGp1c3QgYSBwYXVzZS5cbiAgICB0aGlzLmRlbGF5ZWQgPSAhaXNOYU4ocGFyc2VGbG9hdChtcykpICYmIGlzRmluaXRlKG1zKSA/IG1zIDogdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LCAgIFxuXG4gIC8qKlxuICAgKiBVbndpbmQgdGhlIHF1ZXVlIGNoYWluIGNsZWFyaW5nIHJlcXVlc3RzIHRoYXQgbWlnaHQgaGF2ZSBkZWxheXMgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBtZXRob2QgZHJhaW5cbiAgICogQHJldHVybiB7UHJvbWlzZX0gQSBwcm9taXNlIHdyYXBwaW5nIHRoZSByZXNvbHV0aW9uIG9mIGVpdGhlciBcInJlc29sdmVcIiBvclxuICAgKiBcInJlamVjdFwiIGNhbGxiYWNrLlxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi9cbiAgZHJhaW46IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlbGF5ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnEuZmx1c2goKTsgXG5cbiAgICByZXR1cm4gdGhpcy5kZWZlcnJlZC5wcm9taXNlO1xuICB9LCAgIFxuXG4gIC8qKlxuICAgKiBUaGUgYC5wcm9taXNlKClgIG1ldGhvZCByZXR1cm5zIGEgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIFByb21pc2UgdGhhdCBpcyBcbiAgICogcmVzb2x2ZWQgb25jZSBhbGwgRGVwbG95UiBgLmlvKClgIHJlcXVlc3RzIGhhdmUgZW5kZWQuXG4gICAqICAgXG4gICAqIEBtZXRob2QgcHJvbWlzZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2Ugd3JhcHBpbmcgdGhlIHJlc29sdXRpb24gb2YgZWl0aGVyIFwicmVzb2x2ZVwiIG9yXG4gICAqIFwicmVqZWN0XCIgY2FsbGJhY2suXG4gICAqIEBhcGkgcHVibGljXG4gICAqLyAgICAgXG4gIHByb21pc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmVuZCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVmZXJyZWQucHJvbWlzZTtcbiAgfSxcblxuICAvKipcbiAgICogQWJvcnQgdGhlIERlcGxveVIgcmVxdWVzdC5cbiAgICpcbiAgICogQG1ldGhvZCBhYm9ydCAgXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZy5cbiAgICogQGFwaSBwdWJsaWNcbiAgICovICBcbiAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnJlcS5hYm9ydCgpO1xuICAgIHRoaXMuZW1pdCgnYWJvcnQnKTtcbiAgICB0aGlzLmRlZmVycmVkLnJlamVjdCh0aGlzLl9oYW5kbGVFcnJvcih7IFxuICAgICAgICBzdGF0dXM6ICdhYm9ydCcsXG4gICAgICAgIHRleHQ6ICdEZXBsb3lSIHJlcXVlc3QgYWJvcnRlZC4nXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAvKipcbiAgKiBTZXQgdGltZW91dCB0byBgbXNgLlxuICAqXG4gICogQG1ldGhvZCB0aW1lb3V0ICBcbiAgKiBAcGFyYW0ge051bWJlcn0gbXNcbiAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmdcbiAgKiBAYXBpIHB1YmxpY1xuICAqLyAgXG4gIHRpbWVvdXQ6IGZ1bmN0aW9uIChtcykge1xuICAgIHRoaXMucmVxLnRpbWVvdXQobXMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAvKipcbiAgKiBUdXJuIGxvZ2dpbmcgb24gZm9yIHRoZSBzcGVjaWZpYyB0cmFuc2FjdGlvbi5cbiAgKlxuICAqIEBtZXRob2QgbG9nXG4gICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICogQGFwaSBwdWJsaWNcbiAgKi8gXG4gIGxvZzogZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgdGhpcy5sb2dnZXIuc2V0TGV2ZWwobGV2ZWwgfHwgTG9nZ2VyLkRFQlVHKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHN1Y2Nlc3NmdWwgcmVzcG9uc2VzIHRvIGNvbnRhaW4gb25seSBhIHRvcC1sZXZlbCBEZXBsb3lSIEFQSSBcbiAgICogcmVzcG9uc2UgZW50aXRpZXM6XG4gICAqIC0gJ3VzZXInXG4gICAqIC0gJ3Byb2plY3QnXG4gICAqIC0gJ3dvcmtzcGFjZScgXG4gICAqIC0gJ2V4ZWN1dGlvbicgXG4gICAqIC0gJ2RpcmVjdG9yeScgXG4gICAqIC0gJ3JlcG9zaXRvcnknXG4gICAqIC0gJ3BhY2thZ2VzJyBcbiAgICogICBcbiAgICogQG1ldGhvZCBlbnRpdHlcbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICBlbnRpdHk6IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICB0aGlzLmVudGl0aWVzID0gdXRpbHMuaW5BcnJheShUT1BMRVZFTF9FTlRJVElFUywgZW50aXR5KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSByZXF1ZXN0IGRhdGEgYmVpbmcgc2VudCB0byBhIERlcGxveVIgQVBJLiBcbiAgICpcbiAgICogQG1ldGhvZCBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBvYmplY3QgbGl0ZXJhbCBjb25maWd1cmF0aW9uIGhhc2guIFxuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmdcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIGRhdGE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEgfHwge307ICAgIFxuXG4gICAgLy8gcmVtb3ZlIGFueSBpbmxpbmVkIHJpbnB1dChzKSBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlIHJpbnB1dChzKSBwcm9wZXJ0eVxuICAgIGlmIChkYXRhLnJpbnB1dCB8fCBkYXRhLnJpbnB1dHMpIHtcbiAgICAgIHRoaXMucmlucHV0KGRhdGEucmlucHV0KTtcbiAgICAgIHRoaXMucmlucHV0cyhkYXRhLnJpbnB1dHMpO1xuICAgIH0gXG5cbiAgICAvLyByZW1vdmUgYW55IGByZXNlcnZlZGAgdmFsdWVzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHBhc3NlZCBieSBtaXN0YWtlXG4gICAgdmFyIEJMQUNLTElTVCA9IFsncmlucHV0JywgJ3JpbnB1dHMnLCAnX19jb29raWVzX18nXTtcbiAgICBCTEFDS0xJU1QuZm9yRWFjaChmdW5jdGlvbihwYXJhbSkgeyBkZWxldGUgZGF0YVtwYXJhbV07IH0pOyAgXG5cbiAgICB0aGlzLnBhcmFtcyA9IG1lcmdlKHRoaXMucGFyYW1zLCBkYXRhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIGZpbGUgdG8gYmUgdXBsb2FkZWQuIFxuICAgKlxuICAgKiBAbWV0aG9kIGF0dGFjaFxuICAgKiBAcGFyYW0ge0ZpbGV8QmxvYnxwYXRofSBmaWxlIFRoZSBmaWxlIHRvIGJlIGF0dGFjaGVkIGZvciBhbiB1cGxvYWQuIEZvciBcbiAgICogQnJvd3NlciBlbnZpcm9ubWVudHMgdGhlIEhUTUw1IEZpbGV8QmxvYiBpcyB1c2VkLiBGb3IgdGhlIE5vZGUuanMgXG4gICAqIGVudmlyb25tZW50LCBhIGZpbGUgcGF0aCBpcyBhY2NlcHRlZC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIChvcHRpb25hbCkgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgdXBsb2FkZWQuIFxuICAgKiBUaGlzIG5hbWUgZG9lcyBub3QgaGF2ZSB0byBtYXRjaCB0aGUgYWN0dWFsIHNvdXJjZSBmaWxlbmFtZS5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICBhdHRhY2g6IGZ1bmN0aW9uIChmaWxlLCBmaWxlbmFtZSkge1xuICAgIGlmICh0aGlzLmFwaS51cGxvYWQpIHtcbiAgICAgIHRoaXMuZmlsZSA9IGZpbGU7XG5cbiAgICAgIC8vIG9wdGlvbmFsIGZpbGVuYW1lIGhlcmUgZm9yIGNvbnZlbmllbmNlXG4gICAgICBpZiAoZmlsZW5hbWUpIHsgdGhpcy5kYXRhKCB7IGZpbGVuYW1lOiBmaWxlbmFtZSB9ICk7IH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogU3VwcG9ydGVkIG9ubHkgaW4gTm9kZS5qcywgdGhpcyBtZXRob2Qgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgXG4gICAqIGF0dGFjaCBtZXRob2QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmlsZSBzaG91bGQgYmUgcmVhZCBpbiBhcyBhIHJlYWRhYmxlIFxuICAgKiBzdHJlYW0gZHVyaW5nIGEgZmlsZSB1cGxvYWQuXG4gICAqXG4gICAqIEBtZXRob2Qgc3RyZWFtXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIChvcHRpb25hbCkgdGhlIFJlYWRhYmxlIFN0cmVhbSBvcHRpb25zIGhhc2guXG4gICAqICBgYGBcbiAgICogICAgeyBmbGFnczogJ3InLFxuICAgKiAgICAgIGVuY29kaW5nOiBudWxsLFxuICAgKiAgICAgIGZkOiBudWxsLFxuICAgKiAgICAgIG1vZGU6IDA2NjYsXG4gICAqICAgICAgYXV0b0Nsb3NlOiB0cnVlXG4gICAqICAgIH1cbiAgICogYGBgXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZ1xuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgc3RyZWFtOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5yc3RyZWFtID0gKCF3aW4gJiYgdGhpcy5hcGkudXBsb2FkKTsgLy9ub2RlanMgb25seVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoZSBgZmlsdGVyKM67KWAgbWV0aG9kIHJlbW92ZXMgdGhpcyBEZXBsb3lSIHJlcXVlc3QgZnJvbSB0aGUgcmVxdWVzdCBjaGFpblxuICAgKiBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZG9lcyAqbm90KiBwYXNzIHRoZSB0ZXN0IGltcGxlbWVudGVkIGJ5IGl0LlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICpcbiAgICogYGBgXG4gICAqIC8vIFJlbW92ZSBmcm9tIHRoZSByZXF1ZXN0IGNoYWluXG4gICAqIC5maWx0ZXIoZnVuY3Rpb24oYXJncykge1xuICAgKiAgICByZXR1cm4gNSA+IDEwO1xuICAgKiB9KVxuICAgKlxuICAgKiAvLyBLZWVwIGluIHRoZSByZXF1ZXN0IGNoYWluXG4gICAqIC5maWx0ZXIoZnVuY3Rpb24oYXJncykge1xuICAgKiAgICByZXR1cm4gMTAgPiA1O1xuICAgKiB9KSAgIFxuICAgKiBgYGBcbiAgICpcbiAgICogQG1ldGhvZCBmaWx0ZXJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gzrsgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmdcbiAgICogQGFwaSBwdWJsaWMgICBcbiAgICovXG4gIGZpbHRlcjogZnVuY3Rpb24oZm4pIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuaW9GaWx0ZXIgPSBmdW5jdGlvbihwcmV2QXJncykge1xuICAgICAgICB2YXIgYXJncyA9IHt9LCBrZWVwO1xuXG4gICAgICAgIC8vIGNvcHkgb3ZlciBwcmV2aW91cyBhcmd1bWVudHMgYW5kIGZpbHRlciBvdXQgaW50ZXJuYWwgX19jb29raWVzX18gXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBwcmV2QXJncykge1xuICAgICAgICAgICBpZiAoa2V5ICE9PSAnX19jb29raWVzX18nKSB7IFxuICAgICAgICAgICAgICBhcmdzW2tleV0gPSBwcmV2QXJnc1trZXldO1xuICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZWVwID0gZm4oYXJncyk7XG4gICAgICAgIHJldHVybiAoa2VlcCB8fCBrZWVwID09PSBmYWxzZSA/IGtlZXAgOiB0cnVlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sICBcbiAgXG4gIC8qKlxuICAgKiBBY3RzIGFzIGEgZmluYWxseSBzdGF0ZW1lbnQgYWxsb3dpbmcgeW91IHRvIGV4ZWN1dGUgXCJjbGVhbnVwXCIgdHlwZSB0YXNrcyBcbiAgICogaW4gYSByZXF1ZXN0IGNoYWluLiBJdCBhcnJhbmdlcyBmb3IgY2xlYW51cCB0byBiZSBjYWxsZWQsIHdpdGggbm8gXG4gICAqIGFyZ3VtZW50cywgd2hlbiB0aGUgRGVwbG95UiByZXF1ZXN0IGNoYWluIGlzIGVpdGhlciBjb21wbGV0ZWx5IGZ1bGZpbGxlZCBcbiAgICogb3IgcmVqZWN0ZWQuXG4gICAqXG4gICAqIEBtZXRob2QgZW5zdXJlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IM67IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICAqIEBhcGkgcHVibGljXG4gICAqLyAgXG4gIGVuc3VyZTogZnVuY3Rpb24gKGZuKSB7XG4gICAgdGhpcy5kZWZlcnJlZC5wcm9taXNlLmVuc3VyZShmbik7XG5cbiAgICByZXR1cm4gdGhpcy5kZWZlcnJlZC5wcm9taXNlO1xuICB9LFxuICAgICAgXG4gIC8qKlxuICAgKiBUaGUgZ2VuZXJhbCBmYWlsdXJlIGNhbGxiYWNrLiBJZiBjYWxsZWQsIGFsbCBEZXBsb3lSIGVycm9ycyBmb3IgdGhpcyBcbiAgICogdHJhbnNhY3Rpb24gd2lsbCBiZSByZXR1cm5lZCBoZXJlIHdoZW4gcmFpc2VkLlxuICAgKlxuICAgKiBAbWV0aG9kIGVycm9yXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IM67IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICBlcnJvcjogZnVuY3Rpb24gKGZuKSB7XG4gICAgdGhpcy5vbignZXJyb3InLCBmbik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogU3RyZWFtIHRoZSBEZXBsb3lSIHJlc3BvbnNlIGludG8gdGhlIHBpcGUuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgaWYgXG4gICAqIHRoZSBgLnBpcGUoKWAgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCB0aGUgcmVxdWVzdCB3aWxsIG5vdCBiZSBzZW50LlxuICAgKlxuICAgKiBUaGUgYC5waXBlKClgIG1ldGhvZCBzaG91bGQgYmUgYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBgLmVuZCgpYCBhbmQgXG4gICAqIG5ldmVyIGFsb25nIHNpZGUgb2YgaXQuIGAucGlwZSgpYCBhbmQgYC5lbmQoKWAgYXJlIGFuIGVpdGhlci1vci5cbiAgICpcbiAgICogQG1ldGhvZCBwaXBlXG4gICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gQSBkZXN0aW5hdGlvbiBTdHJlYW0uXG4gICAqIEByZXR1cm4ge1N0cmVhbX0gVGhlIHBhc3NlZCBpbiBkZXN0aW5hdGlvbiBzdHJlYW0gdG8gYmUgdXNlZCBmb3IgYWRkaXRpb25hbCBcbiAgICogcGlwaW5nLlxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgcGlwZTogZnVuY3Rpb24gKGRlc3QpIHtcbiAgICB2YXIgcSAgID0gdGhpcy5xLFxuICAgICAgICBhcGkgPSB0aGlzLmFwaTsgICAgICAgIFxuXG4gICAgcS5hZGQoZnVuY3Rpb24ocmVzcG9uc2VDaGFpbiwgZXJyb3IsIHByZXZBcmdzKSB7ICAgIFxuICAgICAgLy8gYnJha2UgdGhlIGNhbGwgY2hhaW4gb24gZXJyb3IgICAgICBcbiAgICAgIGlmIChlcnJvcikgeyAgICAgICAgXG4gICAgICAgIHRoaXMuZGVmZXJyZWQucmVqZWN0KGVycm9yKTsgICAgICBcbiAgICAgICAgcS5mbHVzaChyZXNwb25zZUNoYWluLCBlcnJvciwgcHJldkFyZ3MpOyAvLyBkcmFpbiB0aGUgcXVldWVcbiAgICAgICAgdGhpcy5fY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLl9wcmVwUmVxdWVzdChyZXNwb25zZUNoYWluLCBwcmV2QXJncyk7XG5cbiAgICAgIExvZ2dlci5pbmZvKCdwaXBlKCknLCBhcGksIHRoaXMucmVxKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3BpcGUoKScsIGFwaSwgdGhpcy5yZXEpOyAgIFxuXG4gICAgICB2YXIgc3RyZWFtID0gdGhpcy5yZXEucGlwZShkZXN0KTtcbiAgICAgIHEueWllbGQodHJ1ZSk7XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyB9KTsgICAgXG4gICAgICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkgeyB9KTsgICAgIFxuICAgICAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24oKSB7IH0pOyAgICAgIFxuICAgIH0sIHRoaXMpO1xuICBcbiAgICBpZiAocS5zaXplKCkgPD0gMSkgeyBxLmZsdXNoKCk7IH1cblxuICAgIHJldHVybiBkZXN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBpcyByZWFkeSB0byBiZSBzZW50IHRvIERlcGxveVIuIEl0IGlzIGltcG9ydGFudCBcbiAgICogdG8gbm90ZSB0aGF0IGlmIHRoZSBgLmVuZCgpYCBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIHRoZSByZXF1ZXN0IHdpbGwgbm90IGJlXG4gICAqIHNlbnQuXG4gICAqXG4gICAqIEBtZXRob2QgZW5kXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IM67IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLlxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi8gXG4gIGVuZDogZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNlbGYgICAgID0gdGhpcyxcbiAgICAgICAgcSAgICAgICAgPSB0aGlzLnEsXG4gICAgICAgIGFwaSAgICAgID0gdGhpcy5hcGksXG4gICAgICAgIGFyZ3MgICAgID0gbnVsbCxcbiAgICAgICAgZW50aXRpZXMgPSAgdGhpcy5lbnRpdGllcztcblxuICAgIHEuYWRkKGZ1bmN0aW9uKHJlc3BvbnNlQ2hhaW4sIGVycm9yLCBwcmV2QXJncykge1xuICAgICAgLy8gYnJlYWsgdGhlIGNhbGwgY2hhaW4gb24gZXJyb3IgICAgICBcbiAgICAgIGlmIChlcnJvcikgeyAgICAgICAgXG4gICAgICAgIHRoaXMuZGVmZXJyZWQucmVqZWN0KGVycm9yKTsgICAgICAgIFxuICAgICAgICBxLmZsdXNoKHJlc3BvbnNlQ2hhaW4sIGVycm9yLCBwcmV2QXJncyk7IC8vIGRyYWluIHRoZSBxdWV1ZVxuICAgICAgICB0aGlzLl9jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICBpZiAoIXRoaXMuaW9GaWx0ZXIocHJldkFyZ3MpKSB7XG4gICAgICAgIGlmIChxLnNpemUoKSA9PT0gMCkgeyBcbiAgICAgICAgICB0aGlzLmRlZmVycmVkLnJlc29sdmUocmVzcG9uc2VDaGFpbiB8fCBwcmV2QXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICBxLmZsdXNoKHJlc3BvbnNlQ2hhaW4sIGVycm9yLCBwcmV2QXJncyk7IC8vIGRyYWluIHRoZSBxdWV1ZVxuICAgICAgICB0aGlzLl9jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMuX3ByZXBSZXF1ZXN0KHJlc3BvbnNlQ2hhaW4sIHByZXZBcmdzKTtcblxuICAgICAgTG9nZ2VyLmluZm8oJ2lvKCknLCBhcGksIHRoaXMucmVxKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ2lvKCknLCBhcGksIHRoaXMucmVxKTsgICAgXG5cbiAgICAgIC8vIHNlbmQgbmV4dCByZXF1ZXN0XG4gICAgICB0aGlzLnJlcS5lbmQoZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgIHNlbGYuc2hhcmUoc2VsZi5jb29raWVzIHx8IHJlcy5oZWFkZXJzWydzZXQtY29va2llJ10pOyAgICAgICAgIFxuXG4gICAgICAgIC8vIC0tIGxvZyBjb29raWVzIGFjcm9zcyByZXF1ZXN0cyAtLVxuICAgICAgICBpZiAoc2VsZi5jb29raWVzKSB7XG4gICAgICAgICAgTG9nZ2VyLmluZm8oJ2Nvb2tpZXMnLCBhcGksIHNlbGYuY29va2llcyk7IFxuICAgICAgICAgIHNlbGYubG9nZ2VyLmluZm8oJ2Nvb2tpZXMnLCBhcGksIHNlbGYuY29va2llcyk7IFxuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IgPSBzZWxmLl9oYW5kbGVFcnJvcihyZXMpO1xuICAgICAgICB2YXIgZHJlcyA9IChyZXMuYm9keSAmJiByZXMuYm9keS5kZXBsb3lyID8gcmVzLmJvZHkgOiByZXMpOyAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICBzZWxmLmlucHV0cyA9IFtdO1xuICAgICAgICBzZWxmLm91dHB1dHMgPSBbXTtcblxuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgIC8vIC0tIExvZyBnbG9iYWwgKyB0cmFuc2FjdGlvbiBsb2cgLS1cbiAgICAgICAgICAgTG9nZ2VyLmluZm8oJ2VuZCgpJywgYXBpLCBkcmVzLCByZXMpO1xuICAgICAgICAgICBzZWxmLmxvZ2dlci5pbmZvKCdlbmQoKScsIGFwaSwgZHJlcywgcmVzKTtcblxuICAgICAgICAgICAvLyAtLSB3YWxrIHJlc3BvbnNlIGZvciB0b3AtbGV2ZWwgZW50aXR5IHJlc3BvbnNlIGFzc2lnbm1lbnQgLS0gICAgICAgIFxuICAgICAgICAgICBpZiAoZW50aXRpZXMpIHsgZHJlcyA9IGRyZXMuZGVwbG95ci5yZXNwb25zZVtlbnRpdGllc10gfHwgZHJlczsgfVxuXG4gICAgICAgICAgIGRyZXMuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7IFxuICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuZ2V0KGRyZXMuZGVwbG95ci5yZXNwb25zZSwga2V5KTsgXG4gICAgICAgICAgIH07XG5cbiAgICAgICAgICAgZHJlcy53b3Jrc3BhY2UgPSBmdW5jdGlvbihuYW1lKSB7IFxuICAgICAgICAgICAgICByZXR1cm4gdXRpbHMud29ya3NwYWNlKGRyZXMuZGVwbG95ci5yZXNwb25zZSwgbmFtZSk7IFxuICAgICAgICAgICB9O1xuXG4gICAgICAgICAgIC8vIC0tIGNhbGxiYWNrIC0tXG4gICAgICAgICAgIGlmIChmbikgeyBhcmdzID0gZm4uYXBwbHkoc2VsZi5zY29wZSwgW2RyZXMsIHJlc3BvbnNlQ2hhaW5dKTt9XG5cbiAgICAgICAgICAgLy8gLS0gbm90aWZ5IHRoYXQgdGhlIHF1ZXVlIGhhcyBiZWVuIGRyYWluZWQuLi4gLS1cbiAgICAgICAgICAgaWYgKHEuc2l6ZSgpID09PSAwKSB7IFxuICAgICAgICAgICAgIHNlbGYuX2NsZWFyKCk7XG4gICAgICAgICAgICAgc2VsZi5kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlQ2hhaW4gfHwgZHJlcyk7XG4gICAgICAgICAgIH0gICAgICAgICAgXG5cbiAgICAgICAgICAgLy8gLS0gaW5jbHVkZSBjb29raWVzIGluIG5leHQgcmVxdWVzdCBpbiB0aGUgcXVldWUgLS1cbiAgICAgICAgICAgYXJncyA9IG1lcmdlKGFyZ3MsIHsgX19jb29raWVzX186IHNlbGYuY29va2llcyB9KTsgICAgICAgICAgXG4gICAgICAgIH0gICAgICAgIFxuXG4gICAgICAgIHEueWllbGQoZmFsc2UpO1xuICAgICAgICBxLmZsdXNoKGRyZXMsIGVycm9yLCBhcmdzKTsgLy8gcGFzcyByZXN1bHR8ZXJyb3J8YXJncyB0byBuZXh0IFxuICAgICAgfSk7XG5cbiAgICAgIHEueWllbGQodHJ1ZSk7XG4gICAgfSwgdGhpcywgdGhpcy5kZWxheWVkKTtcbiAgXG4gICAgaWYgKCF0aGlzLmRlbGF5ZWQgJiYgcS5zaXplKCkgPD0gMSkgeyBxLmZsdXNoKCk7IH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LCBcblxuICAvKiogXG4gICAqIEFkZCBhbiBhZGRpdGlvbmFsIElPIHJlcXVlc3QgdG8gdGhlIGV4c2lzdGluZyBzZXF1ZW50aWFsIHJlcXVlc3QgY2hhaW4uXG4gICAqXG4gICAqIEBtZXRob2QgaW9cbiAgICogQHBhcmFtIHtTdHJpbmd9IGFwaSBPbmUgb2YgdGhlIHN1cHBvcnRlZCBEZXBsb3lSIEFQSXMuXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZy5cbiAgICogQGFwaSBwdWJsaWNcbiAgICovICAgXG4gIGlvOiBmdW5jdGlvbiAoYXBpKSB7ICAgIFxuICAgIHJldHVybiBEZXBsb3lSLm5ldyhhcGksIHsgXG4gICAgICBjb29raWVzOiB0aGlzLmNvb2tpZXMsIFxuICAgICAgcXVldWU6IHRoaXMucSwgXG4gICAgICBkZWZlcnJlZDogdGhpcy5kZWZlcnJlZFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKiBcbiAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGFkZGluZyBhbiBhZGRpdGlvbmFsIHNjcmlwdCBleGVjdXRpb24gdG8gdGhlIFxuICAgKiBleHNpc3Rpbmcgc2VxdWVudGlhbCByZXF1ZXN0IGNoYWluLlxuICAgKlxuICAgKiBAbWV0aG9kIHNjcmlwdFxuICAgKiBAcGFyYW0ge0FyZ3VtZW50c30gQXJndW1lbnRzIHRvIGRlZmluZSB0aGUgZnVsbHkgcXVhbGlmaWVkIHNjcmlwdCBmb3IgXG4gICAqIGV4ZWN1dGlvbi5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLiAgIFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgc2NyaXB0OiBmdW5jdGlvbigpIHtcbiAgICAgdmFyIGFyZ3MgPSB1dGlscy5zaWduYXR1cmUoYXJndW1lbnRzKSxcbiAgICAgICAgIG9wdHMgPSBhcmdzLm9wdHMsXG4gICAgICAgICBhcGkgID0gYXJncy5hcGksXG4gICAgICAgICBsaW5rID0geyBcbiAgICAgICAgICBjb29raWVzOiB0aGlzLmNvb2tpZXMsIFxuICAgICAgICAgIHF1ZXVlOiB0aGlzLnEsIFxuICAgICAgICAgIGRlZmVycmVkOiB0aGlzLmRlZmVycmVkXG4gICAgICAgIH07ICBcblxuICAgIC8vIGNvbnZlbmllbmNlIC0gaWYgdGhlIHByb2plY3QgaXMgYSBib29sZW4gYHRydWVgIHJhdGhlciB0aGFuIGEgcGlkLCBmaXJzdFxuICAgIC8vIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IGFuZCB0aGVuIHByZXBhcmUgdGhlIHByb2plY3QgYXBpIGNhbGwgdG8gZXhlY3V0ZVxuICAgIGlmIChhcmdzLmNyZWF0ZSkge1xuICAgICAgcmV0dXJuIERlcGxveVIubmV3KCcvci9wcm9qZWN0L2NyZWF0ZScsIGxpbmspXG4gICAgICAgICAgICAgICAuZW5kKGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvamVjdDogcmVzLmdldCgncHJvamVjdCcpLnByb2plY3QgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgLmlvKGFwaSlcbiAgICAgICAgICAgICAgIC5kYXRhKG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRGVwbG95Ui5uZXcoYXBpLCBsaW5rKS5kYXRhKG9wdHMpO1xuICAgIH0gICAgXG4gIH0sXG5cbiAgLyoqIFxuICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWRkaW5nIGFuIGFkZGl0aW9uYWwgcmVwb3NpdG9yeS1tYW5hZ2VkIHNoZWxsIFxuICAgKiBzY3JpcHQgZXhlY3V0aW9uIHRvIHRoZSBleHNpc3Rpbmcgc2VxdWVudGlhbCByZXF1ZXN0IGNoYWluLlxuICAgKlxuICAgKiBUaGlzIGNhbGwgZXhlY3V0ZXMgcmVwb3NpdG9yeS1tYW5hZ2VkIHNoZWxsIHNjcmlwdHMgLnNoLCAuY3NoLCAuYmFzaCwgLmJhdCBcbiAgICogb24gdGhlIERlcGxveVIgc2VydmVyLiBEdWUgdG8gdGhlIHNwZWNpYWwgc2VjdXJpdHkgY29uY2VybnMgYXNzb2NpYXRlZCB3aXRoIFxuICAgKiBleGN1dGluZyBzaGVsbCBzY3JpcHRzIG9uIHRoZSBEZXBsb3lSIHNlcnZlciwgb25seSBzaGVsbCBzY3JpcHRzIG93bmVkIGJ5IFxuICAgKiBfQURNSU5JU1RSQVRPUl8gdXNlcnMgY2FuIGJlIGV4ZWN1dGVkIG9uIHRoaXMgQVBJIGNhbGwuIEFueSBhdHRlbXB0IHRvIFxuICAgKiBleGVjdXRlIGEgc2hlbGwgc2NyaXB0IHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeSB0aGF0IGlzIG5vdCBvd25lZCBieSBhbiBcbiAgICogX0FETUlOSVNUUkFUT1JfIHVzZXIgd2lsbCBiZSByZWplY3RlZC5cbiAgICpcbiAgICogVG8gZXhlY3V0ZSBhIHJlcG9zaXRvcnktbWFuYWdlZCBzaGVsbCBzY3JpcHQgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgXG4gICAqIHBhcmFtZXRlciB2YWx1ZXMgZm9yIF9hdXRob3JfLCBfZGlyZWN0b3J5XywgX2ZpbGVuYW1lXy4gVGhpcyBjYW4gYmVcbiAgICogYWNoaWV2ZWQgYnkgcHJvdmlkaW5nIGEgZnVsbHkgcXVhbGlmaWVkIHNoZWxsIHNjcmlwdCBcbiAgICogYC88YXV0aG9yPi88ZGlyZWN0b3J5Pi88ZmlsZW5hbWU+YCwgZm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICBgYGBcbiAgICogIC5zaGVsbCgnL2FkbWluL2V4dGVybmFsOnB1YmxpYzphZG1pbi9lY2hvLnNoJywgJ2VjaG8uc2ggYXJncyB0byBwYXNzLicpXG4gICAqICBgYGBcbiAgICpcbiAgICogQG1ldGhvZCBzaGVsbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZmlsZXBhdGggdG8gZGVmaW5lIHRoZSBmdWxseSBxdWFsaWZpZWQgc2hlbGwgc2NyaXB0IGZvclxuICAgKiBleGVjdXRpb24uIFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYXJncyAob3B0aW9uYWwpIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgc2hlbGwgXG4gICAqIHNjcmlwdCBvbiBleGVjdXRpb24uXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZy4gICBcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIHNoZWxsOiBmdW5jdGlvbihwYXRoLCBhcmdzKSB7ICAgXG4gICAgdmFyIGxpbmsgPSB7IFxuICAgICAgICAgIGNvb2tpZXM6IHRoaXMuY29va2llcywgXG4gICAgICAgICAgcXVldWU6IHRoaXMucSwgXG4gICAgICAgICAgZGVmZXJyZWQ6IHRoaXMuZGVmZXJyZWRcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5zID0gTGFuZy5pc1N0cmluZyhwYXRoKSA/IHBhdGguc3BsaXQoJ1xcLycpIDogW107XG5cbiAgICAvLyBoYW5kbGUgYm90aDogYC9hdXRob3IvZGlyZWN0b3J5L2ZpbGVuYW1lYCAmIGBhdXRob3IvZGlyZWN0b3J5L2ZpbGVuYW1lYFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMykgeyB0b2tlbnMgPSB0b2tlbnMuc2xpY2UoMSk7IH1cblxuICAgIHJldHVybiBEZXBsb3lSLm5ldygnL3IvcmVwb3NpdG9yeS9zaGVsbC9leGVjdXRlJywgbGluaykuZGF0YSh7XG4gICAgICBhdXRob3I6IHRva2Vuc1swXSxcbiAgICAgIGRpcmVjdG9yeTogdG9rZW5zWzFdLFxuICAgICAgZmlsZW5hbWU6IHRva2Vuc1syXSxcbiAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KTtcbiAgfSxcblxuICAvKiogXG4gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBleGVjdXRpbmcgYSBibG9jayBvZiBSIGNvZGUgb24gdGhlIFIgc2Vzc2lvbi5cblxuICAgKiBFeGFtcGxlOlxuICAgKiAgYGBgXG4gICAqICAuY29kZSgneDwtNScpXG4gICAqICAvLyAtLSBvciAtLVxuICAgKiAgLmNvZGUoJ3g8LTUnLCBwcm9qZWN0SWQpXG4gICAqICBgYGBcbiAgICogICBcbiAgICogQG1ldGhvZCBjb2RlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByIC0gVGhlIGJsb2NrIG9mIFIgY29kZSB0byBleGVjdXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvamVjdCAtIChvcHRpb25hbCkgaWYgb21pdHRlZCBhIG5ldyBwcm9qZWN0IHdpbGwgZmlyc3QgYmUgXG4gICAqIGNyZWF0ZWQgYW5kIHVzZWQsIG90aGVyd2lzZSBpdCB3aWxsIGV4ZWN1dGUgb24gdGhlIFIgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5IFxuICAgKiB0aGlzIGBwcm9qZWN0YC5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLiAgIFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgY29kZTogZnVuY3Rpb24ociwgcHJvamVjdCkge1xuICAgICB2YXIgbGluayA9IHtcbiAgICAgICAgICAgICBjb29raWVzOiB0aGlzLmNvb2tpZXMsXG4gICAgICAgICAgICAgcXVldWU6IHRoaXMucSxcbiAgICAgICAgICAgICBkZWZlcnJlZDogdGhpcy5kZWZlcnJlZFxuICAgICAgICAgfSxcbiAgICAgICAgIGFwaSA9ICcvci9wcm9qZWN0L2V4ZWN1dGUvY29kZSc7XG5cbiAgICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICAgICByZXR1cm4gRGVwbG95Ui5uZXcoJy9yL3Byb2plY3QvY3JlYXRlJywgbGluaylcbiAgICAgICAgICAgICAuZW5kKGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9qZWN0OiByZXMuZ2V0KCdwcm9qZWN0JykucHJvamVjdCB9O1xuICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgLmlvKGFwaSlcbiAgICAgICAgICAgICAuZGF0YSh7IGNvZGU6IHIgfSk7XG4gICAgIH0gZWxzZSB7XG4gICAgICAgICByZXR1cm4gRGVwbG95Ui5uZXcoYXBpLCBsaW5rKS5kYXRhKHsgY29kZTogciwgcHJvamVjdDogcHJvamVjdCB9KTtcbiAgICAgfVxuICB9LFxuICBcbiAgLyoqIFxuICAgKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwcm9qZWN0IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uIFxuICAgKiBpbnN0YW5jZSB3aGVuZXZlciBhIGNsaWVudCBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzLiBUaGlzIGluY2x1ZGVzIGNsb3NpbmcgXG4gICAqIGFueSBzdXBwbGllZCBwcm9qZWN0cyBkb3duIGFuZCBsb2dnaW5nIG91dC5cbiAgICpcbiAgICogQG1ldGhvZCByZWxlYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBwcm9qZWN0cyBUaGUgcHJvamVjdCBvciBsaXN0IG9mIHByb2plY3RzIHRvIGNsb3NlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF1dGggKG9wdGlvbmFsKSB0byByZW1haW4gYXV0aGVudGljYXRlZC5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLiAgIFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgcmVsZWFzZTogZnVuY3Rpb24ocHJvamVjdHMsIGF1dGgpIHtcbiAgICAgcHJvamVjdHMgPSBMYW5nLmlzQXJyYXkocHJvamVjdHMpID8gcHJvamVjdHMgOiBbcHJvamVjdHNdO1xuXG4gICAgIHZhciBzZWxmICAgICA9IHRoaXMsXG4gICAgICAgICBkZWZlcnJlZCA9IEQoKSxcbiAgICAgICAgIGVtcHR5ICAgID0gIXByb2plY3RzIHx8ICFwcm9qZWN0c1swXSxcbiAgICAgICAgIGNvdW50ICAgID0gMCxcbiAgICAgICAgIGxhc3QgICAgID0gIWVtcHR5ID8gcHJvamVjdHMubGVuZ3RoIC0gMSA6IGNvdW50LFxuICAgICAgICAgY29va2llcyAgPSB0aGlzLmdldENvb2tpZXMoKTsgICAgICAgICAgIFxuXG4gICAgZnVuY3Rpb24gbG9nb3V0KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPT09IGxhc3QpIHtcbiAgICAgICAgaWYgKCFhdXRoKSB7XG4gICAgICAgICAgRGVwbG95Ui5uZXcoJy9yL3VzZXIvbG9nb3V0JylcbiAgICAgICAgICAuc2hhcmUoY29va2llcylcbiAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24oKSB7ICAgICAgICAgIFxuICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGZhbHNlKTtcbiAgICAgICAgICB9KSAgICAgIFxuICAgICAgICAgIC5lbmQoZnVuY3Rpb24oKSB7IFxuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5lbnN1cmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgIHNlbGYuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9IFxuICAgIH1cblxuICAgIGlmICghZW1wdHkpIHtcbiAgICAgIHByb2plY3RzLmZvckVhY2goZnVuY3Rpb24ocHJvamVjdCkge1xuICAgICAgICBEZXBsb3lSLm5ldygnL3IvcHJvamVjdC9jbG9zZScpXG4gICAgICAgIC5kYXRhKHsgcHJvamVjdDogcHJvamVjdCB9KVxuICAgICAgICAuc2hhcmUoY29va2llcylcbiAgICAgICAgLmVuZCgpXG4gICAgICAgIC5lbnN1cmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbG9nb3V0KGNvdW50KTtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9KTtcbiAgICAgIH0pOyAgIFxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dvdXQoY291bnQpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOyAgXG4gIH0sICBcblxuICAvKiogXG4gICAqIEEgY29udmVuaWVuY2UgYWx0ZXJuYXRpdmUgdG8gbXVsdGlwbGUgYC5yaW5wdXQoKWAgY2FsbHMuIERlZmluZXMgYSBuYW1lIFxuICAgKiBsaXN0IG9mIFIgb2JqZWN0cyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYXMgRGVwbG95Ui1lbmNvZGVkIFIgb2JqZWN0cyBvbiB0aGUgXG4gICAqIHJlc3BvbnNlIG1hcmt1cC5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB+LnJvdXRwdXRzKFsgLi4uIF0pYCBpcyBlcXVpdmFsZW50IHRvIGludm9raW5nIG11bHRpcGxlIFxuICAgKiBgLnJvdXRwdXQoLi4uKWAgY2FsbHMuXG4gICAqXG4gICAqIEBtZXRob2Qgcm91dHB1dHNcbiAgICogQHBhcmFtIHtBcnJheX0gcm9iamVjdHMgQSBuYW1lIGxpc3Qgb2YgUiBvYmplY3RzIHRoYXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLiAgIFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgcm91dHB1dHM6IGZ1bmN0aW9uIChyb3V0cHV0cykge1xuICAgIGlmIChyb3V0cHV0cykgeyB0aGlzLm91dHB1dHMgPSB0aGlzLm91dHB1dHMuY29uY2F0KHJvdXRwdXRzKTsgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIFxuICAvKiogXG4gICAqIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIFIgb2JqZWN0IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBhcyBhIERlcGxveVItZW5jb2RlZCBcbiAgICogUiBvYmplY3Qgb24gdGhlIHJlc3BvbnNlIG1hcmt1cC5cbiAgICpcbiAgICogQG1ldGhvZCByb3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSByb2JqZWN0IFRoZSBuYW1lIG9mIHRoZSBSIG9iamVjdCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZy4gICBcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIHJvdXRwdXQ6IGZ1bmN0aW9uIChyb3V0cHV0KSB7XG4gICAgaWYgKHJvdXRwdXQpIHsgdGhpcy5yb3V0cHV0cyhbcm91dHB1dF0pOyB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKiogXG4gICAqIFVzZWQgdG8gcGFzcyBtdWx0aXBsZSBpbnB1dHMgYXQgb25jZSBmcm9tIEphdmFTY3JpcHQgdG8gYW4gUiBzY3JpcHQgdXNpbmcgXG4gICAqIG9uZSBvZiB0aGUgZGVmaW5lZCBgUklucHV0YCBmYWN0b3JpZXMuXG4gICAqXG4gICAqIEBtZXRob2QgcmlucHV0c1xuICAgKiBAcGFyYW0ge0FycmF5fSByaW5wdXRzIFRoZSBgUklucHV0YCBsaXN0IG9mIERlcGxveVItc3BlY2lmaWMgZW5jb2RlZCBSIFxuICAgKiBvYmplY3QgZGF0YSBmb3IgdXNlIG9uIGFuIEFQSSBjYWxsLlxuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmcuICAgXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICByaW5wdXRzOiBmdW5jdGlvbiAocmlucHV0cykge1xuICAgIGlmIChyaW5wdXRzKSB7IHRoaXMuaW5wdXRzID0gdGhpcy5pbnB1dHMuY29uY2F0KHJpbnB1dHMpOyB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKiogXG4gICAqIFVzZWQgdG8gcGFzcyBtdWx0aXBsZSBpbnB1dHMgYXQgb25jZSBmcm9tIEphdmFTY3JpcHQgdG8gYW4gUiBzY3JpcHQgdXNpbmcgXG4gICAqIG9uZSBvZiB0aGUgZGVmaW5lZCBgUklucHV0YCBmYWN0b3JpZXMuXG4gICAqXG4gICAqIEBtZXRob2QgcmlucHV0XG4gICAqIEBwYXJhbSB7UklucHV0fSByaW5wdXQgVGhlIERlcGxveVItc3BlY2lmaWMgZW5jb2RlZCBSIG9iamVjdCBkYXRhIGZvciB1c2UgXG4gICAqIG9uIGFuIEFQSSBjYWxsLiAgIFxuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmcuICAgXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICByaW5wdXQ6IGZ1bmN0aW9uIChyaW5wdXQpIHtcbiAgICBpZiAocmlucHV0KSB7IHRoaXMuaW5wdXRzLnB1c2gocmlucHV0KTsgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgbGlmZWN5Y2xlIG1ldGhvZC4gRmlyZXMgdGhlIGBkZXN0cm95YCBldmVudCwgcHJpb3IgdG8gaW52b2tpbmcgXG4gICAqIGRlc3RydWN0b3JzIGZvciB0aGUgY2xhc3MgaGllcmFyY2h5LiBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIGAucmVsZWFzZSgpYFxuICAgKiBpcyBjYWxsZWQuXG4gICAqXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi9cbiAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKTtcbiAgICAgIHRoaXMub2ZmQWxsKCk7XG4gICAgXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykge1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IFxuICAgICAgICAgIHRoaXNba2V5XSA9IG51bGw7IFxuICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoKGVycikge31cbiAgfSwgIFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGUgbWV0aG9kc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIF9jbGVhcjogZnVuY3Rpb24oKSB7ICAgIFxuICAgIHRoaXMucGFyYW1zICAgPSB7fTtcbiAgICB0aGlzLmlucHV0cyAgID0gW107XG4gICAgdGhpcy5vdXRwdXRzICA9IFtdO1xuICAgIHRoaXMucnN0cmVhbSAgPSBmYWxzZTtcbiAgICB0aGlzLmRlbGF5ZWQgID0gZmFsc2U7XG4gICAgdGhpcy5hcGkgICAgICA9IG51bGw7ICAgIFxuICAgIHRoaXMuZmlsZSAgICAgPSBudWxsOyAgXG4gICAgdGhpcy5lbnRpdGllcyA9IG51bGw7XG4gICAgdGhpcy5pb0ZpbHRlciA9IG51bGw7XG4gIH0sIFxuXG4gIC8qKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIF9wcmVwUmVxdWVzdDogZnVuY3Rpb24gKHJlc3BvbnNlQ2hhaW4sIGFyZ3MpIHtcbiAgICB2YXIgcmVxICA9IHRoaXMucmVxLFxuICAgICAgICBmaWxlID0gdGhpcy5maWxlO1xuXG4gICAgLy8gc2V0IHRoZSByZXF1ZXN0IHR5cGUgICAgXG4gICAgaWYgKHRoaXMuYXBpLnVwbG9hZCkge1xuICAgICAgIC8vIElmIHRoZSBlbnYgaXMgdGhlIEJyb3dzZXIgdGhlcmUgaXMgbm8gbmVlZCB0byBtYW51YWxseSBzZXQgdGhlXG4gICAgICAgLy8gQ29udGVudC1UeXBlLiBUaGUgYnJvd3NlciB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBcbiAgICAgICAvLyBcIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PS4uLlwiIHZhbHVlLiBJZiB0aGUgZW52IGlzIE5vZGUgd2UgbmVlZFxuICAgICAgIC8vIHRvIHNldCBpdCBtYW51YWxseS5cbiAgICAgICBpZiAoIXdpbikgeyB0aGlzLnJlcS50eXBlKCdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7IH0gICAgXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcS50eXBlKCdmb3JtJyk7XG4gICAgfSAgICBcblxuICAgIHJlcS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsgXG4gICAgICBlcnIgPSBlcnIgfHwgeyAgY29kZTogJ1VOS05PV04gQ09ERScsIHRleHQ6ICdVTktOT1dOIEVSUk9SJyB9O1xuXG4gICAgICB0aGlzLl9oYW5kbGVFcnJvcih7IFxuICAgICAgICBzdGF0dXM6IGVyci5jb2RlIHx8ICdVTktOT1dOIENPREUnLFxuICAgICAgICB0ZXh0OiBlcnJcbiAgICAgIH0pO1xuICAgIH0uYmluZCh0aGlzKSk7ICAgIFxuXG4gICAgdGhpcy5zaGFyZShhcmdzID8gYXJncy5fX2Nvb2tpZXNfXyA6IG51bGwpO1xuXG4gICAgLy8gYXJndW1lbnRzIHJldHVybmVkIGZyb20gcHJldiByZXF1ZXN0J3MgaW8oKS5lbmQoZnVuY3Rpb24oKSB7IHJldHVybiB4OyB9KVxuICAgIGlmIChhcmdzKSB7IFxuICAgICAgIHRoaXMuZGF0YShhcmdzKTtcbiAgICB9IFxuXG4gICAgaWYgKHRoaXMuaW5wdXRzLmxlbmd0aCA+IDApIHsgXG4gICAgICB0aGlzLmRhdGEoeyBpbnB1dHM6IGVuY29kZXIuZW5jb2RlKHRoaXMuaW5wdXRzKSB9KTsgXG4gICAgfVxuICBcbiAgICBpZiAodGhpcy5vdXRwdXRzLmxlbmd0aCA+IDApIHsgXG4gICAgICB0aGlzLmRhdGEoeyByb2JqZWN0czogdGhpcy5vdXRwdXRzLmpvaW4oKSB9KTsgXG4gICAgfSAgICBcblxuICAgIGlmICh0aGlzLmNvb2tpZXMpIHsgICAgIFxuICAgICAgdGhpcy5jb29raWVzLmZvckVhY2goIGZ1bmN0aW9uKGMpIHsgcmVxLnNldCgnQ29va2llJywgYyk7IH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFwaS51cGxvYWQpIHsgICAgXG4gICAgICBmb3IodmFyIHAgaW4gdGhpcy5wYXJhbXMpIHtcbiAgICAgICAgcmVxLmZpZWxkKHAsICh0aGlzLnBhcmFtc1twXSB8fCB0aGlzLnBhcmFtc1twXSA9PT0gZmFsc2UpID8gXG4gICAgICAgICAgIHRoaXMucGFyYW1zW3BdICsgJycgOiAnJyk7XG4gICAgICB9IFxuICAgICAgcmVxLmF0dGFjaCgnZmlsZScsIHRoaXMucnN0cmVhbSA/IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZSkgOiBmaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxW3RoaXMuYXBpLm1ldGhvZCA9PT0gJ0dFVCcgPyAncXVlcnknIDogJ3NlbmQnXSh0aGlzLnBhcmFtcyk7XG4gICAgfSBcbiAgfSxcblxuICAvKipcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuICBfaGFuZGxlRXJyb3I6IGZ1bmN0aW9uIChyYXcpIHtcbiAgICB2YXIgc3RhdCAgPSByYXcuc3RhdHVzLFxuICAgICAgICByZXMgICA9IChyYXcuYm9keSAmJiByYXcuYm9keS5kZXBsb3lyID8gcmF3LmJvZHkgOiByYXcpLFxuICAgICAgICBlcnJvciA9ICgoc3RhdCAhPT0gMjAwKSB8fCByZXMuZGVwbG95ciAmJiAhcmVzLmRlcGxveXIucmVzcG9uc2Uuc3VjY2Vzcyk7XG5cbiAgICAvLyAtLSBIYW5kbGUgZXJyb3JzIC0tXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXMgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7IFxuICAgICAgICAgIHJldHVybiB1dGlscy5nZXQodGhpcy5kZXBsb3lyLnJlc3BvbnNlLCBrZXkpOyBcbiAgICAgICAgfSxcbiAgICAgICAgZGVwbG95cjogeyAgICAgICAgICBcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBjYWxsOiB0aGlzLmFwaVsnY2FsbCddLFxuICAgICAgICAgICAgZXJyb3JDb2RlOiByZXMuZGVwbG95ciA/IHJlcy5kZXBsb3lyLnJlc3BvbnNlLmVycm9yQ29kZSA6IHN0YXQsXG4gICAgICAgICAgICBlcnJvcjogcmVzLmRlcGxveXIgPyByZXMuZGVwbG95ci5yZXNwb25zZS5lcnJvciA6IHJlcy50ZXh0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBMb2dnZXIuZXJyb3IoJ2Vycm9yKCknLCB0aGlzLmFwaSwgcmVzLCByYXcpO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2Vycm9yKCknLCB0aGlzLmFwaSwgcmVzLCByYXcpO1xuXG4gICAgICAvLyAtLSBub3RpZnkgZ2xvYmFsIGVycm9ycyBmaXJzdCAoaWYgYW55KSBmb3IgdGhpcyBjYWxsIC0tICAgICAgXG4gICAgICBpZiAodGhpcy5nbG9iYWxFdnRzKSB7XG4gICAgICAgIHJhaXNlR2xvYmFsRXJyb3JzKHRoaXMuYXBpWydjYWxsJ10sIHJlcyk7ICAgICAgICBcbiAgICAgIH1cblxuICAgICAgLy8gLS0gdHJhbmFjdGlvbiBsZXZlbCBIVFRQIG9yIERlcGxveVIgZXJyb3JzIGNvbWUgbmV4dCAtLSAgICBcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCByZXMpO1xuICAgICAgdGhpcy5lbWl0KCdkZXBsb3lyLWlvOicgKyByZXMuZGVwbG95ci5yZXNwb25zZS5lcnJvckNvZGUsIHJlcyk7XG4gICAgICB0aGlzLmRlZmVycmVkLnJlamVjdChyZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxufSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy8gSW5jbHVkZSB0aGUgYGRlcHJlY2F0ZWRgIGpzRGVwbG95UiBmb3Igbm93LlxuaWYgKHdpbikge1xuICB3aW5kb3cuUmV2b2x1dGlvbiA9IHdpbmRvdy5SZXZvbHV0aW9uIHx8IHJlcXVpcmUoJy4vbGliL2RlcHJlY2F0ZWQnKTtcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEV4cG9zZSBmb3IgYSBjbGVhbmVyIGNsaWVudCBhcGkgaW50byBEZXBsb3lSXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qKlxuICAgKiBFeHBvc2VzIHRoZSBgRGVwbG95UmAgb2JqZWN0IGZvciBleHRlbmRpbmcuXG4gICAqXG4gICAqIGBgYHZhciBEZXBsb3lSID0gcmVxdWlyZSgnZGVwbG95cicpLkRlcGxveVI7YGBgXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQGFwaSBwdWJsaWNcbiAgICogQHJldHVybiB7RGVwbG95Un0gVGhlIGBEZXBsb3lSYCBvYmplY3QuXG4gICAqLyAgIFxuICBEZXBsb3lSOiBEZXBsb3lSLFxuXG4gIC8qKlxuICAgKiBFeHBvc2VzIHRoZSBzdXBwb3J0ZWQgRGVwbG95UiBBUElzLlxuICAgKlxuICAgKiBAbWV0aG9kIGFwaXNcbiAgICogQHBhcmFtIHtCb29sZWFufSBmbGF0IChvcHRpb25hbCkgaWYgYHRydWVgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGp1c3QgdGhlIFxuICAgKiBBUEkncyBlbmRwb2ludCBwcm9wZXJ0aWVzLCBmb3IgZXhhbXBsZTogXG4gICAqIGBgYFxuICAgKiBbJy9yL3VzZXIvbG9naW4nLCAnL3IvdXNlci9sb2dvdXQnLCAnL3IvdXNlci9hYm91dCcsIC4uLl1cbiAgICogYGBgXG4gICAqIEBzdGF0aWNcbiAgICogQGFwaSBwdWJsaWNcbiAgICogQHJldHVybiB7T2JqZWN0fEFycmF5fSBUaGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBEZXBsb3lSIHNlcnZlci4gICAgICBcbiAgICovICBcbiAgYXBpczogZnVuY3Rpb24oZmxhdCkge1xuICAgIHJldHVybiBmbGF0ID8gT2JqZWN0LmtleXMoYXBpcykgOiBhcGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgc3RhdGljIG1ldGhvZCBmb3IgY29uZmlndXJpbmcgYWxsIERlcGxveVIgcmVxdWVzdHMuIFNldHRpbmdzIFxuICAgKiBtYWRlIGhlcmUgYXJlIGFwcGxpZWQgZ2xvYmFsbHkgYWNyb3NzIGV2ZXJ5IHJlcXVlc3QuXG4gICAqXG4gICAqIEBtZXRob2QgY29uZmlndXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvYmplY3QgbGl0ZXJhbCBjb25maWd1cmF0aW9uIGhhc2guIFxuICAgKiBAc3RhdGljXG4gICAqIEBjaGFpbmFibGVcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIGNvbmZpZ3VyZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgZm9yICh2YXIgaSBpbiBvcHRpb25zKSB7IGdsb2JhbE9wdGlvbnMuc2V0KGksIG9wdGlvbnNbaV0pOyB9XG5cbiAgICAvLyBhc3NlcnQgZ2xvYmFsIGNvb2tpZXMgYXJlIGVtcHR5IGlmIGdsb2JhbCBgc3RpY2t5YCBqc2Vzc2lvbmlkIGlzIG9mZlxuICAgIGlmICghZ2xvYmFsT3B0aW9ucy5zdGlja3kpICB7IGdsb2JhbE9wdGlvbnMuc2V0KCdjb29raWVzJywgbnVsbCk7IH1cblxuICAgIC8vIHR1cm4gZ2xvYmFsIGxvZ2dpbmcgb258b2ZmIChvZmYgYnkgZGVmYXVsdClcbiAgICBMb2dnZXIuc2V0TGV2ZWwoZ2xvYmFsT3B0aW9ucy5sb2dnaW5nID8gTG9nZ2VyLkRFQlVHIDogTG9nZ2VyLk9GRik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IElPIHJlcXVlc3RzIHRvIGBEZXBsb3lSYC5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgICAgXG4gICAqICAgIGRlcGxveXIuaW8oJy9yL3VzZXIvYWJvdXQnKS5lbmQoY2FsbGJhY2spO1xuICAgKiBgYGBcbiAgICpcbiAgICogQG1ldGhvZCBpb1xuICAgKiBAcGFyYW0ge1N0cmluZ30gYXBpIE9uZSBvZiB0aGUgc3VwcG9ydGVkIERlcGxveVIgQVBJcy5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBUaGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBEZXBsb3lSIHNlcnZlci5cbiAgICogQGFwaSBwdWJsaWMgICBcbiAgICovXG4gIGlvOiBmdW5jdGlvbihhcGkpIHsgIFxuICAgIHJldHVybiBEZXBsb3lSLm5ldyhhcGkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBzaWduIHRoZSB1c2VyIGluIGJ5IGF1dGhlbnRpY2F0aW5nIHRoZSBjcmVkZW50aWFscyBcbiAgICogd2l0aCB0aGUgRGVwbG95UiBzZXJ2ZXIuICAgXG4gICAqXG4gICAqIEBtZXRob2QgYXV0aFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdXNlcm5hbWUgU3BlY2lmaWVzIHRoZSB1c2VybmFtZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhc3N3b3JkIFNwZWNpZmllcyB0aGUgcGFzc3dvcmQuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybiB7RGVwbG95Un0gVGhlIEhUVFAgcmVxdWVzdCB0byB0aGUgRGVwbG95UiBzZXJ2ZXIuICAgXG4gICAqIEBhcGkgcHVibGljICAgXG4gICAqLyAgIFxuICBhdXRoOiBmdW5jdGlvbih1biwgcHcpIHtcbiAgICB2YXIgZGF0YSA9IHsgdXNlcm5hbWU6IHVuLCBwYXNzd29yZDogcHcgfTtcbiAgICByZXR1cm4gRGVwbG95Ui5uZXcoJy9yL3VzZXIvbG9naW4nKS5kYXRhKGRhdGEpLmVuZCgpOyAgICBcbiAgfSxcblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gc2lnbiB0aGUgdXNlciBpbiBieSBhdXRoZW50aWNhdGluZyB0aGUgY3JlZGVudGlhbHMgXG4gICAqIHdpdGggdGhlIERlcGxveVIgc2VydmVyLiAgIFxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBcbiAgICogICAgZGVwbG95ci5zY3JpcHQoJy90ZXN0dXNlci9yb290L3JlZHVjZS5SJylcbiAgICogICAgZGVwbG95ci5zY3JpcHQoeyBmaWxlbmFtZTogJ3JlZHVjZS5SJywgYXV0aG9yOiAndGVzdHVzZXInLFxuICAgKiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogJ3Jvb3QnfSlcbiAgICogICAgZGVwbG95ci5zY3JpcHQoJ3JlZHVjZS5SJywgJ3Rlc3R1c2VyJywgJ3Jvb3QnKVxuICAgKiAgICBkZXBsb3lyLnNjcmlwdCgnL3Rlc3R1c2VyL3Jvb3QvcmVkdWNlLlInLCBwcm9qZWN0KSAgICAgXG4gICAqIGBgYCAgIFxuICAgKlxuICAgKiBAbWV0aG9kIHNjcmlwdFxuICAgKiBAcGFyYW0ge0FyZ3VtZW50c30gYXJndW1lbnRzIEFyZ3VtZW50cyB0byBkZWZpbmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBzY3JpcHQgXG4gICAqIGZvciBleGVjdXRpb24uXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybiB7RGVwbG95Un0gVGhlIEhUVFAgcmVxdWVzdCB0byB0aGUgRGVwbG95UiBzZXJ2ZXIuICAgXG4gICAqIEBhcGkgcHVibGljICAgXG4gICAqLyAgICAgXG4gIHNjcmlwdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSB1dGlscy5zaWduYXR1cmUoYXJndW1lbnRzKSxcbiAgICAgICAgb3B0cyA9IGFyZ3Mub3B0cyxcbiAgICAgICAgYXBpICA9IGFyZ3MuYXBpOyAgXG5cbiAgICAvLyBjb252ZW5pZW5jZSAtIGlmIHRoZSBwcm9qZWN0IGlzIGEgYm9vbGVuIGB0cnVlYCByYXRoZXIgdGhhbiBhIHBpZCwgZmlyc3RcbiAgICAvLyBjcmVhdGUgYSBuZXcgcHJvamVjdCBhbmQgdGhlbiBwcmVwYXJlIHRoZSBwcm9qZWN0IGFwaSBjYWxsIHRvIGV4ZWN1dGVcbiAgICBpZiAoYXJncy5jcmVhdGUpIHtcbiAgICAgIHJldHVybiBEZXBsb3lSLm5ldygnL3IvcHJvamVjdC9jcmVhdGUnKVxuICAgICAgICAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IHByb2plY3Q6IHJlcy5nZXQoJ3Byb2plY3QnKS5wcm9qZWN0IH07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgIC5pbyhhcGkpXG4gICAgICAgICAgICAgICAuZGF0YShvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIERlcGxveVIubmV3KGFwaSkuZGF0YShvcHRzKTtcbiAgICB9XG4gIH0sICBcblxuICAvKipcbiAgICogUnVuIGFuIHNlcmllcyBvZiBjaGFpbmVkIERlcGxveVIgcmVxdWVzdHMgaW4gc2VxdWVuY2UgYW5kIHdpdGhvdXQgb3ZlcmxhcC4gICAgICAgXG4gICAqXG4gICAqIEBtZXRob2QgcGlwbGluZVxuICAgKiBAcGFyYW0ge0FycmF5fSB0YXNrcyBTcGVjaWZpZXMgdGhlIGxpc3Qgb2YgYEZ1bmN0aW9uYCB0YXNrcy5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2Ugd3JhcHBpbmcgdGhlIHJlc29sdXRpb24gb2YgZWl0aGVyIFwicmVzb2x2ZVwiIG9yXG4gICAqIFwicmVqZWN0XCIgY2FsbGJhY2suXG4gICAqIEBhcGkgcHVibGljICAgXG4gICAqL1xuICBwaXBlbGluZTogZnVuY3Rpb24oY2hhaW5zKSB7ICAgICAgXG4gICAgdmFyIGRlcGxveXIgID0gdGhpcyxcbiAgICAgICAgZGVmZXJyZWQgPSBEKCksXG4gICAgICAgIHEgICAgICAgID0gbmV3IFF1ZXVlKCksXG4gICAgICAgIHJlc3VsdHMgID0gW10sXG4gICAgICAgIGVycm9ycyAgID0gW10sXG4gICAgICAgIE5PT1AgICAgID0gbnVsbCwgLy8gTk9PUCBlcnJvcnN8cmVzdWx0cyBmb3IgW2FdIGJhdGNoIHJlcXVlc3QgY2hhaW5cbiAgICAgICAgb3JpZyAgICAgPSB7XG4gICAgICAgICAgc3RpY2t5OiBnbG9iYWxPcHRpb25zLnN0aWNreSxcbiAgICAgICAgICBjb29raWVzOiBnbG9iYWxPcHRpb25zLmNvb2tpZXNcbiAgICAgICAgfTtcblxuICAgIC8vIG1ha2UgYSBjb3B5XG4gICAgY2hhaW5zID0gY2hhaW5zLnNsaWNlKDApO1xuXG4gICAgLy8gdHVybiBzdGlja3kgc2Vzc2lvbiBmb3IgdGhlc2UgcmVxdWVzdCAoaGFja3kpXG4gICAgZGVwbG95ci5jb25maWd1cmUoIHsgc3RpY2t5OiB0cnVlIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkKCkge1xuICAgICAgcS5hZGQoZnVuY3Rpb24oKSB7IFxuICAgICAgICBjaGFpbnMuc2hpZnQoKS5kcmFpbigpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGNoYWluKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGNoYWluKTsgIFxuICAgICAgICAgIGVycm9ycy5wdXNoKE5PT1ApOyAgICAgICAgICAgXG4gICAgICAgICAgaWYgKHEuaXNFbXB0eSgpKSB7IFxuICAgICAgICAgICAgZGVwbG95ci5jb25maWd1cmUob3JpZyk7IC8vIHJlc2V0XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHsgcmVzdWx0czogcmVzdWx0cywgZXJyb3JzOiBlcnJvcnMgfSk7IFxuICAgICAgICAgIH0gIFxuXG4gICAgICAgICAgcS50YWtlKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycikgeyAgICAgICAgICBcbiAgICAgICAgICByZXN1bHRzLnB1c2goTk9PUCk7IFxuICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgLy8gcmVqZWN0aW9ucyBhcmUgb25seSBtZXQgd2hlbiB0aGV5IFthbGxdIGZhaWxcbiAgICAgICAgICBpZiAocS5pc0VtcHR5KCkgJiYgcmVzdWx0cy5sZW5ndGggPT09IDApIHsgXG4gICAgICAgICAgICBkZXBsb3lyLmNvbmZpZ3VyZShvcmlnKTsgLy8gcmVzZXRcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcnMpOyBcbiAgICAgICAgICB9ICBcbiAgICAgICAgICBxLnRha2UoKTtcbiAgICAgICAgfSk7ICAgICAgIFxuICAgICAgfSwgbnVsbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBhIHNlcSBxdWV1ZSBmb3IgYmV0dGVyIGhhbmRsaW5nXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGNoYWlucy5sZW5ndGg7IGkrKykgeyBhZGQoKTsgfVxuXG4gICAgLy8gc3RhcnQ6IGRlcXVldWUgZmlyc3QgaXRlbSBhbmQgcnVuIGl0XG4gICAgcS50YWtlKCk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgfSxcblxuICAvKipcbiAgICogVGhlIGV2ZW50IHN0cmVhbSBBUEkgaXMgdW5pcXVlIHdpdGhpbiB0aGUgRGVwbG95UiBBUEkgYXMgaXQgc3VwcG9ydHMgcHVzaCBcbiAgICogbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBEZXBsb3lSIHNlcnZlciB0byBjbGllbnQgYXBwbGljYXRpb25zLiBOb3RpZmljYXRpb25zIFxuICAgKiBjb3JyZXNwb25kIHRvIGRpc2NyZXRlIGV2ZW50cyB0aGF0IG9jY3VyIHdpdGhpbiB0aGUgRGVwbG95UiBzZXJ2ZXIuIFRoZXJlIFxuICAgKiBhcmUgZm91ciBkaXN0aW5jdCBldmVudCBjYXRlZ29yaWVzOlxuICAgKiBcbiAgICogLSBTdHJlYW0gTGlmZWN5Y2xlIGV2ZW50c1xuICAgKiAtIEV4ZWN1dGlvbiBldmVudHNcbiAgICogLSBKb2IgTGlmZWN5Y2xlIGV2ZW50c1xuICAgKiAtIE1hbmFnZW1lbnQgZXZlbnRzXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIGBgYFxuICAgKiBkZXBsb3lyLmVzKHsgdXNlcm5hbWU6ICd0ZXN0dXNlcicsIHBhc3N3b3JkOiAnc2VjcmV0JyB9KVxuICAgKiAgICAvLyAtLSBjb25uZWN0aW9uIGNob2ljZXMgZm9yIGV2ZW50IHR5cGVzIC0tXG4gICAqICAgIC5tYW5hZ2VtZW50KCkgIC8vLnNlc3Npb24oKSB8IC5hbGwoKSB8IC5wcm9qZWN0KGlkKSB8IC5qb2IoaWQpXG4gICAqICAgIC5vbignZXM6Z3JpZEhlYXJ0YmVhdCcsIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICogICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09Jyk7XG4gICAqICAgICAgICBjb25zb2xlLmxvZygnZXM6Z3JpZEhlYXJ0YmVhdCcpO1xuICAgKiAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT0nKTsgICAgICAgICAgXG4gICAqICAgICB9KVxuICAgKiAgICAgLm9wZW4oKTtcbiAgICogYGBgXG4gICAqIFxuICAgKiBAbWV0aG9kIGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvYmplY3QgbGl0ZXJhbCBjb25maWd1cmF0aW9uIGhhc2guIFxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm4ge0V2ZW50U3RyZWFtfSBhIG5ldyBgRXZlbnRTdHJlYW1gIGZvciBiaW5kaW5nLlxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi8gIFxuICBlczogZnVuY3Rpb24ob3B0aW9ucykgeyAgICBcbiAgICB2YXIgc3RyZWFtID0gRXZlbnRTdHJlYW0ubmV3KGdsb2JhbE9wdGlvbnMuaG9zdCwgb3B0aW9ucyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVzZXJuYW1lICYmIG9wdGlvbnMucGFzc3dvcmQpIHtcbiAgICAgIHZhciBydXNlciA9IHRoaXMuYXV0aChvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgIHJ1c2VyLmVuc3VyZShmdW5jdGlvbigpIHsgXG4gICAgICAgIHN0cmVhbS5zaGFyZShydXNlci5nZXRDb29raWVzKCkpO1xuICAgICAgICBzdHJlYW0uZmx1c2goKTsgXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyZWFtO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBmYWN0b3J5IGZvciBjcmVhdGluZyBhIERlcGxveVItc3BlY2lmaWMgZW5jb2RlZCBSIG9iamVjdCB0byBiZSBcbiAgICogc2VudCBhcyBpbnB1dCBwYXJhbWV0ZXJzIHRvIGFuIFIgc2NyaXB0LlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBcbiAgICogICAgdmFyIHJpbnB1dCA9IGRlcGxveXIuUklucHV0LmxvZ2ljYWwoJ2xvZ2ljYWxfbmFtZScsIHRydWUpO1xuICAgKiAgICB2YXIgcmlucHV0ID0gZGVwbG95ci5SSW5wdXQubnVtZXJpYygnbnVtZXJpY19uYW1lJywgMTAuNSk7XG4gICAqICAgIHZhciByaW5wdXQgPSBkZXBsb3lyLlJJbnB1dC5pbnRlZ2VyKCdpbnRlZ2VyX25hbWUnLCA1KTtcbiAgICogICAgdmFyIHJpbnB1dCA9IGRlcGxveXIuUklucHV0LmNoYXJhY3RlcignY2hhcmFjdGVyX25hbWUnLCAnSGVsbG8nKTtcbiAgICogICAgLy8gZWN0Li4uXG4gICAqIGBgYFxuICAgKiBAcHJvcGVydHkgUklucHV0XG4gICAqIEBzdGF0aWNcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIFJJbnB1dDoge1xuICAgIG51bWVyaWM6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLm51bWVyaWMoKTtcbiAgICB9LFxuXG4gICAgaW50ZWdlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuaW50ZWdlcigpO1xuICAgIH0sXG5cbiAgICBsb2dpY2FsOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5sb2dpY2FsKCk7XG4gICAgfSxcblxuICAgIGNoYXJhY3RlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuY2hhcmFjdGVyKCk7XG4gICAgfSxcblxuICAgIGRhdGU6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmRhdGUoKTtcbiAgICB9LFxuXG4gICAgcG9zaXhjdDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkucG9zaXhjdCgpO1xuICAgIH0sICBcblxuICAgIG51bWVyaWNWZWN0b3I6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubnVtZXJpY1ZlY3RvcigpO1xuICAgIH0sIFxuXG4gICAgaW50ZWdlclZlY3RvcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuaW50ZWdlclZlY3RvcigpO1xuICAgIH0sXG5cbiAgICBsb2dpY2FsVmVjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubG9naWNhbFZlY3RvcigpO1xuICAgIH0sXG5cbiAgICBjaGFyYWN0ZXJWZWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcbiAgICAgIHJldHVybiBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5jaGFyYWN0ZXJWZWN0b3IoKTtcbiAgICB9LCAgXG5cbiAgICBkYXRlVmVjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuZGF0ZVZlY3RvcigpO1xuICAgIH0sICBcblxuICAgIHBvc2l4Y3RWZWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcbiAgICAgIHJldHVybiBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5wb3NpeGN0VmVjdG9yKCk7XG4gICAgfSxcblxuICAgIGxpc3Q6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmxpc3QoKTsgXG4gICAgfSxcblxuICAgIGRhdGFmcmFtZTogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7IFxuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmRhdGFmcmFtZSgpO1xuICAgIH0sXG4gIFxuICAgIGZhY3RvcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBsZXZlbHMsIGxhYmVscykge1xuICAgICAgdmFyIG9wdHMgPSB7IGxldmVsczogbGV2ZWxzLCBsYWJlbHM6IGxhYmVscyB9O1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUsIG9wdHMpLmZhY3RvcigpO1xuICAgIH0sXG5cbiAgICBvcmRlcmVkOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGxldmVscywgbGFiZWxzKSB7XG4gICAgICB2YXIgb3B0cyA9IHsgbGV2ZWxzOiBsZXZlbHMsIGxhYmVsczogbGFiZWxzIH07XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSwgb3B0cykub3JkZXJlZCgpO1xuICAgIH0sXG5cbiAgICBudW1lcmljTWF0cml4OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubnVtZXJpY01hdHJpeCgpO1xuICAgIH0sXG5cbiAgICBpbnRlZ2VyTWF0cml4OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuaW50ZWdlck1hdHJpeCgpO1xuICAgIH0sXG5cbiAgICBsb2dpY2FsTWF0cml4OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubG9naWNhbE1hdHJpeCgpO1xuICAgIH0sXG5cbiAgICBjaGFyYWN0ZXJNYXRyaXg6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmNoYXJhY3Rlck1hdHJpeCgpO1xuICAgIH1cbiAgfVxufTtcbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW1SbGNHeHZlWEl1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxSVZ4dUlDb2dRMjl3ZVhKcFoyaDBJQ2hES1NBeU1ERXdMVEl3TVRVZ1lua2dVbVYyYjJ4MWRHbHZiaUJCYm1Gc2VYUnBZM01nU1c1akxseHVJQ3BjYmlBcUlGUm9hWE1nY0hKdlozSmhiU0JwY3lCc2FXTmxibk5sWkNCMGJ5QjViM1VnZFc1a1pYSWdkR2hsSUhSbGNtMXpJRzltSUZabGNuTnBiMjRnTWk0d0lHOW1JSFJvWlZ4dUlDb2dRWEJoWTJobElFeHBZMlZ1YzJVdUlGUm9hWE1nY0hKdlozSmhiU0JwY3lCa2FYTjBjbWxpZFhSbFpDQlhTVlJJVDFWVVhHNGdLaUJCVGxrZ1JWaFFVa1ZUVXlCUFVpQkpUVkJNU1VWRUlGZEJVbEpCVGxSWkxDQkpUa05NVlVSSlRrY2dWRWhQVTBVZ1QwWWdUazlPTFVsT1JsSkpUa2RGVFVWT1ZDeGNiaUFxSUUxRlVrTklRVTVVUVVKSlRFbFVXU0JQVWlCR1NWUk9SVk5USUVaUFVpQkJJRkJCVWxSSlExVk1RVklnVUZWU1VFOVRSUzRnVUd4bFlYTmxJSEpsWm1WeUlIUnZJSFJvWlZ4dUlDb2dRWEJoWTJobElFeHBZMlZ1YzJVZ01pNHdJQ2hvZEhSd09pOHZkM2QzTG1Gd1lXTm9aUzV2Y21jdmJHbGpaVzV6WlhNdlRFbERSVTVUUlMweUxqQXBJR1p2Y2lCdGIzSmxJRnh1SUNvZ1pHVjBZV2xzY3k1Y2JpQXFMMXh1WEc1MllYSWdkMmx1SUNBZ0lDQWdJQ0FnUFNBb2RIbHdaVzltSUhkcGJtUnZkeUFoUFQwZ0ozVnVaR1ZtYVc1bFpDY3BMQ0FnSUZ4dUlDQWdJSEpsY1hWbGMzUWdJQ0FnSUQwZ2NtVnhkV2x5WlNnbmMzVndaWEpoWjJWdWRDY3BMRnh1SUNBZ0lFUWdJQ0FnSUNBZ0lDQWdJRDBnY21WeGRXbHlaU2duWkM1cWN5Y3BMRnh1SUNBZ0lHWnpJQ0FnSUNBZ0lDQWdJRDBnY21WeGRXbHlaU2duWm5NbktTeGNiaUFnSUNCaGNHbHpJQ0FnSUNBZ0lDQTlJSEpsY1hWcGNtVW9KeTR2WVhCcGN5NXFjMjl1Snlrc0lGeHVJQ0FnSUVWMlpXNTBVM1J5WldGdElEMGdjbVZ4ZFdseVpTZ25MaTlzYVdJdlpYTW5LU3hjYmlBZ0lDQjFkR2xzY3lBZ0lDQWdJQ0E5SUhKbGNYVnBjbVVvSnk0dmJHbGlMM1YwYVd4ekp5a3NYRzRnSUNBZ1RHRnVaeUFnSUNBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOXNZVzVuSnlrc0lDQWdYRzRnSUNBZ1RHOW5aMlZ5SUNBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOXNiMmRuWlhJbktTd2dJQ0JjYmlBZ0lDQlJkV1YxWlNBZ0lDQWdJQ0E5SUhKbGNYVnBjbVVvSnk0dmJHbGlMM0YxWlhWbEp5a3NYRzRnSUNBZ1JXMXBkSFJsY2lBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOWxiV2wwZEdWeUp5a3NYRzRnSUNBZ1pXNWpiMlJsY2lBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOWxibU52WkdWeUp5a3NYRzRnSUNBZ1FtRnpaU0FnSUNBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOXpaV3htYVhOb0p5a3VRbUZ6WlN4Y2JpQWdJQ0JTU1c1d2RYUWdJQ0FnSUNBOUlISmxjWFZwY21Vb0p5NHZiR2xpTDNKcGJuQjFkQ2NwTENBZ0lDQmNiaUFnSUNCU1NXNXdkWFJ6SUNBZ0lDQTlJSEpsY1hWcGNtVW9KeTR2YkdsaUwzSnBibkIxZEhNbktTeGNiaUFnSUNCdFpYSm5aU0FnSUNBZ0lDQTlJSFYwYVd4ekxtMWxjbWRsTzF4dVhHNHZLbHh1SUNvZ1ZIVnliaUJuYkc5aVlXd2diRzluWjJsdVp5QnZabVlnWW5rZ1pHVm1ZWFZzZEZ4dUlDb3ZYRzVNYjJkblpYSXVjMlYwVEdWMlpXd29URzluWjJWeUxrOUdSaWs3WEc1Y2JpOHFYRzRnS2lCSGJHOWlZV3dnYjNCMGFXOXVjeUIwYUdGMElIQmxjbk5wYzNRZ2RHaHliM1ZuYUNCaGJHd2dSR1Z3Ykc5NVVpQnlaWEYxWlhOMGN5NWNiaUFxTDF4dWRtRnlJR2RzYjJKaGJFOXdkR2x2Ym5NZ1BTQjdJRnh1SUNCamIzSnpPaUJtWVd4elpTeGNiaUFnYkc5bloybHVaem9nWm1Gc2MyVXNYRzRnSUhOMGFXTnJlVG9nWm1Gc2MyVXNYRzRnSUdOdmIydHBaWE02SUc1MWJHd3NYRzRnSUdodmMzUTZJQ2NuTEZ4dUlDQmhiR3h2ZDFObGJHWlRhV2R1WldSVFUweERaWEowT2lCbVlXeHpaU3hjYmlBZ2JXRjRVbVZ4ZFdWemRITTZJRzUxYkd3c0lDOHZJRzV2SUhOdlkydGxkQ0J3YjI5c2FXNW5JR2x1SUdoMGRIQXVRV2RsYm5SY2JpQWdaWFpsYm5Sek9udDlMRnh1SUNCelpYUTZJR1oxYm1OMGFXOXVLSEJ5YjNBc0lIWmhiSFZsS1NCN0lGeHVJQ0FnSUdsbUlDaHdjbTl3SUNFOVBTQW5jMlYwSnlrZ2V5QmNiaUFnSUNBZ0lHbG1JQ2h3Y205d0lEMDlQU0FuYUc5emRDY2dKaVlnZG1Gc2RXVXBJSHNnSUNBZ0lDQWdJQ0JjYmlBZ0lDQWdJQ0FnSUM4dklFSmxJRzF2Y21VZ1ptOXlaMmwyYVc1bklHOXVJSFJvWlNCbGJuUmxjbVZrSUVSbGNHeHZlVklnSjJWdVpIQnZhVzUwSnpwY2JpQWdJQ0FnSUNBZ0lDOHZJQ0FnTFNCb2RIUndLSE1wT2k4dlpHaHZjM1E2Y0c5eWRGeHVJQ0FnSUNBZ0lDQWdMeThnSUNBdElHaDBkSEFvY3lrNkx5OWthRzl6ZERwd2IzSjBMMlJsY0d4dmVYSmNiaUFnSUNBZ0lDQWdJQzh2SUNBZ0xTQmthRzl6ZERwd2IzSjBYRzRnSUNBZ0lDQWdJQ0F2THlBZ0lDMGdaR2h2YzNRNmNHOXlkQzlrWlhCc2IzbHlJQ0FnSUNBZ0lDQWdYRzRnSUNBZ0lDQWdJQ0IyWVd4MVpTQTlJSFpoYkhWbExuSmxjR3hoWTJVb0wxeGNMeW9rZkZ4Y0x5cGtaWEJzYjNseVhGd3ZLaVF2TENBbkp5azdYRzRnSUNBZ0lDQWdJQ0IyWVd4MVpTQTlJQ2h1WlhjZ1VtVm5SWGh3S0NkZUtHaDBkSEI4YUhSMGNITXBPaTh2Snl3Z0oya25LU2t1ZEdWemRDaDJZV3gxWlNrZ1B5QjJZV3gxWlNBNklGeHVJQ0FnSUNBZ0lDQWdJQ0FnSjJoMGRIQTZMeThuSUNzZ2RtRnNkV1U3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUhSb2FYTmJjSEp2Y0YwZ1BTQjJZV3gxWlRzZ1hHNGdJQ0FnZlNCY2JpQWdmVnh1ZlR0Y2JseHVMeXBjYmlBcUlGUm9aU0IwYjNBdGJHVjJaV3dnUkdWd2JHOTVVaUJCVUVrZ2NtVnpjRzl1YzJVZ1pXNTBhWFJwWlhNdVhHNGdLaTljYm5aaGNpQlVUMUJNUlZaRlRGOUZUbFJKVkVsRlV5QTlJRnRjYmlBZ0ozVnpaWEluTENCY2JpQWdKM0J5YjJwbFkzUW5MQ0JjYmlBZ0ozZHZjbXR6Y0dGalpTY3NJRnh1SUNBblpYaGxZM1YwYVc5dUp5d2dYRzRnSUNka2FYSmxZM1J2Y25rbkxDQmNiaUFnSjNKbGNHOXphWFJ2Y25rbkxDQmNiaUFnSjNCaFkydGhaMlZ6SnlCY2JsMDdYRzVjYmk4cVhHNGdLaUJPYjNScFpua2daMnh2WW1Gc0lFbFBJR1Z5Y205eUlHVjJaVzUwY3lCaFkyTmxjM05wWW14bElHSjVJR0ZzYkNCemRXSnpZM0pwWW1WeWN5QmhZM0p2YzNNZ2NtVnhkV1Z6ZEhNdVhHNGdLaTljYm1aMWJtTjBhVzl1SUhKaGFYTmxSMnh2WW1Gc1JYSnliM0p6S0dGd2FTd2djbVZ6S1NCN1hHNGdJSFpoY2lCamIyUmxJQ0FnSUQwZ2NtVnpMbVJsY0d4dmVYSWdQeUJ5WlhNdVpHVndiRzk1Y2k1eVpYTndiMjV6WlM1bGNuSnZja052WkdVZ09pQnlaWE11YzNSaGRIVnpMRnh1SUNBZ0lDQWdZMjl1ZEdWNGRDQTlJSFJvYVhNN1hHNWNiaUFnTHk4Z0xTMGdaMnh2WW1Gc0lHVjJaVzUwY3lCcFppQndjbTkyYVdSbFpDQXRMVnh1SUNCcFppQW9aMnh2WW1Gc1QzQjBhVzl1Y3k1bGRtVnVkSE1wSUh0Y2JpQWdJQ0JwWmlBb0lYSmxjeTVrWlhCc2IzbHlLU0I3WEc0Z0lDQWdJQ0J5WlhNZ1BTQnlaWE11ZEdWNGREdGNiaUFnSUNCOVhHNWNiaUFnSUNCamIyNTBaWGgwSUQwZ1oyeHZZbUZzVDNCMGFXOXVjeTVsZG1WdWRITXVZM1I0SUh4OElHTnZiblJsZUhRN1hHNWNiaUFnSUNBdkx5QXRMU0JuWlc1bGNtRnNJR2RzYjJKaGJDQm1ZV2xzZFhKbElDMHRYRzRnSUNBZ2FXWWdLR2RzYjJKaGJFOXdkR2x2Ym5NdVpYWmxiblJ6TG1WeWNtOXlLU0I3WEc0Z0lDQWdJQ0JuYkc5aVlXeFBjSFJwYjI1ekxtVjJaVzUwY3k1bGNuSnZjaTVoY0hCc2VTaGpiMjUwWlhoMExDQmJZWEJwTENCeVpYTmRLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUF0TFNCSVZGUlFJRzl5SUVSbGNHeHZlVklnWjJ4dlltRnNJR1Z5Y205eWN5QXRMU0FnSUNCY2JpQWdJQ0JwWmlBb1oyeHZZbUZzVDNCMGFXOXVjeTVsZG1WdWRITmJZMjlrWlYwcElIdGNiaUFnSUNBZ0lHZHNiMkpoYkU5d2RHbHZibk11WlhabGJuUnpXMk52WkdWZExtRndjR3g1S0dOdmJuUmxlSFFzSUZ0aGNHa3NJSEpsYzEwcE8xeHVJQ0FnSUgxY2JpQWdmVnh1ZlZ4dVhHNHZLaXBjYmlBcUlGUm9aU0JnUkdWd2JHOTVVbUFnY21WeGRXVnpkQ0JqYkdGemN5QnBjeUJoSUhWMGFXeHBkSGtnZEdoaGRDQmljbTlyWlhKeklFaFVWRkFnY21WeGRXVnpkSE1nZEdoeWIzVm5hQ0JoSUZ4dUlDb2djMmx0Y0d4cFptbGxaQ0JtYkhWcFpDQnBiblJsY21aaFkyVWdkRzhnUkdWd2JHOTVVaTVjYmlBcVhHNGdLaUJBYlc5a2RXeGxJR1JsY0d4dmVYSmNiaUFxSUVCbWIzSWdaR1Z3Ykc5NWNseHVJQ292WEc1MllYSWdSR1Z3Ykc5NVVpQTlJRUpoYzJVdVpYaDBaVzVrS0VWdGFYUjBaWElzSUZKSmJuQjFkSE1zSUh0Y2JseHVJQ0F2S2lwY2JpQWdJQ29nVkdobElHQkVaWEJzYjNsU1lDQlNaWEYxWlhOMElHTnNZWE56SUdseklHRWdkWFJwYkdsMGVTQjBhR0YwSUdKeWIydGxjbk1nU0ZSVVVDQnlaWEYxWlhOMGN5QjBhSEp2ZFdkb0lGeHVJQ0FnS2lCaElITnBiWEJzYVdacFpXUWdabXgxYVdRZ2FXNTBaWEptWVdObElIUnZJRVJsY0d4dmVWSXVYRzRnSUNBcUlGeHVJQ0FnS2lCQVkyeGhjM01nWEc0Z0lDQXFJRUJqYjI1emRISjFZM1J2Y2x4dUlDQWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdZWEJwSUZSb1pTQkVaWEJzYjNsU0lFRlFTVnh1SUNBZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2JHbHVheUJVYUdVZ2IySnFaV04wSUd4cGRHVnlZV3dnWTI5dWRHRnBibWx1WnlCMGFHVWdjSEpsZG1sdmRYTWdjbVZ4ZFdWemRDNWNiaUFnSUNvZ1FHRndhU0J3Y21sMllYUmxYRzRnSUNBcUwxeHVJQ0JwYm1sMGFXRnNhWHBsT2lCbWRXNWpkR2x2YmlCcGJtbDBhV0ZzYVhwbEtHRndhU3dnYkdsdWF5a2dlMXh1SUNBZ0lDQkZiV2wwZEdWeUxtbHVhWFJwWVd4cGVtVXVZMkZzYkNoMGFHbHpMQ0I3ZlNrN1hHNGdJRnh1SUNBZ0lDQjJZWElnYjNCMGN5QTlJR2RzYjJKaGJFOXdkR2x2Ym5NN1hHNWNiaUFnSUNBZ2FXWWdLQ0ZoY0dselcyRndhVjBwSUhzZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkSmJuWmhiR2xrSUVGUVNTQmNJaWNnS3lCaGNHa2dLeUFuWENJbktUc2dmVnh1SUNBZ0lGeHVJQ0FnSUNCMGFHbHpMbUZ3YVNBZ0lDQWdJQ0FnUFNCdFpYSm5aU2g3SUNkallXeHNKem9nWVhCcElIMHNJR0Z3YVhOYllYQnBYU2s3SUNBZ0lGeHVJQ0FnSUNCMGFHbHpMbXhwYm1zZ0lDQWdJQ0FnUFNCc2FXNXJJSHg4SUh0OU8xeHVJQ0FnSUNCMGFHbHpMbkVnSUNBZ0lDQWdJQ0FnUFNCMGFHbHpMbXhwYm1zdWNYVmxkV1VnZkh3Z2JtVjNJRkYxWlhWbEtDazdYRzRnSUNBZ0lIUm9hWE11WkdWbVpYSnlaV1FnSUNBOUlIUm9hWE11YkdsdWF5NWtaV1psY25KbFpDQjhmQ0JFS0NrN1hHNGdJQ0FnSUhSb2FYTXVZMjl2YTJsbGN5QWdJQ0E5SUhSb2FYTXViR2x1YXk1amIyOXJhV1Z6TzF4dUlDQWdJQ0IwYUdsekxteHZaMmRsY2lBZ0lDQWdQU0JNYjJkblpYSXVaMlYwS0dGd2FTd2dURzluWjJWeUxrOUdSaWs3SUM4dklIUnlZVzV6WVdOMGFXOXVMV3hsZG1Wc0lHeHZaMmRwYm1kY2JpQWdJQ0FnZEdocGN5NXdZWEpoYlhNZ0lDQWdJRDBnZTMwN1hHNGdJQ0FnSUhSb2FYTXVhVzV3ZFhSeklDQWdJQ0E5SUZ0ZE95QXZMeUJ5YVc1d2RYUnpJR3hwYzNRZ1hHNGdJQ0FnSUhSb2FYTXViM1YwY0hWMGN5QWdJQ0E5SUZ0ZE95QXZMeUJ5YjNWMGNIVjBJRzlpYW1WamRDQnNhWE4wWEc0Z0lDQWdJSFJvYVhNdWNuTjBjbVZoYlNBZ0lDQTlJR1poYkhObE8xeHVJQ0FnSUNCMGFHbHpMbVJsYkdGNVpXUWdJQ0FnUFNCbVlXeHpaVHRjYmlBZ0lDQWdkR2hwY3k1bmJHOWlZV3hGZG5SeklEMGdkSEoxWlRzZ0x5OGdjM1Z3Y0hKbGMzTjhjbUZwYzJVZ1oyeHZZbUZzSUdWMlpXNTBjeUJtYjNRZ2RHaHBjeUJnYVc5Z0lDQWdJQ0JjYmlBZ0lDQWdkR2hwY3k1bWFXeGxJQ0FnSUNBZ0lEMGdiblZzYkRzZ1hHNGdJQ0FnSUhSb2FYTXVaVzUwYVhScFpYTWdJQ0E5SUc1MWJHdzdJRnh1SUNBZ0lDQjBhR2x6TG1sdlJtbHNkR1Z5SUNBZ1BTQm1kVzVqZEdsdmJpZ3BJSHNnY21WMGRYSnVJSFJ5ZFdVN0lIMDdYRzVjYmlBZ0lDQWdMeThnY0hKbGMyVjBJR1JsY0d4dmVYSW5jeUJoYzNOcFoyNWxaQ0J5WlhOd2IyNXpaU0JtYjNKdFlYUWdabTl5SUdCMGFHbHpZQ0JoY0dsY2JpQWdJQ0FnZEdocGN5NWtZWFJoS0hzZ1ptOXliV0YwT2lCMGFHbHpMbUZ3YVM1bWIzSnRZWFFnZlNrN1hHNWNiaUFnSUNBZ0x5OGdkM0poY0NCemRYQmxjbUZuWlc1MElHWnZjaUIwYUdVZ2FHVmhkbmtnYkdsbWRHbHVaeUFnSUNBZ1hHNGdJQ0FnSUhSb2FYTXVjbVZ4SUQwZ1hHNGdJQ0FnSUNBZ0lISmxjWFZsYzNSYmRHaHBjeTVoY0drdWJXVjBhRzlrTG5SdlRHOTNaWEpEWVhObEtDbGRLRzl3ZEhNdWFHOXpkQ0FySUNjdlpHVndiRzk1Y2ljZ0t5QmhjR2twTzF4dUlDQWdJQ0IwYUdsekxuSmxjUzUwYVcxbGIzVjBLREl3SUNvZ05qQWdLaUF4TURBd0tUc2dMeThnWkdWbVlYVnNkQ0IwYVcxbGIzVjBJQzB0UGlBeU1DQnRhVzUxZEdWelhHNWNiaUFnSUNBZ0x5OGdRV3hzSUVOUFVsTWdaR1Z3Ykc5NWNpQmpZV3hzY3lCeVpYRjFhWEpsSUhOMGFXTnJlU0J6WlhOemFXOXVjMXh1SUNBZ0lDQnBaaUFvZDJsdUlDWW1JR2RzYjJKaGJFOXdkR2x2Ym5NdVkyOXljeWtnZXlCMGFHbHpMbkpsY1M1M2FYUm9RM0psWkdWdWRHbGhiSE1vS1RzZ2ZWeHVYRzRnSUNBZ0lDOHZJRTV2WkdVdWFuTWdMU0JoWTJObGMzTWdZVzRnVTFOTUlHVnVaSEJ2YVc1MElIZHBkR2dnYzJWc1ppQnphV2R1WldRZ1kyVnlkSE1nWm05eUlIUmxjM1JwYm1kOFpHVjJYRzRnSUNBZ0lHbG1JQ2doZDJsdUlDWW1JR2RzYjJKaGJFOXdkR2x2Ym5NdVlXeHNiM2RUWld4bVUybG5ibVZrVTFOTVEyVnlkQ2tnZTF4dUlDQWdJQ0FnSUNCd2NtOWpaWE56TG1WdWRpNU9UMFJGWDFSTVUxOVNSVXBGUTFSZlZVNUJWVlJJVDFKSldrVkVJRDBnSnpBbk95QWdJQ0FnSUNBZ1hHNGdJQ0FnSUgxY2JpQWdmU3hjYmx4dUlDQXZLaXBjYmlBZ0lDb2dRbWx1WkhNZ2RHaGxJSE5qYjNCbElHTnZiblJsZUhRZ1ptOXlJSFJvWlNCamIyNW1hV2QxY21Wa0lHQXVaVzVrS0NsZ0lHRnVaQ0JnTG1WeWNtOXlLQ2xnSUdWMlpXNTBJQ0FnSUZ4dUlDQWdLaUJvWVc1a2JHVnlJR05oYkd4aVlXTnJjeUJ2YmlCMGFHbHpJSEpsY1hWbGMzUXVYRzRnSUNBcVhHNGdJQ0FxSUVCdFpYUm9iMlFnWTNSNFhHNGdJQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JqYjI1MFpYaDBJRlJvWlNCZ2RHaHBjMkFnYjJKcVpXTjBJR1p2Y2lCMGFHVWdZMjl1Wm1sbmRYSmxaQ0JnTG1WdVpDZ3BZQ0JoYm1SY2JpQWdJQ29nWUM1bGNuSnZjaWdwWUNCbGRtVnVkQ0JvWVc1a2JHVnljeUJ2YmlCMGFHbHpJSEpsY1hWbGMzUXVYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpJQ0FnWEc0Z0lDQXFMeUJjYmlBZ1kzUjRPaUJtZFc1amRHbHZiaUFvWTI5dWRHVjRkQ2tnZTF4dUlDQWdJSFJvYVhNdWMyTnZjR1VnUFNCamIyNTBaWGgwSUh4OElIUm9hWE03WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmU3hjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVM1Z3Y0hKbGMzTWdiM0lnY21GcGMyVWdaMnh2WW1Gc0lHVjJaVzUwY3lCbWIzSWdkR2hwY3lCZ2FXOWdJSEpsY1hWbGMzUXVYRzRnSUNBcVhHNGdJQ0FxSUVCdFpYUm9iMlFnWjJ4dlltRnNYRzRnSUNBcUlFQndZWEpoYlNCN1FtOXZiR1ZoYm4wZ2NtRnBjMlVnWUhSeWRXVmdJSFJ2SUhKaGFYTmxJR2RzYjJKaGJDQmxkbVZ1ZEhNc0lHQm1ZV3h6WldBZ2RHOGdjM1Z3Y21WemN5QmNiaUFnSUNvZ1pYWmxiblFnWm1seWFXNW5JR2RzYjJKaGJHeDVMbHh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQm1iM0lnWTJoaGFXNXBibWN1WEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDQXFMeUFnWEc0Z0lHZHNiMkpoYkRvZ1puVnVZM1JwYjI0b2NtRnBjMlVwSUh0Y2JpQWdJQ0IwYUdsekxtZHNiMkpoYkVWMmRITWdQU0JNWVc1bkxtbHpRbTl2YkdWaGJpaHlZV2x6WlNrZ1B5QnlZV2x6WlNBNklIUm9hWE11WjJ4dlltRnNSWFowY3p0Y2JseHVJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHVJQ0I5TENBZ1hHNWNiaUFnTHlvcVhHNGdJQ0FxSUZKbGRISnBaWFpsSUdSbGRHRnBiSE1nWVdKdmRYUWdkWE5sY2k1Y2JpQWdJQ29nSUNCY2JpQWdJQ29nUUcxbGRHaHZaQ0JoWW05MWRGeHVJQ0FnS2lCQWNtVjBkWEp1SUh0UFltcGxZM1I5SUdSbGRHRnBiSE1nWVdKdmRYUWdkWE5sY2lCdmRHaGxjbmRwWlhNZ1lHNTFiR3hnTGx4dUlDQWdLaUJBWVhCcElIQjFZbXhwWXlBZ0lGeHVJQ0FnS2k5Y2JpQWdZV0p2ZFhRNklHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lIWmhjaUJ5WlhOd2IyNXpaU0E5SUhSb2FYTXVjbVZ4TG5KbGN6dGNibHh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbUZ3YVZzblkyRnNiQ2RkSUQwOVBTQW5MM0l2ZFhObGNpOXNiMmRwYmljZ0ppWWdjbVZ6Y0c5dWMyVWdQeUJjYmlBZ0lDQWdJQ0FnSUNBZ2NtVnpjRzl1YzJVdVltOWtlUzVuWlhRb0ozVnpaWEluS1NBNklHNTFiR3c3WEc0Z0lIMHNJQ0JjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVMmhoY21WeklIUm9aU0JqYjI5cmFXVnpJR1p5YjIwZ1lTQmthV1ptY21WdWRDQmdMbWx2S0NsZ0lHRm5aVzUwSUhSdklIQnlaWE5sY25abElITmxjM05wYjI0Z2MzUmhkR1ZjYmlBZ0lDb2dZV055YjNOeklHQjBhR2x6WUNCeVpYRjFaWE4wSUdGdVpDQmhiR3dnY21WeGRXVnpkSE1nWTJoaGFXNWxaQ0IwYnlCcGRDNWNiaUFnSUNwY2JpQWdJQ29nUUcxbGRHaHZaQ0J6YUdGeVpWeHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtY3VYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpJQ0FnWEc0Z0lDQXFMeUFnWEc0Z0lITm9ZWEpsT2lCbWRXNWpkR2x2YmlBb1kyOXZhMmxsY3lrZ2UxeHVJQ0FnSUdsbUlDaG5iRzlpWVd4UGNIUnBiMjV6TG5OMGFXTnJlU2tnZTF4dUlDQWdJQ0FnYVdZZ0tHZHNiMkpoYkU5d2RHbHZibk11WTI5dmEybGxjeWtnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbU52YjJ0cFpYTWdQU0JuYkc5aVlXeFBjSFJwYjI1ekxtTnZiMnRwWlhNdWMyeHBZMlVvTUNrN0lGeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR052YjJ0cFpYTXBJSHNnWEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI5cmFXVnpJRDBnWTI5dmEybGxjeTV6YkdsalpTZ3dLVHNnWEc0Z0lDQWdJQ0FnSUNBZ1oyeHZZbUZzVDNCMGFXOXVjeTV6WlhRb0oyTnZiMnRwWlhNbkxDQjBhR2x6TG1OdmIydHBaWE1wTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSFJvYVhNdVkyOXZhMmxsY3lBOUlDaGpiMjlyYVdWeklEOGdZMjl2YTJsbGN5NXpiR2xqWlNnd0tTQTZJSFJvYVhNdVkyOXZhMmxsY3lrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDBzWEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRkpsZEhWeWJuTWdkR2hsSUVoVVZGQWdZMjl2YTJsbElIQnlaWFpwYjNWemJIa2djMlZ1ZENCaWVTQjBhR1VnYzJWeWRtVnlJSGRwZEdnZ1UyVjBMVU52YjJ0cFpTNWNiaUFnSUNvZ1ZHaHBjeUIyWVd4MVpTQmpZVzRnWW1VZ2NHRnpjMlZrSUhSdklHQXVjMmhoY21Vb2NuVnpaWEl1WjJWMFEyOXZhMmxsY3lncEtXQWdiMllnWVNCa2FXWm1jbVZ1ZEZ4dUlDQWdLaUJnTG1sdktDbGdJR0ZuWlc1MElIUnZJSEJ5WlhObGNuWmxJSE5sYzNOcGIyNGdjM1JoZEdVZ1lXTnliM056SUhKbGNYVmxjM1J6TGx4dUlDQWdLbHh1SUNBZ0tpQkFiV1YwYUc5a0lHZGxkRU52YjJ0cFpYTmNiaUFnSUNvZ1FISmxkSFZ5YmlCN1FYSnlZWGw5SUZSb1pTQklWRlJRSUdOdmIydHBaU0J3Y21WMmFXOTFjMng1SUhObGJuUWdZbmtnZEdobElITmxjblpsY2lCM2FYUm9JRnh1SUNBZ0tpQlRaWFF0UTI5dmEybGxMbHh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZeUFnSUZ4dUlDQWdLaThnSUZ4dUlDQm5aWFJEYjI5cmFXVnpPaUJtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVkyOXZhMmxsY3p0Y2JpQWdmU3dnWEc1Y2JpQWdaR1ZzWVhrNklHWjFibU4wYVc5dUlDaHRjeWtnZTF4dUlDQWdJQzh2SUZSUFJFODZJSE4xY0hCdmNuUWdaR1ZzWVhsbFpDQnlaWEYxWlhOMGN5QmlZWE5sWkNCdmJpQnRjeUJtYjNJZ2JtOTNJSFJvYVhNZ2FYTWdhblZ6ZENCaElIQmhkWE5sTGx4dUlDQWdJSFJvYVhNdVpHVnNZWGxsWkNBOUlDRnBjMDVoVGlod1lYSnpaVVpzYjJGMEtHMXpLU2tnSmlZZ2FYTkdhVzVwZEdVb2JYTXBJRDhnYlhNZ09pQjBjblZsTzF4dVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDBzSUNBZ1hHNWNiaUFnTHlvcVhHNGdJQ0FxSUZWdWQybHVaQ0IwYUdVZ2NYVmxkV1VnWTJoaGFXNGdZMnhsWVhKcGJtY2djbVZ4ZFdWemRITWdkR2hoZENCdGFXZG9kQ0JvWVhabElHUmxiR0Y1Y3lCaGRIUmhZMmhsWkM1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQmtjbUZwYmx4dUlDQWdLaUJBY21WMGRYSnVJSHRRY205dGFYTmxmU0JCSUhCeWIyMXBjMlVnZDNKaGNIQnBibWNnZEdobElISmxjMjlzZFhScGIyNGdiMllnWldsMGFHVnlJRndpY21WemIyeDJaVndpSUc5eVhHNGdJQ0FxSUZ3aWNtVnFaV04wWENJZ1kyRnNiR0poWTJzdVhHNGdJQ0FxSUVCaGNHa2djSFZpYkdsaklDQWdYRzRnSUNBcUwxeHVJQ0JrY21GcGJqb2dablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJSFJvYVhNdVpHVnNZWGxsWkNBOUlHWmhiSE5sTzF4dUlDQWdJSFJvYVhNdWNTNW1iSFZ6YUNncE95QmNibHh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVJsWm1WeWNtVmtMbkJ5YjIxcGMyVTdYRzRnSUgwc0lDQWdYRzVjYmlBZ0x5b3FYRzRnSUNBcUlGUm9aU0JnTG5CeWIyMXBjMlVvS1dBZ2JXVjBhRzlrSUhKbGRIVnlibk1nWVNCa2VXNWhiV2xqWVd4c2VTQm5aVzVsY21GMFpXUWdVSEp2YldselpTQjBhR0YwSUdseklGeHVJQ0FnS2lCeVpYTnZiSFpsWkNCdmJtTmxJR0ZzYkNCRVpYQnNiM2xTSUdBdWFXOG9LV0FnY21WeGRXVnpkSE1nYUdGMlpTQmxibVJsWkM1Y2JpQWdJQ29nSUNCY2JpQWdJQ29nUUcxbGRHaHZaQ0J3Y205dGFYTmxYRzRnSUNBcUlFQnlaWFIxY200Z2UxQnliMjFwYzJWOUlFRWdjSEp2YldselpTQjNjbUZ3Y0dsdVp5QjBhR1VnY21WemIyeDFkR2x2YmlCdlppQmxhWFJvWlhJZ1hDSnlaWE52YkhabFhDSWdiM0pjYmlBZ0lDb2dYQ0p5WldwbFkzUmNJaUJqWVd4c1ltRmpheTVjYmlBZ0lDb2dRR0Z3YVNCd2RXSnNhV05jYmlBZ0lDb3ZJQ0FnSUNCY2JpQWdjSEp2YldselpUb2dablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJSFJvYVhNdVpXNWtLQ2s3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1a1pXWmxjbkpsWkM1d2NtOXRhWE5sTzF4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkJZbTl5ZENCMGFHVWdSR1Z3Ykc5NVVpQnlaWEYxWlhOMExseHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJR0ZpYjNKMElDQmNiaUFnSUNvZ1FISmxkSFZ5YmlCN1JHVndiRzk1VW4wZ1ptOXlJR05vWVdsdWFXNW5MbHh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZMXh1SUNBZ0tpOGdJRnh1SUNCaFltOXlkRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUhSb2FYTXVjbVZ4TG1GaWIzSjBLQ2s3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RoWW05eWRDY3BPMXh1SUNBZ0lIUm9hWE11WkdWbVpYSnlaV1F1Y21WcVpXTjBLSFJvYVhNdVgyaGhibVJzWlVWeWNtOXlLSHNnWEc0Z0lDQWdJQ0FnSUhOMFlYUjFjem9nSjJGaWIzSjBKeXhjYmlBZ0lDQWdJQ0FnZEdWNGREb2dKMFJsY0d4dmVWSWdjbVZ4ZFdWemRDQmhZbTl5ZEdWa0xpZGNiaUFnSUNCOUtTazdYRzVjYmlBZ0lDQnlaWFIxY200Z2RHaHBjenRjYmlBZ2ZTeGNibHh1SUM4cUtseHVJQ0FxSUZObGRDQjBhVzFsYjNWMElIUnZJR0J0YzJBdVhHNGdJQ3BjYmlBZ0tpQkFiV1YwYUc5a0lIUnBiV1Z2ZFhRZ0lGeHVJQ0FxSUVCd1lYSmhiU0I3VG5WdFltVnlmU0J0YzF4dUlDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1WjF4dUlDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDb3ZJQ0JjYmlBZ2RHbHRaVzkxZERvZ1puVnVZM1JwYjI0Z0tHMXpLU0I3WEc0Z0lDQWdkR2hwY3k1eVpYRXVkR2x0Wlc5MWRDaHRjeWs3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmU3hjYmx4dUlDOHFLbHh1SUNBcUlGUjFjbTRnYkc5bloybHVaeUJ2YmlCbWIzSWdkR2hsSUhOd1pXTnBabWxqSUhSeVlXNXpZV04wYVc5dUxseHVJQ0FxWEc0Z0lDb2dRRzFsZEdodlpDQnNiMmRjYmlBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQm1iM0lnWTJoaGFXNXBibWRjYmlBZ0tpQkFZWEJwSUhCMVlteHBZMXh1SUNBcUx5QmNiaUFnYkc5bk9pQm1kVzVqZEdsdmJpQW9iR1YyWld3cElIdGNiaUFnSUNCMGFHbHpMbXh2WjJkbGNpNXpaWFJNWlhabGJDaHNaWFpsYkNCOGZDQk1iMmRuWlhJdVJFVkNWVWNwTzF4dVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDBzWEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRVpwYkhSbGNuTWdjM1ZqWTJWemMyWjFiQ0J5WlhOd2IyNXpaWE1nZEc4Z1kyOXVkR0ZwYmlCdmJteDVJR0VnZEc5d0xXeGxkbVZzSUVSbGNHeHZlVklnUVZCSklGeHVJQ0FnS2lCeVpYTndiMjV6WlNCbGJuUnBkR2xsY3pwY2JpQWdJQ29nTFNBbmRYTmxjaWRjYmlBZ0lDb2dMU0FuY0hKdmFtVmpkQ2RjYmlBZ0lDb2dMU0FuZDI5eWEzTndZV05sSnlCY2JpQWdJQ29nTFNBblpYaGxZM1YwYVc5dUp5QmNiaUFnSUNvZ0xTQW5aR2x5WldOMGIzSjVKeUJjYmlBZ0lDb2dMU0FuY21Wd2IzTnBkRzl5ZVNkY2JpQWdJQ29nTFNBbmNHRmphMkZuWlhNbklGeHVJQ0FnS2lBZ0lGeHVJQ0FnS2lCQWJXVjBhRzlrSUdWdWRHbDBlVnh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQm1iM0lnWTJoaGFXNXBibWRjYmlBZ0lDb2dRR0Z3YVNCd2RXSnNhV05jYmlBZ0lDb3ZYRzRnSUdWdWRHbDBlVG9nWm5WdVkzUnBiMjRnS0dWdWRHbDBlU2tnZTF4dUlDQWdJSFJvYVhNdVpXNTBhWFJwWlhNZ1BTQjFkR2xzY3k1cGJrRnljbUY1S0ZSUFVFeEZWa1ZNWDBWT1ZFbFVTVVZUTENCbGJuUnBkSGtwTzF4dVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDBzWEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRVJsWm1sdVpYTWdkR2hsSUhKbGNYVmxjM1FnWkdGMFlTQmlaV2x1WnlCelpXNTBJSFJ2SUdFZ1JHVndiRzk1VWlCQlVFa3VJRnh1SUNBZ0tseHVJQ0FnS2lCQWJXVjBhRzlrSUdSaGRHRmNiaUFnSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUdSaGRHRWdWR2hsSUc5aWFtVmpkQ0JzYVhSbGNtRnNJR052Ym1acFozVnlZWFJwYjI0Z2FHRnphQzRnWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1WjF4dUlDQWdLaUJBWVhCcElIQjFZbXhwWTF4dUlDQWdLaTljYmlBZ1pHRjBZVG9nWm5WdVkzUnBiMjRnS0dSaGRHRXBJSHRjYmlBZ0lDQmtZWFJoSUQwZ1pHRjBZU0I4ZkNCN2ZUc2dJQ0FnWEc1Y2JpQWdJQ0F2THlCeVpXMXZkbVVnWVc1NUlHbHViR2x1WldRZ2NtbHVjSFYwS0hNcElHRnVaQ0JoZEhSaFkyZ2dkR2hsYlNCMGJ5QjBhR1VnY21sdWNIVjBLSE1wSUhCeWIzQmxjblI1WEc0Z0lDQWdhV1lnS0dSaGRHRXVjbWx1Y0hWMElIeDhJR1JoZEdFdWNtbHVjSFYwY3lrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV5YVc1d2RYUW9aR0YwWVM1eWFXNXdkWFFwTzF4dUlDQWdJQ0FnZEdocGN5NXlhVzV3ZFhSektHUmhkR0V1Y21sdWNIVjBjeWs3WEc0Z0lDQWdmU0JjYmx4dUlDQWdJQzh2SUhKbGJXOTJaU0JoYm5rZ1lISmxjMlZ5ZG1Wa1lDQjJZV3gxWlhNZ2RHaGhkQ0JqYjNWc1pDQm9ZWFpsSUdKbFpXNGdjR0Z6YzJWa0lHSjVJRzFwYzNSaGEyVmNiaUFnSUNCMllYSWdRa3hCUTB0TVNWTlVJRDBnV3lkeWFXNXdkWFFuTENBbmNtbHVjSFYwY3ljc0lDZGZYMk52YjJ0cFpYTmZYeWRkTzF4dUlDQWdJRUpNUVVOTFRFbFRWQzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLSEJoY21GdEtTQjdJR1JsYkdWMFpTQmtZWFJoVzNCaGNtRnRYVHNnZlNrN0lDQmNibHh1SUNBZ0lIUm9hWE11Y0dGeVlXMXpJRDBnYldWeVoyVW9kR2hwY3k1d1lYSmhiWE1zSUdSaGRHRXBPMXh1WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE03WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFRjBkR0ZqYUdWeklHRWdabWxzWlNCMGJ5QmlaU0IxY0d4dllXUmxaQzRnWEc0Z0lDQXFYRzRnSUNBcUlFQnRaWFJvYjJRZ1lYUjBZV05vWEc0Z0lDQXFJRUJ3WVhKaGJTQjdSbWxzWlh4Q2JHOWlmSEJoZEdoOUlHWnBiR1VnVkdobElHWnBiR1VnZEc4Z1ltVWdZWFIwWVdOb1pXUWdabTl5SUdGdUlIVndiRzloWkM0Z1JtOXlJRnh1SUNBZ0tpQkNjbTkzYzJWeUlHVnVkbWx5YjI1dFpXNTBjeUIwYUdVZ1NGUk5URFVnUm1sc1pYeENiRzlpSUdseklIVnpaV1F1SUVadmNpQjBhR1VnVG05a1pTNXFjeUJjYmlBZ0lDb2daVzUyYVhKdmJtMWxiblFzSUdFZ1ptbHNaU0J3WVhSb0lHbHpJR0ZqWTJWd2RHVmtMbHh1SUNBZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1ptbHNaVzVoYldVZ0tHOXdkR2x2Ym1Gc0tTQjBhR1VnYm1GdFpTQnZaaUIwYUdVZ1ptbHNaU0IwYnlCaVpTQjFjR3h2WVdSbFpDNGdYRzRnSUNBcUlGUm9hWE1nYm1GdFpTQmtiMlZ6SUc1dmRDQm9ZWFpsSUhSdklHMWhkR05vSUhSb1pTQmhZM1IxWVd3Z2MyOTFjbU5sSUdacGJHVnVZVzFsTGx4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JtYjNJZ1kyaGhhVzVwYm1kY2JpQWdJQ29nUUdGd2FTQndkV0pzYVdOY2JpQWdJQ292WEc0Z0lHRjBkR0ZqYURvZ1puVnVZM1JwYjI0Z0tHWnBiR1VzSUdacGJHVnVZVzFsS1NCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11WVhCcExuVndiRzloWkNrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVtYVd4bElEMGdabWxzWlR0Y2JseHVJQ0FnSUNBZ0x5OGdiM0IwYVc5dVlXd2dabWxzWlc1aGJXVWdhR1Z5WlNCbWIzSWdZMjl1ZG1WdWFXVnVZMlZjYmlBZ0lDQWdJR2xtSUNobWFXeGxibUZ0WlNrZ2V5QjBhR2x6TG1SaGRHRW9JSHNnWm1sc1pXNWhiV1U2SUdacGJHVnVZVzFsSUgwZ0tUc2dmVnh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNCOUxGeHVYRzRnSUM4cUtseHVJQ0FnS2lCVGRYQndiM0owWldRZ2IyNXNlU0JwYmlCT2IyUmxMbXB6TENCMGFHbHpJRzFsZEdodlpDQjNiM0pyY3lCcGJpQmpiMjVxZFc1amRHbHZiaUIzYVhSb0lIUm9aU0JjYmlBZ0lDb2dZWFIwWVdOb0lHMWxkR2h2WkNCMGJ5QnBibVJwWTJGMFpTQjBhR0YwSUhSb1pTQm1hV3hsSUhOb2IzVnNaQ0JpWlNCeVpXRmtJR2x1SUdGeklHRWdjbVZoWkdGaWJHVWdYRzRnSUNBcUlITjBjbVZoYlNCa2RYSnBibWNnWVNCbWFXeGxJSFZ3Ykc5aFpDNWNiaUFnSUNwY2JpQWdJQ29nUUcxbGRHaHZaQ0J6ZEhKbFlXMWNiaUFnSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5d2RHbHZibk1nS0c5d2RHbHZibUZzS1NCMGFHVWdVbVZoWkdGaWJHVWdVM1J5WldGdElHOXdkR2x2Ym5NZ2FHRnphQzVjYmlBZ0lDb2dJR0JnWUZ4dUlDQWdLaUFnSUNCN0lHWnNZV2R6T2lBbmNpY3NYRzRnSUNBcUlDQWdJQ0FnWlc1amIyUnBibWM2SUc1MWJHd3NYRzRnSUNBcUlDQWdJQ0FnWm1RNklHNTFiR3dzWEc0Z0lDQXFJQ0FnSUNBZ2JXOWtaVG9nTURZMk5peGNiaUFnSUNvZ0lDQWdJQ0JoZFhSdlEyeHZjMlU2SUhSeWRXVmNiaUFnSUNvZ0lDQWdmVnh1SUNBZ0tpQmdZR0JjYmlBZ0lDb2dRSEpsZEhWeWJpQjdSR1Z3Ykc5NVVuMGdabTl5SUdOb1lXbHVhVzVuWEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDQXFMMXh1SUNCemRISmxZVzA2SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCMGFHbHpMbkp6ZEhKbFlXMGdQU0FvSVhkcGJpQW1KaUIwYUdsekxtRndhUzUxY0d4dllXUXBPeUF2TDI1dlpHVnFjeUJ2Ym14NVhHNWNiaUFnSUNCeVpYUjFjbTRnZEdocGN6dGNiaUFnZlN4Y2JseHVJQ0F2S2lwY2JpQWdJQ29nVkdobElHQm1hV3gwWlhJb3pyc3BZQ0J0WlhSb2IyUWdjbVZ0YjNabGN5QjBhR2x6SUVSbGNHeHZlVklnY21WeGRXVnpkQ0JtY205dElIUm9aU0J5WlhGMVpYTjBJR05vWVdsdVhHNGdJQ0FxSUdsbUlIUm9aU0J3Y205MmFXUmxaQ0JtZFc1amRHbHZiaUJrYjJWeklDcHViM1FxSUhCaGMzTWdkR2hsSUhSbGMzUWdhVzF3YkdWdFpXNTBaV1FnWW5rZ2FYUXVYRzRnSUNBcVhHNGdJQ0FxSUVWNFlXMXdiR1Z6T2x4dUlDQWdLbHh1SUNBZ0tpQmdZR0JjYmlBZ0lDb2dMeThnVW1WdGIzWmxJR1p5YjIwZ2RHaGxJSEpsY1hWbGMzUWdZMmhoYVc1Y2JpQWdJQ29nTG1acGJIUmxjaWhtZFc1amRHbHZiaWhoY21kektTQjdYRzRnSUNBcUlDQWdJSEpsZEhWeWJpQTFJRDRnTVRBN1hHNGdJQ0FxSUgwcFhHNGdJQ0FxWEc0Z0lDQXFJQzh2SUV0bFpYQWdhVzRnZEdobElISmxjWFZsYzNRZ1kyaGhhVzVjYmlBZ0lDb2dMbVpwYkhSbGNpaG1kVzVqZEdsdmJpaGhjbWR6S1NCN1hHNGdJQ0FxSUNBZ0lISmxkSFZ5YmlBeE1DQStJRFU3WEc0Z0lDQXFJSDBwSUNBZ1hHNGdJQ0FxSUdCZ1lGeHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJR1pwYkhSbGNseHVJQ0FnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNET3V5QjBhR1VnWTJGc2JHSmhZMnNnWm5WdVkzUnBiMjR1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1WjF4dUlDQWdLaUJBWVhCcElIQjFZbXhwWXlBZ0lGeHVJQ0FnS2k5Y2JpQWdabWxzZEdWeU9pQm1kVzVqZEdsdmJpaG1iaWtnZTF4dUlDQWdJR2xtSUNobWJpa2dlMXh1SUNBZ0lDQWdkR2hwY3k1cGIwWnBiSFJsY2lBOUlHWjFibU4wYVc5dUtIQnlaWFpCY21kektTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCaGNtZHpJRDBnZTMwc0lHdGxaWEE3WEc1Y2JpQWdJQ0FnSUNBZ0x5OGdZMjl3ZVNCdmRtVnlJSEJ5WlhacGIzVnpJR0Z5WjNWdFpXNTBjeUJoYm1RZ1ptbHNkR1Z5SUc5MWRDQnBiblJsY201aGJDQmZYMk52YjJ0cFpYTmZYeUJjYmlBZ0lDQWdJQ0FnWm05eUlDaDJZWElnYTJWNUlHbHVJSEJ5WlhaQmNtZHpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lHbG1JQ2hyWlhrZ0lUMDlJQ2RmWDJOdmIydHBaWE5mWHljcElIc2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnlaM05iYTJWNVhTQTlJSEJ5WlhaQmNtZHpXMnRsZVYwN1hHNGdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHdGxaWEFnUFNCbWJpaGhjbWR6S1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUNoclpXVndJSHg4SUd0bFpYQWdQVDA5SUdaaGJITmxJRDhnYTJWbGNDQTZJSFJ5ZFdVcE8xeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnZEdocGN6dGNiaUFnZlN3Z0lGeHVJQ0JjYmlBZ0x5b3FYRzRnSUNBcUlFRmpkSE1nWVhNZ1lTQm1hVzVoYkd4NUlITjBZWFJsYldWdWRDQmhiR3h2ZDJsdVp5QjViM1VnZEc4Z1pYaGxZM1YwWlNCY0ltTnNaV0Z1ZFhCY0lpQjBlWEJsSUhSaGMydHpJRnh1SUNBZ0tpQnBiaUJoSUhKbGNYVmxjM1FnWTJoaGFXNHVJRWwwSUdGeWNtRnVaMlZ6SUdadmNpQmpiR1ZoYm5Wd0lIUnZJR0psSUdOaGJHeGxaQ3dnZDJsMGFDQnVieUJjYmlBZ0lDb2dZWEpuZFcxbGJuUnpMQ0IzYUdWdUlIUm9aU0JFWlhCc2IzbFNJSEpsY1hWbGMzUWdZMmhoYVc0Z2FYTWdaV2wwYUdWeUlHTnZiWEJzWlhSbGJIa2dablZzWm1sc2JHVmtJRnh1SUNBZ0tpQnZjaUJ5WldwbFkzUmxaQzVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxkR2h2WkNCbGJuTjFjbVZjYmlBZ0lDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGd6cnNnZEdobElHTmhiR3hpWVdOcklHWjFibU4wYVc5dUxseHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtZGNiaUFnSUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFnSUNvdklDQmNiaUFnWlc1emRYSmxPaUJtZFc1amRHbHZiaUFvWm00cElIdGNiaUFnSUNCMGFHbHpMbVJsWm1WeWNtVmtMbkJ5YjIxcGMyVXVaVzV6ZFhKbEtHWnVLVHRjYmx4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG1SbFptVnljbVZrTG5CeWIyMXBjMlU3WEc0Z0lIMHNYRzRnSUNBZ0lDQmNiaUFnTHlvcVhHNGdJQ0FxSUZSb1pTQm5aVzVsY21Gc0lHWmhhV3gxY21VZ1kyRnNiR0poWTJzdUlFbG1JR05oYkd4bFpDd2dZV3hzSUVSbGNHeHZlVklnWlhKeWIzSnpJR1p2Y2lCMGFHbHpJRnh1SUNBZ0tpQjBjbUZ1YzJGamRHbHZiaUIzYVd4c0lHSmxJSEpsZEhWeWJtVmtJR2hsY21VZ2QyaGxiaUJ5WVdselpXUXVYRzRnSUNBcVhHNGdJQ0FxSUVCdFpYUm9iMlFnWlhKeWIzSmNiaUFnSUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ3pyc2dkR2hsSUdOaGJHeGlZV05ySUdaMWJtTjBhVzl1TGx4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JtYjNJZ1kyaGhhVzVwYm1kY2JpQWdJQ29nUUdGd2FTQndkV0pzYVdOY2JpQWdJQ292WEc0Z0lHVnljbTl5T2lCbWRXNWpkR2x2YmlBb1ptNHBJSHRjYmlBZ0lDQjBhR2x6TG05dUtDZGxjbkp2Y2ljc0lHWnVLVHRjYmx4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TzF4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlRkSEpsWVcwZ2RHaGxJRVJsY0d4dmVWSWdjbVZ6Y0c5dWMyVWdhVzUwYnlCMGFHVWdjR2x3WlM0Z1NYUWdhWE1nYVcxd2IzSjBZVzUwSUhSdklHNXZkR1VnZEdoaGRDQnBaaUJjYmlBZ0lDb2dkR2hsSUdBdWNHbHdaU2dwWUNCdFpYUm9iMlFnYVhNZ2JtVjJaWElnWTJGc2JHVmtJSFJvWlNCeVpYRjFaWE4wSUhkcGJHd2dibTkwSUdKbElITmxiblF1WEc0Z0lDQXFYRzRnSUNBcUlGUm9aU0JnTG5CcGNHVW9LV0FnYldWMGFHOWtJSE5vYjNWc1pDQmlaU0JpWlNCMWMyVmtJR0Z6SUdGdUlHRnNkR1Z5Ym1GMGFYWmxJSFJ2SUdBdVpXNWtLQ2xnSUdGdVpDQmNiaUFnSUNvZ2JtVjJaWElnWVd4dmJtY2djMmxrWlNCdlppQnBkQzRnWUM1d2FYQmxLQ2xnSUdGdVpDQmdMbVZ1WkNncFlDQmhjbVVnWVc0Z1pXbDBhR1Z5TFc5eUxseHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJSEJwY0dWY2JpQWdJQ29nUUhCaGNtRnRJSHRUZEhKbFlXMTlJSE4wY21WaGJTQkJJR1JsYzNScGJtRjBhVzl1SUZOMGNtVmhiUzVjYmlBZ0lDb2dRSEpsZEhWeWJpQjdVM1J5WldGdGZTQlVhR1VnY0dGemMyVmtJR2x1SUdSbGMzUnBibUYwYVc5dUlITjBjbVZoYlNCMGJ5QmlaU0IxYzJWa0lHWnZjaUJoWkdScGRHbHZibUZzSUZ4dUlDQWdLaUJ3YVhCcGJtY3VYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpYRzRnSUNBcUwxeHVJQ0J3YVhCbE9pQm1kVzVqZEdsdmJpQW9aR1Z6ZENrZ2UxeHVJQ0FnSUhaaGNpQnhJQ0FnUFNCMGFHbHpMbkVzWEc0Z0lDQWdJQ0FnSUdGd2FTQTlJSFJvYVhNdVlYQnBPeUFnSUNBZ0lDQWdYRzVjYmlBZ0lDQnhMbUZrWkNobWRXNWpkR2x2YmloeVpYTndiMjV6WlVOb1lXbHVMQ0JsY25KdmNpd2djSEpsZGtGeVozTXBJSHNnSUNBZ1hHNGdJQ0FnSUNBdkx5QmljbUZyWlNCMGFHVWdZMkZzYkNCamFHRnBiaUJ2YmlCbGNuSnZjaUFnSUNBZ0lGeHVJQ0FnSUNBZ2FXWWdLR1Z5Y205eUtTQjdJQ0FnSUNBZ0lDQmNiaUFnSUNBZ0lDQWdkR2hwY3k1a1pXWmxjbkpsWkM1eVpXcGxZM1FvWlhKeWIzSXBPeUFnSUNBZ0lGeHVJQ0FnSUNBZ0lDQnhMbVpzZFhOb0tISmxjM0J2Ym5ObFEyaGhhVzRzSUdWeWNtOXlMQ0J3Y21WMlFYSm5jeWs3SUM4dklHUnlZV2x1SUhSb1pTQnhkV1YxWlZ4dUlDQWdJQ0FnSUNCMGFHbHpMbDlqYkdWaGNpZ3BPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQmNiaUFnSUNBZ0lIUm9hWE11WDNCeVpYQlNaWEYxWlhOMEtISmxjM0J2Ym5ObFEyaGhhVzRzSUhCeVpYWkJjbWR6S1R0Y2JseHVJQ0FnSUNBZ1RHOW5aMlZ5TG1sdVptOG9KM0JwY0dVb0tTY3NJR0Z3YVN3Z2RHaHBjeTV5WlhFcE8xeHVJQ0FnSUNBZ2RHaHBjeTVzYjJkblpYSXVhVzVtYnlnbmNHbHdaU2dwSnl3Z1lYQnBMQ0IwYUdsekxuSmxjU2s3SUNBZ1hHNWNiaUFnSUNBZ0lIWmhjaUJ6ZEhKbFlXMGdQU0IwYUdsekxuSmxjUzV3YVhCbEtHUmxjM1FwTzF4dUlDQWdJQ0FnY1M1NWFXVnNaQ2gwY25WbEtUdGNiaUFnSUNBZ0lITjBjbVZoYlM1dmJpZ25aWEp5YjNJbkxDQm1kVzVqZEdsdmJpQW9LU0I3SUgwcE95QWdJQ0JjYmlBZ0lDQWdJSE4wY21WaGJTNXZiaWduWlc1a0p5d2dablZ1WTNScGIyNG9LU0I3SUgwcE95QWdJQ0FnWEc0Z0lDQWdJQ0J6ZEhKbFlXMHViMjRvSjJSaGRHRW5MQ0JtZFc1amRHbHZiaWdwSUhzZ2ZTazdJQ0FnSUNBZ1hHNGdJQ0FnZlN3Z2RHaHBjeWs3WEc0Z0lGeHVJQ0FnSUdsbUlDaHhMbk5wZW1Vb0tTQThQU0F4S1NCN0lIRXVabXgxYzJnb0tUc2dmVnh1WEc0Z0lDQWdjbVYwZFhKdUlHUmxjM1E3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFbHVaR2xqWVhSbGN5QjBhR0YwSUhSb1pTQnlaWEYxWlhOMElHbHpJSEpsWVdSNUlIUnZJR0psSUhObGJuUWdkRzhnUkdWd2JHOTVVaTRnU1hRZ2FYTWdhVzF3YjNKMFlXNTBJRnh1SUNBZ0tpQjBieUJ1YjNSbElIUm9ZWFFnYVdZZ2RHaGxJR0F1Wlc1a0tDbGdJRzFsZEdodlpDQnBjeUJ1WlhabGNpQmpZV3hzWldRZ2RHaGxJSEpsY1hWbGMzUWdkMmxzYkNCdWIzUWdZbVZjYmlBZ0lDb2djMlZ1ZEM1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQmxibVJjYmlBZ0lDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGd6cnNnZEdobElHTmhiR3hpWVdOcklHWjFibU4wYVc5dUxseHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtY3VYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpYRzRnSUNBcUx5QmNiaUFnWlc1a09pQm1kVzVqZEdsdmJpQW9abTRwSUh0Y2JpQWdJQ0IyWVhJZ2MyVnNaaUFnSUNBZ1BTQjBhR2x6TEZ4dUlDQWdJQ0FnSUNCeElDQWdJQ0FnSUNBOUlIUm9hWE11Y1N4Y2JpQWdJQ0FnSUNBZ1lYQnBJQ0FnSUNBZ1BTQjBhR2x6TG1Gd2FTeGNiaUFnSUNBZ0lDQWdZWEpuY3lBZ0lDQWdQU0J1ZFd4c0xGeHVJQ0FnSUNBZ0lDQmxiblJwZEdsbGN5QTlJQ0IwYUdsekxtVnVkR2wwYVdWek8xeHVYRzRnSUNBZ2NTNWhaR1FvWm5WdVkzUnBiMjRvY21WemNHOXVjMlZEYUdGcGJpd2daWEp5YjNJc0lIQnlaWFpCY21kektTQjdYRzRnSUNBZ0lDQXZMeUJpY21WaGF5QjBhR1VnWTJGc2JDQmphR0ZwYmlCdmJpQmxjbkp2Y2lBZ0lDQWdJRnh1SUNBZ0lDQWdhV1lnS0dWeWNtOXlLU0I3SUNBZ0lDQWdJQ0JjYmlBZ0lDQWdJQ0FnZEdocGN5NWtaV1psY25KbFpDNXlaV3BsWTNRb1pYSnliM0lwT3lBZ0lDQWdJQ0FnWEc0Z0lDQWdJQ0FnSUhFdVpteDFjMmdvY21WemNHOXVjMlZEYUdGcGJpd2daWEp5YjNJc0lIQnlaWFpCY21kektUc2dMeThnWkhKaGFXNGdkR2hsSUhGMVpYVmxYRzRnSUNBZ0lDQWdJSFJvYVhNdVgyTnNaV0Z5S0NrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OWNiaUFnSUNBZ0lHbG1JQ2doZEdocGN5NXBiMFpwYkhSbGNpaHdjbVYyUVhKbmN5a3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIRXVjMmw2WlNncElEMDlQU0F3S1NCN0lGeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpHVm1aWEp5WldRdWNtVnpiMngyWlNoeVpYTndiMjV6WlVOb1lXbHVJSHg4SUhCeVpYWkJjbWR6S1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEV1Wm14MWMyZ29jbVZ6Y0c5dWMyVkRhR0ZwYml3Z1pYSnliM0lzSUhCeVpYWkJjbWR6S1RzZ0x5OGdaSEpoYVc0Z2RHaGxJSEYxWlhWbFhHNGdJQ0FnSUNBZ0lIUm9hWE11WDJOc1pXRnlLQ2s3WEc0Z0lDQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJRnh1SUNBZ0lDQWdkR2hwY3k1ZmNISmxjRkpsY1hWbGMzUW9jbVZ6Y0c5dWMyVkRhR0ZwYml3Z2NISmxka0Z5WjNNcE8xeHVYRzRnSUNBZ0lDQk1iMmRuWlhJdWFXNW1ieWduYVc4b0tTY3NJR0Z3YVN3Z2RHaHBjeTV5WlhFcE8xeHVJQ0FnSUNBZ2RHaHBjeTVzYjJkblpYSXVhVzVtYnlnbmFXOG9LU2NzSUdGd2FTd2dkR2hwY3k1eVpYRXBPeUFnSUNCY2JseHVJQ0FnSUNBZ0x5OGdjMlZ1WkNCdVpYaDBJSEpsY1hWbGMzUmNiaUFnSUNBZ0lIUm9hWE11Y21WeExtVnVaQ2htZFc1amRHbHZiaWh5WlhNcElIdGNiaUFnSUNBZ0lDQWdjMlZzWmk1emFHRnlaU2h6Wld4bUxtTnZiMnRwWlhNZ2ZId2djbVZ6TG1obFlXUmxjbk5iSjNObGRDMWpiMjlyYVdVblhTazdJQ0FnSUNBZ0lDQWdYRzVjYmlBZ0lDQWdJQ0FnTHk4Z0xTMGdiRzluSUdOdmIydHBaWE1nWVdOeWIzTnpJSEpsY1hWbGMzUnpJQzB0WEc0Z0lDQWdJQ0FnSUdsbUlDaHpaV3htTG1OdmIydHBaWE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQk1iMmRuWlhJdWFXNW1ieWduWTI5dmEybGxjeWNzSUdGd2FTd2djMlZzWmk1amIyOXJhV1Z6S1RzZ1hHNGdJQ0FnSUNBZ0lDQWdjMlZzWmk1c2IyZG5aWEl1YVc1bWJ5Z25ZMjl2YTJsbGN5Y3NJR0Z3YVN3Z2MyVnNaaTVqYjI5cmFXVnpLVHNnWEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQmxjbkp2Y2lBOUlITmxiR1l1WDJoaGJtUnNaVVZ5Y205eUtISmxjeWs3WEc0Z0lDQWdJQ0FnSUhaaGNpQmtjbVZ6SUQwZ0tISmxjeTVpYjJSNUlDWW1JSEpsY3k1aWIyUjVMbVJsY0d4dmVYSWdQeUJ5WlhNdVltOWtlU0E2SUhKbGN5azdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4dUlDQWdJQ0FnWEc0Z0lDQWdJQ0FnSUhObGJHWXVhVzV3ZFhSeklEMGdXMTA3WEc0Z0lDQWdJQ0FnSUhObGJHWXViM1YwY0hWMGN5QTlJRnRkTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2doWlhKeWIzSXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0x5OGdMUzBnVEc5bklHZHNiMkpoYkNBcklIUnlZVzV6WVdOMGFXOXVJR3h2WnlBdExWeHVJQ0FnSUNBZ0lDQWdJQ0JNYjJkblpYSXVhVzVtYnlnblpXNWtLQ2tuTENCaGNHa3NJR1J5WlhNc0lISmxjeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lITmxiR1l1Ykc5bloyVnlMbWx1Wm04b0oyVnVaQ2dwSnl3Z1lYQnBMQ0JrY21WekxDQnlaWE1wTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQzh2SUMwdElIZGhiR3NnY21WemNHOXVjMlVnWm05eUlIUnZjQzFzWlhabGJDQmxiblJwZEhrZ2NtVnpjRzl1YzJVZ1lYTnphV2R1YldWdWRDQXRMU0FnSUNBZ0lDQWdYRzRnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxiblJwZEdsbGN5a2dleUJrY21WeklEMGdaSEpsY3k1a1pYQnNiM2x5TG5KbGMzQnZibk5sVzJWdWRHbDBhV1Z6WFNCOGZDQmtjbVZ6T3lCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnWkhKbGN5NW5aWFFnUFNCbWRXNWpkR2x2YmloclpYa3BJSHNnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjFkR2xzY3k1blpYUW9aSEpsY3k1a1pYQnNiM2x5TG5KbGMzQnZibk5sTENCclpYa3BPeUJjYmlBZ0lDQWdJQ0FnSUNBZ2ZUdGNibHh1SUNBZ0lDQWdJQ0FnSUNCa2NtVnpMbmR2Y210emNHRmpaU0E5SUdaMWJtTjBhVzl1S0c1aGJXVXBJSHNnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjFkR2xzY3k1M2IzSnJjM0JoWTJVb1pISmxjeTVrWlhCc2IzbHlMbkpsYzNCdmJuTmxMQ0J1WVcxbEtUc2dYRzRnSUNBZ0lDQWdJQ0FnSUgwN1hHNWNiaUFnSUNBZ0lDQWdJQ0FnTHk4Z0xTMGdZMkZzYkdKaFkyc2dMUzFjYmlBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1p1S1NCN0lHRnlaM01nUFNCbWJpNWhjSEJzZVNoelpXeG1Mbk5qYjNCbExDQmJaSEpsY3l3Z2NtVnpjRzl1YzJWRGFHRnBibDBwTzMxY2JseHVJQ0FnSUNBZ0lDQWdJQ0F2THlBdExTQnViM1JwWm5rZ2RHaGhkQ0IwYUdVZ2NYVmxkV1VnYUdGeklHSmxaVzRnWkhKaGFXNWxaQzR1TGlBdExWeHVJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NTNXphWHBsS0NrZ1BUMDlJREFwSUhzZ1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNWZZMnhsWVhJb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNCelpXeG1MbVJsWm1WeWNtVmtMbkpsYzI5c2RtVW9jbVZ6Y0c5dWMyVkRhR0ZwYmlCOGZDQmtjbVZ6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdmU0FnSUNBZ0lDQWdJQ0JjYmx4dUlDQWdJQ0FnSUNBZ0lDQXZMeUF0TFNCcGJtTnNkV1JsSUdOdmIydHBaWE1nYVc0Z2JtVjRkQ0J5WlhGMVpYTjBJR2x1SUhSb1pTQnhkV1YxWlNBdExWeHVJQ0FnSUNBZ0lDQWdJQ0JoY21keklEMGdiV1Z5WjJVb1lYSm5jeXdnZXlCZlgyTnZiMnRwWlhOZlh6b2djMlZzWmk1amIyOXJhV1Z6SUgwcE95QWdJQ0FnSUNBZ0lDQmNiaUFnSUNBZ0lDQWdmU0FnSUNBZ0lDQWdYRzVjYmlBZ0lDQWdJQ0FnY1M1NWFXVnNaQ2htWVd4elpTazdYRzRnSUNBZ0lDQWdJSEV1Wm14MWMyZ29aSEpsY3l3Z1pYSnliM0lzSUdGeVozTXBPeUF2THlCd1lYTnpJSEpsYzNWc2RIeGxjbkp2Y254aGNtZHpJSFJ2SUc1bGVIUWdYRzRnSUNBZ0lDQjlLVHRjYmx4dUlDQWdJQ0FnY1M1NWFXVnNaQ2gwY25WbEtUdGNiaUFnSUNCOUxDQjBhR2x6TENCMGFHbHpMbVJsYkdGNVpXUXBPMXh1SUNCY2JpQWdJQ0JwWmlBb0lYUm9hWE11WkdWc1lYbGxaQ0FtSmlCeExuTnBlbVVvS1NBOFBTQXhLU0I3SUhFdVpteDFjMmdvS1RzZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUgwc0lGeHVYRzRnSUM4cUtpQmNiaUFnSUNvZ1FXUmtJR0Z1SUdGa1pHbDBhVzl1WVd3Z1NVOGdjbVZ4ZFdWemRDQjBieUIwYUdVZ1pYaHphWE4wYVc1bklITmxjWFZsYm5ScFlXd2djbVZ4ZFdWemRDQmphR0ZwYmk1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQnBiMXh1SUNBZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1lYQnBJRTl1WlNCdlppQjBhR1VnYzNWd2NHOXlkR1ZrSUVSbGNHeHZlVklnUVZCSmN5NWNiaUFnSUNvZ1FISmxkSFZ5YmlCN1JHVndiRzk1VW4wZ1ptOXlJR05vWVdsdWFXNW5MbHh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZMXh1SUNBZ0tpOGdJQ0JjYmlBZ2FXODZJR1oxYm1OMGFXOXVJQ2hoY0drcElIc2dJQ0FnWEc0Z0lDQWdjbVYwZFhKdUlFUmxjR3h2ZVZJdWJtVjNLR0Z3YVN3Z2V5QmNiaUFnSUNBZ0lHTnZiMnRwWlhNNklIUm9hWE11WTI5dmEybGxjeXdnWEc0Z0lDQWdJQ0J4ZFdWMVpUb2dkR2hwY3k1eExDQmNiaUFnSUNBZ0lHUmxabVZ5Y21Wa09pQjBhR2x6TG1SbFptVnljbVZrWEc0Z0lDQWdmU2s3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FJRnh1SUNBZ0tpQkRiMjUyWlc1cFpXNWpaU0JtZFc1amRHbHZiaUJtYjNJZ1lXUmthVzVuSUdGdUlHRmtaR2wwYVc5dVlXd2djMk55YVhCMElHVjRaV04xZEdsdmJpQjBieUIwYUdVZ1hHNGdJQ0FxSUdWNGMybHpkR2x1WnlCelpYRjFaVzUwYVdGc0lISmxjWFZsYzNRZ1kyaGhhVzR1WEc0Z0lDQXFYRzRnSUNBcUlFQnRaWFJvYjJRZ2MyTnlhWEIwWEc0Z0lDQXFJRUJ3WVhKaGJTQjdRWEpuZFcxbGJuUnpmU0JCY21kMWJXVnVkSE1nZEc4Z1pHVm1hVzVsSUhSb1pTQm1kV3hzZVNCeGRXRnNhV1pwWldRZ2MyTnlhWEIwSUdadmNpQmNiaUFnSUNvZ1pYaGxZM1YwYVc5dUxseHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtY3VJQ0FnWEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDQXFMMXh1SUNCelkzSnBjSFE2SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNCMllYSWdZWEpuY3lBOUlIVjBhV3h6TG5OcFoyNWhkSFZ5WlNoaGNtZDFiV1Z1ZEhNcExGeHVJQ0FnSUNBZ0lDQWdiM0IwY3lBOUlHRnlaM011YjNCMGN5eGNiaUFnSUNBZ0lDQWdJR0Z3YVNBZ1BTQmhjbWR6TG1Gd2FTeGNiaUFnSUNBZ0lDQWdJR3hwYm1zZ1BTQjdJRnh1SUNBZ0lDQWdJQ0FnSUdOdmIydHBaWE02SUhSb2FYTXVZMjl2YTJsbGN5d2dYRzRnSUNBZ0lDQWdJQ0FnY1hWbGRXVTZJSFJvYVhNdWNTd2dYRzRnSUNBZ0lDQWdJQ0FnWkdWbVpYSnlaV1E2SUhSb2FYTXVaR1ZtWlhKeVpXUmNiaUFnSUNBZ0lDQWdmVHNnSUZ4dVhHNGdJQ0FnTHk4Z1kyOXVkbVZ1YVdWdVkyVWdMU0JwWmlCMGFHVWdjSEp2YW1WamRDQnBjeUJoSUdKdmIyeGxiaUJnZEhKMVpXQWdjbUYwYUdWeUlIUm9ZVzRnWVNCd2FXUXNJR1pwY25OMFhHNGdJQ0FnTHk4Z1kzSmxZWFJsSUdFZ2JtVjNJSEJ5YjJwbFkzUWdZVzVrSUhSb1pXNGdjSEpsY0dGeVpTQjBhR1VnY0hKdmFtVmpkQ0JoY0drZ1kyRnNiQ0IwYnlCbGVHVmpkWFJsWEc0Z0lDQWdhV1lnS0dGeVozTXVZM0psWVhSbEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1JHVndiRzk1VWk1dVpYY29KeTl5TDNCeWIycGxZM1F2WTNKbFlYUmxKeXdnYkdsdWF5bGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDNWxibVFvWm5WdVkzUnBiMjRvY21WektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdleUJ3Y205cVpXTjBPaUJ5WlhNdVoyVjBLQ2R3Y205cVpXTjBKeWt1Y0hKdmFtVmpkQ0I5TzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdWFXOG9ZWEJwS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG1SaGRHRW9iM0IwY3lrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQkVaWEJzYjNsU0xtNWxkeWhoY0drc0lHeHBibXNwTG1SaGRHRW9iM0IwY3lrN1hHNGdJQ0FnZlNBZ0lDQmNiaUFnZlN4Y2JseHVJQ0F2S2lvZ1hHNGdJQ0FxSUVOdmJuWmxibWxsYm1ObElHWjFibU4wYVc5dUlHWnZjaUJoWkdScGJtY2dZVzRnWVdSa2FYUnBiMjVoYkNCeVpYQnZjMmwwYjNKNUxXMWhibUZuWldRZ2MyaGxiR3dnWEc0Z0lDQXFJSE5qY21sd2RDQmxlR1ZqZFhScGIyNGdkRzhnZEdobElHVjRjMmx6ZEdsdVp5QnpaWEYxWlc1MGFXRnNJSEpsY1hWbGMzUWdZMmhoYVc0dVhHNGdJQ0FxWEc0Z0lDQXFJRlJvYVhNZ1kyRnNiQ0JsZUdWamRYUmxjeUJ5WlhCdmMybDBiM0o1TFcxaGJtRm5aV1FnYzJobGJHd2djMk55YVhCMGN5QXVjMmdzSUM1amMyZ3NJQzVpWVhOb0xDQXVZbUYwSUZ4dUlDQWdLaUJ2YmlCMGFHVWdSR1Z3Ykc5NVVpQnpaWEoyWlhJdUlFUjFaU0IwYnlCMGFHVWdjM0JsWTJsaGJDQnpaV04xY21sMGVTQmpiMjVqWlhKdWN5QmhjM052WTJsaGRHVmtJSGRwZEdnZ1hHNGdJQ0FxSUdWNFkzVjBhVzVuSUhOb1pXeHNJSE5qY21sd2RITWdiMjRnZEdobElFUmxjR3h2ZVZJZ2MyVnlkbVZ5TENCdmJteDVJSE5vWld4c0lITmpjbWx3ZEhNZ2IzZHVaV1FnWW5rZ1hHNGdJQ0FxSUY5QlJFMUpUa2xUVkZKQlZFOVNYeUIxYzJWeWN5QmpZVzRnWW1VZ1pYaGxZM1YwWldRZ2IyNGdkR2hwY3lCQlVFa2dZMkZzYkM0Z1FXNTVJR0YwZEdWdGNIUWdkRzhnWEc0Z0lDQXFJR1Y0WldOMWRHVWdZU0J6YUdWc2JDQnpZM0pwY0hRZ2MzUnZjbVZrSUdsdUlIUm9aU0J5WlhCdmMybDBiM0o1SUhSb1lYUWdhWE1nYm05MElHOTNibVZrSUdKNUlHRnVJRnh1SUNBZ0tpQmZRVVJOU1U1SlUxUlNRVlJQVWw4Z2RYTmxjaUIzYVd4c0lHSmxJSEpsYW1WamRHVmtMbHh1SUNBZ0tseHVJQ0FnS2lCVWJ5QmxlR1ZqZFhSbElHRWdjbVZ3YjNOcGRHOXllUzF0WVc1aFoyVmtJSE5vWld4c0lITmpjbWx3ZENCMGFHVWdZMkZzYkdWeUlHMTFjM1FnY0hKdmRtbGtaU0JjYmlBZ0lDb2djR0Z5WVcxbGRHVnlJSFpoYkhWbGN5Qm1iM0lnWDJGMWRHaHZjbDhzSUY5a2FYSmxZM1J2Y25sZkxDQmZabWxzWlc1aGJXVmZMaUJVYUdseklHTmhiaUJpWlZ4dUlDQWdLaUJoWTJocFpYWmxaQ0JpZVNCd2NtOTJhV1JwYm1jZ1lTQm1kV3hzZVNCeGRXRnNhV1pwWldRZ2MyaGxiR3dnYzJOeWFYQjBJRnh1SUNBZ0tpQmdMenhoZFhSb2IzSStMenhrYVhKbFkzUnZjbmsrTHp4bWFXeGxibUZ0WlQ1Z0xDQm1iM0lnWlhoaGJYQnNaVHBjYmlBZ0lDcGNiaUFnSUNvZ0lHQmdZRnh1SUNBZ0tpQWdMbk5vWld4c0tDY3ZZV1J0YVc0dlpYaDBaWEp1WVd3NmNIVmliR2xqT21Ga2JXbHVMMlZqYUc4dWMyZ25MQ0FuWldOb2J5NXphQ0JoY21keklIUnZJSEJoYzNNdUp5bGNiaUFnSUNvZ0lHQmdZRnh1SUNBZ0tseHVJQ0FnS2lCQWJXVjBhRzlrSUhOb1pXeHNYRzRnSUNBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCbWFXeGxjR0YwYUNCMGJ5QmtaV1pwYm1VZ2RHaGxJR1oxYkd4NUlIRjFZV3hwWm1sbFpDQnphR1ZzYkNCelkzSnBjSFFnWm05eVhHNGdJQ0FxSUdWNFpXTjFkR2x2Ymk0Z1hHNGdJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JoY21keklDaHZjSFJwYjI1aGJDa2dZWEpuZFcxbGJuUnpJSFJ2SUdKbElIQmhjM05sWkNCcGJuUnZJSFJvWlNCemFHVnNiQ0JjYmlBZ0lDb2djMk55YVhCMElHOXVJR1Y0WldOMWRHbHZiaTVjYmlBZ0lDb2dRSEpsZEhWeWJpQjdSR1Z3Ykc5NVVuMGdabTl5SUdOb1lXbHVhVzVuTGlBZ0lGeHVJQ0FnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ0FnS2k5Y2JpQWdjMmhsYkd3NklHWjFibU4wYVc5dUtIQmhkR2dzSUdGeVozTXBJSHNnSUNCY2JpQWdJQ0IyWVhJZ2JHbHVheUE5SUhzZ1hHNGdJQ0FnSUNBZ0lDQWdZMjl2YTJsbGN6b2dkR2hwY3k1amIyOXJhV1Z6TENCY2JpQWdJQ0FnSUNBZ0lDQnhkV1YxWlRvZ2RHaHBjeTV4TENCY2JpQWdJQ0FnSUNBZ0lDQmtaV1psY25KbFpEb2dkR2hwY3k1a1pXWmxjbkpsWkZ4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQjBiMnRsYm5NZ1BTQk1ZVzVuTG1selUzUnlhVzVuS0hCaGRHZ3BJRDhnY0dGMGFDNXpjR3hwZENnblhGd3ZKeWtnT2lCYlhUdGNibHh1SUNBZ0lDOHZJR2hoYm1Sc1pTQmliM1JvT2lCZ0wyRjFkR2h2Y2k5a2FYSmxZM1J2Y25rdlptbHNaVzVoYldWZ0lDWWdZR0YxZEdodmNpOWthWEpsWTNSdmNua3ZabWxzWlc1aGJXVmdYRzRnSUNBZ2FXWWdLSFJ2YTJWdWN5NXNaVzVuZEdnZ1BpQXpLU0I3SUhSdmEyVnVjeUE5SUhSdmEyVnVjeTV6YkdsalpTZ3hLVHNnZlZ4dVhHNGdJQ0FnY21WMGRYSnVJRVJsY0d4dmVWSXVibVYzS0NjdmNpOXlaWEJ2YzJsMGIzSjVMM05vWld4c0wyVjRaV04xZEdVbkxDQnNhVzVyS1M1a1lYUmhLSHRjYmlBZ0lDQWdJR0YxZEdodmNqb2dkRzlyWlc1eld6QmRMRnh1SUNBZ0lDQWdaR2x5WldOMGIzSjVPaUIwYjJ0bGJuTmJNVjBzWEc0Z0lDQWdJQ0JtYVd4bGJtRnRaVG9nZEc5clpXNXpXekpkTEZ4dUlDQWdJQ0FnWVhKbmN6b2dZWEpuYzF4dUlDQWdJSDBwTzF4dUlDQjlMRnh1WEc0Z0lDOHFLaUJjYmlBZ0lDb2dRMjl1ZG1WdWFXVnVZMlVnWm5WdVkzUnBiMjRnWm05eUlHVjRaV04xZEdsdVp5QmhJR0pzYjJOcklHOW1JRklnWTI5a1pTQnZiaUIwYUdVZ1VpQnpaWE56YVc5dUxseHVYRzRnSUNBcUlFVjRZVzF3YkdVNlhHNGdJQ0FxSUNCZ1lHQmNiaUFnSUNvZ0lDNWpiMlJsS0NkNFBDMDFKeWxjYmlBZ0lDb2dJQzh2SUMwdElHOXlJQzB0WEc0Z0lDQXFJQ0F1WTI5a1pTZ25lRHd0TlNjc0lIQnliMnBsWTNSSlpDbGNiaUFnSUNvZ0lHQmdZRnh1SUNBZ0tpQWdJRnh1SUNBZ0tpQkFiV1YwYUc5a0lHTnZaR1ZjYmlBZ0lDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlISWdMU0JVYUdVZ1lteHZZMnNnYjJZZ1VpQmpiMlJsSUhSdklHVjRaV04xZEdVdVhHNGdJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J3Y205cVpXTjBJQzBnS0c5d2RHbHZibUZzS1NCcFppQnZiV2wwZEdWa0lHRWdibVYzSUhCeWIycGxZM1FnZDJsc2JDQm1hWEp6ZENCaVpTQmNiaUFnSUNvZ1kzSmxZWFJsWkNCaGJtUWdkWE5sWkN3Z2IzUm9aWEozYVhObElHbDBJSGRwYkd3Z1pYaGxZM1YwWlNCdmJpQjBhR1VnVWlCelpYTnphVzl1SUdsa1pXNTBhV1pwWldRZ1lua2dYRzRnSUNBcUlIUm9hWE1nWUhCeWIycGxZM1JnTGx4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JtYjNJZ1kyaGhhVzVwYm1jdUlDQWdYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpYRzRnSUNBcUwxeHVJQ0JqYjJSbE9pQm1kVzVqZEdsdmJpaHlMQ0J3Y205cVpXTjBLU0I3WEc0Z0lDQWdJSFpoY2lCc2FXNXJJRDBnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJR052YjJ0cFpYTTZJSFJvYVhNdVkyOXZhMmxsY3l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0J4ZFdWMVpUb2dkR2hwY3k1eExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdSbFptVnljbVZrT2lCMGFHbHpMbVJsWm1WeWNtVmtYRzRnSUNBZ0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnSUNBZ1lYQnBJRDBnSnk5eUwzQnliMnBsWTNRdlpYaGxZM1YwWlM5amIyUmxKenRjYmx4dUlDQWdJQ0JwWmlBb0lYQnliMnBsWTNRcElIdGNiaUFnSUNBZ0lDQWdJSEpsZEhWeWJpQkVaWEJzYjNsU0xtNWxkeWduTDNJdmNISnZhbVZqZEM5amNtVmhkR1VuTENCc2FXNXJLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDNWxibVFvWm5WdVkzUnBiMjRvY21WektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjdJSEJ5YjJwbFkzUTZJSEpsY3k1blpYUW9KM0J5YjJwbFkzUW5LUzV3Y205cVpXTjBJSDA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdmU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQXVhVzhvWVhCcEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUM1a1lYUmhLSHNnWTI5a1pUb2djaUI5S1R0Y2JpQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUhKbGRIVnliaUJFWlhCc2IzbFNMbTVsZHloaGNHa3NJR3hwYm1zcExtUmhkR0VvZXlCamIyUmxPaUJ5TENCd2NtOXFaV04wT2lCd2NtOXFaV04wSUgwcE8xeHVJQ0FnSUNCOVhHNGdJSDBzWEc0Z0lGeHVJQ0F2S2lvZ1hHNGdJQ0FxSUZKbGJHVmhjMlVnWVc1NUlISmxjMmxrZFdGc0lIQnliMnBsWTNRZ2NtVnpiM1Z5WTJWeklHRnpjMjlqYVdGMFpXUWdkMmwwYUNCMGFHVWdZWEJ3YkdsallYUnBiMjRnWEc0Z0lDQXFJR2x1YzNSaGJtTmxJSGRvWlc1bGRtVnlJR0VnWTJ4cFpXNTBJR0Z3Y0d4cFkyRjBhVzl1SUhSbGNtMXBibUYwWlhNdUlGUm9hWE1nYVc1amJIVmtaWE1nWTJ4dmMybHVaeUJjYmlBZ0lDb2dZVzU1SUhOMWNIQnNhV1ZrSUhCeWIycGxZM1J6SUdSdmQyNGdZVzVrSUd4dloyZHBibWNnYjNWMExseHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJSEpsYkdWaGMyVmNiaUFnSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ4UVhKeVlYbDlJSEJ5YjJwbFkzUnpJRlJvWlNCd2NtOXFaV04wSUc5eUlHeHBjM1FnYjJZZ2NISnZhbVZqZEhNZ2RHOGdZMnh2YzJVdVhHNGdJQ0FxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnWVhWMGFDQW9iM0IwYVc5dVlXd3BJSFJ2SUhKbGJXRnBiaUJoZFhSb1pXNTBhV05oZEdWa0xseHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtY3VJQ0FnWEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDQXFMMXh1SUNCeVpXeGxZWE5sT2lCbWRXNWpkR2x2Ymlod2NtOXFaV04wY3l3Z1lYVjBhQ2tnZTF4dUlDQWdJQ0J3Y205cVpXTjBjeUE5SUV4aGJtY3VhWE5CY25KaGVTaHdjbTlxWldOMGN5a2dQeUJ3Y205cVpXTjBjeUE2SUZ0d2NtOXFaV04wYzEwN1hHNWNiaUFnSUNBZ2RtRnlJSE5sYkdZZ0lDQWdJRDBnZEdocGN5eGNiaUFnSUNBZ0lDQWdJR1JsWm1WeWNtVmtJRDBnUkNncExGeHVJQ0FnSUNBZ0lDQWdaVzF3ZEhrZ0lDQWdQU0FoY0hKdmFtVmpkSE1nZkh3Z0lYQnliMnBsWTNSeld6QmRMRnh1SUNBZ0lDQWdJQ0FnWTI5MWJuUWdJQ0FnUFNBd0xGeHVJQ0FnSUNBZ0lDQWdiR0Z6ZENBZ0lDQWdQU0FoWlcxd2RIa2dQeUJ3Y205cVpXTjBjeTVzWlc1bmRHZ2dMU0F4SURvZ1kyOTFiblFzWEc0Z0lDQWdJQ0FnSUNCamIyOXJhV1Z6SUNBOUlIUm9hWE11WjJWMFEyOXZhMmxsY3lncE95QWdJQ0FnSUNBZ0lDQWdYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNiMmR2ZFhRb2FXNWtaWGdwSUh0Y2JpQWdJQ0FnSUdsbUlDaHBibVJsZUNBOVBUMGdiR0Z6ZENrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVdGMWRHZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNCRVpYQnNiM2xTTG01bGR5Z25MM0l2ZFhObGNpOXNiMmR2ZFhRbktWeHVJQ0FnSUNBZ0lDQWdJQzV6YUdGeVpTaGpiMjlyYVdWektWeHVJQ0FnSUNBZ0lDQWdJQzVsY25KdmNpaG1kVzVqZEdsdmJpZ3BJSHNnSUNBZ0lDQWdJQ0FnWEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV1psY25KbFpDNXlaV3BsWTNRb1ptRnNjMlVwTzF4dUlDQWdJQ0FnSUNBZ0lIMHBJQ0FnSUNBZ1hHNGdJQ0FnSUNBZ0lDQWdMbVZ1WkNobWRXNWpkR2x2YmlncElIc2dYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pXWmxjbkpsWkM1eVpYTnZiSFpsS0hSeWRXVXBPMXh1SUNBZ0lDQWdJQ0FnSUgwcFhHNGdJQ0FnSUNBZ0lDQWdMbVZ1YzNWeVpTaG1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1WkdWemRISnZlU2dwTzF4dUlDQWdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUdSbFptVnljbVZrTG5KbGMyOXNkbVVvZEhKMVpTazdYRzRnSUNBZ0lDQWdJQ0FnYzJWc1ppNWtaWE4wY205NUtDazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDBnWEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0NGbGJYQjBlU2tnZTF4dUlDQWdJQ0FnY0hKdmFtVmpkSE11Wm05eVJXRmphQ2htZFc1amRHbHZiaWh3Y205cVpXTjBLU0I3WEc0Z0lDQWdJQ0FnSUVSbGNHeHZlVkl1Ym1WM0tDY3ZjaTl3Y205cVpXTjBMMk5zYjNObEp5bGNiaUFnSUNBZ0lDQWdMbVJoZEdFb2V5QndjbTlxWldOME9pQndjbTlxWldOMElIMHBYRzRnSUNBZ0lDQWdJQzV6YUdGeVpTaGpiMjlyYVdWektWeHVJQ0FnSUNBZ0lDQXVaVzVrS0NsY2JpQWdJQ0FnSUNBZ0xtVnVjM1Z5WlNobWRXNWpkR2x2YmlncElIdGNiaUFnSUNBZ0lDQWdJQ0JzYjJkdmRYUW9ZMjkxYm5RcE8xeHVJQ0FnSUNBZ0lDQWdJR052ZFc1MEt5czdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnZlNrN0lDQWdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUd4dloyOTFkQ2hqYjNWdWRDazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUdSbFptVnljbVZrTG5CeWIyMXBjMlU3SUNCY2JpQWdmU3dnSUZ4dVhHNGdJQzhxS2lCY2JpQWdJQ29nUVNCamIyNTJaVzVwWlc1alpTQmhiSFJsY201aGRHbDJaU0IwYnlCdGRXeDBhWEJzWlNCZ0xuSnBibkIxZENncFlDQmpZV3hzY3k0Z1JHVm1hVzVsY3lCaElHNWhiV1VnWEc0Z0lDQXFJR3hwYzNRZ2IyWWdVaUJ2WW1wbFkzUnpJSFJvWVhRZ2QybHNiQ0JpWlNCeVpYUjFjbTVsWkNCaGN5QkVaWEJzYjNsU0xXVnVZMjlrWldRZ1VpQnZZbXBsWTNSeklHOXVJSFJvWlNCY2JpQWdJQ29nY21WemNHOXVjMlVnYldGeWEzVndMbHh1SUNBZ0tseHVJQ0FnS2lCRFlXeHNhVzVuSUhSb2FYTWdiV1YwYUc5a0lINHVjbTkxZEhCMWRITW9XeUF1TGk0Z1hTbGdJR2x6SUdWeGRXbDJZV3hsYm5RZ2RHOGdhVzUyYjJ0cGJtY2diWFZzZEdsd2JHVWdYRzRnSUNBcUlHQXVjbTkxZEhCMWRDZ3VMaTRwWUNCallXeHNjeTVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxkR2h2WkNCeWIzVjBjSFYwYzF4dUlDQWdLaUJBY0dGeVlXMGdlMEZ5Y21GNWZTQnliMkpxWldOMGN5QkJJRzVoYldVZ2JHbHpkQ0J2WmlCU0lHOWlhbVZqZEhNZ2RHaGhkQ0IzYVd4c0lHSmxJSEpsZEhWeWJtVmtMbHh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQm1iM0lnWTJoaGFXNXBibWN1SUNBZ1hHNGdJQ0FxSUVCaGNHa2djSFZpYkdsalhHNGdJQ0FxTDF4dUlDQnliM1YwY0hWMGN6b2dablZ1WTNScGIyNGdLSEp2ZFhSd2RYUnpLU0I3WEc0Z0lDQWdhV1lnS0hKdmRYUndkWFJ6S1NCN0lIUm9hWE11YjNWMGNIVjBjeUE5SUhSb2FYTXViM1YwY0hWMGN5NWpiMjVqWVhRb2NtOTFkSEIxZEhNcE95QjlYRzVjYmlBZ0lDQnlaWFIxY200Z2RHaHBjenRjYmlBZ2ZTeGNiaUFnWEc0Z0lDOHFLaUJjYmlBZ0lDb2dSR1ZtYVc1bGN5QjBhR1VnYm1GdFpTQnZaaUIwYUdVZ1VpQnZZbXBsWTNRZ2RHaGhkQ0IzYVd4c0lHSmxJSEpsZEhWeWJtVmtJR0Z6SUdFZ1JHVndiRzk1VWkxbGJtTnZaR1ZrSUZ4dUlDQWdLaUJTSUc5aWFtVmpkQ0J2YmlCMGFHVWdjbVZ6Y0c5dWMyVWdiV0Z5YTNWd0xseHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJSEp2ZFhSd2RYUmNiaUFnSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhKdlltcGxZM1FnVkdobElHNWhiV1VnYjJZZ2RHaGxJRklnYjJKcVpXTjBJSFJvWVhRZ2QybHNiQ0JpWlNCeVpYUjFjbTVsWkM1Y2JpQWdJQ29nUUhKbGRIVnliaUI3UkdWd2JHOTVVbjBnWm05eUlHTm9ZV2x1YVc1bkxpQWdJRnh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZMXh1SUNBZ0tpOWNiaUFnY205MWRIQjFkRG9nWm5WdVkzUnBiMjRnS0hKdmRYUndkWFFwSUh0Y2JpQWdJQ0JwWmlBb2NtOTFkSEIxZENrZ2V5QjBhR2x6TG5KdmRYUndkWFJ6S0Z0eWIzVjBjSFYwWFNrN0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNCOUxGeHVYRzRnSUM4cUtpQmNiaUFnSUNvZ1ZYTmxaQ0IwYnlCd1lYTnpJRzExYkhScGNHeGxJR2x1Y0hWMGN5QmhkQ0J2Ym1ObElHWnliMjBnU21GMllWTmpjbWx3ZENCMGJ5QmhiaUJTSUhOamNtbHdkQ0IxYzJsdVp5QmNiaUFnSUNvZ2IyNWxJRzltSUhSb1pTQmtaV1pwYm1Wa0lHQlNTVzV3ZFhSZ0lHWmhZM1J2Y21sbGN5NWNiaUFnSUNwY2JpQWdJQ29nUUcxbGRHaHZaQ0J5YVc1d2RYUnpYRzRnSUNBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUhKcGJuQjFkSE1nVkdobElHQlNTVzV3ZFhSZ0lHeHBjM1FnYjJZZ1JHVndiRzk1VWkxemNHVmphV1pwWXlCbGJtTnZaR1ZrSUZJZ1hHNGdJQ0FxSUc5aWFtVmpkQ0JrWVhSaElHWnZjaUIxYzJVZ2IyNGdZVzRnUVZCSklHTmhiR3d1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1Wnk0Z0lDQmNiaUFnSUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFnSUNvdlhHNGdJSEpwYm5CMWRITTZJR1oxYm1OMGFXOXVJQ2h5YVc1d2RYUnpLU0I3WEc0Z0lDQWdhV1lnS0hKcGJuQjFkSE1wSUhzZ2RHaHBjeTVwYm5CMWRITWdQU0IwYUdsekxtbHVjSFYwY3k1amIyNWpZWFFvY21sdWNIVjBjeWs3SUgxY2JseHVJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHVJQ0I5TEZ4dVhHNGdJQzhxS2lCY2JpQWdJQ29nVlhObFpDQjBieUJ3WVhOeklHMTFiSFJwY0d4bElHbHVjSFYwY3lCaGRDQnZibU5sSUdaeWIyMGdTbUYyWVZOamNtbHdkQ0IwYnlCaGJpQlNJSE5qY21sd2RDQjFjMmx1WnlCY2JpQWdJQ29nYjI1bElHOW1JSFJvWlNCa1pXWnBibVZrSUdCU1NXNXdkWFJnSUdaaFkzUnZjbWxsY3k1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQnlhVzV3ZFhSY2JpQWdJQ29nUUhCaGNtRnRJSHRTU1c1d2RYUjlJSEpwYm5CMWRDQlVhR1VnUkdWd2JHOTVVaTF6Y0dWamFXWnBZeUJsYm1OdlpHVmtJRklnYjJKcVpXTjBJR1JoZEdFZ1ptOXlJSFZ6WlNCY2JpQWdJQ29nYjI0Z1lXNGdRVkJKSUdOaGJHd3VJQ0FnWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1Wnk0Z0lDQmNiaUFnSUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFnSUNvdlhHNGdJSEpwYm5CMWREb2dablZ1WTNScGIyNGdLSEpwYm5CMWRDa2dlMXh1SUNBZ0lHbG1JQ2h5YVc1d2RYUXBJSHNnZEdocGN5NXBibkIxZEhNdWNIVnphQ2h5YVc1d2RYUXBPeUI5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmU3hjYmx4dUlDQXZLaXBjYmlBZ0lDb2dSR1Z6ZEhKdmVTQnNhV1psWTNsamJHVWdiV1YwYUc5a0xpQkdhWEpsY3lCMGFHVWdZR1JsYzNSeWIzbGdJR1YyWlc1MExDQndjbWx2Y2lCMGJ5QnBiblp2YTJsdVp5QmNiaUFnSUNvZ1pHVnpkSEoxWTNSdmNuTWdabTl5SUhSb1pTQmpiR0Z6Y3lCb2FXVnlZWEpqYUhrdUlFTmhiR3hsWkNCcGJuUmxjbTVoYkd4NUlIZG9aVzRnWUM1eVpXeGxZWE5sS0NsZ1hHNGdJQ0FxSUdseklHTmhiR3hsWkM1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQmtaWE4wY205NVhHNGdJQ0FxSUVCaGNHa2djSFZpYkdsaklDQWdYRzRnSUNBcUwxeHVJQ0JrWlhOMGNtOTVPaUJtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lIUm9hWE11WlcxcGRDZ25aR1Z6ZEhKdmVTY3BPMXh1SUNBZ0lDQWdkR2hwY3k1dlptWkJiR3dvS1R0Y2JpQWdJQ0JjYmlBZ0lDQWdJR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQjBhR2x6S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtaGhjMDkzYmxCeWIzQmxjblI1S0d0bGVTa3BJSHNnWEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjMXRyWlhsZElEMGdiblZzYkRzZ1hHNGdJQ0FnSUNBZ0lDQWdaR1ZzWlhSbElIUm9hWE5iYTJWNVhUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMGdZMkYwWTJnb1pYSnlLU0I3ZlZ4dUlDQjlMQ0FnWEc1Y2JpQWdMeThnTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMxY2JpQWdMeThnVUhKcGRtRjBaU0J0WlhSb2IyUnpYRzRnSUM4dklDMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFQmhjR2tnY0hKcGRtRjBaVnh1SUNBZ0tpOWNiaUFnWDJOc1pXRnlPaUJtZFc1amRHbHZiaWdwSUhzZ0lDQWdYRzRnSUNBZ2RHaHBjeTV3WVhKaGJYTWdJQ0E5SUh0OU8xeHVJQ0FnSUhSb2FYTXVhVzV3ZFhSeklDQWdQU0JiWFR0Y2JpQWdJQ0IwYUdsekxtOTFkSEIxZEhNZ0lEMGdXMTA3WEc0Z0lDQWdkR2hwY3k1eWMzUnlaV0Z0SUNBOUlHWmhiSE5sTzF4dUlDQWdJSFJvYVhNdVpHVnNZWGxsWkNBZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0IwYUdsekxtRndhU0FnSUNBZ0lEMGdiblZzYkRzZ0lDQWdYRzRnSUNBZ2RHaHBjeTVtYVd4bElDQWdJQ0E5SUc1MWJHdzdJQ0JjYmlBZ0lDQjBhR2x6TG1WdWRHbDBhV1Z6SUQwZ2JuVnNiRHRjYmlBZ0lDQjBhR2x6TG1sdlJtbHNkR1Z5SUQwZ2JuVnNiRHRjYmlBZ2ZTd2dYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFQmhjR2tnY0hKcGRtRjBaVnh1SUNBZ0tpOWNiaUFnWDNCeVpYQlNaWEYxWlhOME9pQm1kVzVqZEdsdmJpQW9jbVZ6Y0c5dWMyVkRhR0ZwYml3Z1lYSm5jeWtnZTF4dUlDQWdJSFpoY2lCeVpYRWdJRDBnZEdocGN5NXlaWEVzWEc0Z0lDQWdJQ0FnSUdacGJHVWdQU0IwYUdsekxtWnBiR1U3WEc1Y2JpQWdJQ0F2THlCelpYUWdkR2hsSUhKbGNYVmxjM1FnZEhsd1pTQWdJQ0JjYmlBZ0lDQnBaaUFvZEdocGN5NWhjR2t1ZFhCc2IyRmtLU0I3WEc0Z0lDQWdJQ0FnTHk4Z1NXWWdkR2hsSUdWdWRpQnBjeUIwYUdVZ1FuSnZkM05sY2lCMGFHVnlaU0JwY3lCdWJ5QnVaV1ZrSUhSdklHMWhiblZoYkd4NUlITmxkQ0IwYUdWY2JpQWdJQ0FnSUNBdkx5QkRiMjUwWlc1MExWUjVjR1V1SUZSb1pTQmljbTkzYzJWeUlIZHBiR3dnWVhWMGIyMWhkR2xqWVd4c2VTQnpaWFFnZEdobElGeHVJQ0FnSUNBZ0lDOHZJRndpYlhWc2RHbHdZWEowTDJadmNtMHRaR0YwWVRzZ1ltOTFibVJoY25rOUxpNHVYQ0lnZG1Gc2RXVXVJRWxtSUhSb1pTQmxibllnYVhNZ1RtOWtaU0IzWlNCdVpXVmtYRzRnSUNBZ0lDQWdMeThnZEc4Z2MyVjBJR2wwSUcxaGJuVmhiR3g1TGx4dUlDQWdJQ0FnSUdsbUlDZ2hkMmx1S1NCN0lIUm9hWE11Y21WeExuUjVjR1VvSjIxMWJIUnBjR0Z5ZEM5bWIzSnRMV1JoZEdFbktUc2dmU0FnSUNCY2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVZ4TG5SNWNHVW9KMlp2Y20wbktUdGNiaUFnSUNCOUlDQWdJRnh1WEc0Z0lDQWdjbVZ4TG05dUtDZGxjbkp2Y2ljc0lHWjFibU4wYVc5dUtHVnljaWtnZXlCY2JpQWdJQ0FnSUdWeWNpQTlJR1Z5Y2lCOGZDQjdJQ0JqYjJSbE9pQW5WVTVMVGs5WFRpQkRUMFJGSnl3Z2RHVjRkRG9nSjFWT1MwNVBWMDRnUlZKU1QxSW5JSDA3WEc1Y2JpQWdJQ0FnSUhSb2FYTXVYMmhoYm1Sc1pVVnljbTl5S0hzZ1hHNGdJQ0FnSUNBZ0lITjBZWFIxY3pvZ1pYSnlMbU52WkdVZ2ZId2dKMVZPUzA1UFYwNGdRMDlFUlNjc1hHNGdJQ0FnSUNBZ0lIUmxlSFE2SUdWeWNseHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZTNWlhVzVrS0hSb2FYTXBLVHNnSUNBZ1hHNWNiaUFnSUNCMGFHbHpMbk5vWVhKbEtHRnlaM01nUHlCaGNtZHpMbDlmWTI5dmEybGxjMTlmSURvZ2JuVnNiQ2s3WEc1Y2JpQWdJQ0F2THlCaGNtZDFiV1Z1ZEhNZ2NtVjBkWEp1WldRZ1puSnZiU0J3Y21WMklISmxjWFZsYzNRbmN5QnBieWdwTG1WdVpDaG1kVzVqZEdsdmJpZ3BJSHNnY21WMGRYSnVJSGc3SUgwcFhHNGdJQ0FnYVdZZ0tHRnlaM01wSUhzZ1hHNGdJQ0FnSUNBZ2RHaHBjeTVrWVhSaEtHRnlaM01wTzF4dUlDQWdJSDBnWEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTVwYm5CMWRITXViR1Z1WjNSb0lENGdNQ2tnZXlCY2JpQWdJQ0FnSUhSb2FYTXVaR0YwWVNoN0lHbHVjSFYwY3pvZ1pXNWpiMlJsY2k1bGJtTnZaR1VvZEdocGN5NXBibkIxZEhNcElIMHBPeUJjYmlBZ0lDQjlYRzRnSUZ4dUlDQWdJR2xtSUNoMGFHbHpMbTkxZEhCMWRITXViR1Z1WjNSb0lENGdNQ2tnZXlCY2JpQWdJQ0FnSUhSb2FYTXVaR0YwWVNoN0lISnZZbXBsWTNSek9pQjBhR2x6TG05MWRIQjFkSE11YW05cGJpZ3BJSDBwT3lCY2JpQWdJQ0I5SUNBZ0lGeHVYRzRnSUNBZ2FXWWdLSFJvYVhNdVkyOXZhMmxsY3lrZ2V5QWdJQ0FnWEc0Z0lDQWdJQ0IwYUdsekxtTnZiMnRwWlhNdVptOXlSV0ZqYUNnZ1puVnVZM1JwYjI0b1l5a2dleUJ5WlhFdWMyVjBLQ2REYjI5cmFXVW5MQ0JqS1RzZ2ZTazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSFJvYVhNdVlYQnBMblZ3Ykc5aFpDa2dleUFnSUNCY2JpQWdJQ0FnSUdadmNpaDJZWElnY0NCcGJpQjBhR2x6TG5CaGNtRnRjeWtnZTF4dUlDQWdJQ0FnSUNCeVpYRXVabWxsYkdRb2NDd2dLSFJvYVhNdWNHRnlZVzF6VzNCZElIeDhJSFJvYVhNdWNHRnlZVzF6VzNCZElEMDlQU0JtWVd4elpTa2dQeUJjYmlBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV3WVhKaGJYTmJjRjBnS3lBbkp5QTZJQ2NuS1R0Y2JpQWdJQ0FnSUgwZ1hHNGdJQ0FnSUNCeVpYRXVZWFIwWVdOb0tDZG1hV3hsSnl3Z2RHaHBjeTV5YzNSeVpXRnRJRDhnWm5NdVkzSmxZWFJsVW1WaFpGTjBjbVZoYlNobWFXeGxLU0E2SUdacGJHVXBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCeVpYRmJkR2hwY3k1aGNHa3ViV1YwYUc5a0lEMDlQU0FuUjBWVUp5QS9JQ2R4ZFdWeWVTY2dPaUFuYzJWdVpDZGRLSFJvYVhNdWNHRnlZVzF6S1R0Y2JpQWdJQ0I5SUZ4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkFZWEJwSUhCeWFYWmhkR1ZjYmlBZ0lDb3ZYRzRnSUY5b1lXNWtiR1ZGY25KdmNqb2dablZ1WTNScGIyNGdLSEpoZHlrZ2UxeHVJQ0FnSUhaaGNpQnpkR0YwSUNBOUlISmhkeTV6ZEdGMGRYTXNYRzRnSUNBZ0lDQWdJSEpsY3lBZ0lEMGdLSEpoZHk1aWIyUjVJQ1ltSUhKaGR5NWliMlI1TG1SbGNHeHZlWElnUHlCeVlYY3VZbTlrZVNBNklISmhkeWtzWEc0Z0lDQWdJQ0FnSUdWeWNtOXlJRDBnS0NoemRHRjBJQ0U5UFNBeU1EQXBJSHg4SUhKbGN5NWtaWEJzYjNseUlDWW1JQ0Z5WlhNdVpHVndiRzk1Y2k1eVpYTndiMjV6WlM1emRXTmpaWE56S1R0Y2JseHVJQ0FnSUM4dklDMHRJRWhoYm1Sc1pTQmxjbkp2Y25NZ0xTMWNiaUFnSUNCcFppQW9aWEp5YjNJcElIdGNiaUFnSUNBZ0lISmxjeUE5SUh0Y2JpQWdJQ0FnSUNBZ1oyVjBPaUJtZFc1amRHbHZiaWhyWlhrcElIc2dYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFYwYVd4ekxtZGxkQ2gwYUdsekxtUmxjR3h2ZVhJdWNtVnpjRzl1YzJVc0lHdGxlU2s3SUZ4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQmtaWEJzYjNseU9pQjdJQ0FnSUNBZ0lDQWdJRnh1SUNBZ0lDQWdJQ0FnSUhKbGMzQnZibk5sT2lCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J6ZFdOalpYTnpPaUJtWVd4elpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUdOaGJHdzZJSFJvYVhNdVlYQnBXeWRqWVd4c0oxMHNYRzRnSUNBZ0lDQWdJQ0FnSUNCbGNuSnZja052WkdVNklISmxjeTVrWlhCc2IzbHlJRDhnY21WekxtUmxjR3h2ZVhJdWNtVnpjRzl1YzJVdVpYSnliM0pEYjJSbElEb2djM1JoZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJR1Z5Y205eU9pQnlaWE11WkdWd2JHOTVjaUEvSUhKbGN5NWtaWEJzYjNseUxuSmxjM0J2Ym5ObExtVnljbTl5SURvZ2NtVnpMblJsZUhSY2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDA3WEc1Y2JpQWdJQ0FnSUV4dloyZGxjaTVsY25KdmNpZ25aWEp5YjNJb0tTY3NJSFJvYVhNdVlYQnBMQ0J5WlhNc0lISmhkeWs3WEc0Z0lDQWdJQ0IwYUdsekxteHZaMmRsY2k1bGNuSnZjaWduWlhKeWIzSW9LU2NzSUhSb2FYTXVZWEJwTENCeVpYTXNJSEpoZHlrN1hHNWNiaUFnSUNBZ0lDOHZJQzB0SUc1dmRHbG1lU0JuYkc5aVlXd2daWEp5YjNKeklHWnBjbk4wSUNocFppQmhibmtwSUdadmNpQjBhR2x6SUdOaGJHd2dMUzBnSUNBZ0lDQmNiaUFnSUNBZ0lHbG1JQ2gwYUdsekxtZHNiMkpoYkVWMmRITXBJSHRjYmlBZ0lDQWdJQ0FnY21GcGMyVkhiRzlpWVd4RmNuSnZjbk1vZEdocGN5NWhjR2xiSjJOaGJHd25YU3dnY21WektUc2dJQ0FnSUNBZ0lGeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQXZMeUF0TFNCMGNtRnVZV04wYVc5dUlHeGxkbVZzSUVoVVZGQWdiM0lnUkdWd2JHOTVVaUJsY25KdmNuTWdZMjl0WlNCdVpYaDBJQzB0SUNBZ0lGeHVJQ0FnSUNBZ2RHaHBjeTVsYldsMEtDZGxjbkp2Y2ljc0lISmxjeWs3WEc0Z0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJSbGNHeHZlWEl0YVc4Nkp5QXJJSEpsY3k1a1pYQnNiM2x5TG5KbGMzQnZibk5sTG1WeWNtOXlRMjlrWlN3Z2NtVnpLVHRjYmlBZ0lDQWdJSFJvYVhNdVpHVm1aWEp5WldRdWNtVnFaV04wS0hKbGN5azdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUdWeWNtOXlPMXh1SUNCOVhHNTlLVHRjYmx4dUx5b3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xTDF4dUx5b3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xTDF4dUx5b3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xTDF4dVhHNHZMeUJKYm1Oc2RXUmxJSFJvWlNCZ1pHVndjbVZqWVhSbFpHQWdhbk5FWlhCc2IzbFNJR1p2Y2lCdWIzY3VYRzVwWmlBb2QybHVLU0I3WEc0Z0lIZHBibVJ2ZHk1U1pYWnZiSFYwYVc5dUlEMGdkMmx1Wkc5M0xsSmxkbTlzZFhScGIyNGdmSHdnY21WeGRXbHlaU2duTGk5c2FXSXZaR1Z3Y21WallYUmxaQ2NwTzF4dWZWeHVYRzR2S2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3ZYRzR2S2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3ZYRzR2S2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3ZYRzVjYmk4cUtseHVJQ29nUlhod2IzTmxJR1p2Y2lCaElHTnNaV0Z1WlhJZ1kyeHBaVzUwSUdGd2FTQnBiblJ2SUVSbGNHeHZlVkpjYmlBcUwxeHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQjdYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVjRjRzl6WlhNZ2RHaGxJR0JFWlhCc2IzbFNZQ0J2WW1wbFkzUWdabTl5SUdWNGRHVnVaR2x1Wnk1Y2JpQWdJQ3BjYmlBZ0lDb2dZR0JnZG1GeUlFUmxjR3h2ZVZJZ1BTQnlaWEYxYVhKbEtDZGtaWEJzYjNseUp5a3VSR1Z3Ykc5NVVqdGdZR0JjYmlBZ0lDcGNiaUFnSUNvZ1FITjBZWFJwWTF4dUlDQWdLaUJBWVhCcElIQjFZbXhwWTF4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JVYUdVZ1lFUmxjR3h2ZVZKZ0lHOWlhbVZqZEM1Y2JpQWdJQ292SUNBZ1hHNGdJRVJsY0d4dmVWSTZJRVJsY0d4dmVWSXNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVjRjRzl6WlhNZ2RHaGxJSE4xY0hCdmNuUmxaQ0JFWlhCc2IzbFNJRUZRU1hNdVhHNGdJQ0FxWEc0Z0lDQXFJRUJ0WlhSb2IyUWdZWEJwYzF4dUlDQWdLaUJBY0dGeVlXMGdlMEp2YjJ4bFlXNTlJR1pzWVhRZ0tHOXdkR2x2Ym1Gc0tTQnBaaUJnZEhKMVpXQWdkMmxzYkNCeVpYUjFjbTRnWVc0Z1lYSnlZWGtnYjJZZ2FuVnpkQ0IwYUdVZ1hHNGdJQ0FxSUVGUVNTZHpJR1Z1WkhCdmFXNTBJSEJ5YjNCbGNuUnBaWE1zSUdadmNpQmxlR0Z0Y0d4bE9pQmNiaUFnSUNvZ1lHQmdYRzRnSUNBcUlGc25MM0l2ZFhObGNpOXNiMmRwYmljc0lDY3ZjaTkxYzJWeUwyeHZaMjkxZENjc0lDY3ZjaTkxYzJWeUwyRmliM1YwSnl3Z0xpNHVYVnh1SUNBZ0tpQmdZR0JjYmlBZ0lDb2dRSE4wWVhScFkxeHVJQ0FnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ0FnS2lCQWNtVjBkWEp1SUh0UFltcGxZM1I4UVhKeVlYbDlJRlJvWlNCSVZGUlFJSEpsY1hWbGMzUWdkRzhnZEdobElFUmxjR3h2ZVZJZ2MyVnlkbVZ5TGlBZ0lDQWdJRnh1SUNBZ0tpOGdJRnh1SUNCaGNHbHpPaUJtZFc1amRHbHZiaWhtYkdGMEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdac1lYUWdQeUJQWW1wbFkzUXVhMlY1Y3loaGNHbHpLU0E2SUdGd2FYTTdYRzRnSUgwc1hHNWNiaUFnTHlvcVhHNGdJQ0FxSUZKbGNISmxjMlZ1ZEhNZ1lTQnpkR0YwYVdNZ2JXVjBhRzlrSUdadmNpQmpiMjVtYVdkMWNtbHVaeUJoYkd3Z1JHVndiRzk1VWlCeVpYRjFaWE4wY3k0Z1UyVjBkR2x1WjNNZ1hHNGdJQ0FxSUcxaFpHVWdhR1Z5WlNCaGNtVWdZWEJ3YkdsbFpDQm5iRzlpWVd4c2VTQmhZM0p2YzNNZ1pYWmxjbmtnY21WeGRXVnpkQzVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxkR2h2WkNCamIyNW1hV2QxY21WY2JpQWdJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRzl3ZEdsdmJuTWdWR2hsSUc5aWFtVmpkQ0JzYVhSbGNtRnNJR052Ym1acFozVnlZWFJwYjI0Z2FHRnphQzRnWEc0Z0lDQXFJRUJ6ZEdGMGFXTmNiaUFnSUNvZ1FHTm9ZV2x1WVdKc1pWeHVJQ0FnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ0FnS2k5Y2JpQWdZMjl1Wm1sbmRYSmxPaUJtZFc1amRHbHZiaWh2Y0hScGIyNXpLU0I3WEc0Z0lDQWdiM0IwYVc5dWN5QTlJRzl3ZEdsdmJuTWdmSHdnZTMwN1hHNWNiaUFnSUNCbWIzSWdLSFpoY2lCcElHbHVJRzl3ZEdsdmJuTXBJSHNnWjJ4dlltRnNUM0IwYVc5dWN5NXpaWFFvYVN3Z2IzQjBhVzl1YzF0cFhTazdJSDFjYmx4dUlDQWdJQzh2SUdGemMyVnlkQ0JuYkc5aVlXd2dZMjl2YTJsbGN5QmhjbVVnWlcxd2RIa2dhV1lnWjJ4dlltRnNJR0J6ZEdsamEzbGdJR3B6WlhOemFXOXVhV1FnYVhNZ2IyWm1YRzRnSUNBZ2FXWWdLQ0ZuYkc5aVlXeFBjSFJwYjI1ekxuTjBhV05yZVNrZ0lIc2daMnh2WW1Gc1QzQjBhVzl1Y3k1elpYUW9KMk52YjJ0cFpYTW5MQ0J1ZFd4c0tUc2dmVnh1WEc0Z0lDQWdMeThnZEhWeWJpQm5iRzlpWVd3Z2JHOW5aMmx1WnlCdmJueHZabVlnS0c5bVppQmllU0JrWldaaGRXeDBLVnh1SUNBZ0lFeHZaMmRsY2k1elpYUk1aWFpsYkNobmJHOWlZV3hQY0hScGIyNXpMbXh2WjJkcGJtY2dQeUJNYjJkblpYSXVSRVZDVlVjZ09pQk1iMmRuWlhJdVQwWkdLVHRjYmx4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TzF4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkdZV04wYjNKNUlHWnZjaUJqY21WaGRHbHVaeUJ1WlhjZ1NVOGdjbVZ4ZFdWemRITWdkRzhnWUVSbGNHeHZlVkpnTGx4dUlDQWdLbHh1SUNBZ0tpQkZlR0Z0Y0d4bE9seHVJQ0FnS2lCZ1lHQWdJQ0JjYmlBZ0lDb2dJQ0FnWkdWd2JHOTVjaTVwYnlnbkwzSXZkWE5sY2k5aFltOTFkQ2NwTG1WdVpDaGpZV3hzWW1GamF5azdYRzRnSUNBcUlHQmdZRnh1SUNBZ0tseHVJQ0FnS2lCQWJXVjBhRzlrSUdsdlhHNGdJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JoY0drZ1QyNWxJRzltSUhSb1pTQnpkWEJ3YjNKMFpXUWdSR1Z3Ykc5NVVpQkJVRWx6TGx4dUlDQWdLaUJBYzNSaGRHbGpYRzRnSUNBcUlFQnlaWFIxY200Z2UwUmxjR3h2ZVZKOUlGUm9aU0JJVkZSUUlISmxjWFZsYzNRZ2RHOGdkR2hsSUVSbGNHeHZlVklnYzJWeWRtVnlMbHh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZeUFnSUZ4dUlDQWdLaTljYmlBZ2FXODZJR1oxYm1OMGFXOXVLR0Z3YVNrZ2V5QWdYRzRnSUNBZ2NtVjBkWEp1SUVSbGNHeHZlVkl1Ym1WM0tHRndhU2s3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFTnZiblpsYm1sbGJtTmxJR1oxYm1OMGFXOXVJSFJ2SUhOcFoyNGdkR2hsSUhWelpYSWdhVzRnWW5rZ1lYVjBhR1Z1ZEdsallYUnBibWNnZEdobElHTnlaV1JsYm5ScFlXeHpJRnh1SUNBZ0tpQjNhWFJvSUhSb1pTQkVaWEJzYjNsU0lITmxjblpsY2k0Z0lDQmNiaUFnSUNwY2JpQWdJQ29nUUcxbGRHaHZaQ0JoZFhSb1hHNGdJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0IxYzJWeWJtRnRaU0JUY0dWamFXWnBaWE1nZEdobElIVnpaWEp1WVcxbExseHVJQ0FnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnY0dGemMzZHZjbVFnVTNCbFkybG1hV1Z6SUhSb1pTQndZWE56ZDI5eVpDNWNiaUFnSUNvZ1FITjBZWFJwWTF4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JVYUdVZ1NGUlVVQ0J5WlhGMVpYTjBJSFJ2SUhSb1pTQkVaWEJzYjNsU0lITmxjblpsY2k0Z0lDQmNiaUFnSUNvZ1FHRndhU0J3ZFdKc2FXTWdJQ0JjYmlBZ0lDb3ZJQ0FnWEc0Z0lHRjFkR2c2SUdaMWJtTjBhVzl1S0hWdUxDQndkeWtnZTF4dUlDQWdJSFpoY2lCa1lYUmhJRDBnZXlCMWMyVnlibUZ0WlRvZ2RXNHNJSEJoYzNOM2IzSmtPaUJ3ZHlCOU8xeHVJQ0FnSUhKbGRIVnliaUJFWlhCc2IzbFNMbTVsZHlnbkwzSXZkWE5sY2k5c2IyZHBiaWNwTG1SaGRHRW9aR0YwWVNrdVpXNWtLQ2s3SUNBZ0lGeHVJQ0I5TEZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJEYjI1MlpXNXBaVzVqWlNCbWRXNWpkR2x2YmlCMGJ5QnphV2R1SUhSb1pTQjFjMlZ5SUdsdUlHSjVJR0YxZEdobGJuUnBZMkYwYVc1bklIUm9aU0JqY21Wa1pXNTBhV0ZzY3lCY2JpQWdJQ29nZDJsMGFDQjBhR1VnUkdWd2JHOTVVaUJ6WlhKMlpYSXVJQ0FnWEc0Z0lDQXFYRzRnSUNBcUlFVjRZVzF3YkdVNlhHNGdJQ0FxSUdCZ1lGeHVJQ0FnS2lBZ0lDQmtaWEJzYjNseUxuTmpjbWx3ZENnbkwzUmxjM1IxYzJWeUwzSnZiM1F2Y21Wa2RXTmxMbEluS1Z4dUlDQWdLaUFnSUNCa1pYQnNiM2x5TG5OamNtbHdkQ2g3SUdacGJHVnVZVzFsT2lBbmNtVmtkV05sTGxJbkxDQmhkWFJvYjNJNklDZDBaWE4wZFhObGNpY3NYRzRnSUNBcUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2x5WldOMGIzSjVPaUFuY205dmRDZDlLVnh1SUNBZ0tpQWdJQ0JrWlhCc2IzbHlMbk5qY21sd2RDZ25jbVZrZFdObExsSW5MQ0FuZEdWemRIVnpaWEluTENBbmNtOXZkQ2NwWEc0Z0lDQXFJQ0FnSUdSbGNHeHZlWEl1YzJOeWFYQjBLQ2N2ZEdWemRIVnpaWEl2Y205dmRDOXlaV1IxWTJVdVVpY3NJSEJ5YjJwbFkzUXBJQ0FnSUNCY2JpQWdJQ29nWUdCZ0lDQWdYRzRnSUNBcVhHNGdJQ0FxSUVCdFpYUm9iMlFnYzJOeWFYQjBYRzRnSUNBcUlFQndZWEpoYlNCN1FYSm5kVzFsYm5SemZTQmhjbWQxYldWdWRITWdRWEpuZFcxbGJuUnpJSFJ2SUdSbFptbHVaU0IwYUdVZ1puVnNiSGtnY1hWaGJHbG1hV1ZrSUhOamNtbHdkQ0JjYmlBZ0lDb2dabTl5SUdWNFpXTjFkR2x2Ymk1Y2JpQWdJQ29nUUhOMFlYUnBZMXh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQlVhR1VnU0ZSVVVDQnlaWEYxWlhOMElIUnZJSFJvWlNCRVpYQnNiM2xTSUhObGNuWmxjaTRnSUNCY2JpQWdJQ29nUUdGd2FTQndkV0pzYVdNZ0lDQmNiaUFnSUNvdklDQWdJQ0JjYmlBZ2MyTnlhWEIwT2lCbWRXNWpkR2x2YmlncElIdGNiaUFnSUNCMllYSWdZWEpuY3lBOUlIVjBhV3h6TG5OcFoyNWhkSFZ5WlNoaGNtZDFiV1Z1ZEhNcExGeHVJQ0FnSUNBZ0lDQnZjSFJ6SUQwZ1lYSm5jeTV2Y0hSekxGeHVJQ0FnSUNBZ0lDQmhjR2tnSUQwZ1lYSm5jeTVoY0drN0lDQmNibHh1SUNBZ0lDOHZJR052Ym5abGJtbGxibU5sSUMwZ2FXWWdkR2hsSUhCeWIycGxZM1FnYVhNZ1lTQmliMjlzWlc0Z1lIUnlkV1ZnSUhKaGRHaGxjaUIwYUdGdUlHRWdjR2xrTENCbWFYSnpkRnh1SUNBZ0lDOHZJR055WldGMFpTQmhJRzVsZHlCd2NtOXFaV04wSUdGdVpDQjBhR1Z1SUhCeVpYQmhjbVVnZEdobElIQnliMnBsWTNRZ1lYQnBJR05oYkd3Z2RHOGdaWGhsWTNWMFpWeHVJQ0FnSUdsbUlDaGhjbWR6TG1OeVpXRjBaU2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJRVJsY0d4dmVWSXVibVYzS0NjdmNpOXdjbTlxWldOMEwyTnlaV0YwWlNjcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdVpXNWtLR1oxYm1OMGFXOXVLSEpsY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIc2djSEp2YW1WamREb2djbVZ6TG1kbGRDZ25jSEp2YW1WamRDY3BMbkJ5YjJwbFkzUWdmVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG1sdktHRndhU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzVrWVhSaEtHOXdkSE1wTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1JHVndiRzk1VWk1dVpYY29ZWEJwS1M1a1lYUmhLRzl3ZEhNcE8xeHVJQ0FnSUgxY2JpQWdmU3dnSUZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJTZFc0Z1lXNGdjMlZ5YVdWeklHOW1JR05vWVdsdVpXUWdSR1Z3Ykc5NVVpQnlaWEYxWlhOMGN5QnBiaUJ6WlhGMVpXNWpaU0JoYm1RZ2QybDBhRzkxZENCdmRtVnliR0Z3TGlBZ0lDQWdJQ0JjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxkR2h2WkNCd2FYQnNhVzVsWEc0Z0lDQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlIUmhjMnR6SUZOd1pXTnBabWxsY3lCMGFHVWdiR2x6ZENCdlppQmdSblZ1WTNScGIyNWdJSFJoYzJ0ekxseHVJQ0FnS2lCQWMzUmhkR2xqWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMUJ5YjIxcGMyVjlJRUVnY0hKdmJXbHpaU0IzY21Gd2NHbHVaeUIwYUdVZ2NtVnpiMngxZEdsdmJpQnZaaUJsYVhSb1pYSWdYQ0p5WlhOdmJIWmxYQ0lnYjNKY2JpQWdJQ29nWENKeVpXcGxZM1JjSWlCallXeHNZbUZqYXk1Y2JpQWdJQ29nUUdGd2FTQndkV0pzYVdNZ0lDQmNiaUFnSUNvdlhHNGdJSEJwY0dWc2FXNWxPaUJtZFc1amRHbHZiaWhqYUdGcGJuTXBJSHNnSUNBZ0lDQmNiaUFnSUNCMllYSWdaR1Z3Ykc5NWNpQWdQU0IwYUdsekxGeHVJQ0FnSUNBZ0lDQmtaV1psY25KbFpDQTlJRVFvS1N4Y2JpQWdJQ0FnSUNBZ2NTQWdJQ0FnSUNBZ1BTQnVaWGNnVVhWbGRXVW9LU3hjYmlBZ0lDQWdJQ0FnY21WemRXeDBjeUFnUFNCYlhTeGNiaUFnSUNBZ0lDQWdaWEp5YjNKeklDQWdQU0JiWFN4Y2JpQWdJQ0FnSUNBZ1RrOVBVQ0FnSUNBZ1BTQnVkV3hzTENBdkx5Qk9UMDlRSUdWeWNtOXljM3h5WlhOMWJIUnpJR1p2Y2lCYllWMGdZbUYwWTJnZ2NtVnhkV1Z6ZENCamFHRnBibHh1SUNBZ0lDQWdJQ0J2Y21sbklDQWdJQ0E5SUh0Y2JpQWdJQ0FnSUNBZ0lDQnpkR2xqYTNrNklHZHNiMkpoYkU5d2RHbHZibk11YzNScFkydDVMRnh1SUNBZ0lDQWdJQ0FnSUdOdmIydHBaWE02SUdkc2IySmhiRTl3ZEdsdmJuTXVZMjl2YTJsbGMxeHVJQ0FnSUNBZ0lDQjlPMXh1WEc0Z0lDQWdMeThnYldGclpTQmhJR052Y0hsY2JpQWdJQ0JqYUdGcGJuTWdQU0JqYUdGcGJuTXVjMnhwWTJVb01DazdYRzVjYmlBZ0lDQXZMeUIwZFhKdUlITjBhV05yZVNCelpYTnphVzl1SUdadmNpQjBhR1Z6WlNCeVpYRjFaWE4wSUNob1lXTnJlU2xjYmlBZ0lDQmtaWEJzYjNseUxtTnZibVpwWjNWeVpTZ2dleUJ6ZEdsamEzazZJSFJ5ZFdVZ2ZTazdYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQmhaR1FvS1NCN1hHNGdJQ0FnSUNCeExtRmtaQ2htZFc1amRHbHZiaWdwSUhzZ1hHNGdJQ0FnSUNBZ0lHTm9ZV2x1Y3k1emFHbG1kQ2dwTG1SeVlXbHVLQ2xjYmlBZ0lDQWdJQ0FnTG5Sb1pXNG9ablZ1WTNScGIyNG9ZMmhoYVc0cElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhOMWJIUnpMbkIxYzJnb1kyaGhhVzRwT3lBZ1hHNGdJQ0FnSUNBZ0lDQWdaWEp5YjNKekxuQjFjMmdvVGs5UFVDazdJQ0FnSUNBZ0lDQWdJQ0JjYmlBZ0lDQWdJQ0FnSUNCcFppQW9jUzVwYzBWdGNIUjVLQ2twSUhzZ1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrWlhCc2IzbHlMbU52Ym1acFozVnlaU2h2Y21sbktUc2dMeThnY21WelpYUmNiaUFnSUNBZ0lDQWdJQ0FnSUdSbFptVnljbVZrTG5KbGMyOXNkbVVvZXlCeVpYTjFiSFJ6T2lCeVpYTjFiSFJ6TENCbGNuSnZjbk02SUdWeWNtOXljeUI5S1RzZ1hHNGdJQ0FnSUNBZ0lDQWdmU0FnWEc1Y2JpQWdJQ0FnSUNBZ0lDQnhMblJoYTJVb0tUdGNiaUFnSUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRvWlhKeUtTQjdJQ0FnSUNBZ0lDQWdJRnh1SUNBZ0lDQWdJQ0FnSUhKbGMzVnNkSE11Y0hWemFDaE9UMDlRS1RzZ1hHNGdJQ0FnSUNBZ0lDQWdaWEp5YjNKekxuQjFjMmdvWlhKeUtUdGNiaUFnSUNBZ0lDQWdJQ0F2THlCeVpXcGxZM1JwYjI1eklHRnlaU0J2Ym14NUlHMWxkQ0IzYUdWdUlIUm9aWGtnVzJGc2JGMGdabUZwYkZ4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2h4TG1selJXMXdkSGtvS1NBbUppQnlaWE4xYkhSekxteGxibWQwYUNBOVBUMGdNQ2tnZXlCY2JpQWdJQ0FnSUNBZ0lDQWdJR1JsY0d4dmVYSXVZMjl1Wm1sbmRYSmxLRzl5YVdjcE95QXZMeUJ5WlhObGRGeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWbVpYSnlaV1F1Y21WcVpXTjBLR1Z5Y205eWN5azdJRnh1SUNBZ0lDQWdJQ0FnSUgwZ0lGeHVJQ0FnSUNBZ0lDQWdJSEV1ZEdGclpTZ3BPMXh1SUNBZ0lDQWdJQ0I5S1RzZ0lDQWdJQ0FnWEc0Z0lDQWdJQ0I5TENCdWRXeHNMQ0IwY25WbEtUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QmpiMjUyWlhKMElIUnZJR0VnYzJWeElIRjFaWFZsSUdadmNpQmlaWFIwWlhJZ2FHRnVaR3hwYm1kY2JpQWdJQ0JtYjNJb2RtRnlJR2tnUFNBd095QnBJRHdnWTJoaGFXNXpMbXhsYm1kMGFEc2dhU3NyS1NCN0lHRmtaQ2dwT3lCOVhHNWNiaUFnSUNBdkx5QnpkR0Z5ZERvZ1pHVnhkV1YxWlNCbWFYSnpkQ0JwZEdWdElHRnVaQ0J5ZFc0Z2FYUmNiaUFnSUNCeExuUmhhMlVvS1R0Y2JseHVJQ0FnSUhKbGRIVnliaUJrWldabGNuSmxaQzV3Y205dGFYTmxPMXh1SUNCOUxGeHVYRzRnSUM4cUtseHVJQ0FnS2lCVWFHVWdaWFpsYm5RZ2MzUnlaV0Z0SUVGUVNTQnBjeUIxYm1seGRXVWdkMmwwYUdsdUlIUm9aU0JFWlhCc2IzbFNJRUZRU1NCaGN5QnBkQ0J6ZFhCd2IzSjBjeUJ3ZFhOb0lGeHVJQ0FnS2lCdWIzUnBabWxqWVhScGIyNXpJR1p5YjIwZ2RHaGxJRVJsY0d4dmVWSWdjMlZ5ZG1WeUlIUnZJR05zYVdWdWRDQmhjSEJzYVdOaGRHbHZibk11SUU1dmRHbG1hV05oZEdsdmJuTWdYRzRnSUNBcUlHTnZjbkpsYzNCdmJtUWdkRzhnWkdselkzSmxkR1VnWlhabGJuUnpJSFJvWVhRZ2IyTmpkWElnZDJsMGFHbHVJSFJvWlNCRVpYQnNiM2xTSUhObGNuWmxjaTRnVkdobGNtVWdYRzRnSUNBcUlHRnlaU0JtYjNWeUlHUnBjM1JwYm1OMElHVjJaVzUwSUdOaGRHVm5iM0pwWlhNNlhHNGdJQ0FxSUZ4dUlDQWdLaUF0SUZOMGNtVmhiU0JNYVdabFkzbGpiR1VnWlhabGJuUnpYRzRnSUNBcUlDMGdSWGhsWTNWMGFXOXVJR1YyWlc1MGMxeHVJQ0FnS2lBdElFcHZZaUJNYVdabFkzbGpiR1VnWlhabGJuUnpYRzRnSUNBcUlDMGdUV0Z1WVdkbGJXVnVkQ0JsZG1WdWRITmNiaUFnSUNwY2JpQWdJQ29nUlhoaGJYQnNaVHBjYmlBZ0lDb2dZR0JnWEc0Z0lDQXFJR1JsY0d4dmVYSXVaWE1vZXlCMWMyVnlibUZ0WlRvZ0ozUmxjM1IxYzJWeUp5d2djR0Z6YzNkdmNtUTZJQ2R6WldOeVpYUW5JSDBwWEc0Z0lDQXFJQ0FnSUM4dklDMHRJR052Ym01bFkzUnBiMjRnWTJodmFXTmxjeUJtYjNJZ1pYWmxiblFnZEhsd1pYTWdMUzFjYmlBZ0lDb2dJQ0FnTG0xaGJtRm5aVzFsYm5Rb0tTQWdMeTh1YzJWemMybHZiaWdwSUh3Z0xtRnNiQ2dwSUh3Z0xuQnliMnBsWTNRb2FXUXBJSHdnTG1wdllpaHBaQ2xjYmlBZ0lDb2dJQ0FnTG05dUtDZGxjenBuY21sa1NHVmhjblJpWldGMEp5d2dablZ1WTNScGIyNG9aR0YwWVNrZ2UxeHVJQ0FnS2lBZ0lDQWdJQ0FnWTI5dWMyOXNaUzVzYjJjb0p6MDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMG5LVHRjYmlBZ0lDb2dJQ0FnSUNBZ0lHTnZibk52YkdVdWJHOW5LQ2RsY3pwbmNtbGtTR1ZoY25SaVpXRjBKeWs3WEc0Z0lDQXFJQ0FnSUNBZ0lDQmpiMjV6YjJ4bExteHZaeWduUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNjcE95QWdJQ0FnSUNBZ0lDQmNiaUFnSUNvZ0lDQWdJSDBwWEc0Z0lDQXFJQ0FnSUNBdWIzQmxiaWdwTzF4dUlDQWdLaUJnWUdCY2JpQWdJQ29nWEc0Z0lDQXFJRUJ0WlhSb2IyUWdaWE5jYmlBZ0lDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOXdkR2x2Ym5NZ1ZHaGxJRzlpYW1WamRDQnNhWFJsY21Gc0lHTnZibVpwWjNWeVlYUnBiMjRnYUdGemFDNGdYRzRnSUNBcUlFQnpkR0YwYVdOY2JpQWdJQ29nUUhKbGRIVnliaUI3UlhabGJuUlRkSEpsWVcxOUlHRWdibVYzSUdCRmRtVnVkRk4wY21WaGJXQWdabTl5SUdKcGJtUnBibWN1WEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqSUNBZ1hHNGdJQ0FxTHlBZ1hHNGdJR1Z6T2lCbWRXNWpkR2x2YmlodmNIUnBiMjV6S1NCN0lDQWdJRnh1SUNBZ0lIWmhjaUJ6ZEhKbFlXMGdQU0JGZG1WdWRGTjBjbVZoYlM1dVpYY29aMnh2WW1Gc1QzQjBhVzl1Y3k1b2IzTjBMQ0J2Y0hScGIyNXpLVHRjYmx4dUlDQWdJR2xtSUNodmNIUnBiMjV6SUNZbUlHOXdkR2x2Ym5NdWRYTmxjbTVoYldVZ0ppWWdiM0IwYVc5dWN5NXdZWE56ZDI5eVpDa2dlMXh1SUNBZ0lDQWdkbUZ5SUhKMWMyVnlJRDBnZEdocGN5NWhkWFJvS0c5d2RHbHZibk11ZFhObGNtNWhiV1VzSUc5d2RHbHZibk11Y0dGemMzZHZjbVFwTzF4dUlDQWdJQ0FnY25WelpYSXVaVzV6ZFhKbEtHWjFibU4wYVc5dUtDa2dleUJjYmlBZ0lDQWdJQ0FnYzNSeVpXRnRMbk5vWVhKbEtISjFjMlZ5TG1kbGRFTnZiMnRwWlhNb0tTazdYRzRnSUNBZ0lDQWdJSE4wY21WaGJTNW1iSFZ6YUNncE95QmNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCemRISmxZVzA3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFUmxabWx1WlhNZ2RHaGxJR1poWTNSdmNua2dabTl5SUdOeVpXRjBhVzVuSUdFZ1JHVndiRzk1VWkxemNHVmphV1pwWXlCbGJtTnZaR1ZrSUZJZ2IySnFaV04wSUhSdklHSmxJRnh1SUNBZ0tpQnpaVzUwSUdGeklHbHVjSFYwSUhCaGNtRnRaWFJsY25NZ2RHOGdZVzRnVWlCelkzSnBjSFF1WEc0Z0lDQXFYRzRnSUNBcUlFVjRZVzF3YkdVNlhHNGdJQ0FxSUdCZ1lGeHVJQ0FnS2lBZ0lDQjJZWElnY21sdWNIVjBJRDBnWkdWd2JHOTVjaTVTU1c1d2RYUXViRzluYVdOaGJDZ25iRzluYVdOaGJGOXVZVzFsSnl3Z2RISjFaU2s3WEc0Z0lDQXFJQ0FnSUhaaGNpQnlhVzV3ZFhRZ1BTQmtaWEJzYjNseUxsSkpibkIxZEM1dWRXMWxjbWxqS0NkdWRXMWxjbWxqWDI1aGJXVW5MQ0F4TUM0MUtUdGNiaUFnSUNvZ0lDQWdkbUZ5SUhKcGJuQjFkQ0E5SUdSbGNHeHZlWEl1VWtsdWNIVjBMbWx1ZEdWblpYSW9KMmx1ZEdWblpYSmZibUZ0WlNjc0lEVXBPMXh1SUNBZ0tpQWdJQ0IyWVhJZ2NtbHVjSFYwSUQwZ1pHVndiRzk1Y2k1U1NXNXdkWFF1WTJoaGNtRmpkR1Z5S0NkamFHRnlZV04wWlhKZmJtRnRaU2NzSUNkSVpXeHNieWNwTzF4dUlDQWdLaUFnSUNBdkx5QmxZM1F1TGk1Y2JpQWdJQ29nWUdCZ1hHNGdJQ0FxSUVCd2NtOXdaWEowZVNCU1NXNXdkWFJjYmlBZ0lDb2dRSE4wWVhScFkxeHVJQ0FnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ0FnS2k5Y2JpQWdVa2x1Y0hWME9pQjdYRzRnSUNBZ2JuVnRaWEpwWXpvZ1puVnVZM1JwYjI0Z0tHNWhiV1VzSUhaaGJIVmxLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdVa2x1Y0hWMExtNWxkeWh1WVcxbExDQjJZV3gxWlNrdWJuVnRaWEpwWXlncE8xeHVJQ0FnSUgwc1hHNWNiaUFnSUNCcGJuUmxaMlZ5T2lCbWRXNWpkR2x2YmlBb2JtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQlNTVzV3ZFhRdWJtVjNLRzVoYldVc0lIWmhiSFZsS1M1cGJuUmxaMlZ5S0NrN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUd4dloybGpZV3c2SUdaMWJtTjBhVzl1SUNodVlXMWxMQ0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlGSkpibkIxZEM1dVpYY29ibUZ0WlN3Z2RtRnNkV1VwTG14dloybGpZV3dvS1R0Y2JpQWdJQ0I5TEZ4dVhHNGdJQ0FnWTJoaGNtRmpkR1Z5T2lCbWRXNWpkR2x2YmlBb2JtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQlNTVzV3ZFhRdWJtVjNLRzVoYldVc0lIWmhiSFZsS1M1amFHRnlZV04wWlhJb0tUdGNiaUFnSUNCOUxGeHVYRzRnSUNBZ1pHRjBaVG9nWm5WdVkzUnBiMjRnS0c1aGJXVXNJSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1VrbHVjSFYwTG01bGR5aHVZVzFsTENCMllXeDFaU2t1WkdGMFpTZ3BPMXh1SUNBZ0lIMHNYRzVjYmlBZ0lDQndiM05wZUdOME9pQm1kVzVqZEdsdmJpQW9ibUZ0WlN3Z2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJTU1c1d2RYUXVibVYzS0c1aGJXVXNJSFpoYkhWbEtTNXdiM05wZUdOMEtDazdYRzRnSUNBZ2ZTd2dJRnh1WEc0Z0lDQWdiblZ0WlhKcFkxWmxZM1J2Y2pvZ1puVnVZM1JwYjI0b2JtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQlNTVzV3ZFhRdWJtVjNLRzVoYldVc0lIWmhiSFZsS1M1dWRXMWxjbWxqVm1WamRHOXlLQ2s3WEc0Z0lDQWdmU3dnWEc1Y2JpQWdJQ0JwYm5SbFoyVnlWbVZqZEc5eU9pQm1kVzVqZEdsdmJpQW9ibUZ0WlN3Z2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJTU1c1d2RYUXVibVYzS0c1aGJXVXNJSFpoYkhWbEtTNXBiblJsWjJWeVZtVmpkRzl5S0NrN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUd4dloybGpZV3hXWldOMGIzSTZJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQjJZV3gxWlNrZ2V5QmNiaUFnSUNBZ0lISmxkSFZ5YmlCU1NXNXdkWFF1Ym1WM0tHNWhiV1VzSUhaaGJIVmxLUzVzYjJkcFkyRnNWbVZqZEc5eUtDazdYRzRnSUNBZ2ZTeGNibHh1SUNBZ0lHTm9ZWEpoWTNSbGNsWmxZM1J2Y2pvZ1puVnVZM1JwYjI0Z0tHNWhiV1VzSUhaaGJIVmxLU0I3SUZ4dUlDQWdJQ0FnY21WMGRYSnVJRkpKYm5CMWRDNXVaWGNvYm1GdFpTd2dkbUZzZFdVcExtTm9ZWEpoWTNSbGNsWmxZM1J2Y2lncE8xeHVJQ0FnSUgwc0lDQmNibHh1SUNBZ0lHUmhkR1ZXWldOMGIzSTZJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQjJZV3gxWlNrZ2V5QmNiaUFnSUNBZ0lISmxkSFZ5YmlCU1NXNXdkWFF1Ym1WM0tHNWhiV1VzSUhaaGJIVmxLUzVrWVhSbFZtVmpkRzl5S0NrN1hHNGdJQ0FnZlN3Z0lGeHVYRzRnSUNBZ2NHOXphWGhqZEZabFkzUnZjam9nWm5WdVkzUnBiMjRnS0c1aGJXVXNJSFpoYkhWbEtTQjdJRnh1SUNBZ0lDQWdjbVYwZFhKdUlGSkpibkIxZEM1dVpYY29ibUZ0WlN3Z2RtRnNkV1VwTG5CdmMybDRZM1JXWldOMGIzSW9LVHRjYmlBZ0lDQjlMRnh1WEc0Z0lDQWdiR2x6ZERvZ1puVnVZM1JwYjI0Z0tHNWhiV1VzSUhaaGJIVmxLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdVa2x1Y0hWMExtNWxkeWh1WVcxbExDQjJZV3gxWlNrdWJHbHpkQ2dwT3lCY2JpQWdJQ0I5TEZ4dVhHNGdJQ0FnWkdGMFlXWnlZVzFsT2lCbWRXNWpkR2x2YmlBb2JtRnRaU3dnZG1Gc2RXVXBJSHNnWEc0Z0lDQWdJQ0J5WlhSMWNtNGdVa2x1Y0hWMExtNWxkeWh1WVcxbExDQjJZV3gxWlNrdVpHRjBZV1p5WVcxbEtDazdYRzRnSUNBZ2ZTeGNiaUFnWEc0Z0lDQWdabUZqZEc5eU9pQm1kVzVqZEdsdmJpQW9ibUZ0WlN3Z2RtRnNkV1VzSUd4bGRtVnNjeXdnYkdGaVpXeHpLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2IzQjBjeUE5SUhzZ2JHVjJaV3h6T2lCc1pYWmxiSE1zSUd4aFltVnNjem9nYkdGaVpXeHpJSDA3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdVa2x1Y0hWMExtNWxkeWh1WVcxbExDQjJZV3gxWlN3Z2IzQjBjeWt1Wm1GamRHOXlLQ2s3WEc0Z0lDQWdmU3hjYmx4dUlDQWdJRzl5WkdWeVpXUTZJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQjJZV3gxWlN3Z2JHVjJaV3h6TENCc1lXSmxiSE1wSUh0Y2JpQWdJQ0FnSUhaaGNpQnZjSFJ6SUQwZ2V5QnNaWFpsYkhNNklHeGxkbVZzY3l3Z2JHRmlaV3h6T2lCc1lXSmxiSE1nZlR0Y2JpQWdJQ0FnSUhKbGRIVnliaUJTU1c1d2RYUXVibVYzS0c1aGJXVXNJSFpoYkhWbExDQnZjSFJ6S1M1dmNtUmxjbVZrS0NrN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUc1MWJXVnlhV05OWVhSeWFYZzZJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQjJZV3gxWlNrZ2V5QmNiaUFnSUNBZ0lISmxkSFZ5YmlCU1NXNXdkWFF1Ym1WM0tHNWhiV1VzSUhaaGJIVmxLUzV1ZFcxbGNtbGpUV0YwY21sNEtDazdYRzRnSUNBZ2ZTeGNibHh1SUNBZ0lHbHVkR1ZuWlhKTllYUnlhWGc2SUdaMWJtTjBhVzl1SUNodVlXMWxMQ0IyWVd4MVpTa2dleUJjYmlBZ0lDQWdJSEpsZEhWeWJpQlNTVzV3ZFhRdWJtVjNLRzVoYldVc0lIWmhiSFZsS1M1cGJuUmxaMlZ5VFdGMGNtbDRLQ2s3WEc0Z0lDQWdmU3hjYmx4dUlDQWdJR3h2WjJsallXeE5ZWFJ5YVhnNklHWjFibU4wYVc5dUlDaHVZVzFsTENCMllXeDFaU2tnZXlCY2JpQWdJQ0FnSUhKbGRIVnliaUJTU1c1d2RYUXVibVYzS0c1aGJXVXNJSFpoYkhWbEtTNXNiMmRwWTJGc1RXRjBjbWw0S0NrN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUdOb1lYSmhZM1JsY2sxaGRISnBlRG9nWm5WdVkzUnBiMjRnS0c1aGJXVXNJSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1VrbHVjSFYwTG01bGR5aHVZVzFsTENCMllXeDFaU2t1WTJoaGNtRmpkR1Z5VFdGMGNtbDRLQ2s3WEc0Z0lDQWdmVnh1SUNCOVhHNTlPeUpkZlE9PSIsIm1vZHVsZS5leHBvcnRzPXtcbiAgICBcIi9yL3VzZXIvbG9naW5cIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci91c2VyL2xvZ291dFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3VzZXIvYWJvdXRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci91c2VyL2F1dG9zYXZlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvdXNlci9yZWxlYXNlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9jcmVhdGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3Bvb2xcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3JlY3ljbGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2xpc3RcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3BpbmdcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2Fib3V0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9hYm91dC91cGRhdGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3NhdmVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3NhdmVhc1wiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvY2xvc2VcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2dyYW50XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9pbXBvcnRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCIsXG4gICAgICAgIFwidXBsb2FkXCI6IHRydWVcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4cG9ydFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvZGVsZXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9leGVjdXRlL2NvZGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4ZWN1dGUvc2NyaXB0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9leGVjdXRlL2ludGVycnVwdFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvZXhlY3V0ZS9jb25zb2xlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9leGVjdXRlL2hpc3RvcnlcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4ZWN1dGUvZmx1c2hcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4ZWN1dGUvcmVzdWx0L2xpc3RcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4ZWN1dGUvcmVzdWx0L2Rvd25sb2FkXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9leGVjdXRlL3Jlc3VsdC9kZWxldGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3dvcmtzcGFjZS9saXN0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2UvZ2V0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2UvdXBsb2FkXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiLFxuICAgICAgICBcInVwbG9hZFwiOiB0cnVlXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2UvdHJhbnNmZXJcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3dvcmtzcGFjZS9wdXNoXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2Uvc2F2ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3Qvd29ya3NwYWNlL3N0b3JlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2UvbG9hZFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3Qvd29ya3NwYWNlL2RlbGV0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvZGlyZWN0b3J5L2xpc3RcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2RpcmVjdG9yeS91cGxvYWRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCIsXG4gICAgICAgIFwidXBsb2FkXCI6IHRydWVcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2RpcmVjdG9yeS90cmFuc2ZlclwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvZGlyZWN0b3J5L3dyaXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9kaXJlY3RvcnkvdXBkYXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9kaXJlY3Rvcnkvc3RvcmVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2RpcmVjdG9yeS9sb2FkXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9kaXJlY3RvcnkvZG93bmxvYWRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2RpcmVjdG9yeS9kZWxldGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3BhY2thZ2UvbGlzdFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvcGFja2FnZS9hdHRhY2hcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3BhY2thZ2UvZGV0YWNoXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3Ivam9iL2xpc3RcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9qb2Ivc3VibWl0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3Ivam9iL3NjaGVkdWxlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3Ivam9iL3F1ZXJ5XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3Ivam9iL2NhbmNlbFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL2pvYi9kZWxldGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9saXN0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvY3JlYXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvcmVuYW1lXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvY29weVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L21vdmVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS91cGRhdGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L3NjcmlwdC9saXN0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9zY3JpcHQvZXhlY3V0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvc2NyaXB0L3JlbmRlclwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvc2NyaXB0L2ludGVycnVwdFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvc2hlbGwvZXhlY3V0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L2FyY2hpdmVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS91cGxvYWRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCIsXG4gICAgICAgIFwidXBsb2FkXCI6IHRydWVcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9kb3dubG9hZFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L2RlbGV0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS9saXN0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9maWxlL2ZldGNoXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9maWxlL2ZldGNoXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9maWxlL3VwbG9hZFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIixcbiAgICAgICAgXCJ1cGxvYWRcIjogdHJ1ZVxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS90cmFuc2ZlclwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS93cml0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS91cGRhdGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvZGlmZlwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS9yZXZlcnRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvZ3JhbnRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvZG93bmxvYWRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvZGVsZXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9maWxlL2NvcHlcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvbW92ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3NlcnZlci9pbmZvXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJHRVRcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9XG59XG4iLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xudmFyIExhbmcgPSByZXF1aXJlKCcuL2xhbmcnKSxcbiAgICBCYXNlID0gcmVxdWlyZSgnLi9zZWxmaXNoJykuQmFzZSxcbiAgICBSSW5wdXQgPSByZXF1aXJlKCcuL3JpbnB1dCcpO1xuXG52YXIgRGVwcmVjYXRlZCxcbiAgICBlbWl0dGVyLFxuICAgIF9jb25maWcgPSB7fSxcbiAgICBUT1BMRVZFTF9FTlRJVElFUyA9IFtcbiAgICAgICAgJ3VzZXInLFxuICAgICAgICAncHJvamVjdCcsXG4gICAgICAgICd3b3Jrc3BhY2UnLFxuICAgICAgICAnZXhlY3V0aW9uJyxcbiAgICAgICAgJ2RpcmVjdG9yeScsXG4gICAgICAgICdyZXBvc2l0b3J5JyxcbiAgICAgICAgJ3BhY2thZ2VzJ1xuICAgIF07XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudmFyIFNlc3Npb25NYW5hZ2VyID0ge1xuICAgIEVORFBPSU5UX1dISVRFTElTVDoge1xuICAgICAgICBsb2dpbjogJy9yL3VzZXIvbG9naW4nLFxuICAgICAgICBsb2dvdXQ6ICcvci91c2VyL2xvZ291dCcsXG4gICAgICAgIHByb2plY3RDcmVhdGU6ICcvci9wcm9qZWN0L2NyZWF0ZScsXG4gICAgICAgIHByb2plY3RDbG9zZTogJy9yL3Byb2plY3QvY2xvc2UnLFxuICAgICAgICBwcm9qZWN0QWJvdXRVcGRhdGU6ICcvci9wcm9qZWN0L2Fib3V0L3VwZGF0ZScsXG4gICAgICAgIHByb2plY3RTYXZlOiAnL3IvcHJvamVjdC9zYXZlJyxcbiAgICAgICAgcHJvamVjdFNhdmVBczogJy9yL3Byb2plY3Qvc2F2ZWFzJyxcbiAgICAgICAgLy8gLS0tIHByaXZhdGUgQVBJUyAtLS1cbiAgICAgICAgY2xpZW50UHJvamVjdFNhdmU6ICcvci9jbGllbnQvcHJvamVjdC9zYXZlJyxcbiAgICAgICAgY2xpZW50UHJvamVjdENsb3NlOiAnL3IvY2xpZW50L3Byb2plY3QvY2xvc2UnXG4gICAgfSxcblxuICAgIHNlc3Npb246IHt9LFxuXG4gICAgY29uZmlnOiB7fSxcblxuICAgIHNldFVubG9hZENvbmZpZzogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICBkaXNhYmxlYXV0b3NhdmU6IGNvbmZpZy5kaXNhYmxlYXV0b3NhdmUgfHwgdHJ1ZSxcbiAgICAgICAgICAgIGRyb3B3b3Jrc3BhY2U6IGNvbmZpZy5kcm9wd29ya3NwYWNlIHx8IHRydWUsXG4gICAgICAgICAgICBkcm9wZGlyZWN0b3J5OiBjb25maWcuZHJvcGRpcmVjdG9yeSB8fCB0cnVlLFxuICAgICAgICAgICAgZHJvcGhpc3Rvcnk6IGNvbmZpZy5kcm9waGlzdG9yeSB8fCB0cnVlLFxuICAgICAgICAgICAgZmx1c2hoaXN0b3J5OiBjb25maWcuZmx1c2hoaXN0b3J5IHx8IHRydWVcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIHNldFNlc3Npb246IGZ1bmN0aW9uKHNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB9LFxuICAgIHNldFByb2plY3Q6IGZ1bmN0aW9uKHByb2plY3QpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnByb2plY3QgPSBwcm9qZWN0O1xuICAgIH0sXG4gICAgY2xlYXJTZXNzaW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgfSxcbiAgICBjbGVhclByb2plY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNlc3Npb24ucHJvamVjdCA9IG51bGw7XG4gICAgfSxcbiAgICB1bmxvYWRIYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBwcm9qZWN0ID0gdGhpcy5zZXNzaW9uLnByb2plY3Q7XG4gICAgICAgICAgICBpZiAocHJvamVjdCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9jb25maWc7XG4gICAgICAgICAgICAgICAgZGF0YS5wcm9qZWN0ID0gcHJvamVjdC5pZDtcbiAgICAgICAgICAgICAgICBkYXRhLnByb2plY3Rjb29raWUgPSBwcm9qZWN0LmNvb2tpZTtcblxuICAgICAgICAgICAgICAgIGRlcGxveXIuaW8oJy9yL3Byb2plY3QvY2xvc2UnKVxuICAgICAgICAgICAgICAgICAgICAuZGF0YShkYXRhKVxuICAgICAgICAgICAgICAgICAgICAuc3luYygpXG4gICAgICAgICAgICAgICAgICAgIC5lbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBmb3JtYXQocmVzcG9uc2UsIHRyYW5zRW50aXR5KSB7XG4gICAgLy8gLS0gdHJhbnNhY3Rpb24gZW50aXR5IGZvcm1hdHMgb3ZlcnJpZGUgZ2xvYmFsIGVudGl0eSBmb3JtYXRzIC0tICBcbiAgICAvL3ZhciBmb3JtYXQgPSB0cmFuc0VudGl0eSB8fCBfY29uZmlnLmVudGl0eTtcbiAgICB2YXIgZm9ybWF0ID0gdHJhbnNFbnRpdHkgfHwgZ2xvYmFsQ29uZmlnLmVudGl0eTtcblxuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAgdmFyIHJlc09iaiA9IHJlc3BvbnNlLmRlcGxveXIucmVzcG9uc2UsXG4gICAgICAgICAgICAvLyAtLSB0b3AtbGV2ZWwgZW50aXRpZXMgLS1cbiAgICAgICAgICAgIGVudGl0aWVzID0gVE9QTEVWRUxfRU5USVRJRVM7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGVudGl0aWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIGVudGl0eSA9IGVudGl0aWVzW2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKHJlc09ialtlbnRpdHldICYmIGZvcm1hdFtlbnRpdHldKSB7IC8vIHJlc3BvbnNlIGVudGl0eSBoaXRcbiAgICAgICAgICAgICAgICAvLyAtLSB1c2VyLWRlZmluZWQgcGFyc2UgZm9yIHRvcC1sZXZlbCBlbnRpdHkgLS0gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdFtlbnRpdHldLnBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0U2NvcGUgPSBmb3JtYXRbZW50aXR5XS5zY29wZSB8fCB0aGlzO1xuICAgICAgICAgICAgICAgICAgICByZXNPYmpbZW50aXR5XSA9IGZvcm1hdFtlbnRpdHldLnBhcnNlci5jYWxsKGZvcm1hdFNjb3BlLCByZXNPYmpbZW50aXR5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VFbmRwb2ludChyZXNwb25zZSwgZW5kcG9pbnQsIGFyZ3MpIHtcblxuICAgIHZhciByZXNPYmogPSByZXNwb25zZS5kZXBsb3lyLnJlc3BvbnNlLFxuICAgICAgICBFTkRQT0lOVCA9IFNlc3Npb25NYW5hZ2VyLkVORFBPSU5UX1dISVRFTElTVDtcblxuICAgIHN3aXRjaCAoZW5kcG9pbnQpIHtcblxuICAgICAgICBjYXNlIEVORFBPSU5ULmxvZ2luOlxuXG4gICAgICAgICAgICBTZXNzaW9uTWFuYWdlci5zZXRTZXNzaW9uKHtcbiAgICAgICAgICAgICAgICBodHRwY29va2llOiByZXNPYmouaHR0cGNvb2tpZSxcbiAgICAgICAgICAgICAgICB1c2VyOiByZXNPYmoudXNlcixcbiAgICAgICAgICAgICAgICBsaW1pdHM6IHJlc09iai5saW1pdHMsXG4gICAgICAgICAgICAgICAgcHJvamVjdDogbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEVORFBPSU5ULmxvZ291dDpcbiAgICAgICAgICAgIFNlc3Npb25NYW5hZ2VyLmNsZWFyU2Vzc2lvbigpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBFTkRQT0lOVC5wcm9qZWN0Q2xvc2U6XG4gICAgICAgIGNhc2UgRU5EUE9JTlQuY2xpZW50UHJvamVjdENsb3NlOlxuICAgICAgICAgICAgU2Vzc2lvbk1hbmFnZXIuY2xlYXJQcm9qZWN0KCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEVORFBPSU5ULnByb2plY3RDcmVhdGU6XG4gICAgICAgIGNhc2UgRU5EUE9JTlQucHJvamVjdEFib3V0VXBkYXRlOlxuICAgICAgICBjYXNlIEVORFBPSU5ULnByb2plY3RTYXZlOlxuICAgICAgICBjYXNlIEVORFBPSU5ULnByb2plY3RTYXZlQXM6XG4gICAgICAgIGNhc2UgRU5EUE9JTlQuY2xpZW50UHJvamVjdFNhdmU6XG4gICAgICAgICAgICB2YXIgcHJvamVjdCA9IHJlc09iai5wcm9qZWN0O1xuICAgICAgICAgICAgU2Vzc2lvbk1hbmFnZXIuc2V0UHJvamVjdCh7XG4gICAgICAgICAgICAgICAgaWQ6IHByb2plY3QucHJvamVjdCxcbiAgICAgICAgICAgICAgICBjb29raWU6IHByb2plY3QuY29va2llXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgfSAvLyBlbmQgc3dpdGNoXG5cbiAgICBEZXByZWNhdGVkLkV2ZW50LmZpcmUoJ0RlcGxveVI6ZW5kcG9pbnRDaGFuZ2UnLCB7XG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgZW5kcG9pbnQ6IGVuZHBvaW50LFxuICAgICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gY2FtZWxDYXNlKGlucHV0KSB7XG4gICAgLy8gY29udmVydCBmb3JtYXQ6ICcvci91c2VyL2xvZ2luJyAtLT4gJ3VzZXJMb2dpbidcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoJ1xcL3JcXC8nLCAnJyk7XG4gICAgcmV0dXJuIGlucHV0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFwvKC4pL2csIGZ1bmN0aW9uKG1hdGNoLCBzZWdtZW50KSB7XG4gICAgICAgIHJldHVybiBzZWdtZW50LnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG59XG5cbi8vIHR1cm4gdGhlIG9sZCBkZXByZWNhdGVkIGlucHV0cyBpbnRvIG5ldyBpbnB1dHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZUlucHV0cyhpbnB1dHMpIHtcbiAgICB2YXIgcmlucHV0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmlucHV0cy5wdXNoKGlucHV0c1tpXS5ub3JtYWxpemUoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJpbnB1dHM7XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBUaGUgRGVwcmVjYXRlZCBpbnRlcmZhY2UuXG4gKi9cbnZhciBSRGF0YSA9IEJhc2UuZXh0ZW5kKHtcbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbih0eXBlLCByY2xhc3MsIHJpbnB1dCkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnJjbGFzcyA9IHJjbGFzcztcbiAgICAgICAgdGhpcy5yaW5wdXQgPSByaW5wdXQ7XG4gICAgfSxcblxuICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlO1xuICAgIH0sXG5cbiAgICBnZXRSQ2xhc3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yY2xhc3M7XG4gICAgfSxcblxuICAgIGdldE5hbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaW5wdXQubmFtZTtcbiAgICB9LFxuXG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaW5wdXQudmFsdWU7XG4gICAgfSxcblxuICAgIGdldExldmVsczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJpbnB1dC5sZXZlbHM7XG4gICAgfSxcblxuICAgIGdldExhYmVsczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJpbnB1dC5sYWJlbHM7XG4gICAgfSxcblxuICAgIGdldE9yZGVyZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaW5wdXQub3JkZXJlZDtcbiAgICB9LFxuXG4gICAgbm9ybWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmlucHV0O1xuICAgIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7ICBcbiAgXG59XG5cbmZ1bmN0aW9uIGRlYnVnKG1zZykgeyAgXG59XG5cbkVtaXR0ZXIucHJvdG90eXBlID0ge1xuXG4gIGV2ZW50czoge30sXG5cbiAgc2NvcGU6IG51bGwsXG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsaXN0ZW5lci4gIE11bHRpcGxlIGNhbiBiZSBhZGRlZCBwZXIgbmFtZS4gIEFsaWFzZWQgYXMgYG9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgQSBjYWxsYmFja1xuICAgKi9cbiAgb246IGZ1bmN0aW9uKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgdGhpcy5ldmVudHNbbmFtZV0gPSBbXTsgfSAgICAgICAgXG5cbiAgICB0aGlzLmV2ZW50c1tuYW1lXS5wdXNoKGhhbmRsZXIpO1xuICAgIGRlYnVnKCdFbWl0dGVyLm9uKFwiJyArIG5hbWUgKyAnXCIpJyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYWxsIG1hdGNoaW5nIGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgYW4gZXZlbnQgZmlyZWRcbiAgICovXG4gIGVtaXQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgcmV0dXJuIHRoaXM7IH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ldmVudHNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYnVnKCdGaXJlZCBldmVudDogXCInICsgbmFtZSArICdcIicpO1xuICAgICAgdGhpcy5ldmVudHNbbmFtZV1baV0uYXBwbHkodGhpcy5zY29wZSB8fCB0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgICAgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIG1hdGNoaW5nIGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgYW4gZXZlbnQgd2FzIHJlbW92ZWRcbiAgICovXG4gIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLmV2ZW50cykge1xuICAgICAgICBkZWxldGUgdGhpcy5ldmVudHNbZV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuYW1lIGluIHRoaXMuZXZlbnRzID09PSBmYWxzZSkgeyByZXR1cm4gdGhpczsgfVxuICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzW25hbWVdOyAgICAgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVtb3ZlTGlzdGVuZXJBdDogZnVuY3Rpb24obmFtZSwgaW5kZXgpIHtcbiAgICB2YXIgYXJyYXkgPSB0aGlzLmV2ZW50c1tuYW1lXSxcbiAgICAgICAgcmVzdCA9IGFycmF5LnNsaWNlKGluZGV4ICsgMSk7XG5cbiAgICBhcnJheS5sZW5ndGggPSBpbmRleDtcbiAgICBhcnJheS5wdXNoLmFwcGx5KGFycmF5LCByZXN0KTtcbiAgICB0aGlzLmV2ZW50c1tuYW1lXSA9IGFycmF5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgYmFzZWQgb24gdGhlIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIGFuIGV2ZW50IHdhcyByZW1vdmVkXG4gICAqL1xuICBvZmY6IGZ1bmN0aW9uKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgcmV0dXJuIHRoaXM7IH1cblxuICAgIC8vIHJlbW92ZSBhbGwgZXZlbnRzIGhhbmRsZXJzIGJ5IHRoaXMgbmFtZVxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICAgIH0gZWxzZSB7IC8vIHJlbW92ZSBhbGwgZXZlbnRzIGhhbmRsZXJzID09ICdoYW5kbGVyJyBieSB0aGlzIG5hbWVcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ldmVudHNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzW25hbWVdW2ldID09IGhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyQXQobmFtZSwgaSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IFxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5cblxuZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG5cbi8qKlxuICogUHJvdmlkZXMgc2ltcGxlIGFkYXB0ZXIgbWV0aG9kcyB3aGljaCB3cmFwIHRoZSByYXcgPGNvZGU+UmV2b2x1dGlvbi5EZXBsb3lSLmlvKC4uLik8L2NvZGU+XG4gKiByZW1vdGUgRGVwbG95UiBBUEkgQUpBWCB0cmFuc2FjdGlvbnMuIFRoZXNlIG1ldGhvZHMgYXJlIGFuIG9wdC1pbiBmZWF0dXJlIHRvXG4gKiBjb21wbGVtZW50IHRoZSBsb3cgbGV2ZWwgRGVwbG95UiBJTyBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBjbGFzcyBSZXZvbHV0aW9uLkRlcGxveVIuUHVibGljQWRhcHRlclxuICogQGV4dGVuc2lvbmZvciBSZXZvbHV0aW9uLkRlcGxveVJcbiAqL1xuXG5EZXByZWNhdGVkID0ge1xuICAgIHZlcnNpb246IHJlcXVpcmUoJy4uL3BhY2thZ2UnKS52ZXJzaW9uLFxuXG4gICAgRXZlbnQ6IHtcbiAgICAgICAgb246IGZ1bmN0aW9uKHR5cGUsIGZuLCBzY29wZSkge1xuICAgICAgICAgICAgZW1pdHRlci5vbih0eXBlLCBmbiwgc2NvcGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRldGFjaDogZnVuY3Rpb24odHlwZSwgZm4sIG9iaikge1xuICAgICAgICAgICAgZW1pdHRlci5vZmYodHlwZSwgZm4pOyAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIFJEYXRhRmFjdG9yeToge1xuICAgICAgICBjcmVhdGVOdW1lcmljOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygncHJpbWl0aXZlJywgJ251bWVyaWMnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5udW1lcmljKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUludGVnZXI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdwcmltaXRpdmUnLCAnaW50ZWdlcicsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmludGVnZXIoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlQm9vbGVhbjogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ3ByaW1pdGl2ZScsICdudW1lcmljJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubG9naWNhbCgpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVTdHJpbmc6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdwcmltaXRpdmUnLCAnY2hhcmFjdGVyJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuY2hhcmFjdGVyKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZURhdGU6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdkYXRlJywgJ0RhdGUnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5kYXRlKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVBPU0lYRGF0ZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ2RhdGUnLCAnUE9TSVhjdCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLnBvc2l4Y3QoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlTnVtZXJpY1ZlY3RvcjogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ3ZlY3RvcicsICdudW1lcmljJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubnVtZXJpY1ZlY3RvcigpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVJbnRlZ2VyVmVjdG9yOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygndmVjdG9yJywgJ2ludGVnZXInLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5pbnRlZ2VyVmVjdG9yKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUJvb2xlYW5WZWN0b3I6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCd2ZWN0b3InLCAnbG9naWNhbCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmxvZ2ljYWxWZWN0b3IoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlU3RyaW5nVmVjdG9yOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygndmVjdG9yJywgJ2NoYXJhY3RlcicsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmNoYXJhY3RlclZlY3RvcigpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVEYXRlVmVjdG9yOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygndHlwZScsICdEYXRlJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuZGF0ZVZlY3RvcigpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVQT1NJWERhdGVWZWN0b3I6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCd2ZWN0b3InLCAnUE9TSVhjdCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLnBvc2l4Y3RWZWN0b3IoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlTGlzdDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ2xpc3QnLCAnbGlzdCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmxpc3QoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlRGF0YWZyYW1lOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygnZGF0YWZyYW1lJywgJ2RhdGEuZnJhbWUnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5kYXRhZnJhbWUoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlRmFjdG9yOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgb3JkZXJlZCwgbGV2ZWxzLCBsYWJlbHMpIHtcbiAgICAgICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgICAgIGxldmVsczogbGV2ZWxzLFxuICAgICAgICAgICAgICAgIGxhYmVsczogbGFiZWxzXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAob3JkZXJlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ2ZhY3RvcicsICdmYWN0b3InLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlLCBvcHRzKS5vcmRlcmVkKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdmYWN0b3InLCAnZmFjdG9yJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSwgb3B0cykuZmFjdG9yKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZU51bWVyaWNNYXRyaXg6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdtYXRyaXgnLCAnbWF0cml4JywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubnVtZXJpY01hdHJpeCgpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVJbnRlZ2VyTWF0cml4OiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygnbWF0cml4JywgJ21hdHJpeCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmludGVnZXJNYXRyaXgoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlQm9vbGVhbk1hdHJpeDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ21hdHJpeCcsICdtYXRyaXgnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5sb2dpY2FsTWF0cml4KCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVN0cmluZ01hdHJpeDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ21hdHJpeCcsICdtYXRyaXgnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5jaGFyYWN0ZXJNYXRyaXgoKSk7XG4gICAgICAgIH1cbiAgICB9LCAvLyBSRGF0YUZhY3RvcnlcblxuICAgIERlcGxveVI6IHtcblxuICAgICAgICBpbml0OiBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcblxuICAgICAgICAgICAgLy8gLS0tIEFzc2VydCBKU0RlcGxveSBjb21wYXRhYmlsaXR5IGFnYWluc3QgdGhlIGNvbm5lY3RlZCBEZXBsb3lSIHZlcnNpb24gLS0tXG4gICAgICAgICAgICBpZiAoY29uZmlnLmNvbXBhdGliaWxpdHkpIHtcbiAgICAgICAgICAgICAgICAvL2NvbXBhdGliaWxpdHlDaGVjaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gRXZlbnQgcmVnaXN0cmF0aW9uIC0tLVxuICAgICAgICAgICAgaWYgKGNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRzID0gY29uZmlnLmV2ZW50cztcblxuICAgICAgICAgICAgICAgIC8vIC0tIE1hbmFnZSBjbGVhbnVwIG9uIGJyb3dzZXIgY2xvc2UgKGNsb3NlIHByb2plY3QsIGxvZ291dCwgZWN0Li4uKS0tXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50cy51bmxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1hbmFnZXIuc2V0VW5sb2FkQ29uZmlnKGV2ZW50cy51bmxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGVkLkV2ZW50Lm9uKCdkZXBsb3lSOnVubG9hZCcsIFNlc3Npb25NYW5hZ2VyLnVubG9hZEhhbmRsZXIsIFNlc3Npb25NYW5hZ2VyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyAtLSBJTyBHbG9iYWwgRXZlbnRzIC0tXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50cy5nbG9iYWxJTykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2NvcGUgPSBldmVudHMuZ2xvYmFsSU8uc2NvcGUgfHwgd2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlID0gZXZlbnRzLmdsb2JhbElPLmxpZmVjeWNsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBldmVudHMuZ2xvYmFsSU8uc3RhdHVzQ29kZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gbGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZC5FdmVudC5vbignZGVwbG95Ui1pbzonICsgZXZlbnROYW1lLCBsaWZlY3ljbGVbZXZlbnROYW1lXSwgc2NvcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBzdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZC5FdmVudC5vbignZGVwbG95Ui1pbzonICsgZXZlbnROYW1lLCBzdGF0dXNDb2RlW2V2ZW50TmFtZV0sIHNjb3BlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTmV3IEFQSVxuICAgICAgICAgICAgZGVwbG95ci5jb25maWd1cmUoe1xuICAgICAgICAgICAgICAgIGhvc3Q6IGNvbmZpZy5kZXBsb3lyVVJJLFxuICAgICAgICAgICAgICAgIGNvcnM6IGNvbmZpZy5kZXBsb3lyVVJJID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxvZ2dpbmc6IGNvbmZpZy5sb2dnaW5nLFxuICAgICAgICAgICAgICAgIHN0aWNreTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW86IGZ1bmN0aW9uKGFwaSwgY29uZmlnLCBjYikge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1wiJyArIGNhbWVsQ2FzZShhcGkpICsgJygpXCIgQVBJIGlzIG5vdyBkZXByZWNhdGVkLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYiA9IGNiIHx8IHt9O1xuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuXG4gICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb24gPSBjb25maWcudHJhbnNhY3Rpb24gfHwge30sXG4gICAgICAgICAgICAgICAgdHJhbnNBcmdzID0gdHJhbnNhY3Rpb25bJ2FyZ3VtZW50cyddLFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSB0cmFuc2FjdGlvbi5zdGF0dXNDb2RlIHx8IHt9LFxuICAgICAgICAgICAgICAgIHNjb3BlID0gY2Iuc2NvcGUgfHwgd2luZG93LFxuICAgICAgICAgICAgICAgIHJvdXRwdXRzID0gY29uZmlnLnJvYmplY3RzLFxuICAgICAgICAgICAgICAgIHJpbnB1dHMgPSBjb25maWcuaW5wdXRzOyAvLyBjb25maWcuaW5wdXRzID0gUi5EZXBsb3lSLnBhcnNlSW5wdXRzKGNvbmZpZy5pbnB1dHMpO1xuXG4gICAgICAgICAgICAvLyAtLS0gb21pdCBkZXByZWNhdGVkIHByb3BzIC0tLVxuICAgICAgICAgICAgaWYgKGNvbmZpZy50cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcudHJhbnNhY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcubWV0aG9kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZy5vbikge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcub247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnLmZvcm1hdCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuZm9ybWF0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbnB1dHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLmlucHV0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25maWcucm9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLnJvYmplY3RzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gbWFrZSB0aGUgbmV3IHJlcXVlc3QgLS0tXG4gICAgICAgICAgICB2YXIgaW8gPSBkZXBsb3lyLmlvKGFwaSlcbiAgICAgICAgICAgICAgICAuZGF0YShjb25maWcgfHwge30pXG4gICAgICAgICAgICAgICAgLmVycm9yKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbC1mYWlsdXJlXG4gICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnZGVwbG95Ui1pbzpmYWlsdXJlJywgW3Jlc3BvbnNlLCBhcGksIHRyYW5zQXJnc10pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLWZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNiLmZhaWx1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmZhaWx1cmUuYXBwbHkoc2NvcGUsIFtyZXNwb25zZSwgYXBpLCB0cmFuc0FyZ3NdKTsgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbC1zdGF0dXNFcnJvclxuICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoKCdkZXBsb3lSLWlvOicgKyBjb2RlKSwgW3Jlc3BvbnNlLCBhcGksIHRyYW5zQXJnc10pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmlucHV0cykge1xuICAgICAgICAgICAgICAgIGlvLnJpbnB1dHMobm9ybWFsaXplSW5wdXRzKHJpbnB1dHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb3V0cHV0cykge1xuICAgICAgICAgICAgICAgIGlvLnJvdXRwdXRzKHJvdXRwdXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5zeW5jKSB7XG4gICAgICAgICAgICAgICAgaW8uc3luYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBpby50aW1lb3V0KHRyYW5zYWN0aW9uLnRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gRXJyb3Igc3RhdHVzIGNvZGUgLS0tIC8vXG4gICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSkge1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHN0YXR1c0NvZGUpIHsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpby5vbignZGVwbG95ci1pbzonICsgZXZlbnROYW1lLCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNiID0gc3RhdHVzQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXNUZXh0ID0gcmVzcG9uc2UuZGVwbG95ci5yZXNwb25zZS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSByZXNwb25zZS5kZXBsb3lyLnJlc3BvbnNlLmVycm9yQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiW3N0YXR1c10uYXBwbHkoc2NvcGUsIFtyZXNwb25zZSwgc3RhdHVzLCBzdGF0dXNUZXh0LCBhcGksIHRyYW5zQXJnc10pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgLy8gQEBAQFRPRE8gQEBAQEBAXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGdsb2JhbC1zdGFydFxuICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdkZXBsb3lSLWlvOnN0YXJ0Jyk7XG5cbiAgICAgICAgICAgIC8vLyB0cmFuc2FjdGlvbi1zdGFydFxuICAgICAgICAgICAgaWYgKGNiLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgY2Iuc3RhcnQuYXBwbHkoc2NvcGUsIFthcGksIHRyYW5zQXJnc10pOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW8uZW5kKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsLWNvbXBsZXRlXG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdkZXBsb3lSLWlvOmNvbXBsZXRlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbi1jb21wbGV0ZVxuICAgICAgICAgICAgICAgIGlmIChjYi5jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYi5jb21wbGV0ZS5hcHBseShzY29wZSwgW3Jlc3BvbnNlLCBhcGksIHRyYW5zQXJnc10pOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbWFuaXB1bGF0aW9uIG9mIHRoZSByZXNwb25zZVxuICAgICAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBmb3JtYXQocmVzcG9uc2UsIHRyYW5zYWN0aW9uLmVudGl0eSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsLXN1Y2Nlc3NcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoJ2RlcGxveVItaW86c3VjY2VzcycsIFtyZXNwb25zZSwgYXBpXSk7XG5cbiAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbi1zdWNjZXNzXG4gICAgICAgICAgICAgICAgaWYgKGNiLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY2Iuc3VjY2Vzcy5hcHBseShzY29wZSwgW3Jlc3BvbnNlLCBhcGksIHRyYW5zQXJnc10pOyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsLWVuZFxuICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnZGVwbG95Ui1pbzplbmQnLCBbcmVzcG9uc2UsIGFwaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24tZW5kXG4gICAgICAgICAgICAgICAgaWYgKGNiLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICBjYi5lbmQuYXBwbHkoc2NvcGUsIFtyZXNwb25zZSwgYXBpLCB0cmFuc0FyZ3NdKTsgXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gaW87XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYXR0ZW5zIGEgZ2l2ZW4gPGNvZGU+UmV2b2x1dGlvbi5SRGF0YTwvY29kZT4gdHlwZSBpbnRvIGEgSlNPTlxuICAgICAgICAgKiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBleHBlY3RlZCBEZXBsb3lSIGlucHV0IGZvcm1hdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwYXJzZUlucHV0c1xuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHJkYXRhIEFuIEFycmF5IG9mIFJEYXRhIE9iamVjdHMgdG8gYmUgZmxhdHRlbmVkLlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBmbGF0dGVuZCBSRGF0YSBKU09OIHN0cmluZyByZXByZXNlbnRpbmcgdGhlXG4gICAgICAgICAqIERlcGxveVIgaW5wdXQgZm9ybWF0LlxuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2VJbnB1dHM6IGZ1bmN0aW9uKHJkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gcmRhdGE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBQcm9qZWN0IFdvcmtzcGFjZSBBUElzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBsaXN0cyB0aGUgb2JqZWN0cyBpbiB0aGUgd29ya3NwYWNlIGZvciB0aGUgcHJvamVjdCBpbmRpY2F0ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFdvcmtzcGFjZUxpc3RcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJvb3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgb2JqZWN0IGdyYXBoIHJvb3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y2xheno8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgUiBjbGFzcyBiYXNlZCBmaWx0ZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsdGVyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIFIgb2JqZWN0IG5hbWUgYmFzZWQgZmlsdGVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGUsIGxpbWl0cyByZXR1cm5lZCBvYmplY3RzIHRvIG9iamVjdFxuICAgICAgICAgKiAgICAgICB0eXBlcyB3aXRoIHN1cHBvcnRlZCBSZXZvRGVwbG95Ui1lbmNvZGluZ1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cGFnZXNpemU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBwYWdlIHNpemUgZm9yIHBhZ2luZyByZXN1bHRzIGluIHJlc3BvbnNlXG4gICAgICAgICAqICAgICAgIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cGFnZW9mZnNldDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHBhZ2Ugb2Zmc2V0IGZvciBwYWdpbmcgcmVzdWx0cyBpbiByZXNwb25zZVxuICAgICAgICAgKiAgICAgICBtYXJrdXBcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0V29ya3NwYWNlTGlzdDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvd29ya3NwYWNlL2xpc3QnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJldHJpZXZlcyBSZXZvRGVwbG95Ui1lbmNvZGVkIG9iamVjdHMgZnJvbSB0aGUgd29ya3NwYWNlIGZvciB0aGVcbiAgICAgICAgICogc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFdvcmtzcGFjZUdldFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvYmplY3QgbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cm9vdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5vcHRpb25hbCkgc3BlY2lmaWVzIG9iamVjdCBncmFwaCByb290PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0YXJ0PC9kdD5cbiAgICAgICAgICogICAgPGRkPm9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG9mZnNldCBpbnRvIG9iamVjdCBkYXRhPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pmxlbmd0aDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5vcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBzZWdtZW50IG9mIG9iamVjdCBkYXRhIHRvIHJldHJpZXZlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+aW5maW5pdHk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGEgY3VzdG9tIHZhbHVlIGZvciBJbmZpbml0eSBhcHBlYXJpbmcgaW4gUlxuICAgICAgICAgKiAgICAgICBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiB0aGUgY2FsbCwgb3RoZXJ3aXNlIEluZmluaXR5IGlzIHJlcHJlc2VudGVkXG4gICAgICAgICAqICAgICAgIGJ5IDB4N2ZmMDAwMDAwMDAwMDAwMExcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+bmFuPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyBjdXN0b20gdmFsdWUgZm9yIE5hTiBhcHBlYXJpbmcgaW4gUiBvYmplY3QgZGF0YVxuICAgICAgICAgKiAgICAgICByZXR1cm5lZCBvbiB0aGUgY2FsbCwgb3RoZXJ3aXNlIE5hTiBpcyByZXByZXNlbnRlZCBieSBudWxsXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5lbmNvZGVEYXRhRnJhbWVQcmltaXRpdmVBc1ZlY3RvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGF0YS5mcmFtZSBwcmltaXRpdmVzIGFyZSBlbmNvZGVkXG4gICAgICAgICAqICAgICAgIHZlY3RvcnMgaW4gUiBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiBjYWxsXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFdvcmtzcGFjZUdldDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvd29ya3NwYWNlL2dldCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgdXBsb2FkcyBhIGJpbmFyeSBvYmplY3QgZnJvbSBmaWxlIGludG8gdGhlIHdvcmtzcGFjZSBmb3IgdGhlXG4gICAgICAgICAqIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RXb3Jrc3BhY2VVcGxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlPC9kdD5cbiAgICAgICAgICogICAgPGRkPmZpbGUgY29udGVudDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFdvcmtzcGFjZVVwbG9hZDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IFwidGV4dFwiO1xuICAgICAgICAgICAgdmFyIGlvQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5mb3JtSWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3dvcmtzcGFjZS91cGxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHRyYW5zZmVycyBhIGJpbmFyeSBvYmplY3QgZnJvbSBhIFVSTCBpbnRvIHRoZSB3b3Jrc3BhY2UgZm9yIHRoZVxuICAgICAgICAgKiBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0V29ya3NwYWNlVHJhbnNmZXJcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZmlsZSBmb3VuZCBvbiB0aGUgVVJMPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnVybDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIFVSTDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFdvcmtzcGFjZVRyYW5zZmVyOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC93b3Jrc3BhY2UvdHJhbnNmZXInLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHB1c2hlcyBhIFJldm9EZXBsb3lSLWVuY29kZWQgb2JqZWN0IGludG8gdGhlIHdvcmtzcGFjZSBmb3IgdGhlXG4gICAgICAgICAqIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RXb3Jrc3BhY2VQdXNoXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBSZXZvRGVwbG95Ui1lbmNvZGVkIG9iamVjdCBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y3N2aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJpbWl0aXZlIG5hbWUvdmFsdWUgaW5wdXRzPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0V29ya3NwYWNlUHVzaDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvd29ya3NwYWNlL3B1c2gnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHNhdmVzIHRoZSB3b3Jrc3BhY2UgdG8gYSBmaWxlIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlXG4gICAgICAgICAqIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiB0aGUgbmFtZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIG9uIHRoZSBjYWxsIHRoZW4gb25seSB0aGUgbmFtZWQgb2JqZWN0XG4gICAgICAgICAqIGlzIHNhdmVkIGFzIGEgYmluYXJ5IG9iamVjdCBmaWxlIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gT3RoZXJ3aXNlIHRoZVxuICAgICAgICAgKiBlbnRpcmUgY29udGVudHMgb2YgdGhlIHdvcmtzcGFjZSBhcmUgc2F2ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFdvcmtzcGFjZVNhdmVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBuYW1lZCBvYmplY3QgZm9yIHNhdmluZzwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGRlc2NyaXB0aW9uIHRvIGFjY29tcGFueSB0aGUgc2F2ZWQgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBuZXcgZmlsZSB3aWxsIGJlIHJlbmFtZWQgdG8gYXZvaWRcbiAgICAgICAgICogICAgICAgb3ZlcndyaXRpbmdcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0V29ya3NwYWNlU2F2ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvd29ya3NwYWNlL3NhdmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHN0b3JlcyB0aGUgd29ya3NwYWNlIGFzIGEgYmluYXJ5IG9iamVjdCB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIG5hbWUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBvbiB0aGUgY2FsbCwgdGhlbiBvbmx5IHRoZSBuYW1lZCBvYmplY3RcbiAgICAgICAgICogaXMgc3RvcmVkIGFzIGEgYmluYXJ5IG9iamVjdCBpbiB0aGUgcmVwb3NpdG9yeS4gT3RoZXJ3aXNlIHRoZSBlbnRpcmVcbiAgICAgICAgICogY29udGVudHMgb2YgdGhlIHdvcmtzcGFjZSBhcmUgc3RvcmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RXb3Jrc3BhY2VTdG9yZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBuYW1lZCBvYmplY3QgZm9yIHN0b3Jpbmc8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgZGVzY3JpcHRpb24gdG8gYWNjb21wYW55IHRoZSBzYXZlZCBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZ3M8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVwb3NpdG9yeSBmaWxlXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXN0cmljdGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJvbGUgbmFtZXMsIHdoaWNoIG1ha2VzIHRoZSBmaWxlXG4gICAgICAgICAqICAgICAgIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCB1c2VycyB3aXRoIHRoZXNlIHJvbGVzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBmaWxlIHdpbGwgYmUgc2hhcmVkLCB3aGljaFxuICAgICAgICAgKiAgICAgICBtYWtlcyB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnB1Ymxpc2hlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGZpbGUgd2lsbCBiZSBwdWJsaXNoZWQsIHdoaWNoXG4gICAgICAgICAqICAgICAgIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0Pm5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIG5ldyBmaWxlIHdpbGwgYmUgcmVuYW1lZCB0b1xuICAgICAgICAgKiAgICAgICBhdm9pZCBvdmVyd3JpdGluZ1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiAgPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0V29ya3NwYWNlU3RvcmU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3dvcmtzcGFjZS9zdG9yZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgbG9hZHMgYSBiaW5hcnkgb2JqZWN0IGZyb20gYSBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGludG8gdGhlXG4gICAgICAgICAqIHdvcmtzcGFjZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RXb3Jrc3BhY2VMb2FkXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXBvPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBhdXRob3I8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSB2ZXJzaW9uPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFdvcmtzcGFjZUxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3dvcmtzcGFjZS9sb2FkJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkZWxldGVzIGFuIG9iamVjdCBmcm9tIHRoZSB3b3Jrc3BhY2UgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0V29ya3NwYWNlRGVsZXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgb2JqZWN0IG5hbWU8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RXb3Jrc3BhY2VEZWxldGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3dvcmtzcGFjZS9kZWxldGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFByb2plY3QgTWFuYWdlbWVudCBBUElzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGNyZWF0ZXMgYSBuZXcgcHJvamVjdCBmb3IgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAgICAgICAqIElmIHRoZSBwcm9qZWN0bmFtZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIG9uIHRoZSBjYWxsLCB0aGVuIHRoZSBuZXdseVxuICAgICAgICAgKiBjcmVhdGVkIHByb2plY3Qgd2lsbCBiZSBhIHBlcnNpc3RlbnQgcHJvamVjdCAuIElmIHRoZSBwcm9qZWN0bmFtZSBwYXJhbWV0ZXJcbiAgICAgICAgICogaXMgb21pdHRlZCBvbiB0aGUgY2FsbCwgdGhlbiB0aGUgbmV3bHkgY3JlYXRlZCBwcm9qZWN0IHdpbGwgYmUgYSB0ZW1wb3JhcnlcbiAgICAgICAgICogcHJvamVjdC4gVGhlIHByb2plY3RkZXNjciBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiB0aGUgcHJvamVjdG5hbWUgcGFyYW1ldGVyXG4gICAgICAgICAqIGlzIG9taXR0ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBibGFja2JveCBwYXJhbWV0ZXIgZW5zdXJlcyB0aGF0IGNhbGxzIG9uIHRoZSB0ZW1wb3JhcnkgcHJvamVjdCBhcmVcbiAgICAgICAgICogbGltaXRlZCB0byB0aGUgQmxhY2tib3ggQVBJIENvbnRyb2xzIC5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNpbmcgdGhlIGlucHV0cyAsIHByZWxvYWRmaWxlICwgcHJlbG9hZG9iamVjdCBhbmQgYWRvcHQgcGFyYW1ldGVycyB0aGVcbiAgICAgICAgICogcHJvamVjdCBjYW4gYmUgcHJlLWluaXRpYWxpemVkIHdpdGggZGF0YSBpbiB0aGUgd29ya3NwYWNlIGFuZC9vciB3b3JraW5nXG4gICAgICAgICAqIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGlucHV0cyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcGFzcyBSZXZvRGVwbG95Ui1lbmNvZGVkIFIgb2JqZWN0XG4gICAgICAgICAqIHZhbHVlcyBhcyBpbnB1dHMuIFRoZXNlIGlucHV0cyBhcmUgdHVybmVkIGludG8gUiBvYmplY3RzIGluIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICogb2YgdGhlIG5ldyBSIHNlc3Npb24gYmVmb3JlIHRoZSBjYWxsIHJldHVybnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwcmVsb2FkZmlsZSBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBvbmUgb3IgbW9yZSBmaWxlcyBmcm9tXG4gICAgICAgICAqIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBuZXcgUiBzZXNzaW9uIGJlZm9yZSB0aGVcbiAgICAgICAgICogY2FsbCByZXR1cm5zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcHJlbG9hZG9iamVjdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBvbmUgb3IgbW9yZSBiaW5hcnkgUlxuICAgICAgICAgKiBvYmplY3RzICguckRhdGEpIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya3NwYWNlIG9mIHRoZSBuZXcgUlxuICAgICAgICAgKiBzZXNzaW9uIGJlZm9yZSB0aGUgY2FsbCByZXR1cm5zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYWRvcHQgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgYSBwcmUtZXhpc3RpbmcgcHJvamVjdFxuICAgICAgICAgKiB3b3Jrc3BhY2UsIHByb2plY3Qgd29ya2luZyBkaXJlY3RvcnkgYW5kL29yIHByb2plY3QgcGFja2FnZSBkZXBlbmRlbmNpZXNcbiAgICAgICAgICogaW50byB0aGUgbmV3IFIgc2Vzc2lvbiBiZWZvcmUgdGhlIGNhbGwgcmV0dXJucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0Q3JlYXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdG5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBuYW1lcyBhIG5ldyBwZXJzaXN0ZW50IHByb2plY3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdGRlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgZGVzY3JpYmVzIGEgbmV3IHBlcnNpc3RlbnQgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ibGFja2JveDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSB3aGVuIGVuYWJsZWQsIGEgdGVtcG9yYXJ5IHByb2plY3QgaXMgbGltaXRlZCB0byBibGFja2JveFxuICAgICAgICAgKiAgICAgICBBUEkgY29udHJvbHNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgaW5wdXRzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmNzdmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByaW1pdGl2ZSBuYW1lL3ZhbHVlIGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZWF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLFxuICAgICAgICAgKiAgICAgICBhdXRob3ItcGVyLXByZWxvYWRmaWxlbmFtZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGV2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLFxuICAgICAgICAgKiAgICAgICB2ZXJzaW9uLXBlci1wcmVsb2FkZmlsZW5hbWVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgb2JqZWN0ICguckRhdGEpXG4gICAgICAgICAqICAgICAgIGZpbGVuYW1lc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZG9iamVjdGF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLFxuICAgICAgICAgKiAgICAgICBhdXRob3ItcGVyLXByZWxvYWRvYmplY3RuYW1lXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucyxcbiAgICAgICAgICogICAgICAgdmVyc2lvbi1wZXItb2JqZWN0LXByZWxvYWRvYmplY3RuYW1lXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZGVudGlmaWVzIHRoZSBwcm9qZWN0IHdob3NlIHdvcmtzcGFjZSBpcyB0byBiZSBhZG9wdGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdGRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZGVudGlmaWVzIHRoZSBwcm9qZWN0IHdob3NlIGRpcmVjdG9yeSBpcyB0byBiZSBhZG9wdGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHBhY2thZ2VzPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlkZW50aWZpZXMgdGhlIHByb2plY3Qgd2hvc2UgcGFja2FnZSBkZXBlbmRlbmNpZXMgYXJlIHRvXG4gICAgICAgICAqICAgICAgIGJlIGFkb3B0ZWRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0Q3JlYXRlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9jcmVhdGUnLCBjb25maWcsIGNhbGxiYWNrKTsgICAgICAgICAgICBcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGNyZWF0ZXMgYSBwb29sIG9mIHRlbXBvcmFyeSBwcm9qZWN0cyBmb3IgdGhlIGN1cnJlbnRseVxuICAgICAgICAgKiBhdXRoZW50aWNhdGVkIHVzZXIuIFRoZSBjYWxsZXIgY2FuIHNwZWNpZnkgdGhlaXIgcHJlZmVycmVkIG51bWJlciBvZlxuICAgICAgICAgKiBwcm9qZWN0cyB0byBjcmVhdGUgdXNpbmcgdGhlIHBvb2xzaXplIHBhcmFtZXRlci4gUmV2b0RlcGxveVIgd2lsbCBhdHRlbXB0XG4gICAgICAgICAqIHRvIGNyZWF0ZSB1cCB0byBwb29sc2l6ZSBudW1iZXIgb2YgcHJvamVjdHMuIEhvd2V2ZXIsIHN0YW5kYXJkIGNvbVxuICAgICAgICAgKiBwb2xpY3kgY29udHJhaW50cyBhcHBseSB0byBpbmRpdmlkdWFsIHVzZXJzIGFuZCBvbiB0aGUgZ3JpZCBzbyB0aGVyZSBpcyBub1xuICAgICAgICAgKiBndWFyYW50ZWUgdGhhdCBwb29sc2l6ZSBwcm9qZWN0cyB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGUgbnVtYmVyIG9mXG4gICAgICAgICAqIHByb2plY3RzIHJldHVybmVkIG9uIHRoaXMgY2FsbCBpcyBsZXNzIHRoYW4gcG9vbHNpemUgdGhlIGNhbGxlciBjYW4gaW5zcGVjdFxuICAgICAgICAgKiB0aGUgZXJyb3IgYW5kIGVycm9yQ29kZSBwcm9wZXJ0aWVzIGluIHRoZSByZXNwb25zZSBtYXJrdXAgdG8gZGV0ZXJtaW5lXG4gICAgICAgICAqIGV4YWN0bHkgd2h5IHRoZWlyIHBvb2wgc2l6ZSB3YXMgbGltaXRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGJsYWNrYm94IHBhcmFtZXRlciBlbnN1cmVzIHRoYXQgY2FsbHMgb24gZWFjaCBwcm9qZWN0IGluIHRoZSBwb29sIGFyZVxuICAgICAgICAgKiBsaW1pdGVkIHRvIHRoZSBCbGFja2JveCBBUEkgQ29udHJvbHMgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBVc2luZyB0aGUgaW5wdXRzLCBwcmVsb2FkZmlsZSwgcHJlbG9hZG9iamVjdCBhbmQgYWRvcHQgcGFyYW1ldGVycyBlYWNoXG4gICAgICAgICAqIHByb2plY3QgaW4gdGhlIHBvb2wgY2FuIGJlIHByZS1pbml0aWFsaXplZCB3aXRoIGRhdGEgaW4gdGhlIHdvcmtzcGFjZVxuICAgICAgICAgKiBhbmQvb3Igd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZCBSIG9iamVjdFxuICAgICAgICAgKiB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0cyBpbiB0aGUgd29ya3NwYWNlXG4gICAgICAgICAqIG9mIHRoZSBuZXcgUiBzZXNzaW9uIGJlZm9yZSB0aGUgY2FsbCByZXR1cm5zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcHJlbG9hZGZpbGUgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmUgZmlsZXMgZnJvbVxuICAgICAgICAgKiB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgbmV3IFIgc2Vzc2lvbiBiZWZvcmUgdGhlXG4gICAgICAgICAqIGNhbGwgcmV0dXJucy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHByZWxvYWRvYmplY3QgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmUgYmluYXJ5IFJcbiAgICAgICAgICogb2JqZWN0cyAoLnJEYXRhKSBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgbmV3IFJcbiAgICAgICAgICogc2Vzc2lvbiBiZWZvcmUgdGhlIGNhbGwgcmV0dXJucy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGFkb3B0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIGEgcHJlLWV4aXN0aW5nIHByb2plY3RcbiAgICAgICAgICogd29ya3NwYWNlLCBwcm9qZWN0IHdvcmtpbmcgZGlyZWN0b3J5IGFuZC9vciBwcm9qZWN0IHBhY2thZ2UgZGVwZW5kZW5jaWVzXG4gICAgICAgICAqIGludG8gdGhlIG5ldyBSIHNlc3Npb24gYmVmb3JlIHRoZSBjYWxsIHJldHVybnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFBvb2xcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wb29sc2l6ZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD50aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIHBvb2wgb2YgdGVtcG9yYXJ5IHByb2plY3RzPC9kZD5cbiAgICAgICAgICogICAgPGR0PmJsYWNrYm94PC9kZD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgd2hlbiBlbmFibGVkLCBlYWNoIHRlbXBvcmFyeSBwcm9qZWN0IGluIHRoZSBwb29sIGlzIGxpbWl0ZWQgdG8gYmxhY2tib3ggQVBJIGNvbnRyb2xzPC9kZD5cbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgaW5wdXRzPC9kZD5cbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxlYXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1wcmVsb2FkZmlsZW5hbWU8L2RkPlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGV2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgb2JqZWN0ICguckRhdGEpIGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLCB2ZXJzaW9uLXBlci1vYmplY3QtcHJlbG9hZG9iamVjdG5hbWU8L2RkPlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHR3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCB3b3Jrc3BhY2UgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5hZG9wdGRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIGRpcmVjdG9yeSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICogICAgPGR0PmFkb3B0cGFja2FnZXM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCBwYWNrYWdlIGRlcGVuZGVuY2llcyBhcmUgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFBvb2w6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3Bvb2wnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJlY3ljbGVzIHRoZSBSIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0IGJ5IGRlbGV0aW5nXG4gICAgICAgICAqIGFsbCBSIG9iamVjdHMgZnJvbSB0aGUgd29ya3NwYWNlIGFuZCBhbGwgZmlsZXMgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFJlY3ljbGluZyBhIHByb2plY3QgaXMgYSBjb252ZW5pZW50IGFuZCBlZmZpY2llbnQgYWx0ZXJuYXRpdmUgdG8gc3RhcnRpbmdcbiAgICAgICAgICogb3ZlciBieSBjbG9zaW5nIGFuIGV4aXN0aW5nIHByb2plY3QgYW5kIHRoZW4gY3JlYXRpbmcgYSBuZXcgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0UmVjeWNsZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5wcmVzZXJ2ZXdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBvYmplY3RzIGluIHRoZSB3b3Jrc3BhY2UgYXJlIHByZXNlcnZlZCBvbiByZWN5Y2xlPC9kZD5cbiAgICAgICAgICogICAgPGR0PnByZXNlcnZlZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGVzIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhcmUgcHJlc2VydmVkIG9uIHJlY3ljbGU8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RSZWN5Y2xlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9yZWN5Y2xlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBsaXN0cyBhbGwgcHJvamVjdHMgb3duZWQgYnkgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXJcbiAgICAgICAgICogYW5kL29yIGFsbCBwcm9qZWN0cyBzaGFyZWQgYnkgb3RoZXIgdXNlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNoYXJlZCBwcm9qZWN0cyBhcmUgYXZhaWxhYmxlIGFzIHJlYWQtb25seSBwcm9qZWN0cyB0byB0aGUgY2FsbGVyLiBUaGVcbiAgICAgICAgICogc2hhcmVkIG9yIHByaXZhdGUgbmF0dXJlIG9mIGEgcHJvamVjdCBjYW4gYmUgY29udHJvbGxlZCB1c2luZyB0aGVcbiAgICAgICAgICogPGNvZGU+L3IvcHJvamVjdC9hYm91dC91cGRhdGU8L2NvZGU+IGNhbGxcbiAgICAgICAgICogPGEgaHJlZj1cIiNtZXRob2RfcHJvamVjdEFib3V0VXBkYXRlXCI+cHJvamVjdEFib3V0VXBkYXRlPC9hPi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0TGlzdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnNoYXJlZHByb2plY3RzYWxzbzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSB3aGVuIHRydWUsIHRoZSBwcm9qZWN0IHJlc3BvbnNlIGxpc3QgY29udGFpbnMgdGhlIGNhbGxlcidzXG4gICAgICAgICAqICAgICAgIHByb2plY3RzIHBsdXMgcHJvamVjdHMgc2hhcmVkIGJ5IG90aGVyIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWRwcm9qZWN0c29ubHk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiB0cnVlLCB0aGUgcHJvamVjdCByZXNwb25zZSBsaXN0IGNvbnRhaW5zIG9ubHlcbiAgICAgICAgICogICAgICAgcHJvamVjdHMgc2hhcmVkIGJ5IG90aGVyIHVzZXJzIGFuZCBub3QgdGhlIHVzZXJzJ3Mgb3duIHByb2plY3RzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pc29yZGVyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiB0cnVlLCB0aGUgcHJvamVjdCByZXNwb25zZSBsaXN0IGlzIG9yZGVyZWQgaW4gYVxuICAgICAgICAgKiAgICAgICBtb3N0LXJlY2VudGx5LW1vZGlmaWVkIGZpcnN0IG9yZGVyLiBPdGhlcndpc2UgdGhlIGxpc3QgaXMgb3JkZXJlZFxuICAgICAgICAgKiAgICAgICBjaHJvbm9sb2dpY2FsbHkgYnkgY3JlYXRpb24gZGF0ZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9saXN0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgcGluZ3MgdGhlIHNwZWNpZmllZCBwcm9qZWN0IHRvIGRldGVybWluZSBpZiB0aGUgcHJvamVjdCBpcyBsaXZlXG4gICAgICAgICAqIG9uIHRoZSBSZXZvRGVwbG95UiBncmlkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RQaW5nXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogIDxkbD5cbiAgICAgICAgICogICAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFBpbmc6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3BpbmcnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJldHJpZXZlcyBhIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgdGhlIHNwZWNpZmllZFxuICAgICAgICAgKiBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RBYm91dFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RBYm91dDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvYWJvdXQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwZGF0ZXMgYSBzZXQgb2YgcHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0QWJvdXRVcGRhdGVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHByb2plY3QgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bG9uZ2Rlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IGxvbmcgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzcGVjaWZpZXMgdGhhdCB0aGUgcHJvamVjdCBpcyBhXG4gICAgICAgICAqICAgICAgIHNoYXJlZCBwcm9qZWN0XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0Y29va2llPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNsaWVudC1hcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9qZWN0IGNvb2tpZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiAgPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0QWJvdXRVcGRhdGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2Fib3V0L3VwZGF0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgc2F2ZXMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIHByb2plY3QgaW5kaWNhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgc2V0IG9mIGRyb3AgcGFyYW1ldGVycyBhbGxvd3MgdGhlIGNhbGxlciB0byBzZWxlY3RpdmVseSBkcm9wIGFzcGVjdHMsXG4gICAgICAgICAqIHN1Y2ggYXMgd29ya3NwYWNlLCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgZXhlY3V0aW9uIGhpc3Rvcnkgb2YgdGhlIHByb2plY3RcbiAgICAgICAgICogc3RhdGUgd2hlbiBzYXZpbmcuIFRoZSBmbHVzaGhpc3RvcnkgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHByZXNlcnZlXG4gICAgICAgICAqIHRoZSBwcm9qZWN0IGV4ZWN1dGlvbiBoaXN0b3J5IGl0c2VsZiB3aGlsZSBkZXN0cm95aW5nIGFsbCBnZW5lcmF0ZWQgY29uc29sZVxuICAgICAgICAgKiBvdXRwdXQgYW5kIHJlc3VsdHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaGlzdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0U2F2ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHByb2plY3QgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bG9uZ2Rlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IGxvbmcgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlzIGEgc2hhcmVkIHByb2plY3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdGNvb2tpZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNsaWVudC1hcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9qZWN0IGNvb2tpZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9wd29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGNvbnRlbnQgb2YgdGhlIHByb2plY3QncyB3b3Jrc3BhY2UgaXMgZHJvcHBlZCBvbiBzYXZlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRyb3BkaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgY29udGVudCBvZiB0aGUgcHJvamVjdCdzIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGRyb3BwZWQgb24gc2F2ZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9waGlzdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBwcm9qZWN0J3MgZXhlY3V0aW9uIGhpc3RvcnkgaXMgZHJvcHBlZCBvbiBzYXZlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZsdXNoaGlzdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBwcm9qZWN0J3MgZXhlY3V0aW9uIGhpc3RvcnkgaXMgZmx1c2hlZCBvbiBzYXZlPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0U2F2ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvc2F2ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgc2F2ZXMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0IHRvIGEgbmV3XG4gICAgICAgICAqIHBlcnNpc3RlbnQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHNldCBvZiBkcm9wIHBhcmFtZXRlcnMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2VsZWN0aXZlbHkgZHJvcCBhc3BlY3RzLFxuICAgICAgICAgKiBzdWNoIGFzIHdvcmtzcGFjZSwgd29ya2luZyBkaXJlY3RvcnksIG9yIGV4ZWN1dGlvbiBoaXN0b3J5IG9mIHRoZSBwcm9qZWN0XG4gICAgICAgICAqIHN0YXRlIHdoZW4gc2F2aW5nIHRvIHRoZSBuZXcgcHJvamVjdC4gVGhlIGZsdXNoaGlzdG9yeSBwYXJhbWV0ZXIgYWxsb3dzIHRoZVxuICAgICAgICAgKiBjYWxsZXIgdG8gcHJlc2VydmUgdGhlIHByb2plY3QgZXhlY3V0aW9uIGhpc3RvcnkgaXRzZWxmIGZvciB0aGUgbmV3IHByb2plY3RcbiAgICAgICAgICogd2hpbGUgZHJvcHBpbmcgYWxsIGdlbmVyYXRlZCBjb25zb2xlIG91dHB1dCBhbmQgcmVzdWx0cyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAgICAgICAqIG9yaWdpbmFsIGhpc3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFNhdmVhc1xuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgbmV3IHByb2plY3QgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgbmV3IHByb2plY3QgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bG9uZ2Rlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuZXcgcHJvamVjdCBsb25nIGRlc2NyaXB0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnNoYXJlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHNwZWNpZmllcyB0aGUgbmV3IHByb2plY3QgaXMgYSBzaGFyZWQgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0Y29va2llPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgY2xpZW50LWFwcGxpY2F0aW9uIHNwZWNpZmljIGNvb2tpZSBmb3IgdGhlIG5ldyBwcm9qZWN0PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRyb3B3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgY29udGVudCBvZiB0aGUgb3JpZ2luYWwgcHJvamVjdCdzIHdvcmtzcGFjZSBpcyBkcm9wcGVkIHdoZW4gc2F2aW5nIHRvIHRoZSBuZXcgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9wZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGNvbnRlbnQgb2YgdGhlIHByb2plY3QncyB3b3JraW5nIGRpcmVjdG9yeSBpcyBkcm9wcGVkIHdoZW4gc2F2aW5nIHRvIHRoZSBuZXcgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9waGlzdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBwcm9qZWN0J3MgZXhlY3V0aW9uIGhpc3RvcnkgaXMgZHJvcHBlZCB3aGVuIHNhdmluZyB0byB0aGUgbmV3IHByb2plY3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Zmx1c2hoaXN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIHByb2plY3QncyBleGVjdXRpb24gaGlzdG9yeSBpcyBmbHVzaGVkIHdoZW4gc2F2aW5nIHRvIHRoZSBuZXcgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFNhdmVhczogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvc2F2ZWFzJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBjbG9zZXMgdGhlIHByb2plY3QgaW5kaWNhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBDbG9zaW5nIGEgbGl2ZSBwcm9qZWN0IHJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0XG4gICAgICAgICAqIG9uIHRoZSBSZXZvRGVwbG95UiBncmlkLiBJZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSBwZXJzaXN0ZW50IHByb2plY3RcbiAgICAgICAgICogdGhlbiB0aGUgZGVmYXVsdCBhdXRvc2F2ZSBzZW1hbnRpY3Mgd2lsbCBjYXVzZSB0aGUgcHJvamVjdCB0byBiZSBzYXZlZFxuICAgICAgICAgKiBhdXRvbWF0aWNhbGx5LiBUaGUgY2FsbGVyIGNhbiBvdmVycmlkZSB0aGF0IGRlZmF1bHQgYmVoYXZpb3IgdXNpbmcgdGhlXG4gICAgICAgICAqIGRpc2FibGVhdXRvc2F2ZSBwYXJhbWV0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBzZXQgb2YgZHJvcCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gc2VsZWN0aXZlbHkgZHJvcCBhc3BlY3RzLFxuICAgICAgICAgKiBzdWNoIGFzIHdvcmtzcGFjZSwgd29ya2luZyBkaXJlY3RvcnksIG9yIGV4ZWN1dGlvbiBoaXN0b3J5LCBvZiB0aGUgcHJvamVjdFxuICAgICAgICAgKiBzdGF0ZSB3aGVuIGNsb3NpbmcuIFRoZSBmbHVzaGhpc3RvcnkgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvXG4gICAgICAgICAqIHByZXNlcnZlIHRoZSBwcm9qZWN0IGV4ZWN1dGlvbiBoaXN0b3J5IGl0c2VsZiB3aGlsZSBkZXN0cm95aW5nIGFsbFxuICAgICAgICAgKiBnZW5lcmF0ZWQgY29uc29sZSBvdXRwdXQgYW5kIHJlc3VsdHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaGlzdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0Q2xvc2VcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGlzYWJsZWF1dG9zYXZlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGRlZmF1bHQgYXV0b3NhdmUgc2VtYW50aWNzIGZvciBwZXJzaXN0ZW50IHByb2plY3RzIGFyZSBkaXNhYmxlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0Y29va2llPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgY2xpZW50LWFwcGxpY2F0aW9uIHNwZWNpZmljIHByb2plY3QgY29va2llPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRyb3B3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgY29udGVudCBvZiB0aGUgcHJvamVjdCdzIHdvcmtzcGFjZSBpcyBkcm9wcGVkIG9uIGNsb3NlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRyb3BkaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgY29udGVudCBvZiB0aGUgcHJvamVjdCdzIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGRyb3BwZWQgb24gY2xvc2U8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZHJvcGhpc3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgcHJvamVjdCdzIGV4ZWN1dGlvbiBoaXN0b3J5IGlzIGRyb3BwZWQgb24gY2xvc2U8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Zmx1c2hoaXN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIHByb2plY3QncyBleGVjdXRpb24gaGlzdG9yeSBpcyBmbHVzaGVkIG9uIGNsb3NlPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0Q2xvc2U6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2Nsb3NlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBncmFudHMgYXV0aG9yc2hpcCBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgdG8gb3RoZXIgdXNlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEdyYW50XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uZXdhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVzZXJuYW1lcyBpbmRpY2F0aW5nIHRoZSBuZXdcbiAgICAgICAgICogICAgICAgb3duZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEdyYW50OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9ncmFudCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgaW1wb3J0cyB0aGUgc3BlY2lmaWVkIHByb2plY3QgYXJjaGl2ZSBhcyBhIG5ldyBwZXJzaXN0ZW50XG4gICAgICAgICAqIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEltcG9ydFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGFyY2hpdmUgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlPC9kdD5cbiAgICAgICAgICogICAgPGRkPi4uLmZpbGUgY29udGVudC4uLjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIG5ld2x5IGltcG9ydGVkIHByb2plY3RcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0SW1wb3J0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB2YXIgaW9Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGF0YTogY29uZmlnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgZm9ybToge1xuICAgICAgICAgICAgICAgICAgICBpZDogY29uZmlnLmZvcm1JZFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb246IGNhbGxiYWNrXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvaW1wb3J0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZXhwb3J0cyBhIGNvbXByZXNzZWQgYXJjaGl2ZSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBzZXQgb2YgZHJvcCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gc2VsZWN0aXZlbHkgZHJvcCBhc3BlY3RzLFxuICAgICAgICAgKiBzdWNoIGFzIHdvcmtzcGFjZSwgd29ya2luZyBkaXJlY3RvcnksIG9yIGV4ZWN1dGlvbiBoaXN0b3J5IG9mIHRoZSBwcm9qZWN0XG4gICAgICAgICAqIHN0YXRlIHdoZW4gZ2VuZXJhdGluZyB0aGUgYXJjaGl2ZS4gVGhlIGZsdXNoaGlzdG9yeSBwYXJhbWV0ZXIgYWxsb3dzIHRoZVxuICAgICAgICAgKiBjYWxsZXIgdG8gcHJlc2VydmUgdGhlIHByb2plY3QgZXhlY3V0aW9uIGhpc3RvcnkgaXRzZWxmIHdoaWxlIGV4Y2x1ZGluZyBhbGxcbiAgICAgICAgICogZ2VuZXJhdGVkIGNvbnNvbGUgb3V0cHV0IGFuZCByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGhpc3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4cG9ydFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9wd29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGNvbnRlbnQgb2YgdGhlIHByb2plY3QncyB3b3Jrc3BhY2UgaXMgZHJvcHBlZCBvbiBleHBvcnQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZHJvcGRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBjb250ZW50IG9mIHRoZSBwcm9qZWN0J3Mgd29ya2luZyBkaXJlY3RvcnkgaXMgZHJvcHBlZCBvbiBleHBvcnQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZHJvcGhpc3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgcHJvamVjdCdzIGV4ZWN1dGlvbiBoaXN0b3J5IGlzIGRyb3BwZWQgb24gZXhwb3J0PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZsdXNoaGlzdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBwcm9qZWN0J3MgZXhlY3V0aW9uIGhpc3RvcnkgaXMgZmx1c2hlZCBvbiBleHBvcnQ8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeHBvcnQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4cG9ydCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZGVsZXRlcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqIERlbGV0aW5nIGEgcHJvamVjdCBpcyBhIHBlcm1hbmVudCBvcGVyYXRpb24gdGhhdCBjYW5ub3QgYmUgdW5kb25lIG9yXG4gICAgICAgICAqIHJlY292ZXJlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RGVsZXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0RGVsZXRlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kZWxldGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFByb2plY3QgRXhlY3V0aW9uIEFQSXNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZXhlY3V0ZXMgYSBibG9jayBvZiBSIGNvZGUgb24gdGhlIFIgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5IHRoZVxuICAgICAgICAgKiBwcm9qZWN0IHBhcmFtZXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogUGxlYXNlIG5vdGUgdGhlIGZvbGxvd2luZyBwcmUgYW5kIHBvc3QgZXhlY3V0aW9uIHBhcmFtZXRlcnM6XG4gICAgICAgICAqXG4gICAgICAgICAqIDxzdHJvbmc+UHJlLWV4ZWN1dGlvbiBwYXJhbWV0ZXJzOjwvc3Ryb25nPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8b2w+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIGlucHV0cyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcGFzcyBSZXZvRGVwbG95Ui1lbmNvZGVkXG4gICAgICAgICAqICAgICAgIFIgb2JqZWN0IHZhbHVlcyBhcyBpbnB1dHMuIFRoZXNlIGlucHV0cyBhcmUgdHVybmVkIGludG8gUiBvYmplY3RzXG4gICAgICAgICAqICAgICAgIGluIHRoZSB3b3Jrc3BhY2UgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2FkZmlsZSBwYXJhbWV0ZXJzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmVcbiAgICAgICAgICogICAgICAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgdGhlXG4gICAgICAgICAqICAgICAgIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHByZWxvYWRvYmplY3QgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmVcbiAgICAgICAgICogICAgICAgYmluYXJ5IFIgb2JqZWN0cyAoLnJEYXRhKSBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtzcGFjZVxuICAgICAgICAgKiAgICAgICBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIGFkb3B0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIGEgcHJlLWV4aXN0aW5nXG4gICAgICAgICAqICAgICAgIHByb2plY3Qgd29ya3NwYWNlLCBwcm9qZWN0IHdvcmtpbmcgZGlyZWN0b3J5IGFuZC9vciBwcm9qZWN0IHBhY2thZ2VcbiAgICAgICAgICogICAgICAgZGVwZW5kZW5jaWVzIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5Qb3N0LWV4ZWN1dGlvbiBwYXJhbWV0ZXJzOjwvc3Ryb25nPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8b2w+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHJvYmplY3RzIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygb2JqZWN0IG5hbWVzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBhcyBSZXZvRGVwbG95Ui1lbmNvZGVkIFJcbiAgICAgICAgICogICAgICAgb2JqZWN0cyBvbiB0aGUgcmVzcG9uc2UgbWFya3VwIGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWZpbGUgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXJcbiAgICAgICAgICogICAgICAgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jlb2JqZWN0IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdHMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXdvcmtzcGFjZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIGVudGlyZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2UgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZGlyZWN0b3J5IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgdGFyZ2V0XG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGZvciBzdG9yZWQgZmlsZXMgYW5kIG9iamVjdHMgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlbmV3dmVyc2lvbiBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY3JlYXRlIG5ld1xuICAgICAgICAgKiAgICAgICB2ZXJzaW9ucyBvZiBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLiBCeSBkZWZhdWx0LCBzdG9yZWQgZmlsZXMgb3ZlcndyaXRlIGFueSBwcmUtZXhpc3RpbmcgZmlsZVxuICAgICAgICAgKiAgICAgICBieSB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXB1YmxpYyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gYXNzaWduIHB1YmxpYyBhY2Nlc3NcbiAgICAgICAgICogICAgICAgdG8gZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICpcbiAgICAgICAgICogIDxzdHJvbmc+U29tZSBrZXkgZGF0YSBpbmRpY2F0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGw6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPmNvZGUgLSBpbmRpY2F0ZXMgdGhlIGNvZGUgdGhhdCBoYXMgYmVlbiBleGVjdXRlZDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgY29uc29sZSAtIGluZGljYXRlcyB0aGUgY29uc29sZSBvdXRwdXQgcmVzdWx0aW5nIGZyb20gdGhlIGNvZGVcbiAgICAgICAgICogICAgICAgZXhlY3V0aW9uXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgcmVzdWx0cyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIFIgZ3JhcGhpY3NcbiAgICAgICAgICogICAgICAgZGV2aWNlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgYXJ0aWZhY3RzIC0gaW5kaWNhdGVzIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBvciBtb2RpZmllZCBpbiB0aGVcbiAgICAgICAgICogICAgICAgd29ya2luZyBkaXJlY3RvcnlcbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBvYmplY3RzIC0gIGluZGljYXRlcyB0aGUgbGlzdCBvZiBSIG9iamVjdHMgcmV0dXJuZWQgZnJvbSB0aGVcbiAgICAgICAgICogICAgICAgd29ya3NwYWNlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgZmlsZXMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIG9iamVjdHMgc3RvcmVkIGluIHRoZVxuICAgICAgICAgKiAgICAgICByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgaW50ZXJydXB0ZWQgLSBpbmRpY2F0ZXMgdGhlIGludGVycnVwdGVkIHN0YXR1cyBvZiBleGVjdXRpb25cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBlcnJvciAtIG9uIGZhaWx1cmUsIGluZGljYXRlcyB0aGUgcmVhc29uIGZvciBmYWlsdXJlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgZXJyb3JDb2RlIC0gb24gZmFpbHVyZSwgaW5kaWNhdGVzIHRoZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4ZWN1dGVDb2RlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jb2RlPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgYmxvY2sgb2YgUiBjb2RlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgc2NyaXB0IGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jc3ZpbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmltaXRpdmUgbmFtZS92YWx1ZSBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZXZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBvYmplY3QgKC5yRGF0YSkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRvYmplY3RuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3R2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLW9iamVjdC1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHdvcmtzcGFjZSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggZGlyZWN0b3J5IGlzIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHRwYWNrYWdlczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIHRhZyB0aGF0IGxhYmVscyB0aGUgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmVjaG9vZmY8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlIFIgY29tbWFuZHMgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBjb25zb2xlIG91dHB1dDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jb25zb2xlb2ZmPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSBjb25zb2xlIG91dHB1dCBpcyBub3QgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmdyYXBoaWNzPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIFIgZ3JhcGhpY3MgZGV2aWNlIGZvciBleGVjdXRpb246IHBuZyBvciBzdmc8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5ncmFwaGljc3dpZHRoPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIHdpZHRoIGZvciBSIGdyYXBoaWNzIGRldmljZSBpbWFnZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5ncmFwaGljc2hlaWdodDwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBoZWlnaHQgZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnJvYmplY3RzPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvYmplY3RzIGZvciByZXRyaWV2YWwgZm9sbG93aW5nIHRoZSBleGVjdXRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5zdG9yZWZpbGU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmtpbmcgZGlyZWN0b3J5IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnN0b3Jlb2JqZWN0PC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3Jrc3BhY2Ugb2JqZWN0IG5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+c3RvcmV3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGZpbGVuYW1lICguckRhdGEpIHdoZXJlIHdvcmtzcGFjZSBjb250ZW50cyB3aWxsIGJlIHNhdmVkIGluIHRoZSByZXBvc2l0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+c3RvcmVuZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5zdXJlcyBlYWNoIGZpbGUgc3RvcmVkIGluXG4gICAgICAgICAqICAgIHJlcG9zaXRvcnkgcmVzdWx0cyBpbiBuZXcgdmVyc2lvbiBiZWluZyBjcmVhdGVkIGlmIG5lZWRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnN0b3JlcHVibGljPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaGVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5pbmZpbml0eTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgSW5maW5pdHkgYXBwZWFyaW5nIGluIFIgb2JqZWN0XG4gICAgICAgICAqICAgIGRhdGEgcmV0dXJuZWQgb24gY2FsbCwgb3RoZXJ3aXNlIEluZmluaXR5IGlzIHJlcHJlc2VudGVkIGJ5IDxjb2RlPjB4N2ZmMDAwMDAwMDAwMDAwMEw8L2NvZGU+XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0Pm5hbjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgTmFOIGFwcGVhcmluZyBpbiBSIG9iamVjdCBkYXRhXG4gICAgICAgICAqICAgIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBOYU4gaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+bnVsbDwvY29kZT48L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5lbmNvZGVEYXRhRnJhbWVQcmltaXRpdmVBc1ZlY3RvcjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRhdGEuZnJhbWUgcHJpbWl0aXZlcyBhcmUgZW5jb2RlZCB2ZWN0b3JzIGluIFIgb2JqZWN0IGRhdGEgcmV0dXJuZWQgb24gY2FsbDwvZGQ+XG4gICAgICAgICAqICA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeGVjdXRlQ29kZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9leGVjdXRlL2NvZGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBleGVjdXRlcyBleGVjdXRlcyByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0cyBvciBleHRlcm5hbCBzY3JpcHRzXG4gICAgICAgICAqIG9uIHRoZSBSIHNlc3Npb24gaWRlbnRpZmllZCBieSB0aGUgcHJvamVjdCBwYXJhbWV0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZVxuICAgICAgICAgKiBwYXJhbWV0ZXIgdmFsdWVzIGZvciBmaWxlbmFtZSwgYXV0aG9yIGFuZCBvcHRpb25hbGx5IHZlcnNpb24uIFRvIGV4ZWN1dGVcbiAgICAgICAgICogYSBjaGFpbiBvZiByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0cyB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhXG4gICAgICAgICAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyBvbiB0aGUgZmlsZW5hbWUgLCBhdXRob3IgYW5kIG9wdGlvbmFsbHlcbiAgICAgICAgICogdmVyc2lvbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBleGVjdXRlIGEgc2luZ2xlIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkIFVSTCBvclxuICAgICAgICAgKiBmaWxlIHBhdGggdXNpbmcgdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gVG8gZXhlY3V0ZSBhIGNoYWluIG9mXG4gICAgICAgICAqIGV4dGVybmFsIHNjcmlwdHMgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXNcbiAgICAgICAgICogb24gdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gTm90ZSwgdG8gZXhlY3V0ZSBhbiBleHRlcm5hbCBzY3JpcHQgdGhlXG4gICAgICAgICAqIGNhbGxlciBtdXN0IGhhdmUgUE9XRVJfVVNFUiBwcml2aWxlZ2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlOiBBIGNoYWluZWQgZXhlY3V0aW9uIGV4ZWN1dGVzIGVhY2ggb2YgdGhlIHNjcmlwdHMgaWRlbnRpZmllZCBvbiB0aGVcbiAgICAgICAgICogY2FsbCBpbiBhIHNlcXVlbnRpYWwgZmFzaGlvbiBvbiB0aGUgUiBzZXNzaW9uLCB3aXRoIGV4ZWN1dGlvbiBvY2N1cmluZyBpblxuICAgICAgICAgKiB0aGUgb3JkZXIgc3BlY2lmaWVkIG9uIHRoZSBwYXJhbWV0ZXIgbGlzdC5cbiAgICAgICAgICpcbiAgICAgICAgICogUGxlYXNlIG5vdCB0aGUgZm9sbG93aW5nIHByZSBhbmQgcG9zdCBleGVjdXRpb24gcGFyYW1ldGVyczpcbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5QcmUtZXhlY3V0aW9uIHBhcmFtZXRlcnM6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgaW5wdXRzIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBwYXNzIFJldm9EZXBsb3lSLWVuY29kZWRcbiAgICAgICAgICogICAgICAgUiBvYmplY3QgdmFsdWVzIGFzIGlucHV0cy4gVGhlc2UgaW5wdXRzIGFyZSB0dXJuZWQgaW50byBSIG9iamVjdHNcbiAgICAgICAgICogICAgICAgaW4gdGhlIHdvcmtzcGFjZSBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHByZWxvYWRmaWxlIHBhcmFtZXRlcnMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gbG9hZCBvbmUgb3IgbW9yZVxuICAgICAgICAgKiAgICAgICBmaWxlcyBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJlZm9yZSB0aGVcbiAgICAgICAgICogICAgICAgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcHJlbG9hZG9iamVjdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBvbmUgb3IgbW9yZVxuICAgICAgICAgKiAgICAgICBiaW5hcnkgUiBvYmplY3RzICguckRhdGEpIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya3NwYWNlXG4gICAgICAgICAqICAgICAgIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgYWRvcHQgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgYSBwcmUtZXhpc3RpbmdcbiAgICAgICAgICogICAgICAgcHJvamVjdCB3b3Jrc3BhY2UsIHByb2plY3Qgd29ya2luZyBkaXJlY3RvcnkgYW5kL29yIHByb2plY3QgcGFja2FnZVxuICAgICAgICAgKiAgICAgICBkZXBlbmRlbmNpZXMgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlBvc3QtZXhlY3V0aW9uIHBhcmFtZXRlcnM6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcm9iamVjdHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiBvYmplY3QgbmFtZXMgdGhhdCB3aWxsIGJlIHJldHVybmVkIGFzIFJldm9EZXBsb3lSLWVuY29kZWQgUlxuICAgICAgICAgKiAgICAgICBvYmplY3RzIG9uIHRoZSByZXNwb25zZSBtYXJrdXAgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZmlsZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZFxuICAgICAgICAgKiAgICAgICBsaXN0IG9mIHdvcmtpbmcgZGlyZWN0b3J5IGZpbGVzIHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlclxuICAgICAgICAgKiAgICAgICB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVvYmplY3QgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3Jrc3BhY2Ugb2JqZWN0cyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlXG4gICAgICAgICAqICAgICAgIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jld29ya3NwYWNlIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzdG9yZSB0aGUgZW50aXJlXG4gICAgICAgICAqICAgICAgIHdvcmtzcGFjZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVkaXJlY3RvcnkgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgYSB0YXJnZXRcbiAgICAgICAgICogICAgICAgcmVwb3NpdG9yeSBkaXJlY3RvcnkgZm9yIHN0b3JlZCBmaWxlcyBhbmQgb2JqZWN0cyBhZnRlciB0aGUgZXhlY3V0aW9uXG4gICAgICAgICAqICAgICAgIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVuZXd2ZXJzaW9uIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBjcmVhdGUgbmV3XG4gICAgICAgICAqICAgICAgIHZlcnNpb25zIG9mIGVhY2ggc3RvcmVkIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuIEJ5IGRlZmF1bHQsIHN0b3JlZCBmaWxlcyBvdmVyd3JpdGUgYW55IHByZS1leGlzdGluZyBmaWxlXG4gICAgICAgICAqICAgICAgIGJ5IHRoZSBzYW1lIG5hbWUuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlcHVibGljIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBhc3NpZ24gcHVibGljIGFjY2Vzc1xuICAgICAgICAgKiAgICAgICB0byBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlxuICAgICAgICAgKiAgICBTb21lIG9mIHRoZSBrZXkgZGF0YSBpbmRpY2F0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGxcbiAgICAgICAgICogICAgaW5jbHVkZTpcbiAgICAgICAgICogPC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBjb25zb2xlIC0gaW5kaWNhdGVzIHRoZSBjb25zb2xlIG91dHB1dCByZXN1bHRpbmcgZnJvbSB0aGUgc2NyaXB0XG4gICAgICAgICAqICAgICAgIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIHJlc3VsdHMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBSIGdyYXBoaWNzXG4gICAgICAgICAqICAgICAgIGRldmljZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGFydGlmYWN0cyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgb3IgbW9kaWZpZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgb2JqZWN0cyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBSIG9iamVjdHMgcmV0dXJuZWQgZnJvbSB0aGUgd29ya3NwYWNlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgZmlsZXMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIG9iamVjdHMgc3RvcmVkIGluIHRoZVxuICAgICAgICAgKiAgICAgICByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5pbnRlcnJ1cHRlZCAtIGluZGljYXRlcyB0aGUgaW50ZXJydXB0ZWQgc3RhdHVzIG9mIGV4ZWN1dGlvbjwvbGk+XG4gICAgICAgICAqICAgIDxsaT5lcnJvciAtIG9uIGZhaWx1cmUsIGluZGljYXRlcyB0aGUgcmVhc29uIGZvciBmYWlsdXJlPC9saT5cbiAgICAgICAgICogICAgPGxpPmVycm9yQ29kZSAtIG9uIGZhaWx1cmUsIGluZGljYXRlcyB0aGUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZTwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4ZWN1dGVTY3JpcHRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiAgPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5LW1hbmFnZWQgZGlyZWN0b3JpZXMgZm9yXG4gICAgICAgICAqICAgICAgIHNjcmlwdHMsIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItZmlsZW5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLCB2ZXJzaW9uLXBlci1maWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5leHRlcm5hbHNvdXJjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFVSTHMgb3IgZmlsZSBwYXRocyB0byBleHRlcm5hbCBzY3JpcHRzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgc2NyaXB0IGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jc3ZpbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmltaXRpdmUgbmFtZS92YWx1ZSBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZXZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBvYmplY3QgKC5yRGF0YSkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRvYmplY3RuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3R2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLW9iamVjdC1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHdvcmtzcGFjZSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggZGlyZWN0b3J5IGlzIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZGQ+YWRvcHRwYWNrYWdlczwvZGQ+XG4gICAgICAgICAqICAgIDxkdD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBhZG9wdGVkPC9kdD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIHRhZyB0aGF0IGxhYmVscyB0aGUgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmVjaG9vZmY8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlIFIgY29tbWFuZHMgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBjb25zb2xlIG91dHB1dDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBwcmVmZXJyZWQgUiBncmFwaGljcyBkZXZpY2UgZm9yIGV4ZWN1dGlvbjogcG5nIG9yIHN2ZzwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljc3dpZHRoPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCB3aWR0aCBmb3IgUiBncmFwaGljcyBkZXZpY2UgaW1hZ2VzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmdyYXBoaWNzaGVpZ2h0PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBoZWlnaHQgZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yb2JqZWN0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9iamVjdHMgZm9yIHJldHJpZXZhbCBmb2xsb3dpbmcgdGhlIGV4ZWN1dGlvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZWZpbGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVvYmplY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3Jrc3BhY2Ugb2JqZWN0IG5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3Jld29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgZmlsZW5hbWUgKC5yRGF0YSkgd2hlcmUgd29ya3NwYWNlIGNvbnRlbnRzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVuZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuc3VyZXMgZWFjaCBmaWxlIHN0b3JlZCBpbiByZXBvc2l0b3J5IHJlc3VsdHMgaW4gbmV3IHZlcnNpb24gYmVpbmcgY3JlYXRlZCBpZiBuZWVkZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVwdWJsaWM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaGVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5maW5pdHk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgY3VzdG9tIHZhbHVlIGZvciBJbmZpbml0eSBhcHBlYXJpbmcgaW4gUiBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiBjYWxsLCBvdGhlcndpc2UgSW5maW5pdHkgaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+MHg3ZmYwMDAwMDAwMDAwMDAwTDwvY29kZT48L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmFuPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgTmFOIGFwcGVhcmluZyBpbiBSIG9iamVjdCBkYXRhIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBOYU4gaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+bnVsbDwvY29kZT48L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZW5jb2RlRGF0YUZyYW1lUHJpbWl0aXZlQXNWZWN0b3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGF0YS5mcmFtZSBwcmltaXRpdmVzIGFyZSBlbmNvZGVkIHZlY3RvcnMgaW4gUiBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiBjYWxsPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEV4ZWN1dGVTY3JpcHQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvc2NyaXB0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBpbnRlcnJ1cHRzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBvbiBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RXhlY3V0ZUludGVycnVwdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqICA8ZGw+XG4gICAgICAgICAqICAgICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqICA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeGVjdXRlSW50ZXJydXB0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9leGVjdXRlL2ludGVycnVwdCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgcmV0cmlldmVzIHRoZSBSIGNvbnNvbGUgb3V0cHV0IGZvciB0aGUgbGF0ZXN0IGV4ZWN1dGlvbiBvblxuICAgICAgICAgKiBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RXhlY3V0ZUNvbnNvbGVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiAgPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEV4ZWN1dGVDb25zb2xlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9leGVjdXRlL2NvbnNvbGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJldHJpZXZlcyB0aGUgZXhlY3V0aW9uIGhpc3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogU29tZSBvZiB0aGUga2V5IGRhdGEgaW5kaWNhdGVkIGZvciBlYWNoIGhpc3RvcnkgaXRlbSBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqIG9uIHRoaXMgY2FsbCBpbmNsdWRlOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8b2w+XG4gICAgICAgICAqICA8bGk+Y29kZSAtIGluZGljYXRlcyB0aGUgY29kZSB0aGF0IGhhcyBiZWVuIGV4ZWN1dGVkPC9saT5cbiAgICAgICAgICogIDxsaT5jb25zb2xlIC0gaW5kaWNhdGVzIHRoZSBjb25zb2xlIG91dHB1dCByZXN1bHRpbmcgZnJvbSB0aGUgY29kZSBleGVjdXRpb248L2xpPlxuICAgICAgICAgKiAgPGxpPnJlc3VsdHNHZW5lcmF0ZWQgLSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBnZW5lcmF0ZWQgcmVzdWx0cyBvbiB0aGUgZXhlY3V0aW9uPC9saT5cbiAgICAgICAgICogIDxsaT5yZXN1bHRzQXZhaWxhYmxlIC0gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZ2VuZXJhdGVkIHJlc3VsdHMgc3RpbGwgc3RvcmVkIG9uIHRoZSBleGVjdXRpb248L2xpPlxuICAgICAgICAgKiAgPGxpPnJlc291cmNlVXNhZ2UgLSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgc3RvcmFnZSBieXRlIGNvdW50IGZvciByZXN1bHRzIG9uIHRoZSBleGVjdXRpb248L2xpPlxuICAgICAgICAgKiAgPGxpPmV4ZWN1dGlvbiAtIGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIGlkZW50aWZpZXIsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgb24gL3IvcHJvamVjdC9leGVjdXRpb24vcmVzdWx0IGNhbGxzIHRvIHJldHJpZXZlIG9yIG1hbmFnZSByZXN1bHRzPC9saT5cbiAgICAgICAgICogIDxsaT5pbnRlcnJ1cHRlZCAtIGluZGljYXRlcyB0aGUgaW50ZXJydXB0ZWQgc3RhdHVzIG9mIGV4ZWN1dGlvbjwvbGk+XG4gICAgICAgICAqICA8bGk+ZXJyb3IgLSBvbiBmYWlsdXJlLCBpbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZTwvbGk+XG4gICAgICAgICAqICA8bGk+ZXJyb3JDb2RlIC0gb24gZmFpbHVyZSwgaW5kaWNhdGVzIHRoZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RXhlY3V0ZUhpc3RvcnlcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbHRlcmRlcHRoPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgbWF4IG51bWJlciBvZiBleGVjdXRpb25zIHRvIGJlIHJldHVybmVkIGluIHRoZSBoaXN0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmV4ZWN1dGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhlY3V0aW9uIGlkZW50aWZpZXJzIG9uIHdoaWNoIHRvIGZpbHRlciBoaXN0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbHRlcnRhZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgZXhlY3V0aW9uIHRhZyBvbiB3aGljaCB0byBmaWx0ZXIgaGlzdG9yeTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXZlcnNlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgZXhlY3V0aW9uIGhpc3RvcnkgaXMgcmV0dXJuZWQgaW4gYVxuICAgICAgICAgKiAgICAgICByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICAgICAgICogICAgPC9kdD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0RXhlY3V0ZUhpc3Rvcnk6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvaGlzdG9yeScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZmx1c2hlcyBleGVjdXRpb25zIGluIHRoZSBoaXN0b3J5IG9uIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICogRmx1c2hpbmcgYW4gZXhlY3V0aW9uIGRlbGV0ZXMgYm90aCB0aGUgUiBjb25zb2xlIG91dHB1dCBhbmQgdGhlIGdlbmVyYXRlZFxuICAgICAgICAgKiByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV4ZWN1dGlvbiBidXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogaXRzZWxmIGZyb20gdGhlIGhpc3RvcnkuIEJ5IG9taXR0aW5nIHRoZSBleGVjdXRpb24gcGFyYW1ldGVyLCB0aGUgY2FsbGVyXG4gICAgICAgICAqIGNhbiBmbHVzaCBldmVyeSBleGVjdXRpb24gaW4gdGhlIGhpc3Rvcnkgb24gdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGZsdXNoaW5nIGZhY2lsaXR5IGlzIHByb3ZpZGVkIHRvIGhlbHAgdXNlcnMgbWFuYWdlIHRoZSBsZXZlbHMgb2ZcbiAgICAgICAgICogcmVzb3VyY2UgdXNhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIHBlcnNpc3RlbnQgcHJvamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4ZWN1dGVGbHVzaFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqICA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmV4ZWN1dGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4ZWN1dGlvbiBpZGVudGlmaWVyczwvZGQ+XG4gICAgICAgICAqICA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeGVjdXRlRmx1c2g6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvZmx1c2gnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGxpc3RzIHRoZSBleGVjdXRpb24gcmVzdWx0cyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBCeSBzcGVjaWZ5aW5nIGEgdmFsdWUgZm9yIHRoZSBleGVjdXRpb24gcGFyYW1ldGVyIHRoZSBjYWxsZXIgY2FuIGxpbWl0IHRoZVxuICAgICAgICAgKiByZXNwb25zZSB0byB0aG9zZSByZXN1bHRzIGZvdW5kIG9uIGEgc3BlY2lmaWMgZXhlY3V0aW9uIG9yIHNldCBvZlxuICAgICAgICAgKiBleGVjdXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiA8YmxvY2txdW90ZT5cbiAgICAgICAgICogICAgSW1wb3J0YW50ISBUaGUgVVJMcyBpbmRpY2F0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGwgcmVtYWluXG4gICAgICAgICAqICAgIHZhbGlkIGZvciBhcyBsb25nIGFzIHRoZSByZXN1bHRzIHJlbWFpbiBwYXJ0IG9mIHRoZSBwcm9qZWN0LlxuICAgICAgICAgKiA8L2Jsb2NrcXVvdGU+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4ZWN1dGVSZXN1bHRMaXN0XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5leGVjdXRpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhlY3V0aW9uIGlkZW50aWZpZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEV4ZWN1dGVSZXN1bHRMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9leGVjdXRlL3Jlc3VsdC9saXN0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkb3dubG9hZHMgdGhlIGV4ZWN1dGlvbiByZXN1bHRzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEJ5IHNwZWNpZnlpbmcgYSB2YWx1ZSBmb3IgdGhlIGV4ZWN1dGlvbiBwYXJhbWV0ZXIgdGhlIGNhbGxlciBjYW4gZG93bmxvYWRcbiAgICAgICAgICogb25seSByZXN1bHRzIG9uIHRoZSBzcGVjaWZpZWQgZXhlY3V0aW9ucy4gQnkgc3BlY2lmeWluZyBhIHZhbHVlIGZvciB0aGVcbiAgICAgICAgICogZmlsZW5hbWUgcGFyYW1ldGVyIHRoZSBjYWxsZXIgY2FuIGRvd25sb2FkIGEgc3BlY2lmaWMgcmVzdWx0IG9uIHRoZVxuICAgICAgICAgKiBzcGVjaWZpZWQgZXhlY3V0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RFeGVjdXRlUmVzdWx0RG93bmxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmV4ZWN1dGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleGVjdXRpb24gaWRlbnRpZmllcnNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgcmVzdWx0IGZpbGUgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbmxpbmU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gcmVzcG9uc2UgaGVhZGVyXG4gICAgICAgICAqICAgICAgIGluZGljYXRpbmcgYXR0YWNobWVudCBpcyBvbWl0dGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqICA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeGVjdXRlUmVzdWx0RG93bmxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvcmVzdWx0L2Rvd25sb2FkJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkZWxldGVzIHRoZSBleGVjdXRpb24gcmVzdWx0cyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBCeSBzcGVjaWZ5aW5nIGEgdmFsdWUgZm9yIHRoZSBleGVjdXRpb24gcGFyYW1ldGVyIHRoZSBjYWxsZXIgY2FuIGRlbGV0ZVxuICAgICAgICAgKiBvbmx5IHRob3NlIHJlc3VsdHMgb24gdGhlIHNwZWNpZmllZCBleGVjdXRpb25zLiBCeSBzcGVjaWZ5aW5nIGEgdmFsdWUgZm9yXG4gICAgICAgICAqIHRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgdGhlIGNhbGxlciBjYW4gZGVsZXRlIGEgc3BlY2lmaWMgcmVzdWx0IG9uIHRoZVxuICAgICAgICAgKiBzcGVjaWZpZWQgZXhlY3V0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RXhlY3V0ZVJlc3VsdERlbGV0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICA8ZHQ+ZXhlY3V0aW9uPC9kdD5cbiAgICAgICAgICogICA8ZGQ+XG4gICAgICAgICAqICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleGVjdXRpb24gaWRlbnRpZmllcnNcbiAgICAgICAgICogICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgcmVzdWx0IGZpbGUgbmFtZTwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEV4ZWN1dGVSZXN1bHREZWxldGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvcmVzdWx0L2RlbGV0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gUHJvamVjdCBEaXJlY3RvcnkgQVBJc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBsaXN0cyB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgZmlsdGVyIHBhcmFtZXRlciBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjYWxsIHRvIGZpbHRlciwgdGhlIHR5cGVzIG9mXG4gICAgICAgICAqIGZpbGVzIHJldHVybmVkIGFjY29yZGluZyB0byB0aGVpciBjYXRlZ29yeS4gVGhlIGZvbGxvd2luZyBmaWx0ZXIgdmFsdWVzIGFyZVxuICAgICAgICAgKiBzdXBwb3J0ZWQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPnBsb3QgLSBmaWxlcyBlbmRpbmcgd2l0aCBhIC5wbmcsIC5zdmcgb3IgLmpwZyBleHRlbnNpb248L2xpPlxuICAgICAgICAgKiAgICA8bGk+c2NyaXB0IC0gZmlsZXMgZW5kaW5nIHdpdGggYSAuUiBvciAuciBleHRlbnNpb248L2xpPlxuICAgICAgICAgKiAgICA8bGk+UiAtIGZpbGVzIGVuZGluZyB3aXRoIGEgLnJEYXRhIG9yIC5yZGF0YSBleHRlbnNpb248L2xpPlxuICAgICAgICAgKiAgICA8bGk+ZGF0YSAtIGZpbGVzIGVuZGluZyB3aXRoIGEgLmNzdiBvciAueGxzIGV4dGVuc2lvbjwvbGk+XG4gICAgICAgICAqICAgIDxsaT50ZXh0IC0gZmlsZXMgZW5kaW5nIHdpdGggYSAudHh0IGV4dGVuc2lvbjwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdERpcmVjdG9yeUxpc3RcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbHRlcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgZmlsdGVyIGJ5IGNhdGVnb3J5IHZhbHVlPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0RGlyZWN0b3J5TGlzdDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvZGlyZWN0b3J5L2xpc3QnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwbG9hZHMgYSBmaWxlIGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWVkXG4gICAgICAgICAqIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdERpcmVjdG9yeVVwbG9hZFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+Li4uZmlsZSBjb250ZW50Li4uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBkZXNjcmlwdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGggZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5vdmVyd3JpdGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyBmaWxlIG9mIHNhbWUgbmFtZTwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeVVwbG9hZDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IFwidGV4dFwiO1xuICAgICAgICAgICAgdmFyIGlvQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5mb3JtSWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2RpcmVjdG9yeS91cGxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHRyYW5zZmVycyBhIGZpbGUgZnJvbSBhIFVSTCBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlXG4gICAgICAgICAqIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3REaXJlY3RvcnlUcmFuc2ZlclxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnVybDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIFVSTCBmb3IgdGhlIGZpbGU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm92ZXJ3cml0ZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIG92ZXJ3cml0ZXMgdGhlIGV4aXN0aW5nIGZpbGUgb2Ygc2FtZSBuYW1lPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeVRyYW5zZmVyOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kaXJlY3RvcnkvdHJhbnNmZXInLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHdyaXRlcyBhIHRleHQgZmlsZSBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmllZFxuICAgICAgICAgKiBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3REaXJlY3RvcnlXcml0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRleHQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSB0ZXh0IGNvbnRlbnQgZm9yIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRlbGltaXRlcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjdXN0b20gZGVsaW1pdGVyIGZvciB0ZXh0IHdoZW4gd3JpdGluZ1xuICAgICAgICAgKiAgICAgICBtdWx0aXBsZSBmaWxlcywgZGVmYXVsdHMgdG8gIywjXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgZGVzY3JpcHRpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGZpbGU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+b3ZlcndyaXRlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgb3ZlcndyaXRlcyB0aGUgZXhpc3RpbmcgZmlsZSBvZiBzYW1lIG5hbWU8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3REaXJlY3RvcnlXcml0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvZGlyZWN0b3J5L3dyaXRlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqIFxuICAgICAgICAgKiBUaGlzIGNhbGwgdXBkYXRlcyBhIGZpbGUgbmFtZSBhbmQvb3IgZGVzY3JpcHRpb24gaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdERpcmVjdG9yeVVwZGF0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgbmV3IG5hbWUgZm9yIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWNlcyB0aGUgbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5vdmVyd3JpdGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyBmaWxlIG9mIHNhbWUgbmFtZTwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeVVwZGF0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvZGlyZWN0b3J5L3VwZGF0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgc3RvcmVzIGEgZmlsZSBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RGlyZWN0b3J5U3RvcmVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBmaWxlIGZvciBzdG9yaW5nPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgZGVzY3JpcHRpb24gdG8gYWNjb21wYW55IHRoZSBzYXZlZCBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZ3M8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCByZXBvc2l0b3J5IGZpbGVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJvbGUgbmFtZXMsIHdoaWNoIG1ha2VzIHRoZSBmaWxlXG4gICAgICAgICAqICAgICAgICB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMgd2l0aCB0aGVzZSByb2xlc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgc2hhcmVkICwgd2hpY2ggbWFrZXMgdGhlIGZpbGVcbiAgICAgICAgICogICAgICAgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGUgd2lsbCBiZSBwdWJsaXNoZWQgLCB3aGljaCBtYWtlcyB0aGVcbiAgICAgICAgICogICAgICAgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgbmV3IGZpbGUgd2lsbCBiZSByZW5hbWVkIHRvIGF2b2lkIG92ZXJ3cml0aW5nXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeVN0b3JlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kaXJlY3Rvcnkvc3RvcmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGxvYWRzIGEgZmlsZSBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvclxuICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdERpcmVjdG9yeUxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgYXV0aG9yIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb248L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3REaXJlY3RvcnlMb2FkOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kaXJlY3RvcnkvbG9hZCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZG93bmxvYWRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBjb250ZW50cyBmb3IgdGhlIHNwZWNpZmllZFxuICAgICAgICAgKiBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBCeSBzcGVjaWZ5aW5nIGEgc2luZ2xlIHZhbHVlIGZvciB0aGUgZmlsZW5hbWUgcGFyYW1ldGVyLCB0aGUgY2FsbGVyIGNhblxuICAgICAgICAgKiBkb3dubG9hZCBhIHNwZWNpZmljIGZpbGUuIEJ5IHNwZWNpZnlpbmcgbXVsdGlwbGUgdmFsdWVzIGZvciB0aGUgZmlsZW5hbWVcbiAgICAgICAgICogcGFyYW1ldGVyLCB0aGUgY2FsbGVyIGNhbiBkb3dubG9hZCBhIHppcCBhcmNoaXZlIG9mIHRob3NlIGZpbGVzLiBCeVxuICAgICAgICAgKiBvbWl0dGluZyB0aGUgZmlsZW5hbWUgcGFyYW1ldGVyLCB0aGVuIHRoZSBjYWxsZXIgY2FuIGRvd25sb2FkIGEgemlwIGFyY2hpdmVcbiAgICAgICAgICogd2l0aCBhbGwgb2YgdGhlIGZpbGVzIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RGlyZWN0b3J5RG93bmxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGNvbW1hLXNlcGFyYXRlZCBmaWxlIG5hbWVzIGZvciBkb3dubG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbmxpbmU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gcmVzcG9uc2UgaGVhZGVyXG4gICAgICAgICAqICAgICAgIGluZGljYXRpbmcgYXR0YWNobWVudCBpcyBvbWl0dGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeURvd25sb2FkOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kaXJlY3RvcnkvZG93bmxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGRlbGV0ZXMgZmlsZXMgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZWRcbiAgICAgICAgICogcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RGlyZWN0b3J5RGVsZXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIG5hbWVzIGZvciBkZWxldGlvbjwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeURlbGV0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvZGlyZWN0b3J5L2RlbGV0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gUHJvamVjdCBQYWNrYWdlIEFQSXNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgbGlzdHMgUiBwYWNrYWdlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RQYWNrYWdlTGlzdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5zdGFsbGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICBpZiB0cnVlLCByZXNwb25zZSBsaXN0cyBhbGwgcGFja2FnZXMgaW5zdGFsbGVkIGluIHByb2plY3QgZW52aXJvbm1lbnRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0UGFja2FnZUxpc3Q6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3BhY2thZ2UvbGlzdCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgYXR0YWNoZXMgUiBwYWNrYWdlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RQYWNrYWdlQXR0YWNoXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFIgcGFja2FnZSBuYW1lcyB0byBhdHRhY2g8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cmVwbzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBSIHJlcG9zaXRvcnkgbG9jYXRpb24gZm9yIG5hbWVkIHBhY2thZ2VzPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0UGFja2FnZUF0dGFjaDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvcGFja2FnZS9hdHRhY2gnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGRldGFjaGVzIFIgcGFja2FnZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0UGFja2FnZURldGFjaFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBSIHBhY2thZ2UgbmFtZXMgdG8gZGV0YWNoPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0UGFja2FnZURldGFjaDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvcGFja2FnZS9kZXRhY2gnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFVzZXIgQVBJc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBzaWducyB0aGUgdXNlciBpbiBieSBhdXRoZW50aWNhdGluZyB0aGUgY3JlZGVudGlhbHMgd2l0aCB0aGVcbiAgICAgICAgICogUmV2b0RlcGxveVIgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHVzZXJMb2dpblxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnVzZXJuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgdXNlcm5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cGFzc3dvcmQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwYXNzd29yZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXNhYmxlYXV0b3NhdmU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiB0cnVlLCBkaXNhYmxlcyBhdXRvc2F2ZSBzZW1hbnRpY3MgZm9yIHBlcnNpc3RlbnRcbiAgICAgICAgICogICAgICAgcHJvamVjdHNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyTG9naW46IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci91c2VyL2xvZ2luJywgY29uZmlnLCBjYWxsYmFjayk7ICAgICAgICAgICAgXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBzaWducyBvdXQgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgdXNlckxvZ291dFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnVzZXJjb29raWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiBzcGVjaWZpZWQsIHZhbHVlIHNldHMgYXBwbGljYXRpb24tc3BlY2lmaWMgcGVyc2lzdGVudFxuICAgICAgICAgKiAgICAgICB1c2VyIGNvb2tpZSwgd2hpY2ggaXMgcmV0cmlldmFibGUgb24gcmVzcG9uc2UgdG9cbiAgICAgICAgICogICAgICAgPGEgaHJlZj1cIiNtZXRob2RfdXNlckxvZ2luXCI+dXNlckxvZ2luPC9hPiBjYWxsLlxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJMb2dvdXQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci91c2VyL2xvZ291dCcsIGNvbmZpZywgY2FsbGJhY2spOyAgICAgICAgICAgIFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgcmV0cmlldmVzIGRldGFpbHMgYWJvdXQgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuIFRoZVxuICAgICAgICAgKiBkZXRhaWxzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBtYXJrdXAgb24gdGhpcyBjYWxsIGFyZSBleGFjdGx5IHRoZSBzYW1lXG4gICAgICAgICAqIGRldGFpbHMgYXMgdGhvc2UgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGVcbiAgICAgICAgICogPGEgaHJlZj1cIiNtZXRob2RfdXNlckxvZ2luXCI+dXNlckxvZ2luPC9hPiBjYWxsLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHVzZXJBYm91dFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFib3V0OiBmdW5jdGlvbihjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3VzZXIvYWJvdXQnLCB7fSwgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYXV0b3NhdmUgc2VtYW50aWNzIG9uIHBlcnNpc3RlbnQgcHJvamVjdHNcbiAgICAgICAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCB1c2VycyBIVFRQIHNlc3Npb24uIEJ5IGRlZmF1bHQsIGFsbCBsaXZlXG4gICAgICAgICAqIHBlcnNpc3RlbnQgcHJvamVjdHMgYXJlIGF1dG9zYXZlZCB1bmRlciB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gICAgICAgICAqXG4gICAgICAgICAqIDx1bD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBXaGVuIGEgdXNlciBjbG9zZXMgYSBwcm9qZWN0IHVzaW5nIHRoZVxuICAgICAgICAgKiAgICAgICA8YSBocmVmPVwiI21ldGhvZF9wcm9qZWN0Q2xvc2VcIj5wcm9qZWN0Q2xvc2U8L2E+IGNhbGwuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgV2hlbiBhIHVzZXIgc2lnbnMtb3V0IHVzaW5nIHRoZVxuICAgICAgICAgKiAgICAgICA8YSBocmVmPVwiI21ldGhvZF91c2VyTG9nb3V0XCI+dXNlckxvZ291dDwvYT4gY2FsbC5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBXaGVuIGEgdXNlciBpcyBhdXRvbWF0aWNhbGx5IHNpZ25lZC1vdXQgYnkgdGhlIHN5c3RlbSBhZnRlciBhXG4gICAgICAgICAqICAgICAgIHByb2xvbmdlZCBwZXJpb2Qgb2YgaW5hY3Rpdml0eS5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC91bD5cbiAgICAgICAgICpcbiAgICAgICAgICogV2hlbiB0aGUgYXV0b3NhdmUgZmVhdHVyZSBpcyBkaXNhYmxlZCBhIHVzZXIgbXVzdCBtYWtlIGFuIGV4cGxpY2l0IGNhbGwgb25cbiAgICAgICAgICogPGEgaHJlZj1cIiNtZXRob2RfcHJvamVjdFNhdmVcIj5wcm9qZWN0U2F2ZTwvYT4gaW4gb3JkZXIgdG8gc2F2ZSBhIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgdXNlckF1dG9zYXZlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZW5hYmxlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgdG9nZ2xlcyBhdXRvc2F2ZSBzZW1hbnRpY3MgZm9yIHBlcnNpc3RlbnQgcHJvamVjdHMuPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQXV0b3NhdmU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci91c2VyL2F1dG9zYXZlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBSZXBvc2l0b3J5IFNjcmlwdCBBUElzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGxpc3RzIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGNhbGwgaXMgYXZhaWxhYmxlIHRvIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2Vycy4gSG93ZXZlciwgaWZcbiAgICAgICAgICogdGhlIGNhbGxlciBpcyBhbiBhbm9ueW1vdXMgdXNlciB0aGVuIG9ubHkgcHVibGlzaGVkIHNjcmlwdHMgd2lsbCBiZVxuICAgICAgICAgKiByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlTY3JpcHRMaXN0XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiBzcGVjaWZpZWQsIGNhbGwgcmV0dXJucyBsaXN0IG9mIHNjcmlwdCB2ZXJzaW9ucyBmb3JcbiAgICAgICAgICogICAgICAgZmlsZW5hbWVcbiAgICAgICAgICogICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBmaWxlcyB0aGF0IGFyZSByZXN0cmljdGVkIGJ1dFxuICAgICAgICAgKiAgICAgICB2aXNpYmxlIG9yIHNoYXJlZCBieSBvdGhlciB1c2VycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzY3JpcHRzIHB1Ymxpc2hlZCBieSBvdGhlciB1c2VycyBhcmVcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlTY3JpcHRMaXN0OiBmdW5jdGlvbihjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvc2NyaXB0L2xpc3QnLCB7fSwgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGV4ZWN1dGVzIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzIG9yIGV4dGVybmFsIHNjcmlwdHMgb24gYW5cbiAgICAgICAgICogQW5vbnltb3VzIFByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZVxuICAgICAgICAgKiBwYXJhbWV0ZXIgdmFsdWVzIGZvciBmaWxlbmFtZSwgYXV0aG9yIGFuZCBvcHRpb25hbGx5IHZlcnNpb24uIFRvIGV4ZWN1dGUgYVxuICAgICAgICAgKiBjaGFpbiBvZiByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0cyB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhXG4gICAgICAgICAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyBvbiB0aGUgZmlsZW5hbWUgLCBhdXRob3IgYW5kIG9wdGlvbmFsbHlcbiAgICAgICAgICogdmVyc2lvbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBleGVjdXRlIGEgc2luZ2xlIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkIFVSTFxuICAgICAgICAgKiBvciBmaWxlIHBhdGggdXNpbmcgdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gVG8gZXhlY3V0ZSBhIGNoYWluIG9mXG4gICAgICAgICAqIGV4dGVybmFsIHNjcmlwdHMgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZlxuICAgICAgICAgKiB2YWx1ZXMgb24gdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gTm90ZSwgdG8gZXhlY3V0ZSBhbiBleHRlcm5hbCBzY3JpcHRcbiAgICAgICAgICogdGhlIGNhbGxlciBtdXN0IGhhdmUgUE9XRVJfVVNFUiBwcml2aWxlZ2VzIHNvIHRoaXMgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAqIHRvIGFub255bW91cyB1c2VycyBvbiB0aGlzIGNhbGwuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGU6IEEgY2hhaW5lZCBleGVjdXRpb24gZXhlY3V0ZXMgZWFjaCBvZiB0aGUgc2NyaXB0cyBpZGVudGlmaWVkIG9uIHRoZVxuICAgICAgICAgKiBjYWxsIGluIGEgc2VxdWVudGlhbCBmYXNoaW9uIG9uIHRoZSBSIHNlc3Npb24sIHdpdGggZXhlY3V0aW9uIG9jY3VyaW5nIGluXG4gICAgICAgICAqIHRoZSBvcmRlciBzcGVjaWZpZWQgb24gdGhlIHBhcmFtZXRlciBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlByZS1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZFxuICAgICAgICAgKiAgICAgICBSIG9iamVjdCB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0c1xuICAgICAgICAgKiAgICAgICBpbiB0aGUgd29ya3NwYWNlIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcHJlbG9hZGZpbGUgcGFyYW1ldGVycyBhbGxvd3MgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2Fkb2JqZWN0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGJpbmFyeSBSIG9iamVjdHMgKC5yRGF0YSkgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICogICAgICAgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBhZG9wdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBhIHByZS1leGlzdGluZ1xuICAgICAgICAgKiAgICAgICBwcm9qZWN0IHdvcmtzcGFjZSwgcHJvamVjdCB3b3JraW5nIGRpcmVjdG9yeSBhbmQvb3IgcHJvamVjdCBwYWNrYWdlXG4gICAgICAgICAqICAgICAgIGRlcGVuZGVuY2llcyBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxzdHJvbmc+UG9zdC1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSByb2JqZWN0cyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZFxuICAgICAgICAgKiAgICAgICBsaXN0IG9mIG9iamVjdCBuYW1lcyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYXMgUmV2b0RlcGxveVItZW5jb2RlZCBSXG4gICAgICAgICAqICAgICAgIG9iamVjdHMgb24gdGhlIHJlc3BvbnNlIG1hcmt1cCBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVmaWxlIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya2luZyBkaXJlY3RvcnkgZmlsZXMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyXG4gICAgICAgICAqICAgICAgIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZW9iamVjdCBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZFxuICAgICAgICAgKiAgICAgICBsaXN0IG9mIHdvcmtzcGFjZSBvYmplY3RzIHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGVcbiAgICAgICAgICogICAgICAgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmV3b3Jrc3BhY2UgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHN0b3JlIHRoZSBlbnRpcmVcbiAgICAgICAgICogICAgICAgd29ya3NwYWNlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWRpcmVjdG9yeSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSBhIHRhcmdldFxuICAgICAgICAgKiAgICAgICByZXBvc2l0b3J5IGRpcmVjdG9yeSBmb3Igc3RvcmVkIGZpbGVzIGFuZCBvYmplY3RzIGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZW5ld3ZlcnNpb24gcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNyZWF0ZSBuZXdcbiAgICAgICAgICogICAgICAgdmVyc2lvbnMgb2YgZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uXG4gICAgICAgICAqICAgICAgIGNvbXBsZXRlcy4gQnkgZGVmYXVsdCwgc3RvcmVkIGZpbGVzIG92ZXJ3cml0ZSBhbnkgcHJlLWV4aXN0aW5nIGZpbGVcbiAgICAgICAgICogICAgICAgYnkgdGhlIHNhbWUgbmFtZS5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVwdWJsaWMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIGFzc2lnbiBwdWJsaWMgYWNjZXNzXG4gICAgICAgICAqICAgICAgIHRvIGVhY2ggc3RvcmVkIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIGluZmluaXR5ICwgbmFuIGFuZCBlbmNvZGVEYXRhRnJhbWVQcmltaXRpdmVBc1ZlY3RvciBwYXJhbWV0ZXJzXG4gICAgICAgICAqICAgICAgIGFsbG93IHRoZSBjYWxsZXIgdG8gY29udHJvbCBob3cgUmV2b0RlcGxveVItZW5jb2RlZCBSIG9iamVjdCBkYXRhIGlzXG4gICAgICAgICAqICAgICAgIGVuY29kZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmtrdXAuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqICA8c3Ryb25nPlxuICAgICAgICAgKiAgICAgU29tZSBrZXkgZGF0YSBpbmRpY2F0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGw6XG4gICAgICAgICAqICA8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogIDxvbD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBjb25zb2xlIC0gaW5kaWNhdGVzIHRoZSBjb25zb2xlIG91dHB1dCByZXN1bHRpbmcgZnJvbSB0aGUgY29kZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb25cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICByZXN1bHRzIC0gaW5kaWNhdGVzIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUgUiBncmFwaGljc1xuICAgICAgICAgKiAgICAgICBkZXZpY2VcbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBhcnRpZmFjdHMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIG9yIG1vZGlmaWVkIGluIHRoZVxuICAgICAgICAgKiAgICAgICB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIG9iamVjdHMgLSAgaW5kaWNhdGVzIHRoZSBsaXN0IG9mIFIgb2JqZWN0cyByZXR1cm5lZCBmcm9tIHRoZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2VcbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBmaWxlcyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBmaWxlcyBhbmQgb2JqZWN0cyBzdG9yZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXNcbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPmludGVycnVwdGVkIC0gaW5kaWNhdGVzIHRoZSBpbnRlcnJ1cHRlZCBzdGF0dXMgb2YgZXhlY3V0aW9uPC9saT5cbiAgICAgICAgICogICAgPGxpPmVycm9yIC0gb24gZmFpbHVyZSwgaW5kaWNhdGVzIHRoZSByZWFzb24gZm9yIGZhaWx1cmU8L2xpPlxuICAgICAgICAgKiAgICA8bGk+ZXJyb3JDb2RlIC0gb24gZmFpbHVyZSwgaW5kaWNhdGVzIHRoZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5U2NyaXB0RXhlY3V0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+Y29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnktbWFuYWdlZCBkaXJlY3RvcmllcyBmb3JcbiAgICAgICAgICogICAgICAgc2NyaXB0cywgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1maWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLWZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmV4dGVybmFsc291cmNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyBvciBmaWxlIHBhdGhzIHRvIGV4dGVybmFsIHNjcmlwdHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgUmV2b0RlcGxveVItZW5jb2RlZCBzY3JpcHQgaW5wdXRzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmNzdmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByaW1pdGl2ZSBuYW1lL3ZhbHVlIGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZWF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxldmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLCB2ZXJzaW9uLXBlci1wcmVsb2FkZmlsZW5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZG9iamVjdG5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IG9iamVjdCAoLnJEYXRhKSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZG9iamVjdGF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcHJlbG9hZG9iamVjdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZG9iamVjdHZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItb2JqZWN0LXByZWxvYWRvYmplY3RuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0d29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggd29ya3NwYWNlIGlzIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHRkaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCBkaXJlY3RvcnkgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHBhY2thZ2VzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggcGFja2FnZSBkZXBlbmRlbmNpZXMgYXJlIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YmxhY2tib3g8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgZXhlY3V0aW9uIHdpbGwgb2NjdXIgb24gdGhlIEhUVFAgYmxhY2tib3hcbiAgICAgICAgICogICAgICAgcHJvamVjdCBmb3IgdGhlIGN1cnJlbnQgSFRUUCBzZXNzaW9uXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnJlY3ljbGU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCByZWN5Y2xlcyB0aGUgUiBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSFRUUFxuICAgICAgICAgKiAgICAgICBibGFja2JveCBwcm9qZWN0IG9uIHRoZSBjdXJyZW50IEhUVFAgc2Vzc2lvblxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dGFnPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgdGFnIHRoYXQgbGFiZWxzIHRoZSBleGVjdXRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZWNob29mZjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBwcmVmZXJyZWQgUiBncmFwaGljcyBkZXZpY2UgZm9yIGV4ZWN1dGlvbjogcG5nIG9yIHN2ZzwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljc3dpZHRoPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCB3aWR0aCBmb3IgUiBncmFwaGljcyBkZXZpY2UgaW1hZ2VzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmdyYXBoaWNzaGVpZ2h0PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBoZWlnaHQgZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yb2JqZWN0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9iamVjdHMgZm9yIHJldHJpZXZhbCBmb2xsb3dpbmcgdGhlIGV4ZWN1dGlvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZWZpbGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVvYmplY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3Jrc3BhY2Ugb2JqZWN0IG5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3Jld29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgZmlsZW5hbWUgKC5yRGF0YSkgd2hlcmUgd29ya3NwYWNlIGNvbnRlbnRzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVuZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuc3VyZXMgZWFjaCBmaWxlIHN0b3JlZCBpbiByZXBvc2l0b3J5IHJlc3VsdHMgaW4gbmV3IHZlcnNpb24gYmVpbmcgY3JlYXRlZCBpZiBuZWVkZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVwdWJsaWM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaGVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5maW5pdHk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgSW5maW5pdHkgYXBwZWFyaW5nIGluIFIgb2JqZWN0XG4gICAgICAgICAqICAgICAgIGRhdGEgcmV0dXJuZWQgb24gY2FsbCwgb3RoZXJ3aXNlIEluZmluaXR5IGlzIHJlcHJlc2VudGVkIGJ5XG4gICAgICAgICAqICAgICAgIDxjb2RlPjB4N2ZmMDAwMDAwMDAwMDAwMEw8L2NvZGU+XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW48L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgTmFOIGFwcGVhcmluZyBpbiBSIG9iamVjdCBkYXRhXG4gICAgICAgICAqICAgICAgIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBOYU4gaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+bnVsbDwvY29kZT5cbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmVuY29kZURhdGFGcmFtZVByaW1pdGl2ZUFzVmVjdG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkYXRhLmZyYW1lIHByaW1pdGl2ZXMgYXJlIGVuY29kZWRcbiAgICAgICAgICogICAgICAgdmVjdG9ycyBpbiBSIG9iamVjdCBkYXRhIHJldHVybmVkIG9uIGNhbGxcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5U2NyaXB0RXhlY3V0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvc2NyaXB0L2V4ZWN1dGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZXhlY3V0ZXMgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdHMgb3IgZXh0ZXJuYWwgc2NyaXB0cyBvbiBhblxuICAgICAgICAgKiBBbm9ueW1vdXMgUHJvamVjdCBhbmQgcmV0dXJucyBhIHNpbXBsZSBIVE1MIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0c1xuICAgICAgICAgKiBnZW5lcmF0ZWQgb24gdGhlIGV4ZWN1dGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogT24gYSBzdWNjZXNzZnVsIGV4ZWN1dGlvbiwgdGhlIEhUTUwgcGFnZSB3aWxsIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBkYXRhXG4gICAgICAgICAqIHdoZW4gYXZhaWxhYmxlIG9uIHRoZSByZXNwb25zZTpcbiAgICAgICAgICpcbiAgICAgICAgICogPHVsPlxuICAgICAgICAgKiAgICA8bGk+UiBjb25zb2xlIG91dHB1dDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5SIHdvcmtzcGFjZSBvYmplY3QgZGF0YTwvbGk+XG4gICAgICAgICAqICAgIDxsaT5SIGdlbmVyYXRlZCBwbG90czwvbGk+XG4gICAgICAgICAqICAgIDxsaT5MaW5rcyB0byBSIHdvcmtpbmcgZGlyZWN0b3J5IGFydGlmYWN0czwvbGk+XG4gICAgICAgICAqICAgIDxsaT5MaW5rcyB0byBSZXBvc2l0b3J5IHN0b3JlZCBhcnRpZmFjdHM8L2xpPlxuICAgICAgICAgKiA8L3VsPlxuICAgICAgICAgKlxuICAgICAgICAgKiBPbiBhIGZhaWxlZCBleGVjdXRpb24sIHRoZSBIVE1MIHBhZ2Ugd2lsbCBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgICogaW5kaWNhdGluZyB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUgYW5kIHdoZW4gYXZhaWxhYmxlLCBSIGNvbnNvbGUgb3V0cHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgQVBJIGNhbGwgbWFrZXMgaXQgdmVyeSBzaW1wbGUgdG8gaW50ZWdyYXRlIG91dHB1dHMgZ2VuZXJhdGVkIGJ5XG4gICAgICAgICAqIFJldm9EZXBsb3lSLW1hbmFnZWQgUiBzY3JpcHRzIGludG8gYW55IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9uLiBJdCBjYW4gYWxzb1xuICAgICAgICAgKiBiZSB1c2VkIGFzIGEgdmVyeSBzaW1wbGUgdGVzdCBhbmQgZGVidWdnaW5nIGFpZCBmb3IgUiBzY3JpcHQgYW5kXG4gICAgICAgICAqIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZVxuICAgICAgICAgKiBwYXJhbWV0ZXIgdmFsdWVzIGZvciBmaWxlbmFtZSAsIGF1dGhvciBhbmQgb3B0aW9uYWxseSB2ZXJzaW9uIC4gVG8gZXhlY3V0ZVxuICAgICAgICAgKiBhIGNoYWluIG9mIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGFcbiAgICAgICAgICogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzIG9uIHRoZSBmaWxlbmFtZSAsIGF1dGhvciBhbmQgb3B0aW9uYWxseVxuICAgICAgICAgKiB2ZXJzaW9uIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGV4ZWN1dGUgYSBzaW5nbGUgZXh0ZXJuYWwgc2NyaXB0IHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgdmFsaWQgVVJMIG9yXG4gICAgICAgICAqIGZpbGUgcGF0aCB1c2luZyB0aGUgZXh0ZXJuYWxzb3VyY2UgcGFyYW1ldGVyLiBUbyBleGVjdXRlIGEgY2hhaW4gb2ZcbiAgICAgICAgICogZXh0ZXJuYWwgc2NyaXB0cyB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlc1xuICAgICAgICAgKiBvbiB0aGUgZXh0ZXJuYWxzb3VyY2UgcGFyYW1ldGVyLiBOb3RlLCB0byBleGVjdXRlIGFuIGV4dGVybmFsIHNjcmlwdCB0aGVcbiAgICAgICAgICogY2FsbGVyIG11c3QgaGF2ZSBQT1dFUl9VU0VSIHByaXZpbGVnZXMgc28gdGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgdG9cbiAgICAgICAgICogYW5vbnltb3VzIHVzZXJzIG9uIHRoaXMgY2FsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZTogQSBjaGFpbmVkIGV4ZWN1dGlvbiBleGVjdXRlcyBlYWNoIG9mIHRoZSBzY3JpcHRzIGlkZW50aWZpZWQgb24gdGhlXG4gICAgICAgICAqIGNhbGwgaW4gYSBzZXF1ZW50aWFsIGZhc2hpb24gb24gdGhlIFIgc2Vzc2lvbiwgd2l0aCBleGVjdXRpb24gb2NjdXJpbmcgaW5cbiAgICAgICAgICogdGhlIG9yZGVyIHNwZWNpZmllZCBvbiB0aGUgcGFyYW1ldGVyIGxpc3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFBsZWFzZSBub3RlIHRoZSBmb2xsb3dpbmcgcHJlIGFuZCBwb3N0IGV4ZWN1dGlvbiBwYXJhbWV0ZXJzOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlByZS1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZFxuICAgICAgICAgKiAgICAgICBSIG9iamVjdCB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0c1xuICAgICAgICAgKiAgICAgICBpbiB0aGUgd29ya3NwYWNlIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgY3N2aW5wdXRzIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBwYXNzIFIgb2JqZWN0IHByaW1pdGl2ZVxuICAgICAgICAgKiAgICAgICB2YWx1ZXMgYXMgY29tbWEtc2VwYXJhdGVkIG5hbWUvdmFsdWUgcGFpcnMuIFRoZXNlIGlucHV0cyBhcmUgdHVybmVkXG4gICAgICAgICAqICAgICAgIGludG8gUiBvYmplY3RzIGluIHRoZSB3b3Jrc3BhY2UgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2FkZmlsZSBwYXJhbWV0ZXJzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmVcbiAgICAgICAgICogICAgICAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgdGhlXG4gICAgICAgICAqICAgICAgIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHByZWxvYWRvYmplY3QgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmVcbiAgICAgICAgICogICAgICAgYmluYXJ5IFIgb2JqZWN0cyAoLnJEYXRhKSBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtzcGFjZVxuICAgICAgICAgKiAgICAgICBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIGFkb3B0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIGEgcHJlLWV4aXN0aW5nXG4gICAgICAgICAqICAgICAgIHByb2plY3Qgd29ya3NwYWNlLCBwcm9qZWN0IHdvcmtpbmcgZGlyZWN0b3J5IGFuZC9vciBwcm9qZWN0IHBhY2thZ2VcbiAgICAgICAgICogICAgICAgZGVwZW5kZW5jaWVzIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5Qb3N0LWV4ZWN1dGlvbiBwYXJhbWV0ZXJzOjwvc3Ryb25nPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8b2w+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHJvYmplY3RzIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygb2JqZWN0IG5hbWVzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBhcyBSZXZvRGVwbG95Ui1lbmNvZGVkIFJcbiAgICAgICAgICogICAgICAgb2JqZWN0cyBvbiB0aGUgcmVzcG9uc2UgbWFya3VwIGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWZpbGUgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXJcbiAgICAgICAgICogICAgICAgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jlb2JqZWN0IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdHMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXdvcmtzcGFjZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIGVudGlyZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2UgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZGlyZWN0b3J5IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgdGFyZ2V0XG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGZvciBzdG9yZWQgZmlsZXMgYW5kIG9iamVjdHMgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlbmV3dmVyc2lvbiBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY3JlYXRlIG5ld1xuICAgICAgICAgKiAgICAgICB2ZXJzaW9ucyBvZiBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLiBCeSBkZWZhdWx0LCBzdG9yZWQgZmlsZXMgb3ZlcndyaXRlIGFueSBwcmUtZXhpc3RpbmcgZmlsZVxuICAgICAgICAgKiAgICAgICBieSB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXB1YmxpYyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gYXNzaWduIHB1YmxpYyBhY2Nlc3NcbiAgICAgICAgICogICAgICAgdG8gZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgIFRoZSBpbmZpbml0eSAsIG5hbiBhbmQgZW5jb2RlRGF0YUZyYW1lUHJpbWl0aXZlQXNWZWN0b3IgcGFyYW1ldGVyc1xuICAgICAgICAgKiAgICAgIGFsbG93IHRoZSBjYWxsZXIgdG8gY29udHJvbCBob3cgUmV2b0RlcGxveVItZW5jb2RlZCBSIG9iamVjdCBkYXRhIGlzXG4gICAgICAgICAqICAgICAgZW5jb2RlZCBpbiB0aGUgcmVzcG9uc2UgbWFya2t1cC5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5Tb21lIGtleSBkYXRhIGluZGljYXRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwIG9uIHRoaXMgY2FsbDo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGNvbnNvbGUgLSBpbmRpY2F0ZXMgdGhlIFIgY29uc29sZSBvdXRwdXQgcmVzdWx0aW5nIGZyb20gdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIHJlc3VsdHMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBSIGdyYXBoaWNzXG4gICAgICAgICAqICAgICAgIGRldmljZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGFydGlmYWN0cyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgb3IgbW9kaWZpZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgb2JqZWN0cyAtICBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgUiBvYmplY3RzIHJldHVybmVkIGZyb20gdGhlXG4gICAgICAgICAqICAgICAgIHdvcmtzcGFjZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGZpbGVzIC0gaW5kaWNhdGVzIHRoZSBsaXN0IG9mIGZpbGVzIGFuZCBvYmplY3RzIHN0b3JlZCBpbiB0aGVcbiAgICAgICAgICogICAgICAgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlc1xuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGludGVycnVwdGVkIC0gaW5kaWNhdGVzIHRoZSBpbnRlcnJ1cHRlZCBzdGF0dXMgb2YgZXhlY3V0aW9uXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgZXJyb3IgLSBvbiBmYWlsdXJlLCBpbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGVycm9yQ29kZSAtIG9uIGZhaWx1cmUsIGluZGljYXRlcyB0aGUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlTY3JpcHRSZW5kZXJcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRcbiAgICAgICAgICogICAgICAgZmlsZW5hbWVzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeS1tYW5hZ2VkIGRpcmVjdG9yaWVzIGZvclxuICAgICAgICAgKiAgICAgICBzY3JpcHRzLCBkZWZhdWx0cyB0byByb290XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgb25lIGF1dGhvciBwZXIgZmlsZW5hbWVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIG9uZSB2ZXJzaW9uIHBlciBmaWxlbmFtZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZXh0ZXJuYWxzb3VyY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyBvciBmaWxlIHBhdGhzIHRvIGV4dGVybmFsXG4gICAgICAgICAqICAgICAgIHNjcmlwdHNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgc2NyaXB0IGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jc3ZpbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmltaXRpdmUgbmFtZS92YWx1ZSBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZXZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBvYmplY3QgKC5yRGF0YSkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRvYmplY3RuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3R2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLW9iamVjdC1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHdvcmtzcGFjZSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggZGlyZWN0b3J5IGlzIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHRwYWNrYWdlczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+YmxhY2tib3g8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBleGVjdXRpb24gd2lsbCBvY2N1ciBvbiB0aGUgSFRUUCBibGFja2JveCBwcm9qZWN0IGZvciB0aGUgY3VycmVudCBIVFRQIHNlc3Npb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5yZWN5Y2xlPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCByZWN5Y2xlcyB0aGUgUiBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSFRUUCBibGFja2JveCBwcm9qZWN0IG9uIHRoZSBjdXJyZW50IEhUVFAgc2Vzc2lvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD50YWc8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSB0YWcgdGhhdCBsYWJlbHMgdGhlIGV4ZWN1dGlvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5lY2hvb2ZmPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSBSIGNvbW1hbmRzIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgY29uc29sZSBvdXRwdXQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y29uc29sZW9mZjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUgY29uc29sZSBvdXRwdXQgaXMgbm90IHJldHVybmVkIGluIHRoZSByZXNwb25zZSBtYXJrdXA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Z3JhcGhpY3M8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIFIgZ3JhcGhpY3MgZGV2aWNlIGZvciBleGVjdXRpb246IHBuZyBvciBzdmc8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Z3JhcGhpY3N3aWR0aDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBwcmVmZXJyZWQgd2lkdGggZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljc2hlaWdodDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBwcmVmZXJyZWQgaGVpZ2h0IGZvciBSIGdyYXBoaWNzIGRldmljZSBpbWFnZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cm9iamVjdHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvYmplY3RzIGZvciByZXRyaWV2YWwgZm9sbG93aW5nIHRoZSBleGVjdXRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVmaWxlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29ya2luZyBkaXJlY3RvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3Jlb2JqZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdCBuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZXdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGZpbGVuYW1lICguckRhdGEpIHdoZXJlIHdvcmtzcGFjZSBjb250ZW50cyB3aWxsIGJlIHNhdmVkIGluIHRoZSByZXBvc2l0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3JlbmV3dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbnN1cmVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gcmVwb3NpdG9yeSByZXN1bHRzIGluIG5ldyB2ZXJzaW9uIGJlaW5nIGNyZWF0ZWQgaWYgbmVlZGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3JlcHVibGljPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2hlcyBlYWNoIGZpbGUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmluZmluaXR5PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyBjdXN0b20gdmFsdWUgZm9yIEluZmluaXR5IGFwcGVhcmluZyBpbiBSIG9iamVjdFxuICAgICAgICAgKiAgICAgICBkYXRhIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBJbmZpbml0eSBpcyByZXByZXNlbnRlZCBieVxuICAgICAgICAgKiAgICAgICAweDdmZjAwMDAwMDAwMDAwMDBMXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW48L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgTmFOIGFwcGVhcmluZyBpbiBSIG9iamVjdCBkYXRhXG4gICAgICAgICAqICAgICAgIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBOYU4gaXMgcmVwcmVzZW50ZWQgYnkgbnVsbFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZW5jb2RlRGF0YUZyYW1lUHJpbWl0aXZlQXNWZWN0b3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgZGF0YS5mcmFtZSBwcmltaXRpdmVzIGFyZSBlbmNvZGVkIHZlY3RvcnMgaW4gUlxuICAgICAgICAgKiAgICAgICBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiBjYWxsXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeVNjcmlwdFJlbmRlcjogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvc2NyaXB0L3JlbmRlcicsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgaW50ZXJydXB0cyB0aGUgY3VycmVudCBleGVjdXRpb24gb24gdGhlIEhUVFAgQmxhY2tib3ggcHJvamVjdFxuICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgSFRUUCBzZXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlTY3JpcHRJbnRlcnJ1cHRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlTY3JpcHRJbnRlcnJ1cHQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9zY3JpcHQvaW50ZXJydXB0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBSZXBvc2l0b3J5IEZpbGUgQVBJc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBsaXN0cyByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGV0TGlzdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHdoZW4gc3BlY2lmaWVkLCBjYWxsIHJldHVybnMgbGlzdCBvZiBzY3JpcHQgdmVyc2lvbnMgZm9yXG4gICAgICAgICAqICAgICAgIGZpbGVuYW1lXG4gICAgICAgICAqICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbGVzIHRoYXQgYXJlIHJlc3RyaWN0ZWQgYnV0XG4gICAgICAgICAqICAgICAgIHZpc2libGUgb3Igc2hhcmVkIGJ5IG90aGVyIHVzZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNjcmlwdHMgcHVibGlzaGVkIGJ5IG90aGVyIHVzZXJzIGFyZVxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jYXRlZ29yeUZpbHRlcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSB3aGVuIHNwZWNpZmllZCBsaXN0IG9mIGZpbGVzIGluIHJlc3BvbnNlIG1hcmt1cCBpcyBsaW1pdGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeUZpbGVMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2xpc3QnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCB1cGxvYWRzIGEgZmlsZSBmcm9tIHRoZSB1c2VyJ3MgY29tcHV0ZXIgdG8gdGhlIHJlcG9zaXRvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVVcGxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgbmFtZSBvZiB0aGUgZmlsZSB0byB1cGxvYWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4uLi5maWxlIGNvbnRlbnQuLi48L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXBsb2FkZWQgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dGFnczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0YWcgd29yZHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHJlcG9zaXRvcnkgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXN0cmljdGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByb2xlIG5hbWVzLCB3aGljaCBtYWtlcyB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMgd2l0aCB0aGVzZSByb2xlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgc2hhcmVkIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCB1c2VyczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgZmlsZSB3aWxsIGJlIHB1Ymxpc2hlZCB3aGljaCBtYWtlcyB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2VyczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIHJlcG9zaXRvcnkgd2lsbCBjcmVhdGUgbmV3IHZlcnNpb24gcmF0aGVyIHRoYW4gb3ZlcndyaXRlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5ld3ZlcnNpb25tc2c8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiBuZXd2ZXJzaW9uIGlzIHRydWUsIG1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdpdGggbmV3IHZlcnNpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBpbnB1dHMgcHJvcGVydHkgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm91dHB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG91dHB1dHMgcHJvcGVydHkgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0PC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RmlsZVVwbG9hZDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IFwidGV4dFwiO1xuICAgICAgICAgICAgdmFyIGlvQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5mb3JtSWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2ZpbGUvdXBsb2FkJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCB0cmFuc2ZlcnMgYSBmaWxlIGZyb20gYSBVUkwgdG8gdGhlIHJlcG9zaXRvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVUcmFuc2ZlclxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBuYW1lIG9mIHRoZSBmaWxlIHRvIHVwbG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD51cmw8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIGEgdXJsIG9mIHRoZSBmaWxlIHRvIHVwbG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXBsb2FkZWQgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD50YWdzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVwb3NpdG9yeSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJvbGUgbmFtZXMsIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCB1c2VycyB3aXRoIHRoZXNlIHJvbGVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGUgd2lsbCBiZSBzaGFyZWQgd2hpY2ggbWFrZXMgdGhlIGZpbGUgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnB1Ymxpc2hlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgcHVibGlzaGVkIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgcmVwb3NpdG9yeSB3aWxsIGNyZWF0ZSBuZXcgdmVyc2lvbiByYXRoZXIgdGhhbiBvdmVyd3JpdGU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbm1zZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIG5ld3ZlcnNpb24gaXMgdHJ1ZSwgbWVzc2FnZSB0byBhc3NvY2lhdGUgd2l0aCBuZXcgdmVyc2lvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIGlucHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+b3V0cHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgb3V0cHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQ8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlVHJhbnNmZXI6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2ZpbGUvdHJhbnNmZXInLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHdyaXRlcyBhIHRleHQgZmlsZSB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZVdyaXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIG5hbWUgb2YgdGhlIGZpbGUgdG8gdXBsb2FkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRleHQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gdXBsb2FkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXBsb2FkZWRcbiAgICAgICAgICogICAgICAgZmlsZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dGFnczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGFnIHdvcmRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSByZXBvc2l0b3J5IGZpbGVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByb2xlIG5hbWVzLCB3aGljaCBtYWtlc1xuICAgICAgICAgKiAgICAgICB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMgd2l0aCB0aGVzZSByb2xlc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgaWxlIGlzIHNoYXJlZCBhbmQgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgcHVibGlzaGVkIHdoaWNoIG1ha2VzIHRoZSBmaWxlXG4gICAgICAgICAqICAgICAgIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIHRoZSByZXBvc2l0b3J5IHdpbGwgY3JlYXRlIG5ldyB2ZXJzaW9uIHJhdGhlclxuICAgICAgICAgKiAgICAgICB0aGFuIG92ZXJ3cml0ZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbm1zZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiBuZXd2ZXJzaW9uIGlzIHRydWUsIG1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdpdGggbmV3XG4gICAgICAgICAqICAgICAgIHZlcnNpb25cbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIGlucHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZFxuICAgICAgICAgKiAgICAgICBzY3JpcHRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm91dHB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBvdXRwdXRzIHByb3BlcnR5IG9uIGEgcmVwb3NpdG9yeS1tYW5hZ2VkXG4gICAgICAgICAqICAgICAgIHNjcmlwdFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlV3JpdGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2ZpbGUvd3JpdGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwZGF0ZXMgdGhlIHByb3BlcnRpZXMgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZVVwZGF0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBuYW1lIG9mIHRoZSBmaWxlIHRvIHVwbG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXBsb2FkZWQgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD50YWdzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVwb3NpdG9yeSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByb2xlIG5hbWVzLCB3aGljaCBtYWtlc1xuICAgICAgICAgKiAgICAgICB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMgd2l0aCB0aGVzZSByb2xlc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgPGR0PnNoYXJlZDwvZHQ+XG4gICAgICAgICAqICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgZmlsZSB3aWxsIGJlIHNoYXJlZCB3aGljaCBtYWtlcyB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGUgd2lsbCBiZSBwdWJsaXNoZWQgd2hpY2ggbWFrZXMgdGhlIGZpbGUgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIGFuZCBhbm9ueW1vdXMgdXNlcnM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBpbnB1dHMgcHJvcGVydHkgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm91dHB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG91dHB1dHMgcHJvcGVydHkgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0PC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RmlsZVVwZGF0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvZmlsZS91cGRhdGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJldmVydHMgdGhlIGN1cnJlbnQgd29ya2luZyBjb3B5IG9mIGEgZmlsZSB0byBhIHNwZWNpZmljIHZlcnNpb25cbiAgICAgICAgICogZm91bmQgaW4gdGhlIGZpbGVzIHZlcnNpb24gaGlzdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZVJldmVydFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBuYW1lIG9mIHRoZSBmaWxlIHRvIHVwbG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb24gdG8gcmV2ZXJ0IGludG8gdGhlIGN1cnJlbnQgd29ya2luZyBjb3B5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGRlc2NyaXB0aW9uIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB1cGxvYWRlZCBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJvbGUgbmFtZXMsIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCB1c2VycyB3aXRoIHRoZXNlIHJvbGVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGUgd2lsbCBiZSBzaGFyZWQgd2hpY2ggbWFrZXMgdGhlIGZpbGUgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnB1Ymxpc2hlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgcHVibGlzaGVkIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgcmVwb3NpdG9yeSB3aWxsIGNyZWF0ZSBuZXcgdmVyc2lvbiByYXRoZXIgdGhhbiBvdmVyd3JpdGU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbm1zZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIG5ld3ZlcnNpb24gaXMgdHJ1ZSwgbWVzc2FnZSB0byBhc3NvY2lhdGUgd2l0aCBuZXcgdmVyc2lvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIGlucHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+b3V0cHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgb3V0cHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQ8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlUmV2ZXJ0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL3JldmVydCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZ2VuZXJhdGVzIGEgZGlmZiBiZXR3ZWVuIHRoZSBjdXJyZW50IHdvcmtpbmcgY29weSBvZiBhIGZpbGUgYW5kXG4gICAgICAgICAqIGEgc3BlY2lmaWMgdmVyc2lvbiBmb3VuZCBpbiB0aGUgZmlsZXMgdmVyc2lvbiBoaXN0b3J5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlGaWxlRGlmZlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIGF1dGhvcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICBzcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSB2ZXJzaW9uIHRvIGRpZmYgYWdhaW5zdCB0aGUgY3VycmVudFxuICAgICAgICAgKiAgICAgICB3b3JraW5nIGNvcHlcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeUZpbGVEaWZmOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2RpZmYnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGdyYW50cyBvd25lcnNoaXAgcmlnaHRzIG9uIGEgZmlsZSB0byBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGVkXG4gICAgICAgICAqIHVzZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlLCB1bmxpa2UgbW9zdCByZXBvc2l0b3J5IEFQSXMgdGhhdCByZXF1aXJlIGJvdGggZmlsZW5hbWUgYW5kIGF1dGhvclxuICAgICAgICAgKiBwYXJhbWV0ZXJzLCB0aGVyZSBpcyBubyBleHBsaWNpdCBhdXRob3IgcGFyYW1ldGVyIG9uIHRoaXMgY2FsbC4gVGhlIGF1dGhvclxuICAgICAgICAgKiBpcyB1bmRlcnN0b29kIHRvIGJlIHRoZSBjYWxsZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVHcmFudFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcmVwb3NpdG9yeSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5ld2F1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4gc3BlY2lmaWVzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZ3JhbnRlZSB1c2VybmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cmV2b2tlYXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJldm9rZWUgdXNlcm5hbWVzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RmlsZUdyYW50OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2dyYW50JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkb3dubG9hZHMgYSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZURvd25sb2FkXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5hdXRob3I8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgYXV0aG9yPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb248L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlRG93bmxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2ZpbGUvZG93bmxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGRlbGV0ZXMgYSBmaWxlIGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVEZWxldGVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+c3BlY2lmaWVzIHRoZSByZXBvc2l0b3J5IGZpbGUgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlRGVsZXRlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2RlbGV0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZmV0Y2hlcyB0aGUgbGF0ZXN0IG1ldGEtZGF0YSBvbiBhIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVGZXRjaFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBhdXRob3JcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb25cbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RmlsZUZldGNoOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2ZldGNoJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBjb3BpZXMgb25lIG9yIG1vcmUgcmVwb3NpdG9yeS1tYW5hZ2VkIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvblxuICAgICAgICAgKiBkaXJlY3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYWxyZWFkeSBjb250YWlucyBhIGZpbGVuYW1lIG1hdGNoaW5nIGFuXG4gICAgICAgICAqIGluY29taW5nIGZpbGVuYW1lLCB0aGVuIGEgbmV3IHZlcnNpb24gb2YgdGhlIGZpbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlGaWxlQ29weVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXN0aW5hdGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIHVzZXIgZGlyZWN0b3J5IGluXG4gICAgICAgICAqICAgICAgIHRoZSByZXBvc2l0b3J5XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb25cbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVyZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmV3IGZpbGVuYW1lcyBmb3IgY29waWVkIGZpbGVzXG4gICAgICAgICAqICAgICAgIGlkZW50aWZpZWQgb24gZmlsZW5hbWUgcGFyYW1ldGVyXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeUZpbGVDb3B5OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2NvcHknLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIG1vdmVzIG9uZSBvciBtb3JlIHJlcG9zaXRvcnktbWFuYWdlZCBmaWxlcyB0byB0aGUgZGVzdGluYXRpb25cbiAgICAgICAgICogZGlyZWN0b3J5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFscmVhZHkgY29udGFpbnMgYSBmaWxlbmFtZSBtYXRjaGluZyBhblxuICAgICAgICAgKiBpbmNvbWluZyBmaWxlbmFtZSwgdGhlbiBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZU1vdmVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+c3BlY2lmaWVzIHRoZSByZXBvc2l0b3J5IGZpbGUgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzdGluYXRpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiB1c2VyIGRpcmVjdG9yeSBpblxuICAgICAgICAgKiAgICAgICB0aGUgcmVwb3NpdG9yeVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSB2ZXJzaW9uXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeUZpbGVNb3ZlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL21vdmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFJlcG9zaXRvcnkgRGlyZWN0b3J5IEFQSXNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgbGlzdHMgcmVwb3NpdG9yeS1tYW5hZ2VkIGRpcmVjdG9yaWVzLlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhIGxpc3Qgb2YgdGhlIGNhbGxlcidzIHVzZXIgZGlyZWN0b3JpZXMgKCByb290IGFuZCBjdXN0b20gKSBhcmVcbiAgICAgICAgICogcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cC5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIHVzZXJmaWxlcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgZmlsZXMgaW4gYWxsIG9mIHRoZSBjYWxsZXInc1xuICAgICAgICAgKiB1c2VyIGRpcmVjdG9yaWVzIGFyZSBsaXN0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cC4gTm90ZSwgZGVwZW5kaW5nIG9uIHRoZVxuICAgICAgICAgKiBudW1iZXIgb2YgZmlsZXMgb3duZWQgYnkgdGhlIGNhbGxlciwgd2hlbiB0aGlzIHBhcmFtZXRlciBpcyBlbmFibGVkIHRoZVxuICAgICAgICAgKiByZXNwb25zZSBtYXJrdXAgcmV0dXJuZWQgb24gdGhpcyBjYWxsIGNhbiBiZSBhIHZlcmJvc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBkaXJlY3RvcnkgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB0aGVuIG9ubHkgdGhlIGZpbGVzIGluIHRoZVxuICAgICAgICAgKiBkaXJlY3RvcnkgaW5kaWNhdGVkIGFyZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkIHRvIHJldHVybiBmaWxlcyBpbiB0aGUgY2FsbGVyJ3MgYXJjaGl2ZWRcbiAgICAgICAgICogZGlyZWN0b3JpZXMgYW5kL29yIGZpbGVzIGluIHRoZSBSZXN0cmljdGVkICwgU2hhcmVkIGFuZCBQdWJsaWMgc3lzdGVtXG4gICAgICAgICAqIGRpcmVjdG9yaWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlOiBUaGUgbWV0YWRhdGEgcHJvcGVydHkgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGwgaXMgcHJvdmlkZWRcbiAgICAgICAgICogYXMgYSBjb252ZW5pZW5jZSBmb3IgY2xpZW50IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuIEl0IHByb3ZpZGVzIGEgY29tcGxldGVcbiAgICAgICAgICogbGlzdCBmbyB0aGUgdXNlciBkaXJlY3RvcmllcyBhdmFpbGFibGUgdG8gdGhlIGN1cnJlbnQgY2FsbGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlEaXJlY3RvcnlMaXN0XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+dXNlcmZpbGVzPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHNwZWNpZmllZCwgZmlsZXMgaW4gYWxsIHVzZXIgZGlyZWN0b3JpZXMgYXJlIGxpc3RlZCBpblxuICAgICAgICAgKiAgICAgICB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YXJjaGl2ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgZmlsZXMgZm91bmQgaW4gYXJjaGl2ZWQgZGlyZWN0b3JpZXMgYXJlIGluY2x1ZGVkXG4gICAgICAgICAqICAgICAgIGluIHRoZSByZXNwb25zZSBtYXJrdXBcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnNoYXJlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCBmaWxlcyB0aGF0IGFyZSByZXN0cmljdGVkIGJ1dCB2aXNpYmxlIG9yIHNoYXJlZFxuICAgICAgICAgKiAgICAgICBieSBvdGhlciB1c2VycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIGZpbGVzIHRoYXQgYXJlIHB1Ymxpc2hlZCBieSBvdGhlciB1c2VycyBhcmVcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvbGlzdCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgY3JlYXRlcyBhIHJlcG9zaXRvcnktbWFuYWdlZCBjdXN0b20gZGlyZWN0b3J5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiB0aGUgbmFtZSBvZiB0aGUgbmV3IGN1c3RvbSBkaXJlY3RvcnkgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIGNhbGxlciB0aGVcbiAgICAgICAgICogcmVzcG9uc2UgbWFya3VwIHdpbGwgaW5kaWNhdGUgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeURpcmVjdG9yeUxpc3RcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlDcmVhdGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9jcmVhdGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJlbmFtZXMgYW4gZXhpc3RpbmcgcmVwb3NpdG9yeS1tYW5hZ2VkIHVzZXIgZGlyZWN0b3J5XG4gICAgICAgICAqICggY3VzdG9tIG9yIGFyY2hpdmVkICkuIFdoZW4gcmVuYW1pbmcgYSB1c2VyIGRpcmVjdG9yeSwgYWxsIGZpbGVzIGluIHRoZVxuICAgICAgICAgKiBzb3VyY2UgZGlyZWN0b3J5IGFyZSBhdXRvbWF0aWNhbGx5IG1vdmVkIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIElmXG4gICAgICAgICAqIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgdGhlIGNhbGwgd2lsbCBiZSByZWplY3RlZCBhbmQgdGhlXG4gICAgICAgICAqIHJlc3BvbnNlIG1hcmt1cCB3aWxsIGluZGljYXRlIGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBZb3UgY2FuIHVzZSB0aGlzIGNhbGwgdG8gY29udmVydCBhbiBhcmNoaXZlZCBkaXJlY3RvcnkgYmFjayBpbnRvIGEgY3VzdG9tXG4gICAgICAgICAqIGRpcmVjdG9yeSwgZXNzZW50aWFsbHkgdW5hcmNoaXZpbmcgdGhlIGFyY2hpdmVkIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZTogWW91IGNhbiBub3QgcmVuYW1lIHRoZSByb290IGRpcmVjdG9yeS4gVG8gbW92ZSBmaWxlcyBmcm9tIHRoZSByb290XG4gICAgICAgICAqIGRpcmVjdG9yeSB1c2UgdGhlIC9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L21vdmUgY2FsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5JbXBvcnRhbnQ6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgY2FsbCB3aWxsIG9ubHkgbW92ZSBmaWxlcyB0aGF0IGFyZSBvd25lZCBieSBhIHNpbmdsZSBhdXRob3IgdG8gdGhlXG4gICAgICAgICAqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gSWYgYSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeVxuICAgICAgICAgKiBoYXMgbXVsdGlwbGUgYXV0aG9ycywgYXMgYSByZXN1bHQgb2YgY29sbGFib3JhdGlvbiB1c2luZyB0aGVcbiAgICAgICAgICogL3IvcmVwb3NpdG9yeS9maWxlL2dyYW50IGNhbGwsIHRoZSBmaWxlIHdpbGwgbm90IGJlIG1vdmVkIHRvIHRoZVxuICAgICAgICAgKiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kIGEgd2FybmluZyB0byB0aGF0IGFmZmVjdCB3aWxsIGJlIGluZGljYXRlZCBpbiB0aGVcbiAgICAgICAgICogcmVzcG9uc2UgbWFya3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlEaXJlY3RvcnlSZW5hbWVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzdGluYXRpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGN1c3RvbSBkaXJlY3RvcnlcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RGlyZWN0b3J5UmVuYW1lOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9yZW5hbWUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIFRoaXMgY2FsbCBjb3BpZXMgb25lIG9yIG1vcmUgcmVwb3NpdG9yeS1tYW5hZ2VkIGZpbGVzIGZyb20gYSBzb3VyY2UgdXNlclxuICAgICAgICAgKiBkaXJlY3RvcnkgdG8gYSBkZXN0aW5hdGlvbiB1c2VyIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgZmlsZXMgaW5kaWNhdGVkIG9uIHRoYXRcbiAgICAgICAgICogcGFyYW1ldGVyIGFyZSBjb3BpZWQuIE90aGVyd2lzZSwgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZVxuICAgICAgICAgKiBjb3BpZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGVuc3VyZSBjb3B5aW5nIGZpbGVzIGRvZXMgbm90IGFjY2lkZW50YWxseSBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGVzXG4gICAgICAgICAqIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGFsbCBjb3BpZWQgZmlsZXMgYXJlIGNyZWF0ZWQgYXMgbmV3IHZlcnNpb25zXG4gICAgICAgICAqIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeURpcmVjdG9yeUNvcHlcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzdGluYXRpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGN1c3RvbSBkaXJlY3RvcnlcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVuYW1lcyB0byBiZSBjb3BpZWQuIElmIG9taXR0ZWQsXG4gICAgICAgICAqICAgICAgIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgY29waWVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlcmVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5ldyBmaWxlbmFtZXMgZm9yIGNvcGllZCBmaWxlc1xuICAgICAgICAgKiAgICAgICBpZGVudGlmaWVkIG9uIGZpbGVuYW1lIHBhcmFtZXRlclxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlDb3B5OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvY29weScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgbW92ZXMgb25lIG9yIG1vcmUgcmVwb3NpdG9yeS1tYW5hZ2VkIGZpbGVzIGZyb20gYSBzb3VyY2UgdXNlclxuICAgICAgICAgKiBkaXJlY3RvcnkgdG8gYSBkZXN0aW5hdGlvbiB1c2VyIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgZmlsZXMgaW5kaWNhdGVkIG9uIHRoYXRcbiAgICAgICAgICogcGFyYW1ldGVyIGFyZSBtb3ZlZC4gT3RoZXJ3aXNlLCBhbGwgZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIG1vdmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBlbnN1cmUgbW92aW5nIGZpbGVzIGRvZXMgbm90IGFjY2lkZW50YWxseSBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGVzXG4gICAgICAgICAqIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGFsbCBtb3ZlZCBmaWxlcyBhcmUgY3JlYXRlZCBhcyBuZXcgdmVyc2lvbnNcbiAgICAgICAgICogaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5JbXBvcnRhbnQ6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgY2FsbCB3aWxsIG9ubHkgbW92ZSBmaWxlcyB0aGF0IGFyZSBvd25lZCBieSBhIHNpbmdsZSBhdXRob3IgdG8gdGhlXG4gICAgICAgICAqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gSWYgYSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeVxuICAgICAgICAgKiBoYXMgbXVsdGlwbGUgYXV0aG9ycywgYXMgcmVzdWx0IG9mIGNvbGxhYm9yYXRpb24gdXNpbmcgdGhlXG4gICAgICAgICAqIC9yL3JlcG9zaXRvcnkvZmlsZS9ncmFudCBjYWxsLCB0aGUgZmlsZSB3aWxsIG5vdCBiZSBtb3ZlZCB0byB0aGVcbiAgICAgICAgICogZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCBhIHdhcm5pbmcgdG8gdGhhdCBhZmZlY3Qgd2lsbCBiZSBpbmRpY2F0ZWQgaW4gdGhlXG4gICAgICAgICAqIHJlc3BvbnNlIG1hcmt1cC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RGlyZWN0b3J5TW92ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXN0aW5hdGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG5ldyBuYW1lIGZvciB0aGUgZGVzdGluYXRpb24gY3VzdG9tIGRpcmVjdG9yeVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGJlIGNvcGllZC4gSWYgb21pdHRlZCxcbiAgICAgICAgICogICAgICAgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBjb3BpZWRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RGlyZWN0b3J5TW92ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L21vdmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwZGF0ZXMgcmVwb3NpdG9yeS1tYW5hZ2VkIGZpbGUgYWNjZXNzIGNvbnRyb2xzIGJ5IGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgZmlsZXMgaW5kaWNhdGVkIG9uIHRoYXRcbiAgICAgICAgICogcGFyYW1ldGVyIGFyZSB1cGRhdGVkLiBPdGhlcndpc2UsIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmVcbiAgICAgICAgICogdXBkYXRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RGlyZWN0b3J5VXBkYXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkgZGlyZWN0b3J5LCBkZWZhdWx0cyB0byByb290XG4gICAgICAgICAqICAgICAgIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZSBtYXJrdXBcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVuYW1lcyB0byBiZSBjb3BpZWQuIElmIG9taXR0ZWQsXG4gICAgICAgICAqICAgICAgIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgY29waWVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXN0cmljdGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgbmV3IG5hbWUgZm9yIHRoZSBkZXN0aW5hdGlvbiBjdXN0b20gZGlyZWN0b3J5XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbGVzIGFyZSBzaGFyZWQgYW5kIHZpc2libGUgdG9cbiAgICAgICAgICogICAgICAgYXV0aGVudGljYXRlZCB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBmaWxlcyBhcmUgcHVibGlzaGVkIGFuZCB2aXNpYmxlIHRvXG4gICAgICAgICAqICAgICAgIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlVcGRhdGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS91cGRhdGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGFyY2hpdmVzIG9uZSBvciBtb3JlIHJlcG9zaXRvcnktbWFuYWdlZCBmaWxlcyBmcm9tIGEgc291cmNlIHVzZXJcbiAgICAgICAgICogZGlyZWN0b3J5ICggcm9vdCBvciBjdXN0b20gKSB0byBhbiBhcmNoaXZlIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIHZhbHVlIG9mIHRoZSBhcmNoaXZlIHBhcmFtZXRlciBpbmRpY2F0ZXMgYW4gZXhpc3RpbmcgYXJjaGl2ZVxuICAgICAgICAgKiBkaXJlY3RvcnkgdGhlbiB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZ1xuICAgICAgICAgKiBhcmNoaXZlLiBPdGhlcndpc2UsIGEgbmV3IGFyY2hpdmUgZGlyZWN0b3J5IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBvblxuICAgICAgICAgKiBiZWhhbGYgb2YgdGhlIGNhbGxlci4gQXJjaGl2ZWQgZGlyZWN0b3JpZXMgYXV0b21hdGljYWxseSBoYXZlIGEgLmFyY2hpdmVcbiAgICAgICAgICogcG9zdGZpeCBhcHBlbmRlZCB0byB0aGVpciBuYW1lIGlmIGl0IGlzIG5vdCBzdXBwbGllZCBvbiB0aGUgYXJjaGl2ZVxuICAgICAgICAgKiBwYXJhbWV0ZXIgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIHN1Y2Nlc3NmdWxseSBhcmNoaXZlZCwgdGhlXG4gICAgICAgICAqIHNvdXJjZSBkaXJlY3RvcnkgaXMgYXV0b21hdGljYWxseSBkZWxldGVkIGZyb20gdGhlIHJlcG9zaXRvcnkuIElmIHRoZVxuICAgICAgICAgKiBzb3VyY2UgZGlyZWN0b3J5IHdhcyByb290ICwgYW4gZW1wdHkgcm9vdCBkaXJlY3RvcnkgaXMgcHJlc2VydmVkLiBJZiBhbnkgb2ZcbiAgICAgICAgICogdGhlIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBza2lwcGVkIG9yIGNhbiBub3QgYmUgYXJjaGl2ZWQgKHNlZVxuICAgICAgICAgKiBmb2xsb3dpbmcgbm90ZSksIHRob3NlIGZpbGVzIGFuZCB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgcHJlc2VydmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPkltcG9ydGFudDo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBjYWxsIHdpbGwgb25seSBhcmNoaXZlIGZpbGVzIHRoYXQgYXJlIG93bmVkIGJ5IGEgc2luZ2xlIGF1dGhvciB0byB0aGVcbiAgICAgICAgICogZGVzdGluYXRpb24gZGlyZWN0b3J5LiBJZiBhIHJlcG9zaXRvcnktbWFuYWdlZCBmaWxlIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5XG4gICAgICAgICAqIGhhcyBtdWx0aXBsZSBhdXRob3JzLCBhcyBhIHJlc3VsdCBvZiBjb2xsYWJvcmF0aW9uIHVzaW5nIHRoZVxuICAgICAgICAgKiAvci9yZXBvc2l0b3J5L2ZpbGUvZ3JhbnQgY2FsbCwgdGhlIGZpbGUgd2lsbCBub3QgYmUgYXJjaGl2ZWQgdG8gdGhlXG4gICAgICAgICAqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgYSB3YXJuaW5nIHRvIHRoYXQgYWZmZWN0IHdpbGwgYmUgaW5kaWNhdGVkIGluIHRoZVxuICAgICAgICAgKiByZXNwb25zZSBtYXJrdXAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeURpcmVjdG9yeUFyY2hpdmVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGJlIGNvcGllZC4gSWYgb21pdHRlZCxcbiAgICAgICAgICogICAgICAgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBjb3BpZWRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGN1c3RvbSBkaXJlY3RvcnlcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnNoYXJlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZmlsZXMgYXJlIHNoYXJlZCBhbmQgdmlzaWJsZSB0b1xuICAgICAgICAgKiAgICAgICBhdXRoZW50aWNhdGVkIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbGVzIGFyZSBwdWJsaXNoZWQgYW5kIHZpc2libGUgdG9cbiAgICAgICAgICogICAgICAgYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeURpcmVjdG9yeUFyY2hpdmU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L2FyY2hpdmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwbG9hZHMgYSBzZXQgb2YgZmlsZXMgaW4gYSB6aXAgYXJjaGl2ZSBpbnRvIGFuIGV4aXN0aW5nXG4gICAgICAgICAqIHJlcG9zaXRvcnktbWFuYWdlZCB1c2VyIGRpcmVjdG9yeSAoIHJvb3QgLCBjdXN0b20gb3IgYXJjaGl2ZWQgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RGlyZWN0b3J5VXBsb2FkXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgLi4uemlwIGFyY2hpdmUgZmlsZSBjb250ZW50Li4uXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGEgZGVzY3JpcHRpb24gdG8gYXNzb2NpYXRlIHdpdGggdGhlIHVwbG9hZGVkIGZpbGVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZ3M8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVwb3NpdG9yeSBmaWxlXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXN0cmljdGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgbmV3IG5hbWUgZm9yIHRoZSBkZXN0aW5hdGlvbiBjdXN0b20gZGlyZWN0b3J5XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbGVzIGFyZSBzaGFyZWQgYW5kIHZpc2libGUgdG9cbiAgICAgICAgICogICAgICAgYXV0aGVudGljYXRlZCB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBmaWxlcyBhcmUgcHVibGlzaGVkIGFuZCB2aXNpYmxlIHRvXG4gICAgICAgICAqICAgICAgIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHJlcG9zaXRvcnkgd2lsbCBjcmVhdGUgbmV3XG4gICAgICAgICAqICAgICAgIHZlcnNpb24gcmF0aGVyIHRoYW4gb3ZlcndyaXRlXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uZXd2ZXJzaW9ubXNnPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIG5ld3ZlcnNpb24gaXMgdHJ1ZSwgbWVzc2FnZSB0byBhc3NvY2lhdGUgd2l0aCBuZXdcbiAgICAgICAgICogICAgICAgdmVyc2lvblxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlVcGxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSAndGV4dCc7XG4gICAgICAgICAgICB2YXIgaW9Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGF0YTogY29uZmlnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5mb3JtSWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS91cGxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGRvd25sb2FkcyBvbmUgb3IgbW9yZSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeVxuICAgICAgICAgKiBpbiB0aGUgcmVwb3NpdG9yeS4gVGhlIHJlc3BvbnNlIHR5cGUgb24gdGhpcyBjYWxsIGlzIGEgemlwIGFyY2hpdmUgZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgZmlsZXMgaW5kaWNhdGVkIG9uIHRoYXRcbiAgICAgICAgICogcGFyYW1ldGVyIGFyZSBkb3dubG9hZGVkLiBPdGhlcndpc2UsIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmVcbiAgICAgICAgICogZG93bmxvYWRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RGlyZWN0b3J5RG93bmxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGJlIGNvcGllZC4gSWYgb21pdHRlZCxcbiAgICAgICAgICogICAgICAgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBjb3BpZWRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RGlyZWN0b3J5RG93bmxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9kb3dubG9hZCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZGVsZXRlcyBhIHJlcG9zaXRvcnktbWFuYWdlZCB1c2VyIGRpcmVjdG9yeSAoIHJvb3QgLCBjdXN0b20gb3JcbiAgICAgICAgICogYXJjaGl2ZWQgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogV2hlbiBkZWxldGluZyBhIHVzZXIgZGlyZWN0b3J5LCBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBhcmVcbiAgICAgICAgICogYXV0b21hdGljYWxseSBkZWxldGVkIGFsb25nIHdpdGggdGhlIGRpcmVjdG9yeS4gSWYgdGhlIHRhcmdldCBkaXJlY3RvcnkgaXNcbiAgICAgICAgICogcm9vdCwgYW4gZW1wdHkgcm9vdCBkaXJlY3RvcnkgaXMgcHJlc2VydmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlEaXJlY3RvcnlEZWxldGVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlEZWxldGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9kZWxldGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIEpvYiBBUElzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICAvKiogIFxuICAgICAgICAgKiBUaGlzIGNhbGwgbGlzdHMgam9icyBmb3IgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBvcGVub25seSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2VlIG9ubHkgdGhvc2Ugam9icyBpbiBhbiBvcGVuXG4gICAgICAgICAqIHN0YXRlLiBUaGUgc2V0IG9mIGpvYiBvcGVuIHN0YXRlcyBhcmUgc2hvd24gaGVyZTpcbiAgICAgICAgICpcbiAgICAgICAgICogPHVsPlxuICAgICAgICAgKiAgPGxpPlNjaGVkdWxlZCA6IGpvYiBpcyBzY2hlZHVsZWQgYnV0IG5vdCB5ZXQgcXVldWVkIGZvciBydW5uaW5nLjwvbGk+XG4gICAgICAgICAqICA8bGk+UXVldWVkIDogam9iIGlzIHF1ZXVlZCBmb3IgcnVubmluZy48L2xpPlxuICAgICAgICAgKiAgPGxpPlJ1bm5pbmcgOiBqb2IgaXMgcnVubmluZy48L2xpPlxuICAgICAgICAgKiA8L3VsPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8YmxvY2txdW90ZT5cbiAgICAgICAgICogICAgSW1wb3J0YW50ISBBbnkgb3BlbiBqb2IgY2FuIGJlIGNhbmNlbGxlZCB1c2luZyB0aGVcbiAgICAgICAgICogICAgPGEgaHJlZj1cIiNtZXRob2Rfam9iQ2FuY2VsXCI+am9iQ2FuY2VsPC9hPiBjYWxsLlxuICAgICAgICAgKiA8L2Jsb2NrcXVvdGU+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgam9iTGlzdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0Pm9wZW5vbmx5PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIG9ubHkgam9icyBpbiBhbiBvcGVuLXN0YXRlIGFyZSBsaXN0ZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZXh0ZW5kZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgSWYgdHJ1ZSwgYWRkaXRpb25hbCBkYXRhIHByb3BlcnRpZXMgZGVzY3JpYmluZyBlYWNoIGpvYlxuICAgICAgICAgKiAgICAgICBhcmUgbGlzdGVkIGluIHRoZSByZXNwb25zZSBtYXJrdXBcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBqb2JMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL2xpc3QnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHN1Ym1pdHMgYSBqb2IgZm9yIGJhY2tncm91bmQgZXhlY3V0aW9uIG9uIGJlaGFsZiBvZiB0aGUgdXNlci5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gc3VibWl0IHRoZSBleGVjdXRpb24gb2YgYW4gYXJiaXRyYXJ5IGJsb2NrIG9mIFIgY29kZSB0aGUgY2FsbGVyIG11c3RcbiAgICAgICAgICogcHJvdmlkZSBhIHZhbHVlIG9uIHRoZSBjb2RlIHBhcmFtZXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICpcbiAgICAgICAgICogVG8gc3VibWl0IHRoZSBleGVjdXRpb24gb2YgYSBzaW5nbGUgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCB0aGUgY2FsbGVyXG4gICAgICAgICAqIG11c3QgcHJvdmlkZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciByc2NyaXB0bmFtZSAsIHJzY3JpcHRhdXRob3IgYW5kXG4gICAgICAgICAqIG9wdGlvbmFsbHkgcnNjcmlwdHZlcnNpb24gLiBUbyBzdWJtaXQgdGhlIGV4ZWN1dGlvbiBvZiBhIGNoYWluIG9mXG4gICAgICAgICAqIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3RcbiAgICAgICAgICogb2YgdmFsdWVzIG9uIHRoZSByc2NyaXB0bmFtZSwsIF9yc2NyaXB0YXV0aG9yIGFuZCBvcHRpb25hbGx5IHJzY3JpcHR2ZXJzaW9uXG4gICAgICAgICAqIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIHN1Ym1pdCB0aGUgZXhlY3V0aW9uIG9mIGEgc2luZ2xlIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3RcbiAgICAgICAgICogcHJvdmlkZSBhIHZhbGlkIFVSTCBvciBmaWxlIHBhdGggdXNpbmcgdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gVG9cbiAgICAgICAgICogc3VibWl0IHRoZSBleGVjdXRpb24gb2YgYSBjaGFpbiBvZiBleHRlcm5hbCBzY3JpcHRzIHRoZSBjYWxsZXIgbXVzdFxuICAgICAgICAgKiBwcm92aWRlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzIG9uIHRoZSBleHRlcm5hbHNvdXJjZSBwYXJhbWV0ZXIuXG4gICAgICAgICAqIE5vdGUsIHRvIHN1Ym1pdCB0aGUgZXhlY3V0aW9uIG9mIGFuIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgaGF2ZVxuICAgICAgICAgKiBQT1dFUl9VU0VSIHByaXZpbGVnZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGU6IEEgY2hhaW5lZCBleGVjdXRpb24gZXhlY3V0ZXMgZWFjaCBvZiB0aGUgc2NyaXB0cyBpZGVudGlmaWVkIG9uIHRoZVxuICAgICAgICAgKiBjYWxsIGluIGEgc2VxdWVudGlhbCBmYXNoaW9uIG9uIHRoZSBSIHNlc3Npb24gZm9yIHRoZSBqb2IsIHdpdGggZXhlY3V0aW9uXG4gICAgICAgICAqIG9jY3VyaW5nIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgb24gdGhlIHBhcmFtZXRlciBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBQbGVhc2Ugbm90IHRoZSBmb2xsb3dpbmcgcHJlIGFuZCBwb3N0IGV4ZWN1dGlvbiBwYXJhbWV0ZXJzOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlByZS1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZFxuICAgICAgICAgKiAgICAgICBSIG9iamVjdCB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0c1xuICAgICAgICAgKiAgICAgICBpbiB0aGUgd29ya3NwYWNlIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcHJlbG9hZGZpbGUgcGFyYW1ldGVycyBhbGxvd3MgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2Fkb2JqZWN0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGJpbmFyeSBSIG9iamVjdHMgKC5yRGF0YSkgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICogICAgICAgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBhZG9wdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBhIHByZS1leGlzdGluZ1xuICAgICAgICAgKiAgICAgICBwcm9qZWN0IHdvcmtzcGFjZSwgcHJvamVjdCB3b3JraW5nIGRpcmVjdG9yeSBhbmQvb3IgcHJvamVjdCBwYWNrYWdlXG4gICAgICAgICAqICAgICAgIGRlcGVuZGVuY2llcyBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxzdHJvbmc+UG9zdC1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWZpbGUgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXJcbiAgICAgICAgICogICAgICAgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jlb2JqZWN0IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdHMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXdvcmtzcGFjZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIGVudGlyZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2UgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZGlyZWN0b3J5IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgdGFyZ2V0XG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGZvciBzdG9yZWQgZmlsZXMgYW5kIG9iamVjdHMgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlbmV3dmVyc2lvbiBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY3JlYXRlIG5ld1xuICAgICAgICAgKiAgICAgICB2ZXJzaW9ucyBvZiBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLiBCeSBkZWZhdWx0LCBzdG9yZWQgZmlsZXMgb3ZlcndyaXRlIGFueSBwcmUtZXhpc3RpbmcgZmlsZVxuICAgICAgICAgKiAgICAgICBieSB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXB1YmxpYyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gYXNzaWduIHB1YmxpYyBhY2Nlc3NcbiAgICAgICAgICogICAgICAgdG8gZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVub3Byb2plY3QgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNraXAgdGhlXG4gICAgICAgICAqICAgICAgIHBlcnNpc3RlbmNlLXRvLXByb2plY3Qgc3RlcCBhZnRlciB0aGUgZXhlY3V0aW9uLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIGpvYlN1Ym1pdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+am9iIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBqb2IgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y29kZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFIgY29kZSB0byBleGVjdXRlIG9uIGpvYjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnJzY3JpcHRuYW1lPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yc2NyaXB0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeS1tYW5hZ2VkIGRpcmVjdG9yaWVzIGZvciBzY3JpcHRzLCBkZWZhdWx0cyB0byByb290PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cnNjcmlwdGF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1yc2NyaXB0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnJzY3JpcHR2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcnNjcmlwdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5leHRlcm5hbHNvdXJjZTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyBvciBmaWxlIHBhdGhzIHRvIGV4dGVybmFsIHNjcmlwdHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgc2NyaXB0IGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jc3ZpbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmltaXRpdmUgbmFtZS92YWx1ZSBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5wcmVsb2FkZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cHJlbG9hZGZpbGVhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cHJlbG9hZGZpbGV2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cHJlbG9hZG9iamVjdG5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgb2JqZWN0ICguckRhdGEpIGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnByZWxvYWRvYmplY3RhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcHJlbG9hZG9iamVjdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5wcmVsb2Fkb2JqZWN0dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLW9iamVjdC1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmFkb3B0d29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCB3b3Jrc3BhY2UgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmFkb3B0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCBkaXJlY3RvcnkgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmFkb3B0cGFja2FnZXM8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cHJpb3JpdHk8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgc2NoZWR1bGluZyBwcmlvcml0eSBmb3IgdGhlIGpvYjogbG93IChkZWZhdWx0KSwgbWVkaXVtIG9yIGhpZ2g8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD50YWc8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIHRhZyB0aGF0IGxhYmVscyB0aGUgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+ZWNob29mZjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUgUiBjb21tYW5kcyB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIGNvbnNvbGUgb3V0cHV0XG4gICAgICAgICAqICAgICAgIHNhdmVkIG9uIHRoZSBwcm9qZWN0IGV4ZWN1dGlvbiBoaXN0b3J5IGZvciB0aGUgam9iXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmdyYXBoaWNzPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIFIgZ3JhcGhpY3MgZGV2aWNlIGZvciBleGVjdXRpb246IHBuZyBvciBzdmc8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5ncmFwaGljc3dpZHRoPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIHdpZHRoIGZvciBSIGdyYXBoaWNzIGRldmljZSBpbWFnZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5ncmFwaGljc2hlaWdodDwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBoZWlnaHQgZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnN0b3JlZmlsZTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29ya2luZyBkaXJlY3RvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+c3RvcmVvYmplY3Q8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmtzcGFjZSBvYmplY3QgbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5zdG9yZXdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgZmlsZW5hbWUgKC5yRGF0YSkgd2hlcmUgd29ya3NwYWNlIGNvbnRlbnRzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5zdG9yZW5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbnN1cmVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gcmVwb3NpdG9yeSByZXN1bHRzIGluIG5ldyB2ZXJzaW9uIGJlaW5nIGNyZWF0ZWQgaWYgbmVlZGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+c3RvcmVwdWJsaWM8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoZXMgZWFjaCBmaWxlIHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnN0b3Jlbm9wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgbm8gcHJvamVjdCBwZXJzaXN0ZW5jZSBmb2xsb3dpbmcgam9iIGV4ZWN1dGlvbjwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgam9iU3VibWl0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL3N1Ym1pdCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgc2NoZWR1bGVzIGEgam9iIGZvciBiYWNrZ3JvdW5kIGV4ZWN1dGlvbiBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBzY2hlZHN0YXJ0IHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBzdGFydCB0aW1lIGZvciB0aGUgam9iLiBUaGlzXG4gICAgICAgICAqIHBhcmFtZXRlciB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgVVRDIGluIG1pbGxpc2Vjb25kcy4gVGhlIHNjaGVkcmVwZWF0XG4gICAgICAgICAqIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgam9iIGlzIHRvIGJlIHJlcGVhdGVkLCBhbmQgaWZcbiAgICAgICAgICogb21pdHRlZCB0aGUgam9iIGlzIGV4ZWN1dGVkIGp1c3Qgb25jZS4gVGhlIHNjaGVkaW50ZXJ2YWwgcGFyYW1ldGVyXG4gICAgICAgICAqIGluZGljYXRlcyB0aGUgaW50ZXJ2YWwsIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcywgYmV0d2VlbiByZXBlYXRcbiAgICAgICAgICogZXhlY3V0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gc2NoZWR1bGUgdGhlIGV4ZWN1dGlvbiBvZiBhbiBhcmJpdHJhcnkgYmxvY2sgb2YgUiBjb2RlIHRoZSBjYWxsZXJcbiAgICAgICAgICogbXVzdCBwcm92aWRlIGEgdmFsdWUgb24gdGhlIGNvZGUgcGFyYW1ldGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIGEgc2luZ2xlIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQgdGhlXG4gICAgICAgICAqIGNhbGxlciBtdXN0IHByb3ZpZGUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgcnNjcmlwdG5hbWUgLCByc2NyaXB0YXV0aG9yIGFuZFxuICAgICAgICAgKiBvcHRpb25hbGx5IHJzY3JpcHR2ZXJzaW9uIC4gVG8gc2NoZWR1bGUgdGhlIGV4ZWN1dGlvbiBvZiBhIGNoYWluIG9mXG4gICAgICAgICAqIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3RcbiAgICAgICAgICogb2YgdmFsdWVzIG9uIHRoZSByc2NyaXB0bmFtZSwsIF9yc2NyaXB0YXV0aG9yIGFuZCBvcHRpb25hbGx5IHJzY3JpcHR2ZXJzaW9uXG4gICAgICAgICAqIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIHNjaGVkdWxlIHRoZSBleGVjdXRpb24gb2YgYSBzaW5nbGUgZXh0ZXJuYWwgc2NyaXB0IHRoZSBjYWxsZXIgbXVzdFxuICAgICAgICAgKiBwcm92aWRlIGEgdmFsaWQgVVJMIG9yIGZpbGUgcGF0aCB1c2luZyB0aGUgZXh0ZXJuYWxzb3VyY2UgcGFyYW1ldGVyLiBUb1xuICAgICAgICAgKiBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIGEgY2hhaW4gb2YgZXh0ZXJuYWwgc2NyaXB0cyB0aGUgY2FsbGVyIG11c3RcbiAgICAgICAgICogcHJvdmlkZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyBvbiB0aGUgZXh0ZXJuYWxzb3VyY2UgcGFyYW1ldGVyLlxuICAgICAgICAgKiBOb3RlLCB0byBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIGFuIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3RcbiAgICAgICAgICogaGF2ZSBQT1dFUl9VU0VSIHByaXZpbGVnZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGU6IEEgY2hhaW5lZCBleGVjdXRpb24gZXhlY3V0ZXMgZWFjaCBvZiB0aGUgc2NyaXB0cyBpZGVudGlmaWVkIG9uIHRoZVxuICAgICAgICAgKiBjYWxsIGluIGEgc2VxdWVudGlhbCBmYXNoaW9uIG9uIHRoZSBSIHNlc3Npb24gZm9yIHRoZSBqb2IsIHdpdGhcbiAgICAgICAgICogZXhlY3V0aW9uIG9jY3VyaW5nIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgb24gdGhlIHBhcmFtZXRlciBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBQbGVhc2Ugbm90IHRoZSBmb2xsb3dpbmcgcHJlIGFuZCBwb3N0IGV4ZWN1dGlvbiBwYXJhbWV0ZXJzOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlByZS1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZFxuICAgICAgICAgKiAgICAgICBSIG9iamVjdCB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0c1xuICAgICAgICAgKiAgICAgICBpbiB0aGUgd29ya3NwYWNlIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcHJlbG9hZGZpbGUgcGFyYW1ldGVycyBhbGxvd3MgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2Fkb2JqZWN0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGJpbmFyeSBSIG9iamVjdHMgKC5yRGF0YSkgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICogICAgICAgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBhZG9wdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBhIHByZS1leGlzdGluZ1xuICAgICAgICAgKiAgICAgICBwcm9qZWN0IHdvcmtzcGFjZSwgcHJvamVjdCB3b3JraW5nIGRpcmVjdG9yeSBhbmQvb3IgcHJvamVjdCBwYWNrYWdlXG4gICAgICAgICAqICAgICAgIGRlcGVuZGVuY2llcyBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxzdHJvbmc+UG9zdC1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWZpbGUgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXJcbiAgICAgICAgICogICAgICAgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jlb2JqZWN0IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdHMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXdvcmtzcGFjZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIGVudGlyZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2UgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZGlyZWN0b3J5IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgdGFyZ2V0XG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGZvciBzdG9yZWQgZmlsZXMgYW5kIG9iamVjdHMgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlbmV3dmVyc2lvbiBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY3JlYXRlIG5ld1xuICAgICAgICAgKiAgICAgICB2ZXJzaW9ucyBvZiBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLiBCeSBkZWZhdWx0LCBzdG9yZWQgZmlsZXMgb3ZlcndyaXRlIGFueSBwcmUtZXhpc3RpbmcgZmlsZVxuICAgICAgICAgKiAgICAgICBieSB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXB1YmxpYyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gYXNzaWduIHB1YmxpYyBhY2Nlc3NcbiAgICAgICAgICogICAgICAgdG8gZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVub3Byb2plY3QgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNraXAgdGhlXG4gICAgICAgICAqICAgICAgIHBlcnNpc3RlbmNlLXRvLXByb2plY3Qgc3RlcCBhZnRlciB0aGUgZXhlY3V0aW9uLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIGpvYlNjaGVkdWxlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5qb2IgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGpvYiBkZXNjcmlwdGlvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zY2hlZHN0YXJ0PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBzdGFydCB0aW1lIGZvciBqb2I8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2NoZWRyZXBlYXQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lcyBqb2IgaXMgdG8gYmUgcmVwZWF0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2NoZWRpbnRlcnZhbDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgKG1zKSBvbiB3aGljaCBqb2IgaXMgdG8gYmUgcmVwZWF0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y29kZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFIgY29kZSB0byBleGVjdXRlIG9uIGpvYjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yc2NyaXB0bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJzY3JpcHRkaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5LW1hbmFnZWQgZGlyZWN0b3JpZXMgZm9yIHNjcmlwdHMsIGRlZmF1bHRzIHRvIHJvb3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cnNjcmlwdGF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcnNjcmlwdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cnNjcmlwdHZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcnNjcmlwdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZXh0ZXJuYWxzb3VyY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBVUkxzIG9yIGZpbGUgcGF0aHMgdG8gZXh0ZXJuYWwgc2NyaXB0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBSZXZvRGVwbG95Ui1lbmNvZGVkIHNjcmlwdCBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y3N2aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJpbWl0aXZlIG5hbWUvdmFsdWUgaW5wdXRzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxlYXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1wcmVsb2FkZmlsZW5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGV2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgb2JqZWN0ICguckRhdGEpIGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLCB2ZXJzaW9uLXBlci1vYmplY3QtcHJlbG9hZG9iamVjdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHR3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCB3b3Jrc3BhY2UgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdGRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIGRpcmVjdG9yeSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0cGFja2FnZXM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCBwYWNrYWdlIGRlcGVuZGVuY2llcyBhcmUgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnByaW9yaXR5PC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkgZm9yIHRoZSBqb2I6IGxvdyAoZGVmYXVsdCksIG1lZGl1bSBvciBoaWdoPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIHRhZyB0aGF0IGxhYmVscyB0aGUgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmVjaG9vZmY8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSBSIGNvbW1hbmRzIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgY29uc29sZSBvdXRwdXRcbiAgICAgICAgICogICAgICAgc2F2ZWQgb24gdGhlIHByb2plY3QgZXhlY3V0aW9uIGhpc3RvcnkgZm9yIHRoZSBqb2JcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmNvbnNvbGVvZmY8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSBjb25zb2xlIG91dHB1dCBpcyBub3Qgc2F2ZWQgb24gdGhlIHByb2plY3RcbiAgICAgICAgICogICAgICAgZXhlY3V0aW9uIGhpc3RvcnkgZm9yIHRoZSBqb2JcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmdyYXBoaWNzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBSIGdyYXBoaWNzIGRldmljZSBmb3IgZXhlY3V0aW9uOiBwbmcgb3Igc3ZnPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmdyYXBoaWNzd2lkdGg8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIHdpZHRoIGZvciBSIGdyYXBoaWNzIGRldmljZSBpbWFnZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Z3JhcGhpY3NoZWlnaHQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIGhlaWdodCBmb3IgUiBncmFwaGljcyBkZXZpY2UgaW1hZ2VzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3JlZmlsZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmtpbmcgZGlyZWN0b3J5IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZW9iamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmtzcGFjZSBvYmplY3QgbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmV3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBmaWxlbmFtZSAoLnJEYXRhKSB3aGVyZSB3b3Jrc3BhY2UgY29udGVudHMgd2lsbCBiZSBzYXZlZCBpbiB0aGUgcmVwb3NpdG9yeTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZW5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5zdXJlcyBlYWNoIGZpbGUgc3RvcmVkIGluIHJlcG9zaXRvcnkgcmVzdWx0cyBpbiBuZXcgdmVyc2lvbiBiZWluZyBjcmVhdGVkIGlmIG5lZWRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZXB1YmxpYzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoZXMgZWFjaCBmaWxlIHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZW5vcHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBubyBwcm9qZWN0IHBlcnNpc3RlbmNlIGZvbGxvd2luZyBqb2IgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBqb2JTY2hlZHVsZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL3NjaGVkdWxlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBxdWVyaWVzIHRoZSBqb2Igc3RhdHVzLiBUaGUgc3RhdHVzIHByb3BlcnR5IHdpbGwgaW5kaWNhdGUgb25lIG9mXG4gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICAgICAgICAgKlxuICAgICAgICAgKiBTY2hlZHVsZWQsIFF1ZXVlZCwgUnVubmluZywgQ29tcGxldGVkLCBDYW5jZWxsaW5nLCBDYW5jZWxsZWQsIEludGVycnVwdGVkLFxuICAgICAgICAgKiBBYm9ydGVkLCBGYWlsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgam9iUXVlcnlcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmpvYjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBqb2IgaWRlbnRpZmllcnM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZXh0ZW5kZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgb25seSBqb2JzIGluIGFuIGV4dGVuZGVkLXN0YXRlIGFyZSBsaXN0ZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGpvYlF1ZXJ5OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL3F1ZXJ5JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBjYW5jZWxzIHRoZSBzcGVjaWZpZWQgam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBPbmx5IGpvYnMgaW4gYW4gb3Blbi1zdGF0ZSBjYW4gYmUgY2FuY2VsbGVkLiBUaGUgc2V0IG9mIGpvYiBvcGVuLXN0YXRlcyBhcmVcbiAgICAgICAgICogc2hvd24gaGVyZTpcbiAgICAgICAgICpcbiAgICAgICAgICogPHVsPlxuICAgICAgICAgKiAgICA8bGk+U2NoZWR1bGVkIDogam9iIGlzIHNjaGVkdWxlZCBidXQgbm90IHlldCBxdWV1ZWQgZm9yIHJ1bm5pbmcuPC9saT5cbiAgICAgICAgICogICAgPGxpPlF1ZXVlZCA6IGpvYiBpcyBxdWV1ZWQgZm9yIHJ1bm5pbmcuPC9saT5cbiAgICAgICAgICogICAgPGxpPlJ1bm5pbmcgOiBqb2IgaXMgcnVubmluZy48L2xpPlxuICAgICAgICAgKiA8L3VsPlxuICAgICAgICAgKiBAbWV0aG9kIGpvYkNhbmNlbFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmpvYjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBqb2IgaWRlbnRpZmllcnM8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGpvYkNhbmNlbDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL2pvYi9saXN0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkZWxldGVzIHRoZSBzcGVjaWZpZWQgam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBPbmx5IGpvYnMgaW4gb25lIG9mIHRoZSBjb21wbGV0ZWQtc3RhdGVzIGNhbiBiZSBkZWxldGVkLiBUaGUgc2V0IG9mIGpvYlxuICAgICAgICAgKiBjb21wZWx0ZWQtc3RhdGVzIGFyZSBzaG93biBoZXJlOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8dWw+XG4gICAgICAgICAqICAgIDxsaT5Db21wbGV0ZWQgOiBqb2IgZXhlY3V0aW9uIGhhcyBydW4gdG8gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLjwvbGk+XG4gICAgICAgICAqICAgIDxsaT5JbnRlcnJ1cHRlZCA6IGpvYiBleGVjdXRpb24gaGFzIGJlZW4gaW50ZXJydXB0ZWQuPC9saT5cbiAgICAgICAgICogICAgPGxpPkNhbmNlbGxlZCA6IGpvYiBoYXMgYmVlbiBjYW5jZWxsZWQuPC9saT5cbiAgICAgICAgICogICAgPGxpPkFib3J0ZWQgOiBqb2IgZXhlY3V0aW9uIGhhcyBiZWVuIGFib3J0ZWQuPC9saT5cbiAgICAgICAgICogICAgPGxpPkZhaWxlZCA6IGpvYiBleGVjdXRpb24gaGFzIHJlc3VsdGVkIGluIGZhaWx1cmUuPC9saT5cbiAgICAgICAgICogPC91bD5cbiAgICAgICAgICpcbiAgICAgICAgICogSm9icyBpbiBhbiBvcGVuLXN0YXRlIG11c3QgZmlyc3QgcnVuIHRvIGNvbXBsZXRpb24gb3IgYmUgY2FuY2VsbGVkIGJlZm9yZVxuICAgICAgICAgKiB0aGV5IGFyZSBlbGlnaWJsZSBmb3IgZGVsZXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIDxibG9ja3F1b3RlPlxuICAgICAgICAgKiAgICBJbXBvcnRhbnQhIERlbGV0aW5nIGpvYnMgd2lsbCBub3QgZGVsZXRlIHRoZSBwcm9qZWN0cyB0aGF0IHJlc3VsdGVkIGZyb21cbiAgICAgICAgICogICAgdGhvc2Ugam9icy5cbiAgICAgICAgICogPC9ibG9ja3F1b3RlPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIGpvYkRlbGV0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogIDxkdD5qb2I8L2R0PlxuICAgICAgICAgKiAgPGRkPnNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGpvYiBpZGVudGlmaWVyczwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgam9iRGVsZXRlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL2RlbGV0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfSAvLyBEZXBsb3lSXG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGVwcmVjYXRlZDsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL3NlbGZpc2gnKS5CYXNlO1xuXG5mdW5jdGlvbiBkZWJ1Zyhtc2cpIHsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhc2UuZXh0ZW5kKHtcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmV2ZW50cyA9IHt9O1xuICAgIHRoaXMuc2NvcGUgID0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhIGxpc3RlbmVyLiAgTXVsdGlwbGUgY2FuIGJlIGFkZGVkIHBlciBuYW1lLiAgQWxpYXNlZCBhcyBgb25gLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBBIGNhbGxiYWNrXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9IGB0aGlzYCBmb3IgY2hhaW5pbmcgICAgICBcbiAgICovXG4gIG9uOiBmdW5jdGlvbihuYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5ldmVudHMgPT09IGZhbHNlKSB7IHRoaXMuZXZlbnRzW25hbWVdID0gW107IH0gICAgICAgIFxuXG4gICAgdGhpcy5ldmVudHNbbmFtZV0ucHVzaChoYW5kbGVyKTtcbiAgICBkZWJ1ZygnRW1pdHRlci5vbihcIicgKyBuYW1lICsgJ1wiKScpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGFsbCBtYXRjaGluZyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfSBgdGhpc2AgZm9yIGNoYWluaW5nICAgXG4gICAqL1xuICBlbWl0OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5ldmVudHMgPT09IGZhbHNlKSB7IHJldHVybiB0aGlzOyB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZXZlbnRzW25hbWVdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZygnRmlyZWQgZXZlbnQ6IFwiJyArIG5hbWUgKyAnXCInKTtcbiAgICAgIHRoaXMuZXZlbnRzW25hbWVdW2ldLmFwcGx5KHRoaXMuc2NvcGUgfHwgdGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7ICAgICAgIFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBtYXRjaGluZyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfSBgdGhpc2AgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZBbGw6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGZvciAodmFyIGUgaW4gdGhpcy5ldmVudHMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzW2VdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c1tuYW1lXTsgICAgICAgIFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgYmFzZWQgb24gYW4gaW5kZXguXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBldmVudCBcbiAgICovXG4gIG9mZkF0OiBmdW5jdGlvbihuYW1lLCBpbmRleCkge1xuICAgIHZhciBhcnJheSA9IHRoaXMuZXZlbnRzW25hbWVdLFxuICAgICAgICByZXN0ICA9IGFycmF5LnNsaWNlKGluZGV4ICsgMSk7XG5cbiAgICBhcnJheS5sZW5ndGggPSBpbmRleDtcbiAgICBhcnJheS5wdXNoLmFwcGx5KGFycmF5LCByZXN0KTtcbiAgICB0aGlzLmV2ZW50c1tuYW1lXSA9IGFycmF5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgYmFzZWQgb24gdGhlIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfSBgdGhpc2AgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmY6IGZ1bmN0aW9uKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgcmV0dXJuIHRoaXM7IH1cblxuICAgIC8vIHJlbW92ZSBhbGwgZXZlbnRzIGhhbmRsZXJzIGJ5IHRoaXMgbmFtZVxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMub2ZmQWxsKG5hbWUpO1xuICAgIH0gZWxzZSB7IC8vIHJlbW92ZSBhbGwgZXZlbnRzIGhhbmRsZXJzID09ICdoYW5kbGVyJyBieSB0aGlzIG5hbWVcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ldmVudHNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzW25hbWVdW2ldID09IGhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLm9mZkF0KG5hbWUsIGkpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbn0pOyAiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xudmFyIExhbmcgPSByZXF1aXJlKCcuL2xhbmcnKSxcbiAgICBSVHlwZXMgPSByZXF1aXJlKCcuL3J0eXBlcycpLFxuICAgIFIgPSBSVHlwZXMucixcbiAgICBEZXBsb3lSID0gUlR5cGVzLmRlcGxveXI7XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGVzKGRhdGVzLCB0eXBlKSB7XG4gICAgdmFyIGZvcm1hdHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9ybWF0cy5wdXNoKGZvcm1hdERhdGUoZGF0ZXNbaV0sIHR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0cztcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlLCB0eXBlKSB7ICAgIFxuICAgdmFyIHllYXIgICA9IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICBtb250aCAgPSAoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgICAgZGF5ICAgID0gZGF0ZS5nZXREYXRlKCksICAgIFxuICAgICAgIGhvdXIgICA9IGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICBtaW4gICAgPSBkYXRlLmdldE1pbnV0ZXMoKSxcbiAgICAgICBzZWMgICAgPSBkYXRlLmdldFNlY29uZHMoKSxcbiAgICAgICB6b25lICAgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAgICAgZm9ybWF0ID0gJyc7XG5cbiAgICAgICBtb250aCAgPSAobW9udGggPCAxMCA/ICcwJyArIG1vbnRoIDogbW9udGgpO1xuICAgICAgIGhvdXIgICA9IChob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cik7XG4gICAgICAgbWluICAgID0gKG1pbiA8IDEwID8gJzAnICsgbWluIDogbWluKTtcbiAgICAgICBzZWMgICAgPSAoc2VjIDwgMTAgPyAnMCcgKyBzZWMgOiBzZWMpOyAgICAgICBcbiAgICAgICBmb3JtYXQgPSB5ZWFyICsgJy0nICsgbW9udGggKyAnLScgKyBkYXk7XG5cbiAgICBmdW5jdGlvbiBsZWZ0WmVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgb3V0cHV0ID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuXG4gICAgICAgIHdoaWxlIChvdXRwdXQubGVuZ3RoIDwgdGFyZ2V0TGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSAnMCcgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgKyBvdXRwdXQ7XG4gICAgfVxuICAgXG4gICAgaWYgKHR5cGUgPT09IERlcGxveVIuUlBPU0lYX0RBVEUgfHwgdHlwZSA9PT0gRGVwbG95Ui5SUE9TSVhfREFURV9WRUNUT1IpIHtcbiAgICAgICAgdmFyIHRpbWUgID0gaG91ciArICc6JyArIG1pbiArICc6JyArIHNlYyxcbiAgICAgICAgICAgIGEgPSAtem9uZSxcbiAgICAgICAgICAgIGIgPSBcIitcIjtcblxuICAgICAgICBpZiAoYSA8IDApIHtcbiAgICAgICAgICAgIGEgPSAtYTtcbiAgICAgICAgICAgIGIgPSBcIi1cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHpvbmUgPSBiICsgbGVmdFplcm9GaWxsKChhIC8gNjApLCAyKSArICcnICsgbGVmdFplcm9GaWxsKGEgJSA2MCwgMik7XG4gICAgICAgIGZvcm1hdCArPSAoJyAnICsgdGltZSArICcgJyArIHpvbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQ7XG59XG5cbmZ1bmN0aW9uIGVuY29kZUVtYmVkZGVkRGF0YWZyYW1lKG9iaiwgcmRmKSB7XG4gICAgdmFyIGRmVmFsdWUgPSBvYmoudmFsdWU7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRmVmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBkZk9iaiA9IGRmVmFsdWVbaW5kZXhdO1xuICAgICAgICBpZiAoZGZPYmoudHlwZSA9PT0gRGVwbG95Ui5SREFUQUZSQU1FKSB7XG4gICAgICAgICAgICByZGYgPSBlbmNvZGVFbWJlZGRlZERhdGFmcmFtZShkZk9iaiwgcmRmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZvcm1hdCBkYXRlc1xuICAgICAgICAgICAgaWYgKFJUeXBlcy5pc0RhdGUoZGZPYmoudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoTGFuZy5pc0FycmF5KGRmT2JqLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBkZk9iai52YWx1ZSA9IGZvcm1hdERhdGVzKGRmT2JqLnZhbHVlLCBkZk9iai50eXBlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZk9iai52YWx1ZSA9IGZvcm1hdERhdGUoZGZPYmoudmFsdWUsIGRmT2JqLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGZPYmoudHlwZSA9IFJUeXBlcy5kZXBsb3lyVG9SKGRmT2JqLnR5cGUpO1xuICAgICAgICAgICAgcmRmLnZhbHVlLnB1c2goZGZPYmopOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIHJkZjtcbn07XG5cbmZ1bmN0aW9uIGVuY29kZURhdGFmcmFtZShvYmopIHtcbiAgICB2YXIgcmRmID0ge1xuICAgICAgICAgICAgdHlwZTogUi5EQVRBRlJBTUUsXG4gICAgICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgICAgICBuYW1lOiBvYmoubmFtZVxuICAgICAgICB9LFxuICAgICAgICBkZlZhbHVlID0gb2JqLnZhbHVlO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRmVmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBkZk9iaiA9IGRmVmFsdWVbaW5kZXhdO1xuXG4gICAgICAgIGlmIChkZk9iai50eXBlID09PSBEZXBsb3lSLlJEQVRBRlJBTUUpIHtcbiAgICAgICAgICAgIHJkZiA9IGVuY29kZUVtYmVkZGVkRGF0YWZyYW1lKGRmT2JqLCByZGYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZm9ybWF0IGRhdGVzXG4gICAgICAgICAgICBpZiAoUlR5cGVzLmlzRGF0ZShkZk9iai50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmIChMYW5nLmlzQXJyYXkoZGZPYmoudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRmT2JqLnZhbHVlID0gZm9ybWF0RGF0ZXMoZGZPYmoudmFsdWUsIGRmT2JqLnR5cGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRmT2JqLnZhbHVlID0gZm9ybWF0RGF0ZShkZk9iai52YWx1ZSwgZGZPYmoudHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZk9iai50eXBlID0gUlR5cGVzLmRlcGxveXJUb1IoZGZPYmoudHlwZSk7XG4gICAgICAgICAgICByZGYudmFsdWUucHVzaChkZk9iaik7XG4gICAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gcmRmO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlTGlzdChvYmopIHtcbiAgICB2YXIgcmxpc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBSLkxJU1QsXG4gICAgICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgICAgICBuYW1lOiBvYmoubmFtZVxuICAgICAgICB9LFxuICAgICAgICBkZlZhbHVlID0gb2JqLnZhbHVlLFxuICAgICAgICByO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRmVmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBkZk9iaiA9IGRmVmFsdWVbaW5kZXhdO1xuXG4gICAgICAgIHN3aXRjaCAoZGZPYmoudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJEQVRBRlJBTUU6XG4gICAgICAgICAgICAgICAgciA9IGVuY29kZURhdGFmcmFtZShkZk9iaik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5STElTVDpcbiAgICAgICAgICAgICAgICByID0gZW5jb2RlTGlzdChkZk9iaik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5STlVNRVJJQ19NQVRSSVg6XG4gICAgICAgICAgICBjYXNlIERlcGxveVIuUklOVEVHRVJfTUFUUklYOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJCT09MRUFOX01BVFJJWDpcbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SU1RSSU5HX01BVFJJWDpcbiAgICAgICAgICAgICAgICByID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZk9iai5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBSLk1BVFJJWCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRmT2JqLnZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJEQVRFOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJQT1NJWF9EQVRFOlxuICAgICAgICAgICAgICAgIHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRmT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuREFURSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBkZk9iai5mb3JtYXQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXREYXRlKGRmT2JqLnZhbHVlLCBkZk9iai50eXBlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SRkFDVE9SOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJPUkRFUkVEOlxuICAgICAgICAgICAgICAgIHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRmT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuRkFDVE9SLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcmVkOiBkZk9iai5vcmRlcmVkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IGRmT2JqLmxhYmVscyxcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWxzOiBkZk9iai5sZXZlbHMsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkZk9iai52YWx1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SU1RSSU5HOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJCT09MRUFOOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJOVU1FUklDOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJJTlRFR0VSOlxuICAgICAgICAgICAgICAgIHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRmT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuUFJJTUlUSVZFLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGZPYmoudmFsdWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIERlcGxveVIuUk5VTUVSSUNfVkVDVE9SOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJJTlRFR0VSX1ZFQ1RPUjpcbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SQk9PTEVBTl9WRUNUT1I6XG4gICAgICAgICAgICBjYXNlIERlcGxveVIuUlNUUklOR19WRUNUT1I6XG4gICAgICAgICAgICAgICAgciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZGZPYmoubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogUi5WRUNUT1IsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkZk9iai52YWx1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SREFURV9WRUNUT1I6XG4gICAgICAgICAgICBjYXNlIERlcGxveVIuUlBPU0lYX0RBVEVfVkVDVE9SOlxuICAgICAgICAgICAgICAgIHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRmT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuVkVDVE9SLCAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXREYXRlcyhkZk9iai52YWx1ZSwgZGZPYmoudHlwZSksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZGZPYmouZm9ybWF0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFJEYXRhVHlwZSBmb3VuZCBmb3IgXCInICsgZGZPYmoudHlwZSArICdcIicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmxpc3QudmFsdWUucHVzaChyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJsaXN0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVucyBhIGdpdmVuIDxjb2RlPlJldm9sdXRpb24uUkRhdGE8L2NvZGU+IHR5cGUgaW50byBhIEpTT04gc3RyaW5nXG4gICAgICogcmVwcmVzZW50aW5nIHRoZVxuICAgICAqIGV4cGVjdGVkIERlcGxveVIgaW5wdXQgZm9ybWF0LlxuICAgICAqXG4gICAgICogQG1ldGhvZCBwYXJzZUlucHV0c1xuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSByZGF0YSBBbiBBcnJheSBvZiBSRGF0YSBPYmplY3RzIHRvIGJlIGZsYXR0ZW5lZC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBmbGF0dGVuZCBSRGF0YSBKU09OIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIERlcGxveVJcbiAgICAgKiAgICAgICAgICAgICAgICAgIGlucHV0IGZvcm1hdC5cbiAgICAgKi9cbiAgICBlbmNvZGU6IGZ1bmN0aW9uKHJkYXRhKSB7XG4gICAgICAgIHZhciByID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHJkYXRhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIG9iaiA9IHJkYXRhW2luZGV4XTtcblxuICAgICAgICAgICAgc3dpdGNoIChvYmoudHlwZSkgeyAvLyAtLSBEZXBsb3lSIFR5cGUgLS0gLy9cblxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SREFUQUZSQU1FOlxuICAgICAgICAgICAgICAgICAgICByW29iai5uYW1lXSA9IGVuY29kZURhdGFmcmFtZShvYmopO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5STElTVDpcbiAgICAgICAgICAgICAgICAgICAgcltvYmoubmFtZV0gPSBlbmNvZGVMaXN0KG9iaik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJOVU1FUklDX01BVFJJWDpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUklOVEVHRVJfTUFUUklYOlxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SQk9PTEVBTl9NQVRSSVg6XG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJTVFJJTkdfTUFUUklYOlxuICAgICAgICAgICAgICAgICAgICByW29iai5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuTUFUUklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9iai52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SREFURTpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUlBPU0lYX0RBVEU6XG4gICAgICAgICAgICAgICAgICAgIHJbb2JqLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUi5EQVRFLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBvYmouZm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdERhdGUob2JqLnZhbHVlLCBvYmoudHlwZSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUkZBQ1RPUjpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUk9SREVSRUQ6ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByW29iai5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuRkFDVE9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZDogb2JqLm9yZGVyZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IG9iai5sYWJlbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM6IG9iai5sZXZlbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb2JqLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJTVFJJTkc6XG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJCT09MRUFOOlxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5STlVNRVJJQzpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUklOVEVHRVI6XG4gICAgICAgICAgICAgICAgICAgIHJbb2JqLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUi5QUklNSVRJVkUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb2JqLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJOVU1FUklDX1ZFQ1RPUjpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUklOVEVHRVJfVkVDVE9SOlxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SQk9PTEVBTl9WRUNUT1I6XG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJTVFJJTkdfVkVDVE9SOlxuICAgICAgICAgICAgICAgICAgICByW29iai5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuVkVDVE9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9iai52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SREFURV9WRUNUT1I6XG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJQT1NJWF9EQVRFX1ZFQ1RPUjpcbiAgICAgICAgICAgICAgICAgICAgcltvYmoubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBSLlZFQ1RPUiwgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXREYXRlcyhvYmoudmFsdWUsIG9iai50eXBlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogb2JqLmZvcm1hdFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gUkRhdGFUeXBlIGZvdW5kIGZvciBcIicgKyBvYmoudHlwZSArICdcIicpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoSlNPTi5zdHJpbmdpZnkocikpO1xuICAgIH1cbn07IiwiIHZhciBvcHRpb25hbCA9IHJlcXVpcmUoJy4vb3B0aW9uYWwnKSxcbiAgICAgV1MgICAgICAgPSBvcHRpb25hbCgnd3MnKSxcbiAgICAgUXVldWUgICAgPSByZXF1aXJlKCcuL3F1ZXVlJyksICAgICBcbiAgICAgRW1pdHRlciAgPSByZXF1aXJlKCcuL2VtaXR0ZXInKSxcbiAgICAgQmFzZSAgICAgPSByZXF1aXJlKCcuL3NlbGZpc2gnKS5CYXNlLFxuICAgICBtZXJnZSAgICA9IHJlcXVpcmUoJy4vdXRpbHMnKS5tZXJnZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFdmVudFN0cmVhbWAgd2l0aCB0aGUgZ2l2ZW4gc2V0IG9mIGBvcHRpb25zYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbnZhciBFdmVudFN0cmVhbSA9IEJhc2UuZXh0ZW5kKEVtaXR0ZXIsIHsgICBcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiBpbml0aWFsaXplKGhvc3QsIG9wdGlvbnMpIHtcbiAgICBFbWl0dGVyLmluaXRpYWxpemUuY2FsbCh0aGlzLCB7fSk7XG5cbiAgICB0aGlzLmhvc3QgICAgICAgID0gaG9zdDtcbiAgICB0aGlzLm9wdGlvbnMgICAgID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLm9wdGlvbnMubG9nID0gdGhpcy5vcHRpb25zLmxvZyB8fCB0aGlzLkxPRy5lcnJvcjtcbiAgICB0aGlzLndzICAgICAgICAgID0gbnVsbDtcbiAgICB0aGlzLnEgICAgICAgICAgID0gbmV3IFF1ZXVlKCk7XG4gICAgdGhpcy5jaGFubmVsICAgICA9IHt9OyAgICAgXG4gIH0sICBcblxuICBMT0c6IHsgXG4gICAgaW5mbzogJ2luZm8nLCBcbiAgICBkZWJ1ZzogJ2RlYnVnJywgXG4gICAgZXJyb3I6ICdlcnJvcicgXG4gIH0sXG4gIFxuICBvcGVuOiBmdW5jdGlvbihvcHRpb25zKSB7ICAgIFxuICAgIHZhciBzZWxmICAgPSB0aGlzLFxuICAgICAgICB1cmkgICAgPSAodGhpcy5ob3N0IHx8ICcnKSArICcvZGVwbG95ci9yL2V2ZW50L3N0cmVhbT8nLFxuICAgICAgICBwYXJhbXMgPSBbXTtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gbWVyZ2Uob3B0aW9ucywgdGhpcy5jaGFubmVsKTsgICAgXG5cbiAgICB0aGlzLmNvb2tpZXMgPSAhdGhpcy5jb29raWVzID8gb3B0aW9ucy5oZWFkZXJzLkNvb2tpZSA6IHRoaXMuY29va2llcztcblxuICAgIC8vIC0tIGFwcGVuZCBvcHRpb24gcGFyYW1ldGVycyAtLVxuICAgIGlmIChvcHRpb25zLnByb2plY3QpIHtcbiAgICAgIHBhcmFtcy5wdXNoKCdwcm9qZWN0PScgKyBvcHRpb25zLnByb2plY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5qb2IpIHtcbiAgICAgICAgcGFyYW1zLnB1c2goJ2pvYj0nICsgb3B0aW9ucy5qb2IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1hbmFnZW1lbnQpIHtcbiAgICAgIHBhcmFtcy5wdXNoKCdtYW5hZ2VtZW50RXZlbnRPbmx5PXRydWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuaHR0cG9ubHkpIHtcbiAgICAgICAgcGFyYW1zLnB1c2goJ2h0dHBFdmVudE9ubHk9dHJ1ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmV2b29ubHkpIHtcbiAgICAgICAgICBwYXJhbXMucHVzaCgncmV2b0V2ZW50T25seT10cnVlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cmkgKz0gcGFyYW1zLmpvaW4oJyYnKS5zdWJzdHIoMCk7XG4gICAgdXJpID0gdXJpLnJlcGxhY2UoL15odHRwLywnd3MnKTtcblxuICAgIHRoaXMucS55aWVsZCh0cnVlKTtcbiAgICB0aGlzLnEuYWRkKGZ1bmN0aW9uKCkge1xuXG4gICAgICB2YXIgaGVhZGVycyA9IHRoaXMuY29va2llcyA/IHsgJ0Nvb2tpZSc6IHRoaXMuY29va2llcyB9IDoge307XG4gICAgICB0aGlzLmVtaXQoJ2VzOmNvbm5lY3RpbmcnLCB7IHVyaTogdXJpLCBoZWFkZXJzOiBoZWFkZXJzIH0pO1xuXG4gICAgICB2YXIgd3MgPSBuZXcgV1ModXJpLCAnaHR0cCcsIHsgaGVhZGVyczogaGVhZGVycyB9KTtcblxuICAgICAgd3Mub25vcGVuID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlczpvcGVuJywgbWVzc2FnZSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgX21lc3NhZ2UgPSAnJztcbiAgICAgIHdzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIHRyeSB7ICAgICAgICAgIFxuICAgICAgICAgIGlmIChtZXNzYWdlLmRhdGEuc3BsaXQoJyF8IScpWzFdKSB7XG4gICAgICAgICAgICBfbWVzc2FnZSA9IF9tZXNzYWdlICsgbWVzc2FnZS5kYXRhLnNwbGl0KCchfCEnKVsxXTtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKF9tZXNzYWdlKTtcbiAgICAgICAgICAgIF9tZXNzYWdlID0gJyc7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IG1lc3NhZ2UuZGVwbG95ci5yZXNwb25zZS5ldmVudC50eXBlO1xuICAgICAgICAgICAgc2VsZi5lbWl0KCdlczonICsgdHlwZS5yZXBsYWNlKCdFdmVudCcsICcnKSwgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fSBcbiAgICAgIH07XG5cbiAgICAgIHdzLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7IHNlbGYuZW1pdCgnZXM6ZXJyb3InLCBlcnIpOyB9O1xuICAgICAgd3Mub25jbG9zZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7IHNlbGYuZW1pdCgnZXM6ZGlzY29ubmVjdCcsIG1lc3NhZ2UpOyB9O1xuXG4gICAgICB0aGlzLndzID0gd3M7XG4gICAgfSwgdGhpcyk7XG5cbiAgICBpZiAob3B0aW9ucy5mb3JjZSkgeyB0aGlzLmZsdXNoKCk7IH1cblxuICAgIHJldHVybiB0aGlzOyAgICBcbiAgfSxcblxuICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMud3MpIHsgdGhpcy53cy5jbG9zZSgpOyB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBlcnJvcjogZnVuY3Rpb24oZm4pIHtcbiAgICB0aGlzLm9uKCdlczplcnJvcicsIGZuKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LCAgXG5cbiAgYWxsOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmNoYW5uZWwgPSB7IHJldm9vbmx5OiB0cnVlIH07ICAvLyByZXZvRXZlbnRPbmx5PXRydWVcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNlc3Npb246IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY2hhbm5lbCA9IHsgaHR0cG9ubHk6IHRydWUgfTsgLy9odHRwRXZlbnRPbmx5PXRydWVcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHByb2plY3Q6IGZ1bmN0aW9uKHByb2plY3QpIHtcbiAgICB0aGlzLmNoYW5uZWwgPSB7IHByb2plY3Q6IHByb2plY3QgfTsgLy8gcHJvamVjdD0xMjM0NVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgam9iOiBmdW5jdGlvbihqb2IpIHtcbiAgICB0aGlzLmNoYW5uZWwgPSB7IGpvYjogam9iIH07IC8vam9iPTEyMzQ1XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBtYW5hZ2VtZW50OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmNoYW5uZWwgPSB7IG1hbmFnZW1lbnQ6IHRydWUgfTsgLy9tYW5hZ2VtZW50RXZlbnRPbmx5PXRydWVcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGZsdXNoOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnEueWllbGQoZmFsc2UpO1xuICAgIHRoaXMucS5mbHVzaCgpO1xuICB9LFxuXG4gIHNoYXJlOiBmdW5jdGlvbihjb29raWVzKSB7XG4gICAgdGhpcy5jb29raWVzID0gY29va2llcztcbiAgfVxuXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFN0cmVhbTtcbiIsIi8qIVxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgYnkgUmV2b2x1dGlvbiBBbmFseXRpY3MgSW5jLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIFZlcnNpb24gMi4wIG9mIHRoZVxuICogQXBhY2hlIExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRZLCBJTkNMVURJTkcgVEhPU0UgT0YgTk9OLUlORlJJTkdFTUVOVCxcbiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gUGxlYXNlIHJlZmVyIHRvIHRoZVxuICogQXBhY2hlIExpY2Vuc2UgMi4wIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApIGZvciBtb3JlIFxuICogZGV0YWlscy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBpcyBhIERlcGxveVIgcG9ydCBvZiB5dWktbGFuZy5qcyBieSBZYWhvbyFcbiAqXG4gKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIFxuICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgXG4gKiBhcmUgbWV0OlxuICpcbiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IFxuICogZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIFxuICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgXG4gKiB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBub3IgdGhlIG5hbWVzIG9mIFlVSSdzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgXG4gKiB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFlhaG9vISBJbmMuXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIFxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgXG4gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIFxuICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgXG4gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBcbiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIFxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgIFxuICogUE9TIFNJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8qKlxuICogUHJvdmlkZXMgY29yZSBsYW5ndWFnZSB1dGlsaXRlcyBhbmQgZXh0ZW5zaW9ucyB1c2VkIHRocm91Z2hvdXQgRGVwbG95Ui5cbiAqXG4gKiBAY2xhc3MgTGFuZ1xuICogQHN0YXRpY1xuICovXG52YXIgTCA9IHt9LCBcblx0VE9TVFJJTkcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLCBcblx0VFlQRVMgPSB7XHRcblx0XHQndW5kZWZpbmVkJyA6ICd1bmRlZmluZWQnLFxuXHRcdCdudW1iZXInIDogJ251bWJlcicsXG5cdFx0J2Jvb2xlYW4nIDogJ2Jvb2xlYW4nLFxuXHRcdCdzdHJpbmcnIDogJ3N0cmluZycsXG5cdFx0J1tvYmplY3QgRnVuY3Rpb25dJyA6ICdmdW5jdGlvbicsXG5cdFx0J1tvYmplY3QgUmVnRXhwXScgOiAncmVnZXhwJyxcblx0XHQnW29iamVjdCBBcnJheV0nIDogJ2FycmF5Jyxcblx0XHQnW29iamVjdCBEYXRlXScgOiAnZGF0ZScsXG5cdFx0J1tvYmplY3QgRXJyb3JdJyA6ICdlcnJvcidcblx0fSwgdW5zYWZlTmF0aXZlcyA9IGZhbHNlO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGl0ZW0gaXMgbnVsbC5cbiAqIEBtZXRob2QgaXNOdWxsXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgbnVsbC5cbiAqL1xuTC5pc051bGwgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiBvID09PSBudWxsO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBpdGVtIGlzIHVuZGVmaW5lZC5cbiAqIEBtZXRob2QgaXNVbmRlZmluZWRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbyBpcyB1bmRlZmluZWQuXG4gKi9cbkwuaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiB0eXBlb2YgbyA9PT0gJ3VuZGVmaW5lZCc7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGl0ZW0gaXMgb2YgdHlwZSBvYmplY3RcbiAqIG9yIGZ1bmN0aW9uLiBOb3RlIHRoYXQgYXJyYXlzIGFyZSBhbHNvIG9iamVjdHMsIHNvXG4gKiA8Y29kZT5ZLkxhbmcuaXNPYmplY3QoW10pID09PSB0cnVlPC9jb2RlPi5cbiAqIEBtZXRob2QgaXNPYmplY3RcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEBwYXJhbSBmYWlsZm4ge2Jvb2xlYW59IGZhaWwgaWYgdGhlIGlucHV0IGlzIGEgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgYW4gb2JqZWN0LlxuICogQHNlZSBpc1BsYWluT2JqZWN0XG4gKi9cbkwuaXNPYmplY3QgPSBmdW5jdGlvbihvLCBmYWlsZm4pIHtcblx0dmFyIHQgPSB0eXBlb2Ygbztcblx0cmV0dXJuIChvICYmICh0ID09PSAnb2JqZWN0JyB8fCAoIWZhaWxmbiAmJiAodCA9PT0gJ2Z1bmN0aW9uJyB8fCBMLmlzRnVuY3Rpb24obykpKSkpIHx8IGZhbHNlO1xufTtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgaXRlbSBpcyBhbiBhcnJheS5cbiAqXG4gKiBSZXR1cm5zIGBmYWxzZWAgZm9yIGFycmF5LWxpa2UgY29sbGVjdGlvbnMgc3VjaCBhcyB0aGUgZnVuY3Rpb24gYGFyZ3VtZW50c2BcbiAqIGNvbGxlY3Rpb24gb3IgYEhUTUxFbGVtZW50YCBjb2xsZWN0aW9ucy5cbiAqXG4gKiBAbWV0aG9kIGlzQXJyYXlcbiAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbyBpcyBhbiBhcnJheS5cbiAqIEBzdGF0aWNcbiAqL1xuTC5pc0FycmF5ID0gKCF1bnNhZmVOYXRpdmVzICYmIEFycmF5LmlzQXJyYXkpIHx8XG5mdW5jdGlvbihvKSB7XG5cdHJldHVybiBMLnR5cGUobykgPT09ICdhcnJheSc7XG59O1xuXG5MLmlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uQShvKSB7XG5cdHJldHVybiAodHlwZW9mKG8pID09PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBpdGVtIGlzIGEgYm9vbGVhbi5cbiAqIEBtZXRob2QgaXNCb29sZWFuXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgYSBib29sZWFuLlxuICovXG5MLmlzQm9vbGVhbiA9IGZ1bmN0aW9uKG8pIHtcblx0cmV0dXJuIHR5cGVvZiBvID09PSAnYm9vbGVhbic7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHN1cHBsaWVkIGl0ZW0gaXMgYSBkYXRlIGluc3RhbmNlLlxuICogQG1ldGhvZCBpc0RhdGVcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbyBpcyBhIGRhdGUuXG4gKi9cbkwuaXNEYXRlID0gZnVuY3Rpb24obykge1xuXHRyZXR1cm4gTC50eXBlKG8pID09PSAnZGF0ZScgJiYgby50b1N0cmluZygpICE9PSAnSW52YWxpZCBEYXRlJyAmJiAhaXNOYU4obyk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGl0ZW0gaXMgYSBsZWdhbCBudW1iZXIuXG4gKiBAbWV0aG9kIGlzTnVtYmVyXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgYSBudW1iZXIuXG4gKi9cbkwuaXNOdW1iZXIgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiB0eXBlb2YgbyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUobyk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGl0ZW0gaXMgYSBzdHJpbmcuXG4gKiBAbWV0aG9kIGlzU3RyaW5nXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgYSBzdHJpbmcuXG4gKi9cbkwuaXNTdHJpbmcgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiB0eXBlb2YgbyA9PT0gJ3N0cmluZyc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIHRoZSBpdGVtIHBhc3NlZCBpbi5cbiAqXG4gKiBAbWV0aG9kIHR5cGVcbiAqIEBwYXJhbSBvIHRoZSBpdGVtIHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBkZXRlY3RlZCB0eXBlLlxuICogQHN0YXRpY1xuICovXG5MLnR5cGUgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiBUWVBFU1sgdHlwZW9mIG9dIHx8IFRZUEVTW1RPU1RSSU5HLmNhbGwobyldIHx8ICggbyA/ICdvYmplY3QnIDogJ251bGwnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTDsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cbiBcbnZhciBMb2dnZXIgPSB7fSxcbiAgICBsb2dnZXJNYXAgPSB7fSxcbiAgICBnbG9iYWxMb2dnZXI7XG5cbi8qKlxuICogVW5pdmVyc2FsIHN0ZG91dHxzdGRlcnIgcHJpbnRlclxuICovXG5mdW5jdGlvbiBsb2cobWVzc2FnZXMsIGNvbnRleHQpIHtcdFxuXHRpZiAoIWNvbnNvbGUpIHsgcmV0dXJuOyB9XG5cblx0ZnVuY3Rpb24gc2VwKGxldmVsKSB7XG5cdFx0dmFyIHNlcCA9ICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nICtcblx0XHQgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbicsXG5cdFx0ICAgIG9mZnNldCA9IDA7XG5cblx0XHRpZiAobGV2ZWwgPT09IExvZ2dlci5ERUJVRyB8fCBsZXZlbCA9PT0gTG9nZ2VyLkVSUk9SKSBvZmZzZXQgPSA4O1xuXHRcdGVsc2UgaWYgKGxldmVsID09PSBMb2dnZXIuSU5GTyB8fCBsZXZlbCA9PT0gTG9nZ2VyLldBUk4pIG9mZnNldCA9IDg7XG5cdFx0ZWxzZSBvZmZzZXQgPSA3O1xuXG5cdFx0cmV0dXJuIHsgc3RhcnQ6IHNlcC5zdWJzdHJpbmcob2Zmc2V0KSwgZW5kOiBzZXAgfTtcblx0fVxuXG5cdHZhciBoZGxyLFxuXHQgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG1lc3NhZ2VzLCAwKSxcblx0ICAgIG5hbWUgPSBjb250ZXh0Lm5hbWUsXG5cdCAgICBlcnJvciA9IGNvbnRleHQubGV2ZWwgPT09IExvZ2dlci5FUlJPUixcbiAgXHQgICAgZGVsaW0gPSBzZXAoY29udGV4dC5sZXZlbCk7XG5cbiAgXHRpZiAoY29udGV4dC5sZXZlbCA9PT0gTG9nZ2VyLldBUk4gJiYgY29uc29sZS53YXJuKSB7XG4gIFx0XHRoZGxyID0gJ3dhcm4nO1xuICBcdH0gZWxzZSBpZiAoY29udGV4dC5sZXZlbCA9PT0gTG9nZ2VyLkVSUk9SICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgXHRcdGhkbHIgPSAnZXJyb3InO1xuICBcdH0gZWxzZSBpZiAoY29udGV4dC5sZXZlbCA9PT0gTG9nZ2VyLklORk8gJiYgY29uc29sZS5pbmZvKSB7XG4gIFx0XHRoZGxyID0gJ2luZm8nO1xuICBcdH0gZWxzZSB7XG4gIFx0XHRoZGxyID0gJ2xvZyc7XG4gIFx0fVxuXG4gIFx0Ly8gLS0gY3VzdG9tIGZvcm1hdCBsb2dnaW5nIHN0YXRlbWVudCBmb3IgZGVwbG95ciByZXF1ZXN0L3Jlc3BvbnNlL2Vycm9yIC0tXG4gIFx0YXJncy51bnNoaWZ0KCdbJyArIChlcnJvciA/IExvZ2dlci5FUlJPUi5uYW1lIDogbmFtZSkgKyAnXSAnICsgZGVsaW0uc3RhcnQpO1xuICBcdGFyZ3MucHVzaChkZWxpbS5lbmQpO1xuXG4gIFx0Y29uc29sZVtoZGxyXShhcmdzWzBdLCBbYXJnc1sxXSArICcgLS0tPiAnICsgYXJnc1syXVsnY2FsbCddXSk7XG5cbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsgY29uc29sZS5sb2coYXJnc1tpXSk7IH0gIFxufVxuXG4vKipcbiAqIExvZ2dpbmcgY2F0ZWdvcnkgYnkgaWQuXG4gKi9cbmZ1bmN0aW9uIENhdGVnb3J5KGlkLCBsZXZlbCwgZm4pIHtcblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmNvbnRleHQgPSBsZXZlbCB8fCBMb2dnZXIuREVCVUc7XG59XG5cbkNhdGVnb3J5LnByb3RvdHlwZSA9IHtcdFxuXHRsb2c6IGZ1bmN0aW9uKGxldmVsLCBtc2dBcmdzKSB7XG5cdFx0aWYgKGxldmVsLnZhbHVlID49IHRoaXMuY29udGV4dC52YWx1ZSkge1x0XHRcdFxuXHRcdFx0bG9nKG1zZ0FyZ3MsIHsgXG5cdFx0XHRcdGxldmVsOiBsZXZlbCxcblx0XHRcdFx0bmFtZTogdGhpcy5jb250ZXh0Lm5hbWUsXG5cdFx0XHRcdHZhbHVlOiB0aGlzLmNvbnRleHQudmFsdWVcblx0XHRcdH0pO1x0XHRcblx0XHR9XG5cdH0sXG5cblx0ZGVidWc6IGZ1bmN0aW9uICgpIHtcdFx0XG5cdFx0dGhpcy5sb2coTG9nZ2VyLkRFQlVHLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdGVycm9yOiBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy5sb2coTG9nZ2VyLkVSUk9SLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdGluZm86IGZ1bmN0aW9uICgpIHtcdFx0XG5cdFx0dGhpcy5sb2coTG9nZ2VyLklORk8sIGFyZ3VtZW50cyk7XG5cdH0sXG5cblx0d2FybjogZnVuY3Rpb24gKCkge1xuXHRcdHRoaXMubG9nKExvZ2dlci5XQVJOLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdHNldExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuXHRcdGlmIChsZXZlbCAmJiAndmFsdWUnIGluIGxldmVsKSB7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSBsZXZlbDtcblx0XHR9XG5cdH1cbn07XG5cbkxvZ2dlci5ERUJVRyA9IHsgdmFsdWU6IDEsIG5hbWU6ICdERUJVRycgfTtcbkxvZ2dlci5JTkZPICA9IHsgdmFsdWU6IDIsIG5hbWU6ICdJTkZPJyB9O1xuTG9nZ2VyLldBUk4gID0geyB2YWx1ZTogNCwgbmFtZTogJ1dBUk4nIH07XG5Mb2dnZXIuRVJST1IgPSB7IHZhbHVlOiA4LCBuYW1lOiAnRVJST1InIH07XG5Mb2dnZXIuT0ZGICAgPSB7IHZhbHVlOiA5OSwgbmFtZTogJ09GRicgfTsgICBcdFx0XG5cbkxvZ2dlci5zZXRMZXZlbCA9IGZ1bmN0aW9uKG5ld0xldmVsKSB7XG5cdGdsb2JhbExvZ2dlci5zZXRMZXZlbChuZXdMZXZlbCk7XG59O1xuXG5Mb2dnZXIuZGVidWcgPSBmdW5jdGlvbiAoKSB7XG5cdGdsb2JhbExvZ2dlci5kZWJ1Zy5hcHBseShnbG9iYWxMb2dnZXIsIGFyZ3VtZW50cyk7XG59O1xuXG5Mb2dnZXIuaW5mbyA9IGZ1bmN0aW9uICgpIHtcblx0Z2xvYmFsTG9nZ2VyLmluZm8uYXBwbHkoZ2xvYmFsTG9nZ2VyLCBhcmd1bWVudHMpO1xufTtcblxuTG9nZ2VyLndhcm4gPSBmdW5jdGlvbiAoKSB7XG5cdGdsb2JhbExvZ2dlci53YXJuLmFwcGx5KGdsb2JhbExvZ2dlciwgYXJndW1lbnRzKTtcbn07XG5cbkxvZ2dlci5lcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0Z2xvYmFsTG9nZ2VyLmVycm9yLmFwcGx5KGdsb2JhbExvZ2dlciwgYXJndW1lbnRzKTtcbn07XG5cbkxvZ2dlci5nZXQgPSBmdW5jdGlvbiAoaWQsIGxldmVsLCBmbikge1x0XG5cdHJldHVybiAobG9nZ2VyTWFwW2lkXSB8fCAoZnVuY3Rpb24oKSB7XG5cdFx0bG9nZ2VyTWFwW2lkXSA9IG5ldyBDYXRlZ29yeShpZCwgbGV2ZWwsIGZuKTtcblx0XHRyZXR1cm4gbG9nZ2VyTWFwW2lkXTtcblx0fSkoKSk7XG59O1xuXG4vLyAtLS0gc2V0dXAgdGhlIGdsb2JhbCBsb2dnZXIgLS0tXG5nbG9iYWxMb2dnZXIgPSBMb2dnZXIuZ2V0KCdnbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgXHQ9IExvZ2dlcjtcbiIsIi8qIVxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgYnkgUmV2b2x1dGlvbiBBbmFseXRpY3MgSW5jLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIFZlcnNpb24gMi4wIG9mIHRoZVxuICogQXBhY2hlIExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRZLCBJTkNMVURJTkcgVEhPU0UgT0YgTk9OLUlORlJJTkdFTUVOVCxcbiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gUGxlYXNlIHJlZmVyIHRvIHRoZVxuICogQXBhY2hlIExpY2Vuc2UgMi4wIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApIGZvciBtb3JlIFxuICogZGV0YWlscy5cbiAqL1xuIFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZShtb2R1bGUpO1xuICB9IGNhdGNoIChlKSB7fVxufTsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxuZnVuY3Rpb24gUXVldWUoKSB7XG4gIHRoaXMuZW1wdHlDYWxsYmFjayA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tzID0gW107XG4gIHRoaXMueWllbGRlZCA9IGZhbHNlO1xuICB0aGlzLnJlc3BvbnNlID0gbnVsbDtcbiAgdGhpcy5yZXNwb25zZUNoYWluID0gW107ICBcbn1cblxuUXVldWUucHJvdG90eXBlID0ge1xuXG4gIGFkZDogZnVuY3Rpb24oZm4sIGN0eCwgZGVmZXIpIHtcbiAgICAvLyBjdXJyZW50bHkgbm90IHdhaXRpbmcgYW5kIHRoZXJlIGlzIG5vIGRlZmVyIGRlbGF5IGp1c3QgbWFrZSBjYWxsXG4gICAgaWYgKCF0aGlzLnlpZWxkZWQgJiYgIWRlZmVyKSB7ICAgICAgXG4gICAgICBmbi5hcHBseShjdHggfHwgdGhpcywgW3RoaXMucmVzcG9uc2VdKTtcbiAgICB9IGVsc2UgeyAvLyBhZGQgdG8gcXVldWVcbiAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goeyBmbjogZm4sIGN0eDogY3R4IH0pO1xuICAgIH1cbiAgfSxcblxuICBzaXplOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja3MubGVuZ3RoO1xuICB9LFxuXG4gIGlzRW1wdHk6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gIH0sXG5cbiAgZW1wdHk6IGZ1bmN0aW9uKGZuLCBjdHgpIHtcbiAgICB0aGlzLmVtcHR5Q2FsbGJhY2sgPSB7IGZuOiBmbiwgY3R4OiBjdHggfTtcbiAgfSxcblxuICB5aWVsZDogZnVuY3Rpb24oeWllbGQpIHtcbiAgICB0aGlzLnlpZWxkZWQgPSB5aWVsZDtcbiAgfSxcblxuICB0YWtlOiBmdW5jdGlvbihyZXNwb25zZSwgZXJyb3IsIGFyZ3MpIHsgXG4gICAgdmFyIGNiO1xuXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICB0aGlzLnJlc3BvbnNlQ2hhaW4ucHVzaChyZXNwb25zZSk7XG4gICAgfVxuXG5cbiAgICBpZiAoIXRoaXMueWllbGRlZCAmJiB0aGlzLmNhbGxiYWNrc1swXSkge1xuICAgICAgY2IgPSB0aGlzLmNhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgY2IuZm4uYXBwbHkoY2IuY3R4IHx8IHRoaXMsIFt0aGlzLnJlc3BvbnNlQ2hhaW4sIGVycm9yLCBhcmdzXSk7XG5cbiAgICAgIC8vIG5vdGlmeSB0aGF0IHRoZSBxdWV1ZSBpcyBub3cgZW1wdHkgICBcbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrc1swXSAmJiB0aGlzLmVtcHR5Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5lbXB0eUNhbGxiYWNrLmZuLmNhbGwodGhpcy5lbXB0eUNhbGxiYWNrLmN0eCB8fCB0aGlzKTsgICAgICAgICBcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFxuICBmbHVzaDogZnVuY3Rpb24ocmVzcG9uc2UsIGVycm9yLCBhcmdzKSB7ICAgICAgICBcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgIHRoaXMucmVzcG9uc2VDaGFpbi5wdXNoKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICAvLyBwb3AgYW5kIGNhbGwgbmV4dCBpbmxpbmVcbiAgICB3aGlsZSAodGhpcy5jYWxsYmFja3NbMF0pIHtcbiAgICAgIGlmICh0aGlzLnlpZWxkZWQpIHsgYnJlYWs7IH1cbiAgICAgIHZhciBjYiA9IHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICBjYi5mbi5hcHBseShjYi5jdHggfHwgdGhpcywgW3RoaXMucmVzcG9uc2VDaGFpbiwgZXJyb3IsIGFyZ3NdKTtcblxuICAgICAgLy8gbm90aWZ5IHRoYXQgdGhlIHF1ZXVlIGlzIG5vdyBlbXB0eVxuICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzWzBdICYmIHRoaXMuZW1wdHlDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmVtcHR5Q2FsbGJhY2suZm4uY2FsbCh0aGlzLmVtcHR5Q2FsbGJhY2suY3R4IHx8IHRoaXMpOyAgICAgICAgIFxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBRdWV1ZTsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxudmFyIEJhc2UgICA9IHJlcXVpcmUoJy4vc2VsZmlzaCcpLkJhc2UsXG4gICAgUlR5cGVzID0gcmVxdWlyZSgnLi9ydHlwZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYXNlLmV4dGVuZChSVHlwZXMsIHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShuYW1lLCB2YWx1ZSwgb3B0aW9ucykgeyAgXHRcblx0XHR0aGlzLm5hbWUgID0gbmFtZTtcblx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0fSxcblxuXHRudW1lcmljOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHtcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5STlVNRVJJQyxcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7XG5cdH0sXHRcblxuXHRpbnRlZ2VyOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUklOVEVHRVIsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblx0XG5cdGxvZ2ljYWw6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SQk9PTEVBTiwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblx0XG5cdGNoYXJhY3RlcjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJTVFJJTkcsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cdFxuXHRkYXRlOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUkRBVEUsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHRmb3JtYXQ6ICd5eXl5LU1NLWRkJyxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFxuXG5cdHBvc2l4Y3Q6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SUE9TSVhfREFURSwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHRmb3JtYXQ6ICd5eXl5LU1NLWRkIEhIOm1tOnNzIFonLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXHRcblx0XG5cdG51bWVyaWNWZWN0b3I6IGZ1bmN0aW9uICgpIHsgXG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUk5VTUVSSUNfVkVDVE9SLFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cdFxuXHRpbnRlZ2VyVmVjdG9yOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUklOVEVHRVJfVkVDVE9SLCBcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFxuXHRcblx0bG9naWNhbFZlY3RvcjogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SQk9PTEVBTl9WRUNUT1IsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cdFxuXHRjaGFyYWN0ZXJWZWN0b3I6IGZ1bmN0aW9uICgpIHsgXG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUlNUUklOR19WRUNUT1IsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sICBcblx0XG5cdGRhdGVWZWN0b3I6IGZ1bmN0aW9uICgpIHsgXG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUkRBVEVfVkVDVE9SLCBcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdGZvcm1hdDogJ3l5eXktTU0tZGQnLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXHRcblx0XG5cdHBvc2l4Y3RWZWN0b3I6IGZ1bmN0aW9uICgpIHsgXG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUlBPU0lYX0RBVEVfVkVDVE9SLCBcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdGZvcm1hdDogJ3l5eXktTU0tZGQgSEg6bW06c3MgWicsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblx0XG5cdGxpc3Q6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5STElTVCwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblx0XG5cdGRhdGFmcmFtZTogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SREFUQUZSQU1FLCBcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFxuXG5cdGZhY3RvcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBvcHRzID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KCB7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJGQUNUT1IsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0b3JkZXJlZDogZmFsc2UsXG5cdFx0XHRsZXZlbHM6IG9wdHMubGV2ZWxzLFxuXHRcdFx0bGFiZWxzOiBvcHRzLmxhYmVscyxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFxuXG5cdG9yZGVyZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgb3B0cyA9IHRoaXMub3B0aW9ucztcblxuXHRcdHJldHVybiB0aGlzLmFzc2VydCggeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5ST1JERVJFRCwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHRvcmRlcmVkOiB0cnVlLFxuXHRcdFx0bGV2ZWxzOiBvcHRzLmxldmVscyxcblx0XHRcdGxhYmVsczogb3B0cy5sYWJlbHMsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcdFx0XG5cblx0bnVtZXJpY01hdHJpeDogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5STlVNRVJJQ19NQVRSSVgsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cblx0aW50ZWdlck1hdHJpeDogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SSU5URUdFUl9NQVRSSVgsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cblx0bG9naWNhbE1hdHJpeDogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SQk9PTEVBTl9NQVRSSVgsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cblx0Y2hhcmFjdGVyTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUlNUUklOR19NQVRSSVgsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cblx0dG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvcHRzICAgPSB0aGlzLm9wdGlvbnMgfHwge30sXG5cdFx0ICAgIGxldmVscyA9IG9wdHMubGV2ZWxzID8gJ1sgbGV2ZWxzID0gJyArIG9wdHMubGV2ZWxzICsgJ10nIDogJycsXG5cdFx0ICAgIGxhYmVscyA9IG9wdHMubGFiZWxzID8gJ1sgbGFiZWxzID0gJyArIG9wdHMubGFiZWxzICsgJ10nIDogJyc7XG5cblx0XHRyZXR1cm4gJ1sgbmFtZSA9ICcgICsgdGhpcy5uYW1lICsgJyBdICcgK1xuXHRcdCAgICAgICAnWyB2YWx1ZSA9ICcgKyB0aGlzLnZhbHVlICsgJyBdICcgK1xuXHRcdCAgICAgICAnWyB0eXBlID0gJyAgKyB0aGlzLnR5cGUgKyAnIF0gJyArXG5cdFx0ICAgICAgIGxldmVscyArIGxhYmVscztcdFx0ICAgICAgIFxuXHR9XG59KTsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxudmFyIEJhc2UgICA9IHJlcXVpcmUoJy4vc2VsZmlzaCcpLkJhc2UsXG4gICAgUlR5cGVzID0gcmVxdWlyZSgnLi9ydHlwZXMnKSxcbiAgICBMYW5nICAgPSByZXF1aXJlKCcuL2xhbmcnKSxcbiAgICBSSW5wdXQgPSByZXF1aXJlKCcuL3JpbnB1dCcpOyBcblxuZnVuY3Rpb24gY3JlYXRlKHR5cGUsIG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG5cdHZhciByaW5wdXQ7XG5cblx0aWYgKExhbmcuaXNPYmplY3QobmFtZSkpIHtcblx0XHRyaW5wdXQgPSBuYW1lO1xuXHRcdGlmICghcmlucHV0LnR5cGUgIT09IHR5cGUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSWxsZWdhbEFyZ3VtZW50RXJyb3I6JyArIFxuXHRcdFx0XHQnRXhwZWN0aW5nIFwiJyArIHR5cGUgKyAnXCIgYnV0IGZvdW5kIFwiJyArIHJpbnB1dC50eXBlICsgJ1wiJyk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHQgICAgcmlucHV0ID0gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSwgb3B0aW9ucylbdHlwZV0oKTtcblx0fSBcblxuXHRyZXR1cm4gcmlucHV0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhc2UuZXh0ZW5kKFJUeXBlcywge1x0XG5cdG51bWVyaWM6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5STlVNRVJJQywgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblx0XG5cdGludGVnZXI6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SSU5URUdFUiwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cdFxuXHRsb2dpY2FsOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUkJPT0xFQU4sIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFxuXHRcblx0Y2hhcmFjdGVyOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUlNUUklORywgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cdFxuXHRkYXRlOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUkRBVEUsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFxuXG5cdHBvc2l4Y3Q6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SUE9TSVhfREFURSwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXHRcblx0XG5cdG51bWVyaWNWZWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUk5VTUVSSUNfVkVDVE9SLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzOyBcblx0fSxcblx0XG5cdGludGVnZXJWZWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SSU5URUdFUl9WRUNUT1IsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFxuXHRcblx0bG9naWNhbFZlY3RvcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7IFxuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SQk9PTEVBTl9WRUNUT1IsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFxuXHRcblx0Y2hhcmFjdGVyVmVjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJTVFJJTkdfVkVDVE9SLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzOyBcblx0fSwgIFxuXHRcblx0ZGF0ZVZlY3RvcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7IFxuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SREFURV9WRUNUT1IsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFx0XG5cdFxuXHRwb3NpeGN0VmVjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJQT1NJWF9EQVRFX1ZFQ1RPUiwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cdFxuXHRsaXN0OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUkxJU1QsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFxuXHRcblx0ZGF0YWZyYW1lOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJEQVRBRlJBTUUsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFx0XG5cblx0ZmFjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGxldmVscywgbGFiZWxzKSB7XG5cdFx0dmFyIG9wdHMgPSB7IGxldmVsczogbGV2ZWxzLCBsYWJlbHM6IGxhYmVscyB9O1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SRkFDVE9SLCBuYW1lLCB2YWx1ZSwgb3B0cykpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdG9yZGVyZWQ6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgbGV2ZWxzLCBsYWJlbHMpIHtcblx0XHR2YXIgb3B0cyA9IHsgbGV2ZWxzOiBsZXZlbHMsIGxhYmVsczogbGFiZWxzIH07XG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJPUkRFUkVELCBuYW1lLCB2YWx1ZSwgb3B0cykpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFx0XHRcblxuXHRudW1lcmljTWF0cml4OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJOVU1FUklDX01BVFJJWCwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cblx0aW50ZWdlck1hdHJpeDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7IFxuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SSU5URUdFUl9NQVRSSVgsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFxuXG5cdGxvZ2ljYWxNYXRyaXg6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUkJPT0xFQU5fTUFUUklYLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzOyBcblx0fSxcblxuXHRjaGFyYWN0ZXJNYXRyaXg6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SU1RSSU5HX01BVFJJWCwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufSk7IiwiLyohXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNCBieSBSZXZvbHV0aW9uIEFuYWx5dGljcyBJbmMuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgVmVyc2lvbiAyLjAgb2YgdGhlXG4gKiBBcGFjaGUgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVRcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVFksIElOQ0xVRElORyBUSE9TRSBPRiBOT04tSU5GUklOR0VNRU5ULFxuICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBQbGVhc2UgcmVmZXIgdG8gdGhlXG4gKiBBcGFjaGUgTGljZW5zZSAyLjAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCkgZm9yIG1vcmUgXG4gKiBkZXRhaWxzLlxuICovXG5cbnZhciBCYXNlID0gcmVxdWlyZSgnLi9zZWxmaXNoJykuQmFzZSxcbiAgICBMYW5nID0gcmVxdWlyZSgnLi9sYW5nJyksXG4gICAgbWFwICA9IHt9OyAvLyBkZXBsb3lyLT5Uby0+UiBjYXRhbG9nXG5cbm1vZHVsZS5leHBvcnRzID0gQmFzZS5leHRlbmQoe1xuXHRyOiB7XG5cdFx0UFJJTUlUSVZFOiAncHJpbWl0aXZlJyxcblx0XHREQVRBRlJBTUU6ICdkYXRhZnJhbWUnLFxuXHRcdExJU1Q6ICdsaXN0Jyxcblx0XHRNQVRSSVg6ICdtYXRyaXgnLFxuXHRcdERBVEU6ICdkYXRlJyxcblx0XHRGQUNUT1I6ICdmYWN0b3InLFxuXHRcdFZFQ1RPUjogJ3ZlY3Rvcidcblx0fSxcblxuXHRkZXBsb3lyOiB7XG5cdFx0UkJPT0xFQU46ICdsb2dpY2FsJyxcblx0XHRSTlVNRVJJQzogJ251bWVyaWMnLFxuXHRcdFJJTlRFR0VSOiAnaW50ZWdlcicsXG5cdFx0UlNUUklORzogJ2NoYXJhY3RlcicsXG5cdFx0UkRBVEU6ICdkYXRlJyxcblx0XHRSUE9TSVhfREFURTogJ3Bvc2l4Y3QnLFxuXHRcdFJCT09MRUFOX1ZFQ1RPUjogJ2xvZ2ljYWxWZWN0b3InLFxuXHRcdFJOVU1FUklDX1ZFQ1RPUjonbnVtZXJpY1ZlY3RvcicsXG5cdFx0UklOVEVHRVJfVkVDVE9SOiAnaW50ZWdlclZlY3RvcicsXHRcblx0XHRSU1RSSU5HX1ZFQ1RPUjogJ2NoYXJhY3RlclZlY3RvcicsXG5cdFx0UkRBVEVfVkVDVE9SOiAnZGF0ZVZlY3RvcicsXG5cdFx0UlBPU0lYX0RBVEVfVkVDVE9SOiAncG9zaXhjdFZlY3RvcicsXG5cdFx0UkxJU1Q6ICdsaXN0Jyxcblx0XHRSREFUQUZSQU1FOiAnZGF0YWZyYW1lJyxcblx0XHRSRkFDVE9SOiAnZmFjdG9yJyxcblx0XHRST1JERVJFRDogJ29yZGVyZWQnLFx0XHRcblx0XHRSQk9PTEVBTl9NQVRSSVg6ICdsb2dpY2FsTWF0cml4Jyxcblx0XHRSTlVNRVJJQ19NQVRSSVg6ICdudW1lcmljTWF0cml4Jyxcblx0XHRSSU5URUdFUl9NQVRSSVg6ICdpbnRlZ2VyTWF0cml4JyxcdFx0XG5cdFx0UlNUUklOR19NQVRSSVg6ICdjaGFyYWN0ZXJNYXRyaXgnXG5cdH0sXG5cblx0aXNEYXRlOiBmdW5jdGlvbih0eXBlKSB7XG5cdFx0cmV0dXJuICh0eXBlID09PSB0aGlzLmRlcGxveXIuUkRBVEUgfHwgXG5cdFx0ICAgICAgICB0eXBlID09PSB0aGlzLmRlcGxveXIuUlBPU0lYX0RBVEUgfHwgXG5cdFx0ICAgICAgICB0eXBlID09PSB0aGlzLmRlcGxveXIuUkRBVEVfVkVDVE9SIHx8XG5cdFx0ICAgICAgICB0eXBlID09PSB0aGlzLmRlcGxveXIuUlBPU0lYX0RBVEVfVkVDVE9SIHx8XG5cdFx0ICAgICAgICB0eXBlID09PSB0aGlzLnIuREFURSk7XG5cdH0sXG5cblx0ZGVwbG95clRvUjogZnVuY3Rpb24odHlwZSkge1x0XG5cdFx0dmFyIGRlcGxveXIgPSB0aGlzLmRlcGxveXIsXG5cdFx0ICAgIHIgICAgICAgPSB0aGlzLnI7XG5cblx0XHRpZiAoIW1hcFt0eXBlXSkgeyAvLyBidWlsZCBjYXRhbG9nIG9ubHkgb25jZVx0XG5cdFx0XHRtYXBbZGVwbG95ci5SQk9PTEVBTl0gICAgICAgICAgID0gci5QUklNSVRJVkU7XG5cdFx0XHRtYXBbZGVwbG95ci5STlVNRVJJQ10gICAgICAgICAgID0gci5QUklNSVRJVkU7XG5cdFx0XHRtYXBbZGVwbG95ci5SSU5URUdFUl0gICAgICAgICAgID0gci5QUklNSVRJVkU7XG5cdFx0XHRtYXBbZGVwbG95ci5SU1RSSU5HXSAgICAgICAgICAgID0gci5QUklNSVRJVkU7XG5cdFx0XHRtYXBbZGVwbG95ci5SREFURV0gICAgICAgICAgICAgID0gci5EQVRFO1xuXHRcdFx0bWFwW2RlcGxveXIuUlBPU0lYX0RBVEVdICAgICAgICA9IHIuREFURTtcblx0XHRcdG1hcFtkZXBsb3lyLlJCT09MRUFOX1ZFQ1RPUl0gICAgPSByLlZFQ1RPUjtcblx0XHRcdG1hcFtkZXBsb3lyLlJOVU1FUklDX1ZFQ1RPUl0gICAgPSByLlZFQ1RPUjtcblx0XHRcdG1hcFtkZXBsb3lyLlJJTlRFR0VSX1ZFQ1RPUl0gICAgPSByLlZFQ1RPUjtcblx0XHRcdG1hcFtkZXBsb3lyLlJTVFJJTkdfVkVDVE9SXSAgICAgPSByLlZFQ1RPUjtcblx0XHRcdG1hcFtkZXBsb3lyLlJEQVRFX1ZFQ1RPUl0gICAgICAgPSByLlZFQ1RPUjtcblx0XHRcdG1hcFtkZXBsb3lyLlJQT1NJWF9EQVRFX1ZFQ1RPUl0gPSByLlZFQ1RPUjtcblx0XHRcdG1hcFtkZXBsb3lyLlJMSVNUXSAgICAgICAgICAgICAgPSByLkxJU1Q7XG5cdFx0XHRtYXBbZGVwbG95ci5SREFUQUZSQU1FXSAgICAgICAgID0gci5EQVRBRlJBTUU7XG5cdFx0XHRtYXBbZGVwbG95ci5SRkFDVE9SXSAgICAgICAgICAgID0gci5GQUNUT1I7XG5cdFx0XHRtYXBbZGVwbG95ci5ST1JERVJFRF0gICAgICAgICAgID0gci5GQUNUT1I7XG5cdFx0XHRtYXBbZGVwbG95ci5SQk9PTEVBTl9NQVRSSVhdICAgID0gci5NQVRSSVg7XG5cdFx0XHRtYXBbZGVwbG95ci5STlVNRVJJQ19NQVRSSVhdICAgID0gci5NQVRSSVg7XG5cdFx0XHRtYXBbZGVwbG95ci5SSU5URUdFUl9NQVRSSVhdICAgID0gci5NQVRSSVg7XG5cdFx0XHRtYXBbZGVwbG95ci5SU1RSSU5HX01BVFJJWF0gICAgID0gci5NQVRSSVg7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcFt0eXBlXTtcdFx0XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFzc2VydCB0aGF0IHRoZSBgcmlucHV0YCB2YWx1ZSBpcyB0aGUgY29ycmVjdCBKYXZhU2NyaXB0IERhdGEgVHlwZS5cblx0ICovXG5cdGFzc2VydDogZnVuY3Rpb24gKHJpbnB1dCkge1xuXHRcdHZhciBkZXBsb3lyID0gdGhpcy5kZXBsb3lyLFxuICAgIFx0XHROT09QICAgID0gbnVsbCxcblx0XHQgICAgdmFsdWVzICA9IHJpbnB1dC52YWx1ZSxcblx0XHQgICAgZm47XG5cblx0XHR2YWx1ZXMgPSAhTGFuZy5pc0FycmF5KHZhbHVlcykgPyBbdmFsdWVzXSA6IHZhbHVlcztcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdmFsdWUgPSB2YWx1ZXNbaV07XG5cblx0XHRcdHN3aXRjaCAocmlucHV0LnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBkZXBsb3lyLlJOVU1FUklDIDpcblx0XHRcdFx0Y2FzZSBkZXBsb3lyLlJOVU1FUklDX1ZFQ1RPUiA6XG5cdFx0XHRcdGNhc2UgZGVwbG95ci5STlVNRVJJQ19WRUNUT1IgOlxuXHRcdFx0XHRmbiA9IExhbmcuaXNOdW1iZXI7XG5cdFx0XHRcdC8vIHN1cHBvcnQgc3RyaW5nIG51bWJlcnNcblx0XHRcdFx0dmFyIHZhbCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXHRcdFx0ICAgIHZhbHVlID0gaXNOYU4odmFsKSA/IHZhbHVlIDogdmFsOyBcblx0XHRcdCAgICBicmVhaztcblxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SSU5URUdFUiA6XG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJJTlRFR0VSX1ZFQ1RPUiA6XG5cdFx0XHQgICAgZm4gPSBMYW5nLmlzTnVtYmVyO1xuXHRcdFx0ICAgIC8vIHN1cHBvcnQgc3RyaW5nIG51bWJlcnNcblx0XHRcdCAgICB2YXIgdmFsID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG5cdFx0XHQgICAgdmFsdWUgPSBpc05hTih2YWwpID8gdmFsdWUgOiB2YWw7IFxuXHRcdFx0ICAgIGJyZWFrO1xuXG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJCT09MRUFOIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUkJPT0xFQU5fVkVDVE9SIDpcblx0XHRcdCAgICBmbiA9IExhbmcuaXNCb29sZWFuO1xuXHRcdFx0ICAgIGJyZWFrO1xuXHRcdFx0ICAgIFxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SU1RSSU5HIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUlNUUklOR19WRUNUT1IgOlx0XG5cdFx0XHQgICAgZm4gPSBMYW5nLmlzU3RyaW5nO1xuXHRcdFx0ICAgIGJyZWFrO1xuXG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJEQVRFIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUlBPU0lYX0RBVEUgOlxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SREFURV9WRUNUT1IgOlxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SUE9TSVhfREFURV9WRUNUT1IgOlxuXHRcdFx0ICAgIGZuID0gTGFuZy5pc0RhdGU7XG5cdFx0XHQgICAgYnJlYWs7XG5cblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUkZBQ1RPUiA6XG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJPUkRFUkVEIDpcdFx0XHQgICAgXG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJEQVRBRlJBTUUgOlxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SSU5URUdFUl9NQVRSSVggOlxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SQk9PTEVBTl9NQVRSSVggOlxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SU1RSSU5HX01BVFJJWCA6XHQgICAgXG5cdFx0XHQgICAgZm4gPSBOT09QO1xuXHRcdFx0ICAgIGJyZWFrXG5cdFx0XHR9XG5cblx0XHRcdGlmIChmbiAmJiAhZm4odmFsdWUpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignUklucHV0Rm9ybWF0RXJyb3I6ICcgKyAnXCInICsgdmFsdWUgKyBcblx0XHRcdFx0XHQnXCIgaXMgbm90IGEgdmFsaWQgXCInICsgcmlucHV0LnR5cGUgKyAnXCIgdHlwZS4nKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmlucHV0O1xuXHR9XG59KTsiLCIvKiFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb3phbGEvc2VsZmlzaFxuICovXG5cbi8qIHZpbTpzZXQgdHM9MiBzdz0yIHN0cz0yIGV4cGFuZHRhYiAqL1xuLypqc2hpbnQgdW5kZWY6IHRydWUgZXM1OiB0cnVlIG5vZGU6IHRydWUgZGV2ZWw6IHRydWUgZXZpbDogdHJ1ZVxuICAgICAgICAgZm9yaW46IHRydWUgbGF0ZWRlZjogZmFsc2Ugc3VwZXJuZXc6IHRydWUgKi9cbi8qZ2xvYmFsIGRlZmluZTogdHJ1ZSAqL1xuXG4hKHR5cGVvZiBkZWZpbmUgIT09IFwiZnVuY3Rpb25cIiA/IGZ1bmN0aW9uKCQpeyAkKG51bGwsIHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyA/IGV4cG9ydHMgOiB3aW5kb3cpOyB9IDogZGVmaW5lKShmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLkJhc2UgPSBPYmplY3QuZnJlZXplKE9iamVjdC5jcmVhdGUoT2JqZWN0LnByb3RvdHlwZSwge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIGB0aGlzYCBvYmplY3QgKEFuYWxvZyBvZlxuICAgKiBgbmV3IE9iamVjdCgpYCkuXG4gICAqIEBleGFtcGxlc1xuICAgKlxuICAgKiAgICB2YXIgRG9nID0gQmFzZS5leHRlbmQoe1xuICAgKiAgICAgIGJhcms6IGZ1bmN0aW9uIGJhcmsoKSB7XG4gICAqICAgICAgICByZXR1cm4gJ1J1ZmYhIFJ1ZmYhJ1xuICAgKiAgICAgIH1cbiAgICogICAgfSk7XG4gICAqICAgIHZhciBkb2cgPSBEb2cubmV3KCk7XG4gICAqL1xuICAnbmV3JzogeyB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgIHZhciBvYmplY3QgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIG9iamVjdC5pbml0aWFsaXplLmFwcGx5KG9iamVjdCwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9fSxcbiAgLyoqXG4gICAqIFdoZW4gbmV3IGluc3RhbmNlIG9mIHRoZSB0aGlzIHByb3RvdHlwZSBpcyBjcmVhdGVkIGl0J3MgYGluaXRpYWxpemVgXG4gICAqIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhbGwgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGBuZXdgLiBZb3UgY2FuXG4gICAqIG92ZXJyaWRlIGBpbml0aWFsaXplYCB0byBzZXQgdXAgYW4gaW5zdGFuY2UuXG4gICAqL1xuICBpbml0aWFsaXplOiB7IHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICB9fSxcbiAgLyoqXG4gICAqIE1lcmdlcyBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBhc3NlZCBvYmplY3RzIGludG8gYHRoaXNgIGluc3RhbmNlIChUaGlzXG4gICAqIG1ldGhvZCBjYW4gYmUgdXNlZCBvbiBpbnN0YW5jZXMgb25seSBhcyBwcm90b3R5cGUgb2JqZWN0cyBhcmUgZnJvemVuKS5cbiAgICpcbiAgICogSWYgdHdvIG9yIG1vcmUgYXJndW1lbnQgb2JqZWN0cyBoYXZlIG93biBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgbmFtZSxcbiAgICogdGhlIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4sIHdpdGggcHJlY2VkZW5jZSBmcm9tIHJpZ2h0IHRvIGxlZnQsIGltcGx5aW5nLFxuICAgKiB0aGF0IHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBvbiB0aGUgbGVmdCBhcmUgb3ZlcnJpZGRlbiBieSBhIHNhbWUgbmFtZWRcbiAgICogcHJvcGVydHkgb2YgdGhlIG9iamVjdCBvbiB0aGUgcmlnaHQuXG4gICAqXG4gICAqIEBleGFtcGxlc1xuICAgKlxuICAgKiAgICB2YXIgUGV0ID0gRG9nLmV4dGVuZCh7XG4gICAqICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShvcHRpb25zKSB7XG4gICAqICAgICAgICAvLyB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgLT4gd291bGQgaGF2ZSB0aHJvd24gKGZyb3plbiBwcm90b3R5cGUpXG4gICAqICAgICAgICB0aGlzLm1lcmdlKG9wdGlvbnMpIC8vIHdpbGwgb3ZlcnJpZGUgYWxsIHByb3BlcnRpZXMuXG4gICAqICAgICAgfSxcbiAgICogICAgICBjYWxsOiBmdW5jdGlvbihuYW1lKSB7XG4gICAqICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBuYW1lID8gdGhpcy5iYXJrKCkgOiAnJ1xuICAgKiAgICAgIH0sXG4gICAqICAgICAgbmFtZTogbnVsbFxuICAgKiAgICB9KVxuICAgKiAgICB2YXIgcGV0ID0gUGV0Lm5ldyh7IG5hbWU6ICdCZW56eScsIGJyZWVkOiAnTGFicmFkb3InIH0pXG4gICAqICAgIHBldC5jYWxsKCdCZW56eScpICAgLy8gJ1J1ZmYhIFJ1ZmYhJ1xuICAgKi9cbiAgbWVyZ2U6IHsgdmFsdWU6IGZ1bmN0aW9uIG1lcmdlKCkge1xuICAgIHZhciBkZXNjcmlwdG9yID0ge307XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhcmd1bWVudHMsIGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgZGVzY3JpcHRvcltuYW1lXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydGllcywgbmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkZXNjcmlwdG9yKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfX0sXG4gIC8qKlxuICAgKiBUYWtlcyBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50IG9iamVjdHMgYW5kIHJldHVybnMgZnJvemVuLCBjb21wb3NpdGUgb2JqZWN0XG4gICAqIHRoYXQgaW5oZXJpdHMgZnJvbSBgdGhpc2Agb2JqZWN0IGFuZCBjb21iaW5lcyBhbGwgb2YgdGhlIG93biBwcm9wZXJ0aWVzIG9mXG4gICAqIHRoZSBhcmd1bWVudCBvYmplY3RzLiAoT2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGFyZSBmcm96ZW4gYXNcbiAgICogdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0eXBlcykuXG4gICAqXG4gICAqIElmIHR3byBvciBtb3JlIGFyZ3VtZW50IG9iamVjdHMgaGF2ZSBvd24gcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIG5hbWUsXG4gICAqIHRoZSBwcm9wZXJ0eSBpcyBvdmVycmlkZGVuLCB3aXRoIHByZWNlZGVuY2UgZnJvbSByaWdodCB0byBsZWZ0LCBpbXBseWluZyxcbiAgICogdGhhdCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3Qgb24gdGhlIGxlZnQgYXJlIG92ZXJyaWRkZW4gYnkgYSBzYW1lIG5hbWVkXG4gICAqIHByb3BlcnR5IG9mIHRoZSBvYmplY3Qgb24gdGhlIHJpZ2h0LlxuICAgKiBAZXhhbXBsZXNcbiAgICpcbiAgICogICAgLy8gIyMgT2JqZWN0IGNvbXBvc2l0aW9uICMjXG4gICAqXG4gICAqICAgIHZhciBIRVggPSBCYXNlLmV4dGVuZCh7XG4gICAqICAgICAgaGV4OiBmdW5jdGlvbiBoZXgoKSB7XG4gICAqICAgICAgICByZXR1cm4gJyMnICsgdGhpcy5jb2xvcjtcbiAgICogICAgICB9XG4gICAqICAgIH0pXG4gICAqXG4gICAqICAgIHZhciBSR0IgPSBCYXNlLmV4dGVuZCh7XG4gICAqICAgICAgcmVkOiBmdW5jdGlvbiByZWQoKSB7XG4gICAqICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5jb2xvci5zdWJzdHIoMCwgMiksIDE2KTtcbiAgICogICAgICB9LFxuICAgKiAgICAgIGdyZWVuOiBmdW5jdGlvbiBncmVlbigpIHtcbiAgICogICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmNvbG9yLnN1YnN0cigyLCAyKSwgMTYpO1xuICAgKiAgICAgIH0sXG4gICAqICAgICAgYmx1ZTogZnVuY3Rpb24gYmx1ZSgpIHtcbiAgICogICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmNvbG9yLnN1YnN0cig0LCAyKSwgMTYpO1xuICAgKiAgICAgIH1cbiAgICogICAgfSlcbiAgICpcbiAgICogICAgdmFyIENNWUsgPSBCYXNlLmV4dGVuZChSR0IsIHtcbiAgICogICAgICBibGFjazogZnVuY3Rpb24gYmxhY2soKSB7XG4gICAqICAgICAgICB2YXIgY29sb3IgPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLnJlZCgpLCB0aGlzLmdyZWVuKCkpLCB0aGlzLmJsdWUoKSk7XG4gICAqICAgICAgICByZXR1cm4gKDEgLSBjb2xvciAvIDI1NSkudG9GaXhlZCg0KTtcbiAgICogICAgICB9LFxuICAgKiAgICAgIGN5YW46IGZ1bmN0aW9uIGN5YW4oKSB7XG4gICAqICAgICAgICB2YXIgSyA9IHRoaXMuYmxhY2soKTtcbiAgICogICAgICAgIHJldHVybiAoKCgxIC0gdGhpcy5yZWQoKSAvIDI1NSkudG9GaXhlZCg0KSAtIEspIC8gKDEgLSBLKSkudG9GaXhlZCg0KTtcbiAgICogICAgICB9LFxuICAgKiAgICAgIG1hZ2VudGE6IGZ1bmN0aW9uIG1hZ2VudGEoKSB7XG4gICAqICAgICAgICB2YXIgSyA9IHRoaXMuYmxhY2soKTtcbiAgICogICAgICAgIHJldHVybiAoKCgxIC0gdGhpcy5ncmVlbigpIC8gMjU1KS50b0ZpeGVkKDQpIC0gSykgLyAoMSAtIEspKS50b0ZpeGVkKDQpO1xuICAgKiAgICAgIH0sXG4gICAqICAgICAgeWVsbG93OiBmdW5jdGlvbiB5ZWxsb3coKSB7XG4gICAqICAgICAgICB2YXIgSyA9IHRoaXMuYmxhY2soKTtcbiAgICogICAgICAgIHJldHVybiAoKCgxIC0gdGhpcy5ibHVlKCkgLyAyNTUpLnRvRml4ZWQoNCkgLSBLKSAvICgxIC0gSykpLnRvRml4ZWQoNCk7XG4gICAqICAgICAgfVxuICAgKiAgICB9KVxuICAgKlxuICAgKiAgICB2YXIgQ29sb3IgPSBCYXNlLmV4dGVuZChIRVgsIFJHQiwgQ01ZSywge1xuICAgKiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIENvbG9yKGNvbG9yKSB7XG4gICAqICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAqICAgICAgfVxuICAgKiAgICB9KTtcbiAgICpcbiAgICogICAgLy8gIyMgUHJvdG90eXBhbCBpbmhlcml0YW5jZSAjI1xuICAgKlxuICAgKiAgICB2YXIgUGl4ZWwgPSBDb2xvci5leHRlbmQoe1xuICAgKiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIFBpeGVsKHgsIHksIGhleCkge1xuICAgKiAgICAgICAgQ29sb3IuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIGhleCk7XG4gICAqICAgICAgICB0aGlzLnggPSB4O1xuICAgKiAgICAgICAgdGhpcy55ID0geTtcbiAgICogICAgICB9LFxuICAgKiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICogICAgICAgIHJldHVybiB0aGlzLnggKyAnOicgKyB0aGlzLnkgKyAnQCcgKyB0aGlzLmhleCgpO1xuICAgKiAgICAgIH1cbiAgICogICAgfSk7XG4gICAqXG4gICAqICAgIHZhciBwaXhlbCA9IFBpeGVsLm5ldygxMSwgMjMsICdDQzMzOTknKVxuICAgKiAgICBwaXhlbC50b1N0cmluZygpOyAvLyAxMToyM0AjQ0MzMzk5XG4gICAqXG4gICAqICAgIHBpeGVsLnJlZCgpOyAgICAgIC8vIDIwNFxuICAgKiAgICBwaXhlbC5ncmVlbigpOyAgICAvLyA1MVxuICAgKiAgICBwaXhlbC5ibHVlKCk7ICAgICAvLyAxNTNcbiAgICpcbiAgICogICAgcGl4ZWwuY3lhbigpOyAgICAgLy8gMC4wMDAwXG4gICAqICAgIHBpeGVsLm1hZ2VudGEoKTsgIC8vIDAuNzUwMFxuICAgKiAgICBwaXhlbC55ZWxsb3coKTsgICAvLyAwLjI1MDBcbiAgICpcbiAgICovXG4gICBleHRlbmQ6IHsgdmFsdWU6IGZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh0aGlzLm1lcmdlLmFwcGx5KE9iamVjdC5jcmVhdGUodGhpcyksIGFyZ3VtZW50cykpO1xuICB9fVxufSkpO1xuXG59KTsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xuXG52YXIgTGFuZyA9IHJlcXVpcmUoJy4vbGFuZycpO1xuXG52YXIgZ2V0ID0gZXhwb3J0cy5nZXQgPSBmdW5jdGlvbihzLCBrZXkpIHtcbiAgICBmdW5jdGlvbiB0cmF2ZXJzZShvYmosIGZuLCBwYXJlbnQpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBbaSwgb2JqW2ldLCBwYXJlbnRdKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmICEob2JqW2ldIGluc3RhbmNlb2YgQXJyYXkpKSB7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlKG9ialtpXSwgZm4sIGkpO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UHJvcGVydHkob2JqLCBwcm9wZXJ0eSkge1xuICAgICAgICB2YXIgYWNjID0ge307XG4gICAgICAgIHRyYXZlcnNlKG9iaiwgZnVuY3Rpb24oa2V5LCB2YWx1ZSwgcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBwcm9wZXJ0eSkgeyAgXG4gICAgICAgICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVtcHR5KG9iaikge1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIG9iaikgeyBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSByZXR1cm4gb2JqOyB9XG4gICAgICAgIHJldHVybiAhTGFuZy5pc09iamVjdChvYmopID8gb2JqIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZW1wdHkoZ2V0UHJvcGVydHkocywga2V5KSk7XG59O1xuXG52YXIgaW5BcnJheSA9IGV4cG9ydHMuaW5BcnJheSA9IGZ1bmN0aW9uKGhheXN0YWNrLCBuZWVkbGUsIGtleSkge1xuICAgIHZhciBpLCBtYXggPSBoYXlzdGFjay5sZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgaWYgKGhheXN0YWNrW2ldW2tleV0gPT09IG5lZWRsZSkgeyByZXR1cm4gaGF5c3RhY2tbaV07IH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChoYXlzdGFja1tpXSA9PT0gbmVlZGxlKSB7IHJldHVybiBoYXlzdGFja1tpXTsgfVxuICAgICAgICB9ICAgXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0cy5tZXJnZSA9IGZ1bmN0aW9uKHRvLCBmcm9tKSB7ICAgICAgICBcbiAgICBpZiAoIXRvIHx8IHR5cGVvZih0bykgIT09ICdvYmplY3QnKSB7IHRvID0ge307IH1cbiAgICBpZiAoIWZyb20gfHwgdHlwZW9mKGZyb20pICE9PSAnb2JqZWN0JykgeyBmcm9tID0ge307IH1cblxuICAgIGZvciAodmFyIGsgaW4gZnJvbSkgeyB0b1trXSA9IGZyb21ba107IH1cblxuICAgIHJldHVybiB0bztcbn07XG5cbmV4cG9ydHMud29ya3NwYWNlID0gZnVuY3Rpb24ob2JqLCBuYW1lKSB7XG4gICAgdmFyIHdzID0gZ2V0KG9iaiwgJ3dvcmtzcGFjZScpO1xuICAgIHJldHVybiAod3MgPyBuYW1lID8gaW5BcnJheSh3cy5vYmplY3RzLCBuYW1lLCAnbmFtZScpIDogd3Mub2JqZWN0cyB8fCB3cy5vYmplY3Q6IG51bGwpO1xufTtcblxuZXhwb3J0cy5zaWduYXR1cmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzWycwJ10sIDApLFxuICAgICAgICBsZW4gICAgPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgY3JlYXRlID0gZmFsc2UsXG4gICAgICAgIG9wdHMgICA9IHt9LFxuICAgICAgICBhcGk7XG5cbiAgICBpZiAobGVuID09PSAxICYmIExhbmcuaXNPYmplY3QoYXJnc1swXSkpIHtcbiAgICAgICAgb3B0cyA9IGFyZ3NbMF07XG4gICAgICAgIGFwaSAgPSBvcHRzLnByb2plY3QgPyAnL3IvcHJvamVjdC9leGVjdXRlL3NjcmlwdCcgOlxuICAgICAgICAgICAgJy9yL3JlcG9zaXRvcnkvc2NyaXB0L2V4ZWN1dGUnO1xuICAgIH0gZWxzZSBpZiAobGVuID09PSAxICYmIExhbmcuaXNTdHJpbmcoYXJnc1swXSkpIHtcbiAgICAgICAgYXJncyA9IGFyZ3NbMF0uc3BsaXQoJ1xcLycpO1xuICAgICAgICBhcGkgID0gJy9yL3JlcG9zaXRvcnkvc2NyaXB0L2V4ZWN1dGUnXG4gICAgICAgIG9wdHMgPSB7XG4gICAgICAgICAgICBhdXRob3I6IGFyZ3NbMV0sXG4gICAgICAgICAgICBkaXJlY3Rvcnk6IGFyZ3NbMl0sXG4gICAgICAgICAgICBmaWxlbmFtZTogYXJnc1szXVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAobGVuID09PSAyKSB7XG4gICAgICAgIC8vIGV4OiAuc2NyaXB0KCcvdGVzdHVzZXIvcm9vdC9EZXBsb3lSIC0gSGVsbG8gV29ybGQuUicsIHByb2plY3QpXG4gICAgICAgIHZhciBwcm9qZWN0ID0gYXJnc1sxXTtcbiAgICAgICAgYXBpID0gcHJvamVjdCA/ICcvci9wcm9qZWN0L2V4ZWN1dGUvc2NyaXB0JyA6ICcvci9yZXBvc2l0b3J5L3NjcmlwdC9leGVjdXRlJztcblxuICAgICAgICBhcmdzID0gYXJnc1swXS5zcGxpdCgnXFwvJyk7XG4gICAgICAgIG9wdHMgPSB7XG4gICAgICAgICAgICBwcm9qZWN0OiBwcm9qZWN0LFxuICAgICAgICAgICAgYXV0aG9yOiBhcmdzWzFdLFxuICAgICAgICAgICAgZGlyZWN0b3J5OiBhcmdzWzJdLFxuICAgICAgICAgICAgZmlsZW5hbWU6IGFyZ3NbM11cbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGxlbiA+IDIpIHtcbiAgICAgICAgLy8gZXg6IC5zY3JpcHQoJ0RlcGxveVIgLSBIZWxsbyBXb3JsZC5SJywgJ3Rlc3R1c2VyJywgJ3Jvb3QnKVxuICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgYXV0aG9yOiBhcmdzWzJdLFxuICAgICAgICAgICAgZGlyZWN0b3J5OiBhcmdzWzFdLFxuICAgICAgICAgICAgZmlsZW5hbWU6IGFyZ3NbMF1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBpbmRpY2F0ZSBhIG5ldyBwcm9qZWN0IHNob3VsZCBiZSBjcmVhdGVkXG4gICAgaWYgKG9wdHMucHJvamVjdCAmJiBMYW5nLmlzQm9vbGVhbihvcHRzLnByb2plY3QpKSB7XG4gICAgICBkZWxldGUgb3B0c1sncHJvamVjdCddO1xuICAgICAgY3JlYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhcGk6IGFwaSxcbiAgICAgICAgb3B0czogb3B0cyxcbiAgICAgICAgY3JlYXRlOiBjcmVhdGVcbiAgICB9O1xufTsiLG51bGwsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudFF1ZXVlO1xuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICBjdXJyZW50UXVldWVbaV0oKTtcbiAgICAgICAgfVxuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG59XG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHF1ZXVlLnB1c2goZnVuKTtcbiAgICBpZiAoIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLyoqXG4qIGF0dGVtcHQgb2YgYSBzaW1wbGUgZGVmZXIvcHJvbWlzZSBsaWJyYXJ5IGZvciBtb2JpbGUgZGV2ZWxvcG1lbnRcbiogQGF1dGhvciBKb25hdGhhbiBHb3R0aSA8IGpnb3R0aSBhdCBqZ290dGkgZG90IG5ldD5cbiogQHNpbmNlIDIwMTItMTBcbiogQHZlcnNpb24gMC42LjBcbiogQGNoYW5nZWxvZ1xuKiAgICAgICAgICAgLSAyMDEzLTEyLTA3IC0gbGFzdCBwcm9taXNlIDEuMSBzcGVjcyB0ZXN0IHBhc3NpbmdzICh0aHggdG8gd2l6YXJkd2VyZG5hKVxuICogICAgICAgICAgICAgICAgICAgICAgIC0gcmVkdWNlIHByb21pc2VzIGZvb3RwcmludCBieSB1bnNjb3BpbmcgbWV0aG9kcyB0aGF0IGNvdWxkIGJlXG4qICAgICAgICAgICAtIDIwMTMtMTAtMjMgLSBtYWtlIGl0IHdvcmtpZyBhY3Jvc3Mgbm9kZS13ZWJraXQgY29udGV4dHNcbiogICAgICAgICAgIC0gMjAxMy0wNy0wMyAtIGJ1ZyBjb3JyZWN0aW9uIGluIHByb21peGlmeSBtZXRob2QgKHRoeCB0byBhZHJpZW4gZ2licmF0IClcbiogICAgICAgICAgIC0gMjAxMy0wNi0yMiAtIGJ1ZyBjb3JyZWN0aW9uIGluIG5vZGVDYXBzdWxlIG1ldGhvZFxuKiAgICAgICAgICAgLSAyMDEzLTA2LTE3IC0gcmVtb3ZlIHVubmVjZXNzYXJ5IEFycmF5LmluZGV4T2YgbWV0aG9kIGRlcGVuZGVuY3lcbiogICAgICAgICAgIC0gMjAxMy0wNC0xOCAtIGFkZCB0cnkvY2F0Y2ggYmxvY2sgYXJvdW5kIG5vZGVDYXBzdWxlZCBtZXRob2RzXG4qICAgICAgICAgICAtIDIwMTMtMDQtMTMgLSBjaGVjayBwcm9taXNlcy9BKyBjb25mb3JtaXR5XG4qICAgICAgICAgICAgICAgICAgICAgICAgLSBtYWtlIHNvbWUgbWluaWNhdGlvbiBvcHRpbWlzYXRpb25zXG4qICAgICAgICAgICAtIDIwMTMtMDMtMjYgLSBhZGQgcmVzb2x2ZWQsIGZ1bGZpbGxlZCBhbmQgcmVqZWN0ZWQgbWV0aG9kc1xuKiAgICAgICAgICAgLSAyMDEzLTAzLTIxIC0gYnJvd3Nlci9ub2RlIGNvbXBhdGlibGVcbiogICAgICAgICAgICAgICAgICAgICAgICAtIG5ldyBtZXRob2Qgbm9kZUNhcHN1bGVcbiogICAgICAgICAgICAgICAgICAgICAgICAtIHNpbXBsZXIgcHJvbWl4aWZ5IHdpdGggZnVsbCBhcGkgc3VwcG9ydFxuKiAgICAgICAgICAgLSAyMDEzLTAxLTI1IC0gYWRkIHJldGhyb3cgbWV0aG9kXG4qICAgICAgICAgICAgICAgICAgICAgICAgLSBuZXh0VGljayBvcHRpbWlzYXRpb24gLT4gYWRkIHN1cHBvcnQgZm9yIHByb2Nlc3MubmV4dFRpY2sgKyBNZXNzYWdlQ2hhbm5lbCB3aGVyZSBhdmFpbGFibGVcbiogICAgICAgICAgIC0gMjAxMi0xMi0yOCAtIGFkZCBhcHBseSBtZXRob2QgdG8gcHJvbWlzZVxuKiAgICAgICAgICAgLSAyMDEyLTEyLTIwIC0gYWRkIGFsd2F5c0FzeW5jIHBhcmFtZXRlcnMgYW5kIHByb3BlcnR5IGZvciBkZWZhdWx0IHNldHRpbmdcbiovXG4oZnVuY3Rpb24odW5kZWYpe1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR2YXIgbmV4dFRpY2tcblx0XHQsIGlzRnVuYyA9IGZ1bmN0aW9uKGYpeyByZXR1cm4gKCB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyApOyB9XG5cdFx0LCBpc0FycmF5ID0gZnVuY3Rpb24oYSl7IHJldHVybiBBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheShhKSA6IChhIGluc3RhbmNlb2YgQXJyYXkpOyB9XG5cdFx0LCBpc09iak9yRnVuYyA9IGZ1bmN0aW9uKG8peyByZXR1cm4gISEobyAmJiAodHlwZW9mIG8pLm1hdGNoKC9mdW5jdGlvbnxvYmplY3QvKSk7IH1cblx0XHQsIGlzTm90VmFsID0gZnVuY3Rpb24odil7IHJldHVybiAodiA9PT0gZmFsc2UgfHwgdiA9PT0gdW5kZWYgfHwgdiA9PT0gbnVsbCk7IH1cblx0XHQsIHNsaWNlID0gZnVuY3Rpb24oYSwgb2Zmc2V0KXsgcmV0dXJuIFtdLnNsaWNlLmNhbGwoYSwgb2Zmc2V0KTsgfVxuXHRcdCwgdW5kZWZTdHIgPSAndW5kZWZpbmVkJ1xuXHRcdCwgdEVyciA9IHR5cGVvZiBUeXBlRXJyb3IgPT09IHVuZGVmU3RyID8gRXJyb3IgOiBUeXBlRXJyb3Jcblx0O1xuXHRpZiAoICh0eXBlb2YgcHJvY2VzcyAhPT0gdW5kZWZTdHIpICYmIHByb2Nlc3MubmV4dFRpY2sgKSB7XG5cdFx0bmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrO1xuXHR9IGVsc2UgaWYgKCB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09IHVuZGVmU3RyICkge1xuXHRcdHZhciBudGlja0NoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKSwgcXVldWUgPSBbXTtcblx0XHRudGlja0NoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oKXsgcXVldWUubGVuZ3RoICYmIChxdWV1ZS5zaGlmdCgpKSgpOyB9O1xuXHRcdG5leHRUaWNrID0gZnVuY3Rpb24oY2Ipe1xuXHRcdFx0cXVldWUucHVzaChjYik7XG5cdFx0XHRudGlja0NoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRuZXh0VGljayA9IGZ1bmN0aW9uKGNiKXsgc2V0VGltZW91dChjYiwgMCk7IH07XG5cdH1cblx0ZnVuY3Rpb24gcmV0aHJvdyhlKXsgbmV4dFRpY2soZnVuY3Rpb24oKXsgdGhyb3cgZTt9KTsgfVxuXG5cdC8qKlxuXHQgKiBAdHlwZWRlZiBkZWZlcnJlZFxuXHQgKiBAcHJvcGVydHkge3Byb21pc2V9IHByb21pc2Vcblx0ICogQG1ldGhvZCByZXNvbHZlXG5cdCAqIEBtZXRob2QgZnVsZmlsbFxuXHQgKiBAbWV0aG9kIHJlamVjdFxuXHQgKi9cblxuXHQvKipcblx0ICogQHR5cGVkZWYge2Z1bmN0aW9ufSBmdWxmaWxsZWRcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBwcm9taXNlIHJlc29sdmVkIHZhbHVlXG5cdCAqIEByZXR1cm5zIHsqfSBuZXh0IHByb21pc2UgcmVzb2x1dGlvbiB2YWx1ZVxuXHQgKi9cblxuXHQvKipcblx0ICogQHR5cGVkZWYge2Z1bmN0aW9ufSBmYWlsZWRcblx0ICogQHBhcmFtIHsqfSByZWFzb24gcHJvbWlzZSByZWplY3Rpb24gcmVhc29uXG5cdCAqIEByZXR1cm5zIHsqfSBuZXh0IHByb21pc2UgcmVzb2x1dGlvbiB2YWx1ZSBvciByZXRocm93IHRoZSByZWFzb25cblx0ICovXG5cblx0Ly8tLSBkZWZpbmluZyB1bmVuY2xvc2VkIHByb21pc2UgbWV0aG9kcyAtLS8vXG5cdC8qKlxuXHQgKiBzYW1lIGFzIHRoZW4gd2l0aG91dCBmYWlsZWQgY2FsbGJhY2tcblx0ICogQHBhcmFtIHtmdWxmaWxsZWR9IGZ1bGZpbGxlZCBjYWxsYmFja1xuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gYSBuZXcgcHJvbWlzZVxuXHQgKi9cblx0ZnVuY3Rpb24gcHJvbWlzZV9zdWNjZXNzKGZ1bGZpbGxlZCl7IHJldHVybiB0aGlzLnRoZW4oZnVsZmlsbGVkLCB1bmRlZik7IH1cblxuXHQvKipcblx0ICogc2FtZSBhcyB0aGVuIHdpdGggb25seSBhIGZhaWxlZCBjYWxsYmFja1xuXHQgKiBAcGFyYW0ge2ZhaWxlZH0gZmFpbGVkIGNhbGxiYWNrXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfSBhIG5ldyBwcm9taXNlXG5cdCAqL1xuXHRmdW5jdGlvbiBwcm9taXNlX2Vycm9yKGZhaWxlZCl7IHJldHVybiB0aGlzLnRoZW4odW5kZWYsIGZhaWxlZCk7IH1cblxuXG5cdC8qKlxuXHQgKiBzYW1lIGFzIHRoZW4gYnV0IGZ1bGZpbGxlZCBjYWxsYmFjayB3aWxsIHJlY2VpdmUgbXVsdGlwbGUgcGFyYW1ldGVycyB3aGVuIHByb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gQXJyYXlcblx0ICogQHBhcmFtIHtmdWxmaWxsZWR9IGZ1bGZpbGxlZCBjYWxsYmFja1xuXHQgKiBAcGFyYW0ge2ZhaWxlZH0gZmFpbGVkIGNhbGxiYWNrXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfSBhIG5ldyBwcm9taXNlXG5cdCAqL1xuXHRmdW5jdGlvbiBwcm9taXNlX2FwcGx5KGZ1bGZpbGxlZCwgZmFpbGVkKXtcblx0XHRyZXR1cm4gdGhpcy50aGVuKFxuXHRcdFx0ZnVuY3Rpb24oYSl7XG5cdFx0XHRcdHJldHVybiBpc0Z1bmMoZnVsZmlsbGVkKSA/IGZ1bGZpbGxlZC5hcHBseShudWxsLCBpc0FycmF5KGEpID8gYSA6IFthXSkgOiAoZGVmZXIub25seUZ1bmNzID8gYSA6IGZ1bGZpbGxlZCk7XG5cdFx0XHR9XG5cdFx0XHQsIGZhaWxlZCB8fCB1bmRlZlxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogY2xlYW51cCBtZXRob2Qgd2hpY2ggd2lsbCBiZSBhbHdheXMgZXhlY3V0ZWQgcmVnYXJkbGVzcyBmdWxmaWxsbWVudCBvciByZWplY3Rpb25cblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gY2IgYSBjYWxsYmFjayBjYWxsZWQgcmVnYXJkbGVzcyBvZiB0aGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIG9mIHRoZSBwcm9taXNlIHdoaWNoIHdpbGwgYmUgY2FsbGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHByb21pc2UgaXMgbm90IHBlbmRpbmcgYW55bW9yZVxuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gdGhlIHNhbWUgcHJvbWlzZSB1bnRvdWNoZWRcblx0ICovXG5cdGZ1bmN0aW9uIHByb21pc2VfZW5zdXJlKGNiKXtcblx0XHRmdW5jdGlvbiBfY2IoKXsgY2IoKTsgfVxuXHRcdHRoaXMudGhlbihfY2IsIF9jYik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogdGFrZSBhIHNpbmdsZSBjYWxsYmFjayB3aGljaCB3YWl0IGZvciBhbiBlcnJvciBhcyBmaXJzdCBwYXJhbWV0ZXIuIG90aGVyIHJlc29sdXRpb24gdmFsdWVzIGFyZSBwYXNzZWQgYXMgd2l0aCB0aGUgYXBwbHkvc3ByZWFkIG1ldGhvZFxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYiBhIGNhbGxiYWNrIGNhbGxlZCByZWdhcmRsZXNzIG9mIHRoZSBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gb2YgdGhlIHByb21pc2Ugd2hpY2ggd2lsbCBiZSBjYWxsZWRcblx0ICogICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgcHJvbWlzZSBpcyBub3QgcGVuZGluZyBhbnltb3JlIHdpdGggZXJyb3IgYXMgZmlyc3QgcGFyYW1ldGVyIGlmIGFueSBhcyBpbiBub2RlIHN0eWxlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiBSZXN0IG9mIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBsaWVkIGFzIHdpdGggdGhlIGFwcGx5IG1ldGhvZC5cblx0ICogQHJldHVybnMge3Byb21pc2V9IGEgbmV3IHByb21pc2Vcblx0ICovXG5cdGZ1bmN0aW9uIHByb21pc2Vfbm9kaWZ5KGNiKXtcblx0XHRyZXR1cm4gdGhpcy50aGVuKFxuXHRcdFx0ZnVuY3Rpb24oYSl7XG5cdFx0XHRcdHJldHVybiBpc0Z1bmMoY2IpID8gY2IuYXBwbHkobnVsbCwgaXNBcnJheShhKSA/IGEuc3BsaWNlKDAsMCx1bmRlZmluZWQpICYmIGEgOiBbdW5kZWZpbmVkLGFdKSA6IChkZWZlci5vbmx5RnVuY3MgPyBhIDogY2IpO1xuXHRcdFx0fVxuXHRcdFx0LCBmdW5jdGlvbihlKXtcblx0XHRcdFx0cmV0dXJuIGNiKGUpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gW2ZhaWxlZF0gd2l0aG91dCBwYXJhbWV0ZXIgd2lsbCBvbmx5IHJldGhyb3cgcHJvbWlzZSByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgb2YgdGhlIHByb21pc2UgbGlicmFyeSBvbiBuZXh0IHRpY2tcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGFzc2VkIGEgZmFpbGVkIG1ldGhvZCB0aGVuIHdpbGwgY2FsbCBmYWlsZWQgb24gcmVqZWN0aW9uIGFuZCB0aHJvdyB0aGUgZXJyb3IgYWdhaW4gaWYgZmFpbGVkIGRpZG4ndFxuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gYSBuZXcgcHJvbWlzZVxuXHQgKi9cblx0ZnVuY3Rpb24gcHJvbWlzZV9yZXRocm93KGZhaWxlZCl7XG5cdFx0cmV0dXJuIHRoaXMudGhlbihcblx0XHRcdHVuZGVmXG5cdFx0XHQsIGZhaWxlZCA/IGZ1bmN0aW9uKGUpeyBmYWlsZWQoZSk7IHRocm93IGU7IH0gOiByZXRocm93XG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQqIEBwYXJhbSB7Ym9vbGVhbn0gW2Fsd2F5c0FzeW5jXSBpZiBzZXQgZm9yY2UgdGhlIGFzeW5jIHJlc29sdXRpb24gZm9yIHRoaXMgcHJvbWlzZSBpbmRlcGVuZGFudGx5IG9mIHRoZSBELmFsd2F5c0FzeW5jIG9wdGlvblxuXHQqIEByZXR1cm5zIHtkZWZlcnJlZH0gZGVmZXJlZCBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAncHJvbWlzZScgYW5kIG1ldGhvZHMgcmVqZWN0LGZ1bGZpbGwscmVzb2x2ZSAoZnVsZmlsbCBiZWluZyBhbiBhbGlhcyBmb3IgcmVzb2x2ZSlcblx0Ki9cblx0dmFyIGRlZmVyID0gZnVuY3Rpb24gKGFsd2F5c0FzeW5jKXtcblx0XHR2YXIgYWx3YXlzQXN5bmNGbiA9ICh1bmRlZiAhPT0gYWx3YXlzQXN5bmMgPyBhbHdheXNBc3luYyA6IGRlZmVyLmFsd2F5c0FzeW5jKSA/IG5leHRUaWNrIDogZnVuY3Rpb24oZm4pe2ZuKCk7fVxuXHRcdFx0LCBzdGF0dXMgPSAwIC8vIC0xIGZhaWxlZCB8IDEgZnVsZmlsbGVkXG5cdFx0XHQsIHBlbmRpbmdzID0gW11cblx0XHRcdCwgdmFsdWVcblx0XHRcdC8qKlxuXHRcdFx0ICogQHR5cGVkZWYgcHJvbWlzZVxuXHRcdFx0ICovXG5cdFx0XHQsIF9wcm9taXNlICA9IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIEBwYXJhbSB7ZnVsZmlsbGVkfGZ1bmN0aW9ufSBmdWxmaWxsZWQgY2FsbGJhY2tcblx0XHRcdFx0ICogQHBhcmFtIHtmYWlsZWR8ZnVuY3Rpb259IGZhaWxlZCBjYWxsYmFja1xuXHRcdFx0XHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gYSBuZXcgcHJvbWlzZVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oZnVsZmlsbGVkLCBmYWlsZWQpe1xuXHRcdFx0XHRcdHZhciBkID0gZGVmZXIoKTtcblx0XHRcdFx0XHRwZW5kaW5ncy5wdXNoKFtcblx0XHRcdFx0XHRcdGZ1bmN0aW9uKHZhbHVlKXtcblx0XHRcdFx0XHRcdFx0dHJ5e1xuXHRcdFx0XHRcdFx0XHRcdGlmKCBpc05vdFZhbChmdWxmaWxsZWQpKXtcblx0XHRcdFx0XHRcdFx0XHRcdGQucmVzb2x2ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGQucmVzb2x2ZShpc0Z1bmMoZnVsZmlsbGVkKSA/IGZ1bGZpbGxlZCh2YWx1ZSkgOiAoZGVmZXIub25seUZ1bmNzID8gdmFsdWUgOiBmdWxmaWxsZWQpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1jYXRjaChlKXtcblx0XHRcdFx0XHRcdFx0XHRkLnJlamVjdChlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LCBmdW5jdGlvbihlcnIpe1xuXHRcdFx0XHRcdFx0XHRpZiAoIGlzTm90VmFsKGZhaWxlZCkgfHwgKCghaXNGdW5jKGZhaWxlZCkpICYmIGRlZmVyLm9ubHlGdW5jcykgKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZC5yZWplY3QoZXJyKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoIGZhaWxlZCApIHtcblx0XHRcdFx0XHRcdFx0XHR0cnl7IGQucmVzb2x2ZShpc0Z1bmMoZmFpbGVkKSA/IGZhaWxlZChlcnIpIDogZmFpbGVkKTsgfWNhdGNoKGUpeyBkLnJlamVjdChlKTt9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRzdGF0dXMgIT09IDAgJiYgYWx3YXlzQXN5bmNGbihleGVjQ2FsbGJhY2tzKTtcblx0XHRcdFx0XHRyZXR1cm4gZC5wcm9taXNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LCBzdWNjZXNzOiBwcm9taXNlX3N1Y2Nlc3NcblxuXHRcdFx0XHQsIGVycm9yOiBwcm9taXNlX2Vycm9yXG5cdFx0XHRcdCwgb3RoZXJ3aXNlOiBwcm9taXNlX2Vycm9yXG5cblx0XHRcdFx0LCBhcHBseTogcHJvbWlzZV9hcHBseVxuXHRcdFx0XHQsIHNwcmVhZDogcHJvbWlzZV9hcHBseVxuXG5cdFx0XHRcdCwgZW5zdXJlOiBwcm9taXNlX2Vuc3VyZVxuXG5cdFx0XHRcdCwgbm9kaWZ5OiBwcm9taXNlX25vZGlmeVxuXG5cdFx0XHRcdCwgcmV0aHJvdzogcHJvbWlzZV9yZXRocm93XG5cblx0XHRcdFx0LCBpc1BlbmRpbmc6IGZ1bmN0aW9uKCl7IHJldHVybiAhIShzdGF0dXMgPT09IDApOyB9XG5cblx0XHRcdFx0LCBnZXRTdGF0dXM6IGZ1bmN0aW9uKCl7IHJldHVybiBzdGF0dXM7IH1cblx0XHRcdH1cblx0XHQ7XG5cdFx0X3Byb21pc2UudG9Tb3VyY2UgPSBfcHJvbWlzZS50b1N0cmluZyA9IF9wcm9taXNlLnZhbHVlT2YgPSBmdW5jdGlvbigpe3JldHVybiB2YWx1ZSA9PT0gdW5kZWYgPyB0aGlzIDogdmFsdWU7IH07XG5cblxuXHRcdGZ1bmN0aW9uIGV4ZWNDYWxsYmFja3MoKXtcblx0XHRcdGlmICggc3RhdHVzID09PSAwICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR2YXIgY2JzID0gcGVuZGluZ3MsIGkgPSAwLCBsID0gY2JzLmxlbmd0aCwgY2JJbmRleCA9IH5zdGF0dXMgPyAwIDogMSwgY2I7XG5cdFx0XHRwZW5kaW5ncyA9IFtdO1xuXHRcdFx0Zm9yKCA7IGkgPCBsOyBpKysgKXtcblx0XHRcdFx0KGNiID0gY2JzW2ldW2NiSW5kZXhdKSAmJiBjYih2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogZnVsZmlsbCBkZWZlcnJlZCB3aXRoIGdpdmVuIHZhbHVlXG5cdFx0ICogQHBhcmFtIHsqfSB2YWxcblx0XHQgKiBAcmV0dXJucyB7ZGVmZXJyZWR9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIF9yZXNvbHZlKHZhbCl7XG5cdFx0XHR2YXIgZG9uZSA9IGZhbHNlO1xuXHRcdFx0ZnVuY3Rpb24gb25jZShmKXtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKHgpe1xuXHRcdFx0XHRcdGlmIChkb25lKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRkb25lID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHJldHVybiBmKHgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGlmICggc3RhdHVzICkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciB0aGVuID0gaXNPYmpPckZ1bmModmFsKSAmJiB2YWwudGhlbjtcblx0XHRcdFx0aWYgKCBpc0Z1bmModGhlbikgKSB7IC8vIG1hbmFnaW5nIGEgcHJvbWlzZVxuXHRcdFx0XHRcdGlmKCB2YWwgPT09IF9wcm9taXNlICl7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgdEVycihcIlByb21pc2UgY2FuJ3QgcmVzb2x2ZSBpdHNlbGZcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoZW4uY2FsbCh2YWwsIG9uY2UoX3Jlc29sdmUpLCBvbmNlKF9yZWplY3QpKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvbmNlKF9yZWplY3QpKGUpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHRcdGFsd2F5c0FzeW5jRm4oZnVuY3Rpb24oKXtcblx0XHRcdFx0dmFsdWUgPSB2YWw7XG5cdFx0XHRcdHN0YXR1cyA9IDE7XG5cdFx0XHRcdGV4ZWNDYWxsYmFja3MoKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogcmVqZWN0IGRlZmVycmVkIHdpdGggZ2l2ZW4gcmVhc29uXG5cdFx0ICogQHBhcmFtIHsqfSBFcnJcblx0XHQgKiBAcmV0dXJucyB7ZGVmZXJyZWR9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIF9yZWplY3QoRXJyKXtcblx0XHRcdHN0YXR1cyB8fCBhbHdheXNBc3luY0ZuKGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHRyeXsgdGhyb3coRXJyKTsgfWNhdGNoKGUpeyB2YWx1ZSA9IGU7IH1cblx0XHRcdFx0c3RhdHVzID0gLTE7XG5cdFx0XHRcdGV4ZWNDYWxsYmFja3MoKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdHJldHVybiAvKipAdHlwZSBkZWZlcnJlZCAqLyB7XG5cdFx0XHRwcm9taXNlOl9wcm9taXNlXG5cdFx0XHQscmVzb2x2ZTpfcmVzb2x2ZVxuXHRcdFx0LGZ1bGZpbGw6X3Jlc29sdmUgLy8gYWxpYXNcblx0XHRcdCxyZWplY3Q6X3JlamVjdFxuXHRcdH07XG5cdH07XG5cblx0ZGVmZXIuZGVmZXJyZWQgPSBkZWZlci5kZWZlciA9IGRlZmVyO1xuXHRkZWZlci5uZXh0VGljayA9IG5leHRUaWNrO1xuXHRkZWZlci5hbHdheXNBc3luYyA9IHRydWU7IC8vIHNldHRpbmcgdGhpcyB3aWxsIGNoYW5nZSBkZWZhdWx0IGJlaGF2aW91ci4gdXNlIGl0IG9ubHkgaWYgbmVjZXNzYXJ5IGFzIGFzeW5jaHJvbmljaXR5IHdpbGwgZm9yY2Ugc29tZSBkZWxheSBiZXR3ZWVuIHlvdXIgcHJvbWlzZSByZXNvbHV0aW9ucyBhbmQgaXMgbm90IGFsd2F5cyB3aGF0IHlvdSB3YW50LlxuXHQvKipcblx0KiBzZXR0aW5nIG9ubHlGdW5jcyB0byBmYWxzZSB3aWxsIGJyZWFrIHByb21pc2VzL0ErIGNvbmZvcm1pdHkgYnkgYWxsb3dpbmcgeW91IHRvIHBhc3Mgbm9uIHVuZGVmaW5lZC9udWxsIHZhbHVlcyBpbnN0ZWFkIG9mIGNhbGxiYWNrc1xuXHQqIGluc3RlYWQgb2YganVzdCBpZ25vcmluZyBhbnkgbm9uIGZ1bmN0aW9uIHBhcmFtZXRlcnMgdG8gdGhlbixzdWNjZXNzLGVycm9yLi4uIGl0IHdpbGwgYWNjZXB0IG5vbiBudWxsfHVuZGVmaW5lZCB2YWx1ZXMuXG5cdCogdGhpcyB3aWxsIGFsbG93IHlvdSBzaG9ydGN1dHMgbGlrZSBwcm9taXNlLnRoZW4oJ3ZhbCcsJ2hhbmRsZWQgZXJyb3InJylcblx0KiB0byBiZSBlcXVpdmFsZW50IG9mIHByb21pc2UudGhlbihmdW5jdGlvbigpeyByZXR1cm4gJ3ZhbCc7fSxmdW5jdGlvbigpeyByZXR1cm4gJ2hhbmRsZWQgZXJyb3InfSlcblx0Ki9cblx0ZGVmZXIub25seUZ1bmNzID0gdHJ1ZTtcblxuXHQvKipcblx0ICogcmV0dXJuIGEgZnVsZmlsbGVkIHByb21pc2Ugb2YgZ2l2ZW4gdmFsdWUgKGFsd2F5cyBhc3luYyByZXNvbHV0aW9uKVxuXHQgKiBAcGFyYW0geyp9IHZhbHVlXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfVxuXHQgKi9cblx0ZGVmZXIucmVzb2x2ZWQgPSBkZWZlci5mdWxmaWxsZWQgPSBmdW5jdGlvbih2YWx1ZSl7IHJldHVybiBkZWZlcih0cnVlKS5yZXNvbHZlKHZhbHVlKS5wcm9taXNlOyB9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm4gYSByZWplY3RlZCBwcm9taXNlIHdpdGggZ2l2ZW4gcmVhc29uIG9mIHJlamVjdGlvbiAoYWx3YXlzIGFzeW5jIHJlamVjdGlvbilcblx0ICogQHBhcmFtIHsqfSByZWFzb25cblx0ICogQHJldHVybnMge3Byb21pc2V9XG5cdCAqL1xuXHRkZWZlci5yZWplY3RlZCA9IGZ1bmN0aW9uKHJlYXNvbil7IHJldHVybiBkZWZlcih0cnVlKS5yZWplY3QocmVhc29uKS5wcm9taXNlOyB9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm4gYSBwcm9taXNlIHdpdGggbm8gcmVzb2x1dGlvbiB2YWx1ZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIGluIHRpbWUgbXMgKHVzaW5nIHNldFRpbWVvdXQpXG5cdCAqIEBwYXJhbSB7aW50fSBbdGltZV0gaW4gbXMgZGVmYXVsdCB0byAwXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfVxuXHQgKi9cblx0ZGVmZXIud2FpdCA9IGZ1bmN0aW9uKHRpbWUpe1xuXHRcdHZhciBkID0gZGVmZXIoKTtcblx0XHRzZXRUaW1lb3V0KGQucmVzb2x2ZSwgdGltZSB8fCAwKTtcblx0XHRyZXR1cm4gZC5wcm9taXNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIGZ1bmN0aW9uIGNhbGwgd2hpY2ggd2lsbCBiZSBmdWxmaWxsZWQgaW4gZGVsYXkgbXMgb3IgcmVqZWN0ZWQgaWYgZ2l2ZW4gZm4gdGhyb3cgYW4gZXJyb3Jcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gZm5cblx0ICogQHBhcmFtIHtpbnR9IFtkZWxheV0gaW4gbXMgZGVmYXVsdCB0byAwXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfVxuXHQgKi9cblx0ZGVmZXIuZGVsYXkgPSBmdW5jdGlvbihmbiwgZGVsYXkpe1xuXHRcdHZhciBkID0gZGVmZXIoKTtcblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IHRyeXsgZC5yZXNvbHZlKGZuLmFwcGx5KG51bGwpKTsgfWNhdGNoKGUpeyBkLnJlamVjdChlKTsgfSB9LCBkZWxheSB8fCAwKTtcblx0XHRyZXR1cm4gZC5wcm9taXNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBpZiBnaXZlbiB2YWx1ZSBpcyBub3QgYSBwcm9taXNlIHJldHVybiBhIGZ1bGZpbGxlZCBwcm9taXNlIHJlc29sdmVkIHRvIGdpdmVuIHZhbHVlXG5cdCAqIEBwYXJhbSB7Kn0gcHJvbWlzZSBhIHZhbHVlIG9yIGEgcHJvbWlzZVxuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX1cblx0ICovXG5cdGRlZmVyLnByb21pc2lmeSA9IGZ1bmN0aW9uKHByb21pc2Upe1xuXHRcdGlmICggcHJvbWlzZSAmJiBpc0Z1bmMocHJvbWlzZS50aGVuKSApIHsgcmV0dXJuIHByb21pc2U7fVxuXHRcdHJldHVybiBkZWZlci5yZXNvbHZlZChwcm9taXNlKTtcblx0fTtcblxuXHRmdW5jdGlvbiBtdWx0aVByb21pc2VSZXNvbHZlcihjYWxsZXJBcmd1bWVudHMsIHJldHVyblByb21pc2VzKXtcblx0XHR2YXIgcHJvbWlzZXMgPSBzbGljZShjYWxsZXJBcmd1bWVudHMpO1xuXHRcdGlmICggcHJvbWlzZXMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkocHJvbWlzZXNbMF0pICkge1xuXHRcdFx0aWYoISBwcm9taXNlc1swXS5sZW5ndGggKXtcblx0XHRcdFx0cmV0dXJuIGRlZmVyLmZ1bGZpbGxlZChbXSk7XG5cdFx0XHR9XG5cdFx0XHRwcm9taXNlcyA9IHByb21pc2VzWzBdO1xuXHRcdH1cblx0XHR2YXIgYXJncyA9IFtdXG5cdFx0XHQsIGQgPSBkZWZlcigpXG5cdFx0XHQsIGMgPSBwcm9taXNlcy5sZW5ndGhcblx0XHQ7XG5cdFx0aWYgKCAhYyApIHtcblx0XHRcdGQucmVzb2x2ZShhcmdzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJlc29sdmVyID0gZnVuY3Rpb24oaSl7XG5cdFx0XHRcdHByb21pc2VzW2ldID0gZGVmZXIucHJvbWlzaWZ5KHByb21pc2VzW2ldKTtcblx0XHRcdFx0cHJvbWlzZXNbaV0udGhlbihcblx0XHRcdFx0XHRmdW5jdGlvbih2KXtcblx0XHRcdFx0XHRcdGlmICghIChpIGluIGFyZ3MpICkgeyAvL0B0b2RvIGNoZWNrIHRoaXMgaXMgc3RpbGwgcmVxdWlyZWQgYXMgcHJvbWlzZXMgY2FuJ3QgYmUgcmVzb2x2ZSBtb3JlIHRoYW4gb25jZVxuXHRcdFx0XHRcdFx0XHRhcmdzW2ldID0gcmV0dXJuUHJvbWlzZXMgPyBwcm9taXNlc1tpXSA6IHY7XG5cdFx0XHRcdFx0XHRcdCgtLWMpIHx8IGQucmVzb2x2ZShhcmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LCBmdW5jdGlvbihlKXtcblx0XHRcdFx0XHRcdGlmKCEgKGkgaW4gYXJncykgKXtcblx0XHRcdFx0XHRcdFx0aWYoICEgcmV0dXJuUHJvbWlzZXMgKXtcblx0XHRcdFx0XHRcdFx0XHRkLnJlamVjdChlKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRhcmdzW2ldID0gcHJvbWlzZXNbaV07XG5cdFx0XHRcdFx0XHRcdFx0KC0tYykgfHwgZC5yZXNvbHZlKGFyZ3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblx0XHRcdGZvciggdmFyIGkgPSAwLCBsID0gYzsgaSA8IGw7IGkrKyApe1xuXHRcdFx0XHRyZXNvbHZlcihpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGQucHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm4gYSBwcm9taXNlIGZvciBhbGwgZ2l2ZW4gcHJvbWlzZXMgLyB2YWx1ZXMuXG5cdCAqIHRoZSByZXR1cm5lZCBwcm9taXNlcyB3aWxsIGJlIGZ1bGZpbGxlZCB3aXRoIGEgbGlzdCBvZiByZXNvbHZlZCB2YWx1ZS5cblx0ICogaWYgYW55IGdpdmVuIHByb21pc2UgaXMgcmVqZWN0ZWQgdGhlbiBvbiB0aGUgZmlyc3QgcmVqZWN0aW9uIHRoZSByZXR1cm5lZCBwcm9taXNlZCB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWUgcmVhc29uXG5cdCAqIEBwYXJhbSB7YXJyYXl8Li4uKn0gW3Byb21pc2VdIGNhbiBiZSBhIHNpbmdsZSBhcnJheSBvZiBwcm9taXNlL3ZhbHVlcyBhcyBmaXJzdCBwYXJhbWV0ZXIgb3IgYSBsaXN0IG9mIGRpcmVjdCBwYXJhbWV0ZXJzIHByb21pc2UvdmFsdWVcblx0ICogQHJldHVybnMge3Byb21pc2V9IG9mIGEgbGlzdCBvZiBnaXZlbiBwcm9taXNlIHJlc29sdXRpb24gdmFsdWVcblx0ICovXG5cdGRlZmVyLmFsbCA9IGZ1bmN0aW9uKCl7IHJldHVybiBtdWx0aVByb21pc2VSZXNvbHZlcihhcmd1bWVudHMsZmFsc2UpOyB9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm4gYW4gYWx3YXlzIGZ1bGZpbGxlZCBwcm9taXNlIG9mIGFycmF5PHByb21pc2U+IGxpc3Qgb2YgcHJvbWlzZXMvdmFsdWVzIHJlZ2FyZGxlc3MgdGhleSByZXNvbHZlIGZ1bGZpbGxlZCBvciByZWplY3RlZFxuXHQgKiBAcGFyYW0ge2FycmF5fC4uLip9IFtwcm9taXNlXSBjYW4gYmUgYSBzaW5nbGUgYXJyYXkgb2YgcHJvbWlzZS92YWx1ZXMgYXMgZmlyc3QgcGFyYW1ldGVyIG9yIGEgbGlzdCBvZiBkaXJlY3QgcGFyYW1ldGVycyBwcm9taXNlL3ZhbHVlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgKG5vbiBwcm9taXNlIHZhbHVlcyB3aWxsIGJlIHByb21pc2lmaWVkKVxuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gb2YgdGhlIGxpc3Qgb2YgZ2l2ZW4gcHJvbWlzZXNcblx0ICovXG5cdGRlZmVyLnJlc29sdmVBbGwgPSBmdW5jdGlvbigpeyByZXR1cm4gbXVsdGlQcm9taXNlUmVzb2x2ZXIoYXJndW1lbnRzLHRydWUpOyB9O1xuXG5cdC8qKlxuXHQgKiB0cmFuc2Zvcm0gYSB0eXBpY2FsIG5vZGVqcyBhc3luYyBtZXRob2QgYXdhaXRpbmcgYSBjYWxsYmFjayBhcyBsYXN0IHBhcmFtZXRlciwgcmVjZWl2aW5nIGVycm9yIGFzIGZpcnN0IHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uIHRoYXRcblx0ICogd2lsbCByZXR1cm4gYSBwcm9taXNlIGluc3RlYWQuIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVzb2x2ZSB3aXRoIG5vcm1hbCBjYWxsYmFjayB2YWx1ZSBtaW51cyB0aGUgZmlyc3QgZXJyb3IgcGFyYW1ldGVyIG9uXG5cdCAqIGZ1bGZpbGwgYW5kIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGF0IGVycm9yIGFzIHJlYXNvbiBpbiBjYXNlIG9mIGVycm9yLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW3N1YmplY3RdIG9wdGlvbmFsIHN1YmplY3Qgb2YgdGhlIG1ldGhvZCB0byBlbmNhcHN1bGF0ZVxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24gdG8gZW5jYXBzdWxhdGUgaWYgdGhlIG5vcm1hbCBjYWxsYmFjayBzaG91bGQgcmVjZWl2ZSBtb3JlIHRoYW4gYSBzaW5nbGUgcGFyYW1ldGVyIChtaW51cyB0aGUgZXJyb3IpXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSB3aXRoIHRoZSBsaXN0IG9yIHBhcmFtZXRlcnMgYXMgZnVsZmlsbG1lbnQgdmFsdWUuIElmIG9ubHkgb25lIHBhcmFtZXRlciBpcyBzZW50IHRvIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayB0aGVuIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVzb2x1dGlvbiB2YWx1ZS5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufVxuXHQgKi9cblx0ZGVmZXIubm9kZUNhcHN1bGUgPSBmdW5jdGlvbihzdWJqZWN0LCBmbil7XG5cdFx0aWYgKCAhZm4gKSB7XG5cdFx0XHRmbiA9IHN1YmplY3Q7XG5cdFx0XHRzdWJqZWN0ID0gdm9pZCgwKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCl7XG5cdFx0XHR2YXIgZCA9IGRlZmVyKCksIGFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXHRcdFx0YXJncy5wdXNoKGZ1bmN0aW9uKGVyciwgcmVzKXtcblx0XHRcdFx0ZXJyID8gZC5yZWplY3QoZXJyKSA6IGQucmVzb2x2ZShhcmd1bWVudHMubGVuZ3RoID4gMiA/IHNsaWNlKGFyZ3VtZW50cywgMSkgOiByZXMpO1xuXHRcdFx0fSk7XG5cdFx0XHR0cnl7XG5cdFx0XHRcdGZuLmFwcGx5KHN1YmplY3QsIGFyZ3MpO1xuXHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRkLnJlamVjdChlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkLnByb21pc2U7XG5cdFx0fTtcblx0fTtcblxuXHR0eXBlb2Ygd2luZG93ICE9PSB1bmRlZlN0ciAmJiAod2luZG93LkQgPSBkZWZlcik7XG5cdHR5cGVvZiBtb2R1bGUgIT09IHVuZGVmU3RyICYmIG1vZHVsZS5leHBvcnRzICYmIChtb2R1bGUuZXhwb3J0cyA9IGRlZmVyKTtcblxufSkoKTtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5a0xtcHpMMnhwWWk5RUxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU0lzSW1acGJHVWlPaUpuWlc1bGNtRjBaV1F1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5b3FYRzRxSUdGMGRHVnRjSFFnYjJZZ1lTQnphVzF3YkdVZ1pHVm1aWEl2Y0hKdmJXbHpaU0JzYVdKeVlYSjVJR1p2Y2lCdGIySnBiR1VnWkdWMlpXeHZjRzFsYm5SY2Jpb2dRR0YxZEdodmNpQktiMjVoZEdoaGJpQkhiM1IwYVNBOElHcG5iM1IwYVNCaGRDQnFaMjkwZEdrZ1pHOTBJRzVsZEQ1Y2Jpb2dRSE5wYm1ObElESXdNVEl0TVRCY2Jpb2dRSFpsY25OcGIyNGdNQzQyTGpCY2Jpb2dRR05vWVc1blpXeHZaMXh1S2lBZ0lDQWdJQ0FnSUNBZ0xTQXlNREV6TFRFeUxUQTNJQzBnYkdGemRDQndjbTl0YVhObElERXVNU0J6Y0dWamN5QjBaWE4wSUhCaGMzTnBibWR6SUNoMGFIZ2dkRzhnZDJsNllYSmtkMlZ5Wkc1aEtWeHVJQ29nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDMGdjbVZrZFdObElIQnliMjFwYzJWeklHWnZiM1J3Y21sdWRDQmllU0IxYm5OamIzQnBibWNnYldWMGFHOWtjeUIwYUdGMElHTnZkV3hrSUdKbFhHNHFJQ0FnSUNBZ0lDQWdJQ0F0SURJd01UTXRNVEF0TWpNZ0xTQnRZV3RsSUdsMElIZHZjbXRwWnlCaFkzSnZjM01nYm05a1pTMTNaV0pyYVhRZ1kyOXVkR1Y0ZEhOY2Jpb2dJQ0FnSUNBZ0lDQWdJQzBnTWpBeE15MHdOeTB3TXlBdElHSjFaeUJqYjNKeVpXTjBhVzl1SUdsdUlIQnliMjFwZUdsbWVTQnRaWFJvYjJRZ0tIUm9lQ0IwYnlCaFpISnBaVzRnWjJsaWNtRjBJQ2xjYmlvZ0lDQWdJQ0FnSUNBZ0lDMGdNakF4TXkwd05pMHlNaUF0SUdKMVp5QmpiM0p5WldOMGFXOXVJR2x1SUc1dlpHVkRZWEJ6ZFd4bElHMWxkR2h2WkZ4dUtpQWdJQ0FnSUNBZ0lDQWdMU0F5TURFekxUQTJMVEUzSUMwZ2NtVnRiM1psSUhWdWJtVmpaWE56WVhKNUlFRnljbUY1TG1sdVpHVjRUMllnYldWMGFHOWtJR1JsY0dWdVpHVnVZM2xjYmlvZ0lDQWdJQ0FnSUNBZ0lDMGdNakF4TXkwd05DMHhPQ0F0SUdGa1pDQjBjbmt2WTJGMFkyZ2dZbXh2WTJzZ1lYSnZkVzVrSUc1dlpHVkRZWEJ6ZFd4bFpDQnRaWFJvYjJSelhHNHFJQ0FnSUNBZ0lDQWdJQ0F0SURJd01UTXRNRFF0TVRNZ0xTQmphR1ZqYXlCd2NtOXRhWE5sY3k5Qkt5QmpiMjVtYjNKdGFYUjVYRzRxSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMU0J0WVd0bElITnZiV1VnYldsdWFXTmhkR2x2YmlCdmNIUnBiV2x6WVhScGIyNXpYRzRxSUNBZ0lDQWdJQ0FnSUNBdElESXdNVE10TURNdE1qWWdMU0JoWkdRZ2NtVnpiMngyWldRc0lHWjFiR1pwYkd4bFpDQmhibVFnY21WcVpXTjBaV1FnYldWMGFHOWtjMXh1S2lBZ0lDQWdJQ0FnSUNBZ0xTQXlNREV6TFRBekxUSXhJQzBnWW5KdmQzTmxjaTl1YjJSbElHTnZiWEJoZEdsaWJHVmNiaW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXRJRzVsZHlCdFpYUm9iMlFnYm05a1pVTmhjSE4xYkdWY2Jpb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdElITnBiWEJzWlhJZ2NISnZiV2w0YVdaNUlIZHBkR2dnWm5Wc2JDQmhjR2tnYzNWd2NHOXlkRnh1S2lBZ0lDQWdJQ0FnSUNBZ0xTQXlNREV6TFRBeExUSTFJQzBnWVdSa0lISmxkR2h5YjNjZ2JXVjBhRzlrWEc0cUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTFNCdVpYaDBWR2xqYXlCdmNIUnBiV2x6WVhScGIyNGdMVDRnWVdSa0lITjFjSEJ2Y25RZ1ptOXlJSEJ5YjJObGMzTXVibVY0ZEZScFkyc2dLeUJOWlhOellXZGxRMmhoYm01bGJDQjNhR1Z5WlNCaGRtRnBiR0ZpYkdWY2Jpb2dJQ0FnSUNBZ0lDQWdJQzBnTWpBeE1pMHhNaTB5T0NBdElHRmtaQ0JoY0hCc2VTQnRaWFJvYjJRZ2RHOGdjSEp2YldselpWeHVLaUFnSUNBZ0lDQWdJQ0FnTFNBeU1ERXlMVEV5TFRJd0lDMGdZV1JrSUdGc2QyRjVjMEZ6ZVc1aklIQmhjbUZ0WlhSbGNuTWdZVzVrSUhCeWIzQmxjblI1SUdadmNpQmtaV1poZFd4MElITmxkSFJwYm1kY2Jpb3ZYRzRvWm5WdVkzUnBiMjRvZFc1a1pXWXBlMXh1WEhSY0luVnpaU0J6ZEhKcFkzUmNJanRjYmx4dVhIUjJZWElnYm1WNGRGUnBZMnRjYmx4MFhIUXNJR2x6Um5WdVl5QTlJR1oxYm1OMGFXOXVLR1lwZXlCeVpYUjFjbTRnS0NCMGVYQmxiMllnWmlBOVBUMGdKMloxYm1OMGFXOXVKeUFwT3lCOVhHNWNkRngwTENCcGMwRnljbUY1SUQwZ1puVnVZM1JwYjI0b1lTbDdJSEpsZEhWeWJpQkJjbkpoZVM1cGMwRnljbUY1SUQ4Z1FYSnlZWGt1YVhOQmNuSmhlU2hoS1NBNklDaGhJR2x1YzNSaGJtTmxiMllnUVhKeVlYa3BPeUI5WEc1Y2RGeDBMQ0JwYzA5aWFrOXlSblZ1WXlBOUlHWjFibU4wYVc5dUtHOHBleUJ5WlhSMWNtNGdJU0VvYnlBbUppQW9kSGx3Wlc5bUlHOHBMbTFoZEdOb0tDOW1kVzVqZEdsdmJueHZZbXBsWTNRdktTazdJSDFjYmx4MFhIUXNJR2x6VG05MFZtRnNJRDBnWm5WdVkzUnBiMjRvZGlsN0lISmxkSFZ5YmlBb2RpQTlQVDBnWm1Gc2MyVWdmSHdnZGlBOVBUMGdkVzVrWldZZ2ZId2dkaUE5UFQwZ2JuVnNiQ2s3SUgxY2JseDBYSFFzSUhOc2FXTmxJRDBnWm5WdVkzUnBiMjRvWVN3Z2IyWm1jMlYwS1hzZ2NtVjBkWEp1SUZ0ZExuTnNhV05sTG1OaGJHd29ZU3dnYjJabWMyVjBLVHNnZlZ4dVhIUmNkQ3dnZFc1a1pXWlRkSElnUFNBbmRXNWtaV1pwYm1Wa0oxeHVYSFJjZEN3Z2RFVnljaUE5SUhSNWNHVnZaaUJVZVhCbFJYSnliM0lnUFQwOUlIVnVaR1ZtVTNSeUlEOGdSWEp5YjNJZ09pQlVlWEJsUlhKeWIzSmNibHgwTzF4dVhIUnBaaUFvSUNoMGVYQmxiMllnY0hKdlkyVnpjeUFoUFQwZ2RXNWtaV1pUZEhJcElDWW1JSEJ5YjJObGMzTXVibVY0ZEZScFkyc2dLU0I3WEc1Y2RGeDBibVY0ZEZScFkyc2dQU0J3Y205alpYTnpMbTVsZUhSVWFXTnJPMXh1WEhSOUlHVnNjMlVnYVdZZ0tDQjBlWEJsYjJZZ1RXVnpjMkZuWlVOb1lXNXVaV3dnSVQwOUlIVnVaR1ZtVTNSeUlDa2dlMXh1WEhSY2RIWmhjaUJ1ZEdsamEwTm9ZVzV1Wld3Z1BTQnVaWGNnVFdWemMyRm5aVU5vWVc1dVpXd29LU3dnY1hWbGRXVWdQU0JiWFR0Y2JseDBYSFJ1ZEdsamEwTm9ZVzV1Wld3dWNHOXlkREV1YjI1dFpYTnpZV2RsSUQwZ1puVnVZM1JwYjI0b0tYc2djWFZsZFdVdWJHVnVaM1JvSUNZbUlDaHhkV1YxWlM1emFHbG1kQ2dwS1NncE95QjlPMXh1WEhSY2RHNWxlSFJVYVdOcklEMGdablZ1WTNScGIyNG9ZMklwZTF4dVhIUmNkRngwY1hWbGRXVXVjSFZ6YUNoallpazdYRzVjZEZ4MFhIUnVkR2xqYTBOb1lXNXVaV3d1Y0c5eWRESXVjRzl6ZEUxbGMzTmhaMlVvTUNrN1hHNWNkRngwZlR0Y2JseDBmU0JsYkhObElIdGNibHgwWEhSdVpYaDBWR2xqYXlBOUlHWjFibU4wYVc5dUtHTmlLWHNnYzJWMFZHbHRaVzkxZENoallpd2dNQ2s3SUgwN1hHNWNkSDFjYmx4MFpuVnVZM1JwYjI0Z2NtVjBhSEp2ZHlobEtYc2dibVY0ZEZScFkyc29ablZ1WTNScGIyNG9LWHNnZEdoeWIzY2daVHQ5S1RzZ2ZWeHVYRzVjZEM4cUtseHVYSFFnS2lCQWRIbHdaV1JsWmlCa1pXWmxjbkpsWkZ4dVhIUWdLaUJBY0hKdmNHVnlkSGtnZTNCeWIyMXBjMlY5SUhCeWIyMXBjMlZjYmx4MElDb2dRRzFsZEdodlpDQnlaWE52YkhabFhHNWNkQ0FxSUVCdFpYUm9iMlFnWm5Wc1ptbHNiRnh1WEhRZ0tpQkFiV1YwYUc5a0lISmxhbVZqZEZ4dVhIUWdLaTljYmx4dVhIUXZLaXBjYmx4MElDb2dRSFI1Y0dWa1pXWWdlMloxYm1OMGFXOXVmU0JtZFd4bWFXeHNaV1JjYmx4MElDb2dRSEJoY21GdElIc3FmU0IyWVd4MVpTQndjbTl0YVhObElISmxjMjlzZG1Wa0lIWmhiSFZsWEc1Y2RDQXFJRUJ5WlhSMWNtNXpJSHNxZlNCdVpYaDBJSEJ5YjIxcGMyVWdjbVZ6YjJ4MWRHbHZiaUIyWVd4MVpWeHVYSFFnS2k5Y2JseHVYSFF2S2lwY2JseDBJQ29nUUhSNWNHVmtaV1lnZTJaMWJtTjBhVzl1ZlNCbVlXbHNaV1JjYmx4MElDb2dRSEJoY21GdElIc3FmU0J5WldGemIyNGdjSEp2YldselpTQnlaV3BsWTNScGIyNGdjbVZoYzI5dVhHNWNkQ0FxSUVCeVpYUjFjbTV6SUhzcWZTQnVaWGgwSUhCeWIyMXBjMlVnY21WemIyeDFkR2x2YmlCMllXeDFaU0J2Y2lCeVpYUm9jbTkzSUhSb1pTQnlaV0Z6YjI1Y2JseDBJQ292WEc1Y2JseDBMeTh0TFNCa1pXWnBibWx1WnlCMWJtVnVZMnh2YzJWa0lIQnliMjFwYzJVZ2JXVjBhRzlrY3lBdExTOHZYRzVjZEM4cUtseHVYSFFnS2lCellXMWxJR0Z6SUhSb1pXNGdkMmwwYUc5MWRDQm1ZV2xzWldRZ1kyRnNiR0poWTJ0Y2JseDBJQ29nUUhCaGNtRnRJSHRtZFd4bWFXeHNaV1I5SUdaMWJHWnBiR3hsWkNCallXeHNZbUZqYTF4dVhIUWdLaUJBY21WMGRYSnVjeUI3Y0hKdmJXbHpaWDBnWVNCdVpYY2djSEp2YldselpWeHVYSFFnS2k5Y2JseDBablZ1WTNScGIyNGdjSEp2YldselpWOXpkV05qWlhOektHWjFiR1pwYkd4bFpDbDdJSEpsZEhWeWJpQjBhR2x6TG5Sb1pXNG9ablZzWm1sc2JHVmtMQ0IxYm1SbFppazdJSDFjYmx4dVhIUXZLaXBjYmx4MElDb2djMkZ0WlNCaGN5QjBhR1Z1SUhkcGRHZ2diMjVzZVNCaElHWmhhV3hsWkNCallXeHNZbUZqYTF4dVhIUWdLaUJBY0dGeVlXMGdlMlpoYVd4bFpIMGdabUZwYkdWa0lHTmhiR3hpWVdOclhHNWNkQ0FxSUVCeVpYUjFjbTV6SUh0d2NtOXRhWE5sZlNCaElHNWxkeUJ3Y205dGFYTmxYRzVjZENBcUwxeHVYSFJtZFc1amRHbHZiaUJ3Y205dGFYTmxYMlZ5Y205eUtHWmhhV3hsWkNsN0lISmxkSFZ5YmlCMGFHbHpMblJvWlc0b2RXNWtaV1lzSUdaaGFXeGxaQ2s3SUgxY2JseHVYRzVjZEM4cUtseHVYSFFnS2lCellXMWxJR0Z6SUhSb1pXNGdZblYwSUdaMWJHWnBiR3hsWkNCallXeHNZbUZqYXlCM2FXeHNJSEpsWTJWcGRtVWdiWFZzZEdsd2JHVWdjR0Z5WVcxbGRHVnljeUIzYUdWdUlIQnliMjFwYzJVZ2FYTWdablZzWm1sc2JHVmtJSGRwZEdnZ1lXNGdRWEp5WVhsY2JseDBJQ29nUUhCaGNtRnRJSHRtZFd4bWFXeHNaV1I5SUdaMWJHWnBiR3hsWkNCallXeHNZbUZqYTF4dVhIUWdLaUJBY0dGeVlXMGdlMlpoYVd4bFpIMGdabUZwYkdWa0lHTmhiR3hpWVdOclhHNWNkQ0FxSUVCeVpYUjFjbTV6SUh0d2NtOXRhWE5sZlNCaElHNWxkeUJ3Y205dGFYTmxYRzVjZENBcUwxeHVYSFJtZFc1amRHbHZiaUJ3Y205dGFYTmxYMkZ3Y0d4NUtHWjFiR1pwYkd4bFpDd2dabUZwYkdWa0tYdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NTBhR1Z1S0Z4dVhIUmNkRngwWm5WdVkzUnBiMjRvWVNsN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCcGMwWjFibU1vWm5Wc1ptbHNiR1ZrS1NBL0lHWjFiR1pwYkd4bFpDNWhjSEJzZVNodWRXeHNMQ0JwYzBGeWNtRjVLR0VwSUQ4Z1lTQTZJRnRoWFNrZ09pQW9aR1ZtWlhJdWIyNXNlVVoxYm1OeklEOGdZU0E2SUdaMWJHWnBiR3hsWkNrN1hHNWNkRngwWEhSOVhHNWNkRngwWEhRc0lHWmhhV3hsWkNCOGZDQjFibVJsWmx4dVhIUmNkQ2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1kyeGxZVzUxY0NCdFpYUm9iMlFnZDJocFkyZ2dkMmxzYkNCaVpTQmhiSGRoZVhNZ1pYaGxZM1YwWldRZ2NtVm5ZWEprYkdWemN5Qm1kV3htYVd4c2JXVnVkQ0J2Y2lCeVpXcGxZM1JwYjI1Y2JseDBJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnWTJJZ1lTQmpZV3hzWW1GamF5QmpZV3hzWldRZ2NtVm5ZWEprYkdWemN5QnZaaUIwYUdVZ1puVnNabWxzYkcxbGJuUWdiM0lnY21WcVpXTjBhVzl1SUc5bUlIUm9aU0J3Y205dGFYTmxJSGRvYVdOb0lIZHBiR3dnWW1VZ1kyRnNiR1ZrWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhkb1pXNGdkR2hsSUhCeWIyMXBjMlVnYVhNZ2JtOTBJSEJsYm1ScGJtY2dZVzU1Ylc5eVpWeHVYSFFnS2lCQWNtVjBkWEp1Y3lCN2NISnZiV2x6WlgwZ2RHaGxJSE5oYldVZ2NISnZiV2x6WlNCMWJuUnZkV05vWldSY2JseDBJQ292WEc1Y2RHWjFibU4wYVc5dUlIQnliMjFwYzJWZlpXNXpkWEpsS0dOaUtYdGNibHgwWEhSbWRXNWpkR2x2YmlCZlkySW9LWHNnWTJJb0tUc2dmVnh1WEhSY2RIUm9hWE11ZEdobGJpaGZZMklzSUY5allpazdYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTTdYRzVjZEgxY2JseHVYSFF2S2lwY2JseDBJQ29nZEdGclpTQmhJSE5wYm1kc1pTQmpZV3hzWW1GamF5QjNhR2xqYUNCM1lXbDBJR1p2Y2lCaGJpQmxjbkp2Y2lCaGN5Qm1hWEp6ZENCd1lYSmhiV1YwWlhJdUlHOTBhR1Z5SUhKbGMyOXNkWFJwYjI0Z2RtRnNkV1Z6SUdGeVpTQndZWE56WldRZ1lYTWdkMmwwYUNCMGFHVWdZWEJ3YkhrdmMzQnlaV0ZrSUcxbGRHaHZaRnh1WEhRZ0tpQkFjR0Z5WVcwZ2UyWjFibU4wYVc5dWZTQmpZaUJoSUdOaGJHeGlZV05ySUdOaGJHeGxaQ0J5WldkaGNtUnNaWE56SUc5bUlIUm9aU0JtZFd4bWFXeHNiV1Z1ZENCdmNpQnlaV3BsWTNScGIyNGdiMllnZEdobElIQnliMjFwYzJVZ2QyaHBZMmdnZDJsc2JDQmlaU0JqWVd4c1pXUmNibHgwSUNvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkMmhsYmlCMGFHVWdjSEp2YldselpTQnBjeUJ1YjNRZ2NHVnVaR2x1WnlCaGJubHRiM0psSUhkcGRHZ2daWEp5YjNJZ1lYTWdabWx5YzNRZ2NHRnlZVzFsZEdWeUlHbG1JR0Z1ZVNCaGN5QnBiaUJ1YjJSbElITjBlV3hsWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGJHeGlZV05yTGlCU1pYTjBJRzltSUhCaGNtRnRaWFJsY25NZ2QybHNiQ0JpWlNCaGNIQnNhV1ZrSUdGeklIZHBkR2dnZEdobElHRndjR3g1SUcxbGRHaHZaQzVjYmx4MElDb2dRSEpsZEhWeWJuTWdlM0J5YjIxcGMyVjlJR0VnYm1WM0lIQnliMjFwYzJWY2JseDBJQ292WEc1Y2RHWjFibU4wYVc5dUlIQnliMjFwYzJWZmJtOWthV1o1S0dOaUtYdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NTBhR1Z1S0Z4dVhIUmNkRngwWm5WdVkzUnBiMjRvWVNsN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCcGMwWjFibU1vWTJJcElEOGdZMkl1WVhCd2JIa29iblZzYkN3Z2FYTkJjbkpoZVNoaEtTQS9JR0V1YzNCc2FXTmxLREFzTUN4MWJtUmxabWx1WldRcElDWW1JR0VnT2lCYmRXNWtaV1pwYm1Wa0xHRmRLU0E2SUNoa1pXWmxjaTV2Ym14NVJuVnVZM01nUHlCaElEb2dZMklwTzF4dVhIUmNkRngwZlZ4dVhIUmNkRngwTENCbWRXNWpkR2x2YmlobEtYdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHTmlLR1VwTzF4dVhIUmNkRngwZlZ4dVhIUmNkQ2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNwY2JseDBJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnVzJaaGFXeGxaRjBnZDJsMGFHOTFkQ0J3WVhKaGJXVjBaWElnZDJsc2JDQnZibXg1SUhKbGRHaHliM2NnY0hKdmJXbHpaU0J5WldwbFkzUnBiMjRnY21WaGMyOXVJRzkxZEhOcFpHVWdiMllnZEdobElIQnliMjFwYzJVZ2JHbGljbUZ5ZVNCdmJpQnVaWGgwSUhScFkydGNibHgwSUNvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdjR0Z6YzJWa0lHRWdabUZwYkdWa0lHMWxkR2h2WkNCMGFHVnVJSGRwYkd3Z1kyRnNiQ0JtWVdsc1pXUWdiMjRnY21WcVpXTjBhVzl1SUdGdVpDQjBhSEp2ZHlCMGFHVWdaWEp5YjNJZ1lXZGhhVzRnYVdZZ1ptRnBiR1ZrSUdScFpHNG5kRnh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdjSEp2YldselpYMGdZU0J1WlhjZ2NISnZiV2x6WlZ4dVhIUWdLaTljYmx4MFpuVnVZM1JwYjI0Z2NISnZiV2x6WlY5eVpYUm9jbTkzS0daaGFXeGxaQ2w3WEc1Y2RGeDBjbVYwZFhKdUlIUm9hWE11ZEdobGJpaGNibHgwWEhSY2RIVnVaR1ZtWEc1Y2RGeDBYSFFzSUdaaGFXeGxaQ0EvSUdaMWJtTjBhVzl1S0dVcGV5Qm1ZV2xzWldRb1pTazdJSFJvY205M0lHVTdJSDBnT2lCeVpYUm9jbTkzWEc1Y2RGeDBLVHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFxSUVCd1lYSmhiU0I3WW05dmJHVmhibjBnVzJGc2QyRjVjMEZ6ZVc1alhTQnBaaUJ6WlhRZ1ptOXlZMlVnZEdobElHRnplVzVqSUhKbGMyOXNkWFJwYjI0Z1ptOXlJSFJvYVhNZ2NISnZiV2x6WlNCcGJtUmxjR1Z1WkdGdWRHeDVJRzltSUhSb1pTQkVMbUZzZDJGNWMwRnplVzVqSUc5d2RHbHZibHh1WEhRcUlFQnlaWFIxY201eklIdGtaV1psY25KbFpIMGdaR1ZtWlhKbFpDQnZZbXBsWTNRZ2QybDBhQ0J3Y205d1pYSjBlU0FuY0hKdmJXbHpaU2NnWVc1a0lHMWxkR2h2WkhNZ2NtVnFaV04wTEdaMWJHWnBiR3dzY21WemIyeDJaU0FvWm5Wc1ptbHNiQ0JpWldsdVp5QmhiaUJoYkdsaGN5Qm1iM0lnY21WemIyeDJaU2xjYmx4MEtpOWNibHgwZG1GeUlHUmxabVZ5SUQwZ1puVnVZM1JwYjI0Z0tHRnNkMkY1YzBGemVXNWpLWHRjYmx4MFhIUjJZWElnWVd4M1lYbHpRWE41Ym1OR2JpQTlJQ2gxYm1SbFppQWhQVDBnWVd4M1lYbHpRWE41Ym1NZ1B5QmhiSGRoZVhOQmMzbHVZeUE2SUdSbFptVnlMbUZzZDJGNWMwRnplVzVqS1NBL0lHNWxlSFJVYVdOcklEb2dablZ1WTNScGIyNG9abTRwZTJadUtDazdmVnh1WEhSY2RGeDBMQ0J6ZEdGMGRYTWdQU0F3SUM4dklDMHhJR1poYVd4bFpDQjhJREVnWm5Wc1ptbHNiR1ZrWEc1Y2RGeDBYSFFzSUhCbGJtUnBibWR6SUQwZ1cxMWNibHgwWEhSY2RDd2dkbUZzZFdWY2JseDBYSFJjZEM4cUtseHVYSFJjZEZ4MElDb2dRSFI1Y0dWa1pXWWdjSEp2YldselpWeHVYSFJjZEZ4MElDb3ZYRzVjZEZ4MFhIUXNJRjl3Y205dGFYTmxJQ0E5SUh0Y2JseDBYSFJjZEZ4MEx5b3FYRzVjZEZ4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3Wm5Wc1ptbHNiR1ZrZkdaMWJtTjBhVzl1ZlNCbWRXeG1hV3hzWldRZ1kyRnNiR0poWTJ0Y2JseDBYSFJjZEZ4MElDb2dRSEJoY21GdElIdG1ZV2xzWldSOFpuVnVZM1JwYjI1OUlHWmhhV3hsWkNCallXeHNZbUZqYTF4dVhIUmNkRngwWEhRZ0tpQkFjbVYwZFhKdWN5QjdjSEp2YldselpYMGdZU0J1WlhjZ2NISnZiV2x6WlZ4dVhIUmNkRngwWEhRZ0tpOWNibHgwWEhSY2RGeDBkR2hsYmpvZ1puVnVZM1JwYjI0b1puVnNabWxzYkdWa0xDQm1ZV2xzWldRcGUxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCa0lEMGdaR1ZtWlhJb0tUdGNibHgwWEhSY2RGeDBYSFJ3Wlc1a2FXNW5jeTV3ZFhOb0tGdGNibHgwWEhSY2RGeDBYSFJjZEdaMWJtTjBhVzl1S0haaGJIVmxLWHRjYmx4MFhIUmNkRngwWEhSY2RGeDBkSEo1ZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEdsbUtDQnBjMDV2ZEZaaGJDaG1kV3htYVd4c1pXUXBLWHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEdRdWNtVnpiMngyWlNoMllXeDFaU2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEdRdWNtVnpiMngyWlNocGMwWjFibU1vWm5Wc1ptbHNiR1ZrS1NBL0lHWjFiR1pwYkd4bFpDaDJZV3gxWlNrZ09pQW9aR1ZtWlhJdWIyNXNlVVoxYm1OeklEOGdkbUZzZFdVZ09pQm1kV3htYVd4c1pXUXBLVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSDFqWVhSamFDaGxLWHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJrTG5KbGFtVmpkQ2hsS1R0Y2JseDBYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MExDQm1kVzVqZEdsdmJpaGxjbklwZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJwWmlBb0lHbHpUbTkwVm1Gc0tHWmhhV3hsWkNrZ2ZId2dLQ2doYVhOR2RXNWpLR1poYVd4bFpDa3BJQ1ltSUdSbFptVnlMbTl1YkhsR2RXNWpjeWtnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFpDNXlaV3BsWTNRb1pYSnlLVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MFhIUnBaaUFvSUdaaGFXeGxaQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSMGNubDdJR1F1Y21WemIyeDJaU2hwYzBaMWJtTW9abUZwYkdWa0tTQS9JR1poYVd4bFpDaGxjbklwSURvZ1ptRnBiR1ZrS1RzZ2ZXTmhkR05vS0dVcGV5QmtMbkpsYW1WamRDaGxLVHQ5WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFJkS1R0Y2JseDBYSFJjZEZ4MFhIUnpkR0YwZFhNZ0lUMDlJREFnSmlZZ1lXeDNZWGx6UVhONWJtTkdiaWhsZUdWalEyRnNiR0poWTJ0ektUdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdaQzV3Y205dGFYTmxPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MExDQnpkV05qWlhOek9pQndjbTl0YVhObFgzTjFZMk5sYzNOY2JseHVYSFJjZEZ4MFhIUXNJR1Z5Y205eU9pQndjbTl0YVhObFgyVnljbTl5WEc1Y2RGeDBYSFJjZEN3Z2IzUm9aWEozYVhObE9pQndjbTl0YVhObFgyVnljbTl5WEc1Y2JseDBYSFJjZEZ4MExDQmhjSEJzZVRvZ2NISnZiV2x6WlY5aGNIQnNlVnh1WEhSY2RGeDBYSFFzSUhOd2NtVmhaRG9nY0hKdmJXbHpaVjloY0hCc2VWeHVYRzVjZEZ4MFhIUmNkQ3dnWlc1emRYSmxPaUJ3Y205dGFYTmxYMlZ1YzNWeVpWeHVYRzVjZEZ4MFhIUmNkQ3dnYm05a2FXWjVPaUJ3Y205dGFYTmxYMjV2WkdsbWVWeHVYRzVjZEZ4MFhIUmNkQ3dnY21WMGFISnZkem9nY0hKdmJXbHpaVjl5WlhSb2NtOTNYRzVjYmx4MFhIUmNkRngwTENCcGMxQmxibVJwYm1jNklHWjFibU4wYVc5dUtDbDdJSEpsZEhWeWJpQWhJU2h6ZEdGMGRYTWdQVDA5SURBcE95QjlYRzVjYmx4MFhIUmNkRngwTENCblpYUlRkR0YwZFhNNklHWjFibU4wYVc5dUtDbDdJSEpsZEhWeWJpQnpkR0YwZFhNN0lIMWNibHgwWEhSY2RIMWNibHgwWEhRN1hHNWNkRngwWDNCeWIyMXBjMlV1ZEc5VGIzVnlZMlVnUFNCZmNISnZiV2x6WlM1MGIxTjBjbWx1WnlBOUlGOXdjbTl0YVhObExuWmhiSFZsVDJZZ1BTQm1kVzVqZEdsdmJpZ3BlM0psZEhWeWJpQjJZV3gxWlNBOVBUMGdkVzVrWldZZ1B5QjBhR2x6SURvZ2RtRnNkV1U3SUgwN1hHNWNibHh1WEhSY2RHWjFibU4wYVc5dUlHVjRaV05EWVd4c1ltRmphM01vS1h0Y2JseDBYSFJjZEdsbUlDZ2djM1JoZEhWeklEMDlQU0F3SUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200N1hHNWNkRngwWEhSOVhHNWNkRngwWEhSMllYSWdZMkp6SUQwZ2NHVnVaR2x1WjNNc0lHa2dQU0F3TENCc0lEMGdZMkp6TG14bGJtZDBhQ3dnWTJKSmJtUmxlQ0E5SUg1emRHRjBkWE1nUHlBd0lEb2dNU3dnWTJJN1hHNWNkRngwWEhSd1pXNWthVzVuY3lBOUlGdGRPMXh1WEhSY2RGeDBabTl5S0NBN0lHa2dQQ0JzT3lCcEt5c2dLWHRjYmx4MFhIUmNkRngwS0dOaUlEMGdZMkp6VzJsZFcyTmlTVzVrWlhoZEtTQW1KaUJqWWloMllXeDFaU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWm5Wc1ptbHNiQ0JrWldabGNuSmxaQ0IzYVhSb0lHZHBkbVZ1SUhaaGJIVmxYRzVjZEZ4MElDb2dRSEJoY21GdElIc3FmU0IyWVd4Y2JseDBYSFFnS2lCQWNtVjBkWEp1Y3lCN1pHVm1aWEp5WldSOUlIUm9hWE1nWm05eUlHMWxkR2h2WkNCamFHRnBibWx1WjF4dVhIUmNkQ0FxTDF4dVhIUmNkR1oxYm1OMGFXOXVJRjl5WlhOdmJIWmxLSFpoYkNsN1hHNWNkRngwWEhSMllYSWdaRzl1WlNBOUlHWmhiSE5sTzF4dVhIUmNkRngwWm5WdVkzUnBiMjRnYjI1alpTaG1LWHRjYmx4MFhIUmNkRngwY21WMGRYSnVJR1oxYm1OMGFXOXVLSGdwZTF4dVhIUmNkRngwWEhSY2RHbG1JQ2hrYjI1bEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSeVpYUjFjbTRnZFc1a1pXWnBibVZrTzF4dVhIUmNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBYSFJrYjI1bElEMGdkSEoxWlR0Y2JseDBYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQm1LSGdwTzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmVHRjYmx4MFhIUmNkSDFjYmx4MFhIUmNkR2xtSUNnZ2MzUmhkSFZ6SUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MFhIUmNkSDFjYmx4MFhIUmNkSFJ5ZVNCN1hHNWNkRngwWEhSY2RIWmhjaUIwYUdWdUlEMGdhWE5QWW1wUGNrWjFibU1vZG1Gc0tTQW1KaUIyWVd3dWRHaGxianRjYmx4MFhIUmNkRngwYVdZZ0tDQnBjMFoxYm1Nb2RHaGxiaWtnS1NCN0lDOHZJRzFoYm1GbmFXNW5JR0VnY0hKdmJXbHpaVnh1WEhSY2RGeDBYSFJjZEdsbUtDQjJZV3dnUFQwOUlGOXdjbTl0YVhObElDbDdYRzVjZEZ4MFhIUmNkRngwWEhSMGFISnZkeUJ1WlhjZ2RFVnljaWhjSWxCeWIyMXBjMlVnWTJGdUozUWdjbVZ6YjJ4MlpTQnBkSE5sYkdaY0lpazdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RIUm9aVzR1WTJGc2JDaDJZV3dzSUc5dVkyVW9YM0psYzI5c2RtVXBMQ0J2Ym1ObEtGOXlaV3BsWTNRcEtUdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdkR2hwY3p0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZTQmpZWFJqYUNBb1pTa2dlMXh1WEhSY2RGeDBYSFJ2Ym1ObEtGOXlaV3BsWTNRcEtHVXBPMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkR2hwY3p0Y2JseDBYSFJjZEgxY2JseDBYSFJjZEdGc2QyRjVjMEZ6ZVc1alJtNG9ablZ1WTNScGIyNG9LWHRjYmx4MFhIUmNkRngwZG1Gc2RXVWdQU0IyWVd3N1hHNWNkRngwWEhSY2RITjBZWFIxY3lBOUlERTdYRzVjZEZ4MFhIUmNkR1Y0WldORFlXeHNZbUZqYTNNb0tUdGNibHgwWEhSY2RIMHBPMXh1WEhSY2RGeDBjbVYwZFhKdUlIUm9hWE03WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WcVpXTjBJR1JsWm1WeWNtVmtJSGRwZEdnZ1oybDJaVzRnY21WaGMyOXVYRzVjZEZ4MElDb2dRSEJoY21GdElIc3FmU0JGY25KY2JseDBYSFFnS2lCQWNtVjBkWEp1Y3lCN1pHVm1aWEp5WldSOUlIUm9hWE1nWm05eUlHMWxkR2h2WkNCamFHRnBibWx1WjF4dVhIUmNkQ0FxTDF4dVhIUmNkR1oxYm1OMGFXOXVJRjl5WldwbFkzUW9SWEp5S1h0Y2JseDBYSFJjZEhOMFlYUjFjeUI4ZkNCaGJIZGhlWE5CYzNsdVkwWnVLR1oxYm1OMGFXOXVLQ2w3WEc1Y2RGeDBYSFJjZEhSeWVYc2dkR2h5YjNjb1JYSnlLVHNnZldOaGRHTm9LR1VwZXlCMllXeDFaU0E5SUdVN0lIMWNibHgwWEhSY2RGeDBjM1JoZEhWeklEMGdMVEU3WEc1Y2RGeDBYSFJjZEdWNFpXTkRZV3hzWW1GamEzTW9LVHRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkRngwY21WMGRYSnVJSFJvYVhNN1hHNWNkRngwZlZ4dVhIUmNkSEpsZEhWeWJpQXZLaXBBZEhsd1pTQmtaV1psY25KbFpDQXFMeUI3WEc1Y2RGeDBYSFJ3Y205dGFYTmxPbDl3Y205dGFYTmxYRzVjZEZ4MFhIUXNjbVZ6YjJ4MlpUcGZjbVZ6YjJ4MlpWeHVYSFJjZEZ4MExHWjFiR1pwYkd3NlgzSmxjMjlzZG1VZ0x5OGdZV3hwWVhOY2JseDBYSFJjZEN4eVpXcGxZM1E2WDNKbGFtVmpkRnh1WEhSY2RIMDdYRzVjZEgwN1hHNWNibHgwWkdWbVpYSXVaR1ZtWlhKeVpXUWdQU0JrWldabGNpNWtaV1psY2lBOUlHUmxabVZ5TzF4dVhIUmtaV1psY2k1dVpYaDBWR2xqYXlBOUlHNWxlSFJVYVdOck8xeHVYSFJrWldabGNpNWhiSGRoZVhOQmMzbHVZeUE5SUhSeWRXVTdJQzh2SUhObGRIUnBibWNnZEdocGN5QjNhV3hzSUdOb1lXNW5aU0JrWldaaGRXeDBJR0psYUdGMmFXOTFjaTRnZFhObElHbDBJRzl1YkhrZ2FXWWdibVZqWlhOellYSjVJR0Z6SUdGemVXNWphSEp2Ym1samFYUjVJSGRwYkd3Z1ptOXlZMlVnYzI5dFpTQmtaV3hoZVNCaVpYUjNaV1Z1SUhsdmRYSWdjSEp2YldselpTQnlaWE52YkhWMGFXOXVjeUJoYm1RZ2FYTWdibTkwSUdGc2QyRjVjeUIzYUdGMElIbHZkU0IzWVc1MExseHVYSFF2S2lwY2JseDBLaUJ6WlhSMGFXNW5JRzl1YkhsR2RXNWpjeUIwYnlCbVlXeHpaU0IzYVd4c0lHSnlaV0ZySUhCeWIyMXBjMlZ6TDBFcklHTnZibVp2Y20xcGRIa2dZbmtnWVd4c2IzZHBibWNnZVc5MUlIUnZJSEJoYzNNZ2JtOXVJSFZ1WkdWbWFXNWxaQzl1ZFd4c0lIWmhiSFZsY3lCcGJuTjBaV0ZrSUc5bUlHTmhiR3hpWVdOcmMxeHVYSFFxSUdsdWMzUmxZV1FnYjJZZ2FuVnpkQ0JwWjI1dmNtbHVaeUJoYm5rZ2JtOXVJR1oxYm1OMGFXOXVJSEJoY21GdFpYUmxjbk1nZEc4Z2RHaGxiaXh6ZFdOalpYTnpMR1Z5Y205eUxpNHVJR2wwSUhkcGJHd2dZV05qWlhCMElHNXZiaUJ1ZFd4c2ZIVnVaR1ZtYVc1bFpDQjJZV3gxWlhNdVhHNWNkQ29nZEdocGN5QjNhV3hzSUdGc2JHOTNJSGx2ZFNCemFHOXlkR04xZEhNZ2JHbHJaU0J3Y205dGFYTmxMblJvWlc0b0ozWmhiQ2NzSjJoaGJtUnNaV1FnWlhKeWIzSW5KeWxjYmx4MEtpQjBieUJpWlNCbGNYVnBkbUZzWlc1MElHOW1JSEJ5YjIxcGMyVXVkR2hsYmlobWRXNWpkR2x2YmlncGV5QnlaWFIxY200Z0ozWmhiQ2M3ZlN4bWRXNWpkR2x2YmlncGV5QnlaWFIxY200Z0oyaGhibVJzWldRZ1pYSnliM0luZlNsY2JseDBLaTljYmx4MFpHVm1aWEl1YjI1c2VVWjFibU56SUQwZ2RISjFaVHRjYmx4dVhIUXZLaXBjYmx4MElDb2djbVYwZFhKdUlHRWdablZzWm1sc2JHVmtJSEJ5YjIxcGMyVWdiMllnWjJsMlpXNGdkbUZzZFdVZ0tHRnNkMkY1Y3lCaGMzbHVZeUJ5WlhOdmJIVjBhVzl1S1Z4dVhIUWdLaUJBY0dGeVlXMGdleXA5SUhaaGJIVmxYRzVjZENBcUlFQnlaWFIxY201eklIdHdjbTl0YVhObGZWeHVYSFFnS2k5Y2JseDBaR1ZtWlhJdWNtVnpiMngyWldRZ1BTQmtaV1psY2k1bWRXeG1hV3hzWldRZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNsN0lISmxkSFZ5YmlCa1pXWmxjaWgwY25WbEtTNXlaWE52YkhabEtIWmhiSFZsS1M1d2NtOXRhWE5sT3lCOU8xeHVYRzVjZEM4cUtseHVYSFFnS2lCeVpYUjFjbTRnWVNCeVpXcGxZM1JsWkNCd2NtOXRhWE5sSUhkcGRHZ2daMmwyWlc0Z2NtVmhjMjl1SUc5bUlISmxhbVZqZEdsdmJpQW9ZV3gzWVhseklHRnplVzVqSUhKbGFtVmpkR2x2YmlsY2JseDBJQ29nUUhCaGNtRnRJSHNxZlNCeVpXRnpiMjVjYmx4MElDb2dRSEpsZEhWeWJuTWdlM0J5YjIxcGMyVjlYRzVjZENBcUwxeHVYSFJrWldabGNpNXlaV3BsWTNSbFpDQTlJR1oxYm1OMGFXOXVLSEpsWVhOdmJpbDdJSEpsZEhWeWJpQmtaV1psY2loMGNuVmxLUzV5WldwbFkzUW9jbVZoYzI5dUtTNXdjbTl0YVhObE95QjlPMXh1WEc1Y2RDOHFLbHh1WEhRZ0tpQnlaWFIxY200Z1lTQndjbTl0YVhObElIZHBkR2dnYm04Z2NtVnpiMngxZEdsdmJpQjJZV3gxWlNCM2FHbGphQ0IzYVd4c0lHSmxJSEpsYzI5c2RtVmtJR2x1SUhScGJXVWdiWE1nS0hWemFXNW5JSE5sZEZScGJXVnZkWFFwWEc1Y2RDQXFJRUJ3WVhKaGJTQjdhVzUwZlNCYmRHbHRaVjBnYVc0Z2JYTWdaR1ZtWVhWc2RDQjBieUF3WEc1Y2RDQXFJRUJ5WlhSMWNtNXpJSHR3Y205dGFYTmxmVnh1WEhRZ0tpOWNibHgwWkdWbVpYSXVkMkZwZENBOUlHWjFibU4wYVc5dUtIUnBiV1VwZTF4dVhIUmNkSFpoY2lCa0lEMGdaR1ZtWlhJb0tUdGNibHgwWEhSelpYUlVhVzFsYjNWMEtHUXVjbVZ6YjJ4MlpTd2dkR2x0WlNCOGZDQXdLVHRjYmx4MFhIUnlaWFIxY200Z1pDNXdjbTl0YVhObE8xeHVYSFI5TzF4dVhHNWNkQzhxS2x4dVhIUWdLaUJ5WlhSMWNtNGdZU0J3Y205dGFYTmxJR1p2Y2lCMGFHVWdjbVYwZFhKdUlIWmhiSFZsSUc5bUlHWjFibU4wYVc5dUlHTmhiR3dnZDJocFkyZ2dkMmxzYkNCaVpTQm1kV3htYVd4c1pXUWdhVzRnWkdWc1lYa2diWE1nYjNJZ2NtVnFaV04wWldRZ2FXWWdaMmwyWlc0Z1ptNGdkR2h5YjNjZ1lXNGdaWEp5YjNKY2JseDBJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnWm01Y2JseDBJQ29nUUhCaGNtRnRJSHRwYm5SOUlGdGtaV3hoZVYwZ2FXNGdiWE1nWkdWbVlYVnNkQ0IwYnlBd1hHNWNkQ0FxSUVCeVpYUjFjbTV6SUh0d2NtOXRhWE5sZlZ4dVhIUWdLaTljYmx4MFpHVm1aWEl1WkdWc1lYa2dQU0JtZFc1amRHbHZiaWhtYml3Z1pHVnNZWGtwZTF4dVhIUmNkSFpoY2lCa0lEMGdaR1ZtWlhJb0tUdGNibHgwWEhSelpYUlVhVzFsYjNWMEtHWjFibU4wYVc5dUtDbDdJSFJ5ZVhzZ1pDNXlaWE52YkhabEtHWnVMbUZ3Y0d4NUtHNTFiR3dwS1RzZ2ZXTmhkR05vS0dVcGV5QmtMbkpsYW1WamRDaGxLVHNnZlNCOUxDQmtaV3hoZVNCOGZDQXdLVHRjYmx4MFhIUnlaWFIxY200Z1pDNXdjbTl0YVhObE8xeHVYSFI5TzF4dVhHNWNkQzhxS2x4dVhIUWdLaUJwWmlCbmFYWmxiaUIyWVd4MVpTQnBjeUJ1YjNRZ1lTQndjbTl0YVhObElISmxkSFZ5YmlCaElHWjFiR1pwYkd4bFpDQndjbTl0YVhObElISmxjMjlzZG1Wa0lIUnZJR2RwZG1WdUlIWmhiSFZsWEc1Y2RDQXFJRUJ3WVhKaGJTQjdLbjBnY0hKdmJXbHpaU0JoSUhaaGJIVmxJRzl5SUdFZ2NISnZiV2x6WlZ4dVhIUWdLaUJBY21WMGRYSnVjeUI3Y0hKdmJXbHpaWDFjYmx4MElDb3ZYRzVjZEdSbFptVnlMbkJ5YjIxcGMybG1lU0E5SUdaMWJtTjBhVzl1S0hCeWIyMXBjMlVwZTF4dVhIUmNkR2xtSUNnZ2NISnZiV2x6WlNBbUppQnBjMFoxYm1Nb2NISnZiV2x6WlM1MGFHVnVLU0FwSUhzZ2NtVjBkWEp1SUhCeWIyMXBjMlU3ZlZ4dVhIUmNkSEpsZEhWeWJpQmtaV1psY2k1eVpYTnZiSFpsWkNod2NtOXRhWE5sS1R0Y2JseDBmVHRjYmx4dVhIUm1kVzVqZEdsdmJpQnRkV3gwYVZCeWIyMXBjMlZTWlhOdmJIWmxjaWhqWVd4c1pYSkJjbWQxYldWdWRITXNJSEpsZEhWeWJsQnliMjFwYzJWektYdGNibHgwWEhSMllYSWdjSEp2YldselpYTWdQU0J6YkdsalpTaGpZV3hzWlhKQmNtZDFiV1Z1ZEhNcE8xeHVYSFJjZEdsbUlDZ2djSEp2YldselpYTXViR1Z1WjNSb0lEMDlQU0F4SUNZbUlHbHpRWEp5WVhrb2NISnZiV2x6WlhOYk1GMHBJQ2tnZTF4dVhIUmNkRngwYVdZb0lTQndjbTl0YVhObGMxc3dYUzVzWlc1bmRHZ2dLWHRjYmx4MFhIUmNkRngwY21WMGRYSnVJR1JsWm1WeUxtWjFiR1pwYkd4bFpDaGJYU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ3Y205dGFYTmxjeUE5SUhCeWIyMXBjMlZ6V3pCZE8xeHVYSFJjZEgxY2JseDBYSFIyWVhJZ1lYSm5jeUE5SUZ0ZFhHNWNkRngwWEhRc0lHUWdQU0JrWldabGNpZ3BYRzVjZEZ4MFhIUXNJR01nUFNCd2NtOXRhWE5sY3k1c1pXNW5kR2hjYmx4MFhIUTdYRzVjZEZ4MGFXWWdLQ0FoWXlBcElIdGNibHgwWEhSY2RHUXVjbVZ6YjJ4MlpTaGhjbWR6S1R0Y2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBkbUZ5SUhKbGMyOXNkbVZ5SUQwZ1puVnVZM1JwYjI0b2FTbDdYRzVjZEZ4MFhIUmNkSEJ5YjIxcGMyVnpXMmxkSUQwZ1pHVm1aWEl1Y0hKdmJXbHphV1o1S0hCeWIyMXBjMlZ6VzJsZEtUdGNibHgwWEhSY2RGeDBjSEp2YldselpYTmJhVjB1ZEdobGJpaGNibHgwWEhSY2RGeDBYSFJtZFc1amRHbHZiaWgyS1h0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtSUNnaElDaHBJR2x1SUdGeVozTXBJQ2tnZXlBdkwwQjBiMlJ2SUdOb1pXTnJJSFJvYVhNZ2FYTWdjM1JwYkd3Z2NtVnhkV2x5WldRZ1lYTWdjSEp2YldselpYTWdZMkZ1SjNRZ1ltVWdjbVZ6YjJ4MlpTQnRiM0psSUhSb1lXNGdiMjVqWlZ4dVhIUmNkRngwWEhSY2RGeDBYSFJoY21kelcybGRJRDBnY21WMGRYSnVVSEp2YldselpYTWdQeUJ3Y205dGFYTmxjMXRwWFNBNklIWTdYRzVjZEZ4MFhIUmNkRngwWEhSY2RDZ3RMV01wSUh4OElHUXVjbVZ6YjJ4MlpTaGhjbWR6S1R0Y2JseDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBMQ0JtZFc1amRHbHZiaWhsS1h0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtS0NFZ0tHa2dhVzRnWVhKbmN5a2dLWHRjYmx4MFhIUmNkRngwWEhSY2RGeDBhV1lvSUNFZ2NtVjBkWEp1VUhKdmJXbHpaWE1nS1h0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSa0xuSmxhbVZqZENobEtUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSaGNtZHpXMmxkSUQwZ2NISnZiV2x6WlhOYmFWMDdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBLQzB0WXlrZ2ZId2daQzV5WlhOdmJIWmxLR0Z5WjNNcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUXBPMXh1WEhSY2RGeDBmVHRjYmx4MFhIUmNkR1p2Y2lnZ2RtRnlJR2tnUFNBd0xDQnNJRDBnWXpzZ2FTQThJR3c3SUdrckt5QXBlMXh1WEhSY2RGeDBYSFJ5WlhOdmJIWmxjaWhwS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RGeDBjbVYwZFhKdUlHUXVjSEp2YldselpUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJ5WlhSMWNtNGdZU0J3Y205dGFYTmxJR1p2Y2lCaGJHd2daMmwyWlc0Z2NISnZiV2x6WlhNZ0x5QjJZV3gxWlhNdVhHNWNkQ0FxSUhSb1pTQnlaWFIxY201bFpDQndjbTl0YVhObGN5QjNhV3hzSUdKbElHWjFiR1pwYkd4bFpDQjNhWFJvSUdFZ2JHbHpkQ0J2WmlCeVpYTnZiSFpsWkNCMllXeDFaUzVjYmx4MElDb2dhV1lnWVc1NUlHZHBkbVZ1SUhCeWIyMXBjMlVnYVhNZ2NtVnFaV04wWldRZ2RHaGxiaUJ2YmlCMGFHVWdabWx5YzNRZ2NtVnFaV04wYVc5dUlIUm9aU0J5WlhSMWNtNWxaQ0J3Y205dGFYTmxaQ0IzYVd4c0lHSmxJSEpsYW1WamRHVmtJSGRwZEdnZ2RHaGxJSE5oYldVZ2NtVmhjMjl1WEc1Y2RDQXFJRUJ3WVhKaGJTQjdZWEp5WVhsOExpNHVLbjBnVzNCeWIyMXBjMlZkSUdOaGJpQmlaU0JoSUhOcGJtZHNaU0JoY25KaGVTQnZaaUJ3Y205dGFYTmxMM1poYkhWbGN5QmhjeUJtYVhKemRDQndZWEpoYldWMFpYSWdiM0lnWVNCc2FYTjBJRzltSUdScGNtVmpkQ0J3WVhKaGJXVjBaWEp6SUhCeWIyMXBjMlV2ZG1Gc2RXVmNibHgwSUNvZ1FISmxkSFZ5Ym5NZ2UzQnliMjFwYzJWOUlHOW1JR0VnYkdsemRDQnZaaUJuYVhabGJpQndjbTl0YVhObElISmxjMjlzZFhScGIyNGdkbUZzZFdWY2JseDBJQ292WEc1Y2RHUmxabVZ5TG1Gc2JDQTlJR1oxYm1OMGFXOXVLQ2w3SUhKbGRIVnliaUJ0ZFd4MGFWQnliMjFwYzJWU1pYTnZiSFpsY2loaGNtZDFiV1Z1ZEhNc1ptRnNjMlVwT3lCOU8xeHVYRzVjZEM4cUtseHVYSFFnS2lCeVpYUjFjbTRnWVc0Z1lXeDNZWGx6SUdaMWJHWnBiR3hsWkNCd2NtOXRhWE5sSUc5bUlHRnljbUY1UEhCeWIyMXBjMlUrSUd4cGMzUWdiMllnY0hKdmJXbHpaWE12ZG1Gc2RXVnpJSEpsWjJGeVpHeGxjM01nZEdobGVTQnlaWE52YkhabElHWjFiR1pwYkd4bFpDQnZjaUJ5WldwbFkzUmxaRnh1WEhRZ0tpQkFjR0Z5WVcwZ2UyRnljbUY1ZkM0dUxpcDlJRnR3Y205dGFYTmxYU0JqWVc0Z1ltVWdZU0J6YVc1bmJHVWdZWEp5WVhrZ2IyWWdjSEp2YldselpTOTJZV3gxWlhNZ1lYTWdabWx5YzNRZ2NHRnlZVzFsZEdWeUlHOXlJR0VnYkdsemRDQnZaaUJrYVhKbFkzUWdjR0Z5WVcxbGRHVnljeUJ3Y205dGFYTmxMM1poYkhWbFhHNWNkQ0FxSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHNXZiaUJ3Y205dGFYTmxJSFpoYkhWbGN5QjNhV3hzSUdKbElIQnliMjFwYzJsbWFXVmtLVnh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdjSEp2YldselpYMGdiMllnZEdobElHeHBjM1FnYjJZZ1oybDJaVzRnY0hKdmJXbHpaWE5jYmx4MElDb3ZYRzVjZEdSbFptVnlMbkpsYzI5c2RtVkJiR3dnUFNCbWRXNWpkR2x2YmlncGV5QnlaWFIxY200Z2JYVnNkR2xRY205dGFYTmxVbVZ6YjJ4MlpYSW9ZWEpuZFcxbGJuUnpMSFJ5ZFdVcE95QjlPMXh1WEc1Y2RDOHFLbHh1WEhRZ0tpQjBjbUZ1YzJadmNtMGdZU0IwZVhCcFkyRnNJRzV2WkdWcWN5QmhjM2x1WXlCdFpYUm9iMlFnWVhkaGFYUnBibWNnWVNCallXeHNZbUZqYXlCaGN5QnNZWE4wSUhCaGNtRnRaWFJsY2l3Z2NtVmpaV2wyYVc1bklHVnljbTl5SUdGeklHWnBjbk4wSUhCaGNtRnRaWFJsY2lCMGJ5QmhJR1oxYm1OMGFXOXVJSFJvWVhSY2JseDBJQ29nZDJsc2JDQnlaWFIxY200Z1lTQndjbTl0YVhObElHbHVjM1JsWVdRdUlIUm9aU0J5WlhSMWNtNWxaQ0J3Y205dGFYTmxJSGRwYkd3Z2NtVnpiMngyWlNCM2FYUm9JRzV2Y20xaGJDQmpZV3hzWW1GamF5QjJZV3gxWlNCdGFXNTFjeUIwYUdVZ1ptbHljM1FnWlhKeWIzSWdjR0Z5WVcxbGRHVnlJRzl1WEc1Y2RDQXFJR1oxYkdacGJHd2dZVzVrSUhkcGJHd2dZbVVnY21WcVpXTjBaV1FnZDJsMGFDQjBhR0YwSUdWeWNtOXlJR0Z6SUhKbFlYTnZiaUJwYmlCallYTmxJRzltSUdWeWNtOXlMbHh1WEhRZ0tpQkFjR0Z5WVcwZ2UyOWlhbVZqZEgwZ1czTjFZbXBsWTNSZElHOXdkR2x2Ym1Gc0lITjFZbXBsWTNRZ2IyWWdkR2hsSUcxbGRHaHZaQ0IwYnlCbGJtTmhjSE4xYkdGMFpWeHVYSFFnS2lCQWNHRnlZVzBnZTJaMWJtTjBhVzl1ZlNCbWJpQjBhR1VnWm5WdVkzUnBiMjRnZEc4Z1pXNWpZWEJ6ZFd4aGRHVWdhV1lnZEdobElHNXZjbTFoYkNCallXeHNZbUZqYXlCemFHOTFiR1FnY21WalpXbDJaU0J0YjNKbElIUm9ZVzRnWVNCemFXNW5iR1VnY0dGeVlXMWxkR1Z5SUNodGFXNTFjeUIwYUdVZ1pYSnliM0lwWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb1pTQndjbTl0YVhObElIZHBiR3dnY21WemIyeDJaU0IzYVhSb0lIUm9aU0JzYVhOMElHOXlJSEJoY21GdFpYUmxjbk1nWVhNZ1puVnNabWxzYkcxbGJuUWdkbUZzZFdVdUlFbG1JRzl1YkhrZ2IyNWxJSEJoY21GdFpYUmxjaUJwY3lCelpXNTBJSFJ2SUhSb1pWeHVYSFFnS2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZV3hzWW1GamF5QjBhR1Z1SUdsMElIZHBiR3dnWW1VZ2RYTmxaQ0JoY3lCMGFHVWdjbVZ6YjJ4MWRHbHZiaUIyWVd4MVpTNWNibHgwSUNvZ1FISmxkSFZ5Ym5NZ2UwWjFibU4wYVc5dWZWeHVYSFFnS2k5Y2JseDBaR1ZtWlhJdWJtOWtaVU5oY0hOMWJHVWdQU0JtZFc1amRHbHZiaWh6ZFdKcVpXTjBMQ0JtYmlsN1hHNWNkRngwYVdZZ0tDQWhabTRnS1NCN1hHNWNkRngwWEhSbWJpQTlJSE4xWW1wbFkzUTdYRzVjZEZ4MFhIUnpkV0pxWldOMElEMGdkbTlwWkNnd0tUdGNibHgwWEhSOVhHNWNkRngwY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2w3WEc1Y2RGeDBYSFIyWVhJZ1pDQTlJR1JsWm1WeUtDa3NJR0Z5WjNNZ1BTQnpiR2xqWlNoaGNtZDFiV1Z1ZEhNcE8xeHVYSFJjZEZ4MFlYSm5jeTV3ZFhOb0tHWjFibU4wYVc5dUtHVnljaXdnY21WektYdGNibHgwWEhSY2RGeDBaWEp5SUQ4Z1pDNXlaV3BsWTNRb1pYSnlLU0E2SUdRdWNtVnpiMngyWlNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0Z01pQS9JSE5zYVdObEtHRnlaM1Z0Wlc1MGN5d2dNU2tnT2lCeVpYTXBPMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFIwY25sN1hHNWNkRngwWEhSY2RHWnVMbUZ3Y0d4NUtITjFZbXBsWTNRc0lHRnlaM01wTzF4dVhIUmNkRngwZldOaGRHTm9LR1VwZTF4dVhIUmNkRngwWEhSa0xuSmxhbVZqZENobEtUdGNibHgwWEhSY2RIMWNibHgwWEhSY2RISmxkSFZ5YmlCa0xuQnliMjFwYzJVN1hHNWNkRngwZlR0Y2JseDBmVHRjYmx4dVhIUjBlWEJsYjJZZ2QybHVaRzkzSUNFOVBTQjFibVJsWmxOMGNpQW1KaUFvZDJsdVpHOTNMa1FnUFNCa1pXWmxjaWs3WEc1Y2RIUjVjR1Z2WmlCdGIyUjFiR1VnSVQwOUlIVnVaR1ZtVTNSeUlDWW1JRzF2WkhWc1pTNWxlSEJ2Y25SeklDWW1JQ2h0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR1JsWm1WeUtUdGNibHh1ZlNrb0tUdGNiaUpkZlE9PSIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2VtaXR0ZXInKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCdyZWR1Y2UnKTtcblxuLyoqXG4gKiBSb290IHJlZmVyZW5jZSBmb3IgaWZyYW1lcy5cbiAqL1xuXG52YXIgcm9vdCA9ICd1bmRlZmluZWQnID09IHR5cGVvZiB3aW5kb3dcbiAgPyB0aGlzXG4gIDogd2luZG93O1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gbm9vcCgpe307XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBob3N0IG9iamVjdCxcbiAqIHdlIGRvbid0IHdhbnQgdG8gc2VyaWFsaXplIHRoZXNlIDopXG4gKlxuICogVE9ETzogZnV0dXJlIHByb29mLCBtb3ZlIHRvIGNvbXBvZW50IGxhbmRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNIb3N0KG9iaikge1xuICB2YXIgc3RyID0ge30udG9TdHJpbmcuY2FsbChvYmopO1xuXG4gIHN3aXRjaCAoc3RyKSB7XG4gICAgY2FzZSAnW29iamVjdCBGaWxlXSc6XG4gICAgY2FzZSAnW29iamVjdCBCbG9iXSc6XG4gICAgY2FzZSAnW29iamVjdCBGb3JtRGF0YV0nOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZSBYSFIuXG4gKi9cblxuZnVuY3Rpb24gZ2V0WEhSKCkge1xuICBpZiAocm9vdC5YTUxIdHRwUmVxdWVzdFxuICAgICYmICgnZmlsZTonICE9IHJvb3QubG9jYXRpb24ucHJvdG9jb2wgfHwgIXJvb3QuQWN0aXZlWE9iamVjdCkpIHtcbiAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICB9IGVsc2Uge1xuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAuNi4wJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjMuMCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoKGUpIHt9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYWRkZWQgdG8gc3VwcG9ydCBJRS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxudmFyIHRyaW0gPSAnJy50cmltXG4gID8gZnVuY3Rpb24ocykgeyByZXR1cm4gcy50cmltKCk7IH1cbiAgOiBmdW5jdGlvbihzKSB7IHJldHVybiBzLnJlcGxhY2UoLyheXFxzKnxcXHMqJCkvZywgJycpOyB9O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogPT09IE9iamVjdChvYmopO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gYG9iamAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplKG9iaikge1xuICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHZhciBwYWlycyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG51bGwgIT0gb2JqW2tleV0pIHtcbiAgICAgIHBhaXJzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhaXJzLmpvaW4oJyYnKTtcbn1cblxuLyoqXG4gKiBFeHBvc2Ugc2VyaWFsaXphdGlvbiBtZXRob2QuXG4gKi9cblxuIHJlcXVlc3Quc2VyaWFsaXplT2JqZWN0ID0gc2VyaWFsaXplO1xuXG4gLyoqXG4gICogUGFyc2UgdGhlIGdpdmVuIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCBgc3RyYC5cbiAgKlxuICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICogQGFwaSBwcml2YXRlXG4gICovXG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHN0cikge1xuICB2YXIgb2JqID0ge307XG4gIHZhciBwYWlycyA9IHN0ci5zcGxpdCgnJicpO1xuICB2YXIgcGFydHM7XG4gIHZhciBwYWlyO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHBhaXIgPSBwYWlyc1tpXTtcbiAgICBwYXJ0cyA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMV0pO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBFeHBvc2UgcGFyc2VyLlxuICovXG5cbnJlcXVlc3QucGFyc2VTdHJpbmcgPSBwYXJzZVN0cmluZztcblxuLyoqXG4gKiBEZWZhdWx0IE1JTUUgdHlwZSBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICovXG5cbnJlcXVlc3QudHlwZXMgPSB7XG4gIGh0bWw6ICd0ZXh0L2h0bWwnLFxuICBqc29uOiAnYXBwbGljYXRpb24vanNvbicsXG4gIHhtbDogJ2FwcGxpY2F0aW9uL3htbCcsXG4gIHVybGVuY29kZWQ6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybS1kYXRhJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ob2JqKXtcbiAqICAgICAgIHJldHVybiAnZ2VuZXJhdGVkIHhtbCBoZXJlJztcbiAqICAgICB9O1xuICpcbiAqL1xuXG4gcmVxdWVzdC5zZXJpYWxpemUgPSB7XG4gICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogc2VyaWFsaXplLFxuICAgJ2FwcGxpY2F0aW9uL2pzb24nOiBKU09OLnN0cmluZ2lmeVxuIH07XG5cbiAvKipcbiAgKiBEZWZhdWx0IHBhcnNlcnMuXG4gICpcbiAgKiAgICAgc3VwZXJhZ2VudC5wYXJzZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihzdHIpe1xuICAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAgKiAgICAgfTtcbiAgKlxuICAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cikge1xuICB2YXIgbGluZXMgPSBzdHIuc3BsaXQoL1xccj9cXG4vKTtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICB2YXIgaW5kZXg7XG4gIHZhciBsaW5lO1xuICB2YXIgZmllbGQ7XG4gIHZhciB2YWw7XG5cbiAgbGluZXMucG9wKCk7IC8vIHRyYWlsaW5nIENSTEZcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsaW5lID0gbGluZXNbaV07XG4gICAgaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBmaWVsZCA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdHJpbShsaW5lLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIGZpZWxkc1tmaWVsZF0gPSB2YWw7XG4gIH1cblxuICByZXR1cm4gZmllbGRzO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgbWltZSB0eXBlIGZvciB0aGUgZ2l2ZW4gYHN0cmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHlwZShzdHIpe1xuICByZXR1cm4gc3RyLnNwbGl0KC8gKjsgKi8pLnNoaWZ0KCk7XG59O1xuXG4vKipcbiAqIFJldHVybiBoZWFkZXIgZmllbGQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJhbXMoc3RyKXtcbiAgcmV0dXJuIHJlZHVjZShzdHIuc3BsaXQoLyAqOyAqLyksIGZ1bmN0aW9uKG9iaiwgc3RyKXtcbiAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoLyAqPSAqLylcbiAgICAgICwga2V5ID0gcGFydHMuc2hpZnQoKVxuICAgICAgLCB2YWwgPSBwYXJ0cy5zaGlmdCgpO1xuXG4gICAgaWYgKGtleSAmJiB2YWwpIG9ialtrZXldID0gdmFsO1xuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVzcG9uc2VgIHdpdGggdGhlIGdpdmVuIGB4aHJgLlxuICpcbiAqICAtIHNldCBmbGFncyAoLm9rLCAuZXJyb3IsIGV0YylcbiAqICAtIHBhcnNlIGhlYWRlclxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICBBbGlhc2luZyBgc3VwZXJhZ2VudGAgYXMgYHJlcXVlc3RgIGlzIG5pY2U6XG4gKlxuICogICAgICByZXF1ZXN0ID0gc3VwZXJhZ2VudDtcbiAqXG4gKiAgV2UgY2FuIHVzZSB0aGUgcHJvbWlzZS1saWtlIEFQSSwgb3IgcGFzcyBjYWxsYmFja3M6XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnLycpLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICogICAgICByZXF1ZXN0LmdldCgnLycsIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIFNlbmRpbmcgZGF0YSBjYW4gYmUgY2hhaW5lZDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgT3IgcGFzc2VkIHRvIGAuc2VuZCgpYDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5wb3N0KClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiBPciBmdXJ0aGVyIHJlZHVjZWQgdG8gYSBzaW5nbGUgY2FsbCBmb3Igc2ltcGxlIGNhc2VzOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIEBwYXJhbSB7WE1MSFRUUFJlcXVlc3R9IHhoclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFJlc3BvbnNlKHJlcSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5yZXEgPSByZXE7XG4gIHRoaXMueGhyID0gdGhpcy5yZXEueGhyO1xuICB0aGlzLnRleHQgPSB0aGlzLnJlcS5tZXRob2QgIT0nSEVBRCcgXG4gICAgID8gdGhpcy54aHIucmVzcG9uc2VUZXh0IFxuICAgICA6IG51bGw7XG4gIHRoaXMuc2V0U3RhdHVzUHJvcGVydGllcyh0aGlzLnhoci5zdGF0dXMpO1xuICB0aGlzLmhlYWRlciA9IHRoaXMuaGVhZGVycyA9IHBhcnNlSGVhZGVyKHRoaXMueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTtcbiAgLy8gZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIHNvbWV0aW1lcyBmYWxzZWx5IHJldHVybnMgXCJcIiBmb3IgQ09SUyByZXF1ZXN0cywgYnV0XG4gIC8vIGdldFJlc3BvbnNlSGVhZGVyIHN0aWxsIHdvcmtzLiBzbyB3ZSBnZXQgY29udGVudC10eXBlIGV2ZW4gaWYgZ2V0dGluZ1xuICAvLyBvdGhlciBoZWFkZXJzIGZhaWxzLlxuICB0aGlzLmhlYWRlclsnY29udGVudC10eXBlJ10gPSB0aGlzLnhoci5nZXRSZXNwb25zZUhlYWRlcignY29udGVudC10eXBlJyk7XG4gIHRoaXMuc2V0SGVhZGVyUHJvcGVydGllcyh0aGlzLmhlYWRlcik7XG4gIHRoaXMuYm9keSA9IHRoaXMucmVxLm1ldGhvZCAhPSAnSEVBRCdcbiAgICA/IHRoaXMucGFyc2VCb2R5KHRoaXMudGV4dClcbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgYGZpZWxkYCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgcmV0dXJuIHRoaXMuaGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xufTtcblxuLyoqXG4gKiBTZXQgaGVhZGVyIHJlbGF0ZWQgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gYC50eXBlYCB0aGUgY29udGVudCB0eXBlIHdpdGhvdXQgcGFyYW1zXG4gKlxuICogQSByZXNwb25zZSBvZiBcIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiXG4gKiB3aWxsIHByb3ZpZGUgeW91IHdpdGggYSBgLnR5cGVgIG9mIFwidGV4dC9wbGFpblwiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS5zZXRIZWFkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24oaGVhZGVyKXtcbiAgLy8gY29udGVudC10eXBlXG4gIHZhciBjdCA9IHRoaXMuaGVhZGVyWydjb250ZW50LXR5cGUnXSB8fCAnJztcbiAgdGhpcy50eXBlID0gdHlwZShjdCk7XG5cbiAgLy8gcGFyYW1zXG4gIHZhciBvYmogPSBwYXJhbXMoY3QpO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB0aGlzW2tleV0gPSBvYmpba2V5XTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGJvZHkgYHN0cmAuXG4gKlxuICogVXNlZCBmb3IgYXV0by1wYXJzaW5nIG9mIGJvZGllcy4gUGFyc2Vyc1xuICogYXJlIGRlZmluZWQgb24gdGhlIGBzdXBlcmFnZW50LnBhcnNlYCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUucGFyc2VCb2R5ID0gZnVuY3Rpb24oc3RyKXtcbiAgdmFyIHBhcnNlID0gcmVxdWVzdC5wYXJzZVt0aGlzLnR5cGVdO1xuICByZXR1cm4gcGFyc2UgJiYgc3RyICYmIHN0ci5sZW5ndGhcbiAgICA/IHBhcnNlKHN0cilcbiAgICA6IG51bGw7XG59O1xuXG4vKipcbiAqIFNldCBmbGFncyBzdWNoIGFzIGAub2tgIGJhc2VkIG9uIGBzdGF0dXNgLlxuICpcbiAqIEZvciBleGFtcGxlIGEgMnh4IHJlc3BvbnNlIHdpbGwgZ2l2ZSB5b3UgYSBgLm9rYCBvZiBfX3RydWVfX1xuICogd2hlcmVhcyA1eHggd2lsbCBiZSBfX2ZhbHNlX18gYW5kIGAuZXJyb3JgIHdpbGwgYmUgX190cnVlX18uIFRoZVxuICogYC5jbGllbnRFcnJvcmAgYW5kIGAuc2VydmVyRXJyb3JgIGFyZSBhbHNvIGF2YWlsYWJsZSB0byBiZSBtb3JlXG4gKiBzcGVjaWZpYywgYW5kIGAuc3RhdHVzVHlwZWAgaXMgdGhlIGNsYXNzIG9mIGVycm9yIHJhbmdpbmcgZnJvbSAxLi41XG4gKiBzb21ldGltZXMgdXNlZnVsIGZvciBtYXBwaW5nIHJlc3BvbmQgY29sb3JzIGV0Yy5cbiAqXG4gKiBcInN1Z2FyXCIgcHJvcGVydGllcyBhcmUgYWxzbyBkZWZpbmVkIGZvciBjb21tb24gY2FzZXMuIEN1cnJlbnRseSBwcm92aWRpbmc6XG4gKlxuICogICAtIC5ub0NvbnRlbnRcbiAqICAgLSAuYmFkUmVxdWVzdFxuICogICAtIC51bmF1dGhvcml6ZWRcbiAqICAgLSAubm90QWNjZXB0YWJsZVxuICogICAtIC5ub3RGb3VuZFxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGF0dXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS5zZXRTdGF0dXNQcm9wZXJ0aWVzID0gZnVuY3Rpb24oc3RhdHVzKXtcbiAgdmFyIHR5cGUgPSBzdGF0dXMgLyAxMDAgfCAwO1xuXG4gIC8vIHN0YXR1cyAvIGNsYXNzXG4gIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICB0aGlzLnN0YXR1c1R5cGUgPSB0eXBlO1xuXG4gIC8vIGJhc2ljc1xuICB0aGlzLmluZm8gPSAxID09IHR5cGU7XG4gIHRoaXMub2sgPSAyID09IHR5cGU7XG4gIHRoaXMuY2xpZW50RXJyb3IgPSA0ID09IHR5cGU7XG4gIHRoaXMuc2VydmVyRXJyb3IgPSA1ID09IHR5cGU7XG4gIHRoaXMuZXJyb3IgPSAoNCA9PSB0eXBlIHx8IDUgPT0gdHlwZSlcbiAgICA/IHRoaXMudG9FcnJvcigpXG4gICAgOiBmYWxzZTtcblxuICAvLyBzdWdhclxuICB0aGlzLmFjY2VwdGVkID0gMjAyID09IHN0YXR1cztcbiAgdGhpcy5ub0NvbnRlbnQgPSAyMDQgPT0gc3RhdHVzIHx8IDEyMjMgPT0gc3RhdHVzO1xuICB0aGlzLmJhZFJlcXVlc3QgPSA0MDAgPT0gc3RhdHVzO1xuICB0aGlzLnVuYXV0aG9yaXplZCA9IDQwMSA9PSBzdGF0dXM7XG4gIHRoaXMubm90QWNjZXB0YWJsZSA9IDQwNiA9PSBzdGF0dXM7XG4gIHRoaXMubm90Rm91bmQgPSA0MDQgPT0gc3RhdHVzO1xuICB0aGlzLmZvcmJpZGRlbiA9IDQwMyA9PSBzdGF0dXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBgRXJyb3JgIHJlcHJlc2VudGF0aXZlIG9mIHRoaXMgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybiB7RXJyb3J9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS50b0Vycm9yID0gZnVuY3Rpb24oKXtcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgbWV0aG9kID0gcmVxLm1ldGhvZDtcbiAgdmFyIHVybCA9IHJlcS51cmw7XG5cbiAgdmFyIG1zZyA9ICdjYW5ub3QgJyArIG1ldGhvZCArICcgJyArIHVybCArICcgKCcgKyB0aGlzLnN0YXR1cyArICcpJztcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVyci5tZXRob2QgPSBtZXRob2Q7XG4gIGVyci51cmwgPSB1cmw7XG5cbiAgcmV0dXJuIGVycjtcbn07XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZWAuXG4gKi9cblxucmVxdWVzdC5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlcXVlc3RgIHdpdGggdGhlIGdpdmVuIGBtZXRob2RgIGFuZCBgdXJsYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJlcXVlc3QobWV0aG9kLCB1cmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBFbWl0dGVyLmNhbGwodGhpcyk7XG4gIHRoaXMuX3F1ZXJ5ID0gdGhpcy5fcXVlcnkgfHwgW107XG4gIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5oZWFkZXIgPSB7fTtcbiAgdGhpcy5faGVhZGVyID0ge307XG4gIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGVyciA9IG51bGw7XG4gICAgdmFyIHJlcyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgcmVzID0gbmV3IFJlc3BvbnNlKHNlbGYpOyBcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGVyciA9IG5ldyBFcnJvcignUGFyc2VyIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgcmVzcG9uc2UnKTtcbiAgICAgIGVyci5wYXJzZSA9IHRydWU7XG4gICAgICBlcnIub3JpZ2luYWwgPSBlO1xuICAgIH1cblxuICAgIHNlbGYuY2FsbGJhY2soZXJyLCByZXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBNaXhpbiBgRW1pdHRlcmAuXG4gKi9cblxuRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogQWxsb3cgZm9yIGV4dGVuc2lvblxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uKGZuKSB7XG4gIGZuKHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBTZXQgdGltZW91dCB0byBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbihtcyl7XG4gIHRoaXMuX3RpbWVvdXQgPSBtcztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuX3RpbWVvdXQgPSAwO1xuICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWJvcnQgdGhlIHJlcXVlc3QsIGFuZCBjbGVhciBwb3RlbnRpYWwgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uKCl7XG4gIGlmICh0aGlzLmFib3J0ZWQpIHJldHVybjtcbiAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgdGhpcy54aHIuYWJvcnQoKTtcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgdGhpcy5lbWl0KCdhYm9ydCcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciBgZmllbGRgIHRvIGB2YWxgLCBvciBtdWx0aXBsZSBmaWVsZHMgd2l0aCBvbmUgb2JqZWN0LlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKVxuICogICAgICAgIC5zZXQoJ1gtQVBJLUtleScsICdmb29iYXInKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnNldCh7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnWC1BUEktS2V5JzogJ2Zvb2JhcicgfSlcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGZpZWxkXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oZmllbGQsIHZhbCl7XG4gIGlmIChpc09iamVjdChmaWVsZCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXSA9IHZhbDtcbiAgdGhpcy5oZWFkZXJbZmllbGRdID0gdmFsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGhlYWRlciBgZmllbGRgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAudW5zZXQoJ1VzZXItQWdlbnQnKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICBkZWxldGUgdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xuICBkZWxldGUgdGhpcy5oZWFkZXJbZmllbGRdO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgaGVhZGVyIGBmaWVsZGAgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIgPSBmdW5jdGlvbihmaWVsZCl7XG4gIHJldHVybiB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07XG59O1xuXG4vKipcbiAqIFNldCBDb250ZW50LVR5cGUgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCd4bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBY2NlcHQgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQWNjZXB0JywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBdXRob3JpemF0aW9uIGZpZWxkIHZhbHVlIHdpdGggYHVzZXJgIGFuZCBgcGFzc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXV0aCA9IGZ1bmN0aW9uKHVzZXIsIHBhc3Mpe1xuICB2YXIgc3RyID0gYnRvYSh1c2VyICsgJzonICsgcGFzcyk7XG4gIHRoaXMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBzdHIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuKiBBZGQgcXVlcnktc3RyaW5nIGB2YWxgLlxuKlxuKiBFeGFtcGxlczpcbipcbiogICByZXF1ZXN0LmdldCgnL3Nob2VzJylcbiogICAgIC5xdWVyeSgnc2l6ZT0xMCcpXG4qICAgICAucXVlcnkoeyBjb2xvcjogJ2JsdWUnIH0pXG4qXG4qIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmFsXG4qIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuKiBAYXBpIHB1YmxpY1xuKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbih2YWwpe1xuICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHZhbCkgdmFsID0gc2VyaWFsaXplKHZhbCk7XG4gIGlmICh2YWwpIHRoaXMuX3F1ZXJ5LnB1c2godmFsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdyaXRlIHRoZSBmaWVsZCBgbmFtZWAgYW5kIGB2YWxgIGZvciBcIm11bHRpcGFydC9mb3JtLWRhdGFcIlxuICogcmVxdWVzdCBib2RpZXMuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoJ2ZvbycsICdiYXInKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xCbG9ifEZpbGV9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmZpZWxkID0gZnVuY3Rpb24obmFtZSwgdmFsKXtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkgdGhpcy5fZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgdGhpcy5fZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBRdWV1ZSB0aGUgZ2l2ZW4gYGZpbGVgIGFzIGFuIGF0dGFjaG1lbnQgdG8gdGhlIHNwZWNpZmllZCBgZmllbGRgLFxuICogd2l0aCBvcHRpb25hbCBgZmlsZW5hbWVgLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAqICAgLmF0dGFjaChuZXcgQmxvYihbJzxhIGlkPVwiYVwiPjxiIGlkPVwiYlwiPmhleSE8L2I+PC9hPiddLCB7IHR5cGU6IFwidGV4dC9odG1sXCJ9KSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7QmxvYnxGaWxlfSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbihmaWVsZCwgZmlsZSwgZmlsZW5hbWUpe1xuICBpZiAoIXRoaXMuX2Zvcm1EYXRhKSB0aGlzLl9mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICB0aGlzLl9mb3JtRGF0YS5hcHBlbmQoZmllbGQsIGZpbGUsIGZpbGVuYW1lKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNlbmQgYGRhdGFgLCBkZWZhdWx0aW5nIHRoZSBgLnR5cGUoKWAgdG8gXCJqc29uXCIgd2hlblxuICogYW4gb2JqZWN0IGlzIGdpdmVuLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgIC8vIHF1ZXJ5c3RyaW5nXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3NlYXJjaCcpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gbXVsdGlwbGUgZGF0YSBcIndyaXRlc1wiXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3NlYXJjaCcpXG4gKiAgICAgICAgIC5zZW5kKHsgc2VhcmNoOiAncXVlcnknIH0pXG4gKiAgICAgICAgIC5zZW5kKHsgcmFuZ2U6ICcxLi41JyB9KVxuICogICAgICAgICAuc2VuZCh7IG9yZGVyOiAnZGVzYycgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBtYW51YWwganNvblxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdqc29uJylcbiAqICAgICAgICAgLnNlbmQoJ3tcIm5hbWVcIjpcInRqXCJ9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8ganNvblxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIG1hbnVhbCB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnZm9ybScpXG4gKiAgICAgICAgIC5zZW5kKCduYW1lPXRqJylcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBhdXRvIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gZGVmYXVsdHMgdG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gICogICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAgKiAgICAgICAgLnNlbmQoJ25hbWU9dG9iaScpXG4gICogICAgICAgIC5zZW5kKCdzcGVjaWVzPWZlcnJldCcpXG4gICogICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBkYXRhXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uKGRhdGEpe1xuICB2YXIgb2JqID0gaXNPYmplY3QoZGF0YSk7XG4gIHZhciB0eXBlID0gdGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIC8vIG1lcmdlXG4gIGlmIChvYmogJiYgaXNPYmplY3QodGhpcy5fZGF0YSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgdGhpcy5fZGF0YVtrZXldID0gZGF0YVtrZXldO1xuICAgIH1cbiAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZGF0YSkge1xuICAgIGlmICghdHlwZSkgdGhpcy50eXBlKCdmb3JtJyk7XG4gICAgdHlwZSA9IHRoaXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKTtcbiAgICBpZiAoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgPT0gdHlwZSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGFcbiAgICAgICAgPyB0aGlzLl9kYXRhICsgJyYnICsgZGF0YVxuICAgICAgICA6IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGEgPSAodGhpcy5fZGF0YSB8fCAnJykgKyBkYXRhO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICghb2JqKSByZXR1cm4gdGhpcztcbiAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2pzb24nKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCBgZXJyYCBhbmQgYHJlc2BcbiAqIGFuZCBoYW5kbGUgYXJpdHkgY2hlY2suXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhbGxiYWNrID0gZnVuY3Rpb24oZXJyLCByZXMpe1xuICB2YXIgZm4gPSB0aGlzLl9jYWxsYmFjaztcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgaWYgKDIgPT0gZm4ubGVuZ3RoKSByZXR1cm4gZm4oZXJyLCByZXMpO1xuICBpZiAoZXJyKSByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIGZuKHJlcyk7XG59O1xuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHgtZG9tYWluIGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNyb3NzRG9tYWluRXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgZXJyID0gbmV3IEVycm9yKCdPcmlnaW4gaXMgbm90IGFsbG93ZWQgYnkgQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJyk7XG4gIGVyci5jcm9zc0RvbWFpbiA9IHRydWU7XG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggdGltZW91dCBlcnJvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50aW1lb3V0RXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgdGltZW91dCA9IHRoaXMuX3RpbWVvdXQ7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ3RpbWVvdXQgb2YgJyArIHRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnKTtcbiAgZXJyLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB0aGlzLmNhbGxiYWNrKGVycik7XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0cmFuc21pc3Npb24gb2YgY29va2llcyB3aXRoIHgtZG9tYWluIHJlcXVlc3RzLlxuICpcbiAqIE5vdGUgdGhhdCBmb3IgdGhpcyB0byB3b3JrIHRoZSBvcmlnaW4gbXVzdCBub3QgYmVcbiAqIHVzaW5nIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIgd2l0aCBhIHdpbGRjYXJkLFxuICogYW5kIGFsc28gbXVzdCBzZXQgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiXG4gKiB0byBcInRydWVcIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLndpdGhDcmVkZW50aWFscyA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBJbml0aWF0ZSByZXF1ZXN0LCBpbnZva2luZyBjYWxsYmFjayBgZm4ocmVzKWBcbiAqIHdpdGggYW4gaW5zdGFuY2VvZiBgUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oZm4pe1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB4aHIgPSB0aGlzLnhociA9IGdldFhIUigpO1xuICB2YXIgcXVlcnkgPSB0aGlzLl9xdWVyeS5qb2luKCcmJyk7XG4gIHZhciB0aW1lb3V0ID0gdGhpcy5fdGltZW91dDtcbiAgdmFyIGRhdGEgPSB0aGlzLl9mb3JtRGF0YSB8fCB0aGlzLl9kYXRhO1xuXG4gIC8vIHN0b3JlIGNhbGxiYWNrXG4gIHRoaXMuX2NhbGxiYWNrID0gZm4gfHwgbm9vcDtcblxuICAvLyBzdGF0ZSBjaGFuZ2VcbiAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7XG4gICAgaWYgKDQgIT0geGhyLnJlYWR5U3RhdGUpIHJldHVybjtcbiAgICBpZiAoMCA9PSB4aHIuc3RhdHVzKSB7XG4gICAgICBpZiAoc2VsZi5hYm9ydGVkKSByZXR1cm4gc2VsZi50aW1lb3V0RXJyb3IoKTtcbiAgICAgIHJldHVybiBzZWxmLmNyb3NzRG9tYWluRXJyb3IoKTtcbiAgICB9XG4gICAgc2VsZi5lbWl0KCdlbmQnKTtcbiAgfTtcblxuICAvLyBwcm9ncmVzc1xuICBpZiAoeGhyLnVwbG9hZCkge1xuICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uKGUpe1xuICAgICAgZS5wZXJjZW50ID0gZS5sb2FkZWQgLyBlLnRvdGFsICogMTAwO1xuICAgICAgc2VsZi5lbWl0KCdwcm9ncmVzcycsIGUpO1xuICAgIH07XG4gIH1cblxuICAvLyB0aW1lb3V0XG4gIGlmICh0aW1lb3V0ICYmICF0aGlzLl90aW1lcikge1xuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgc2VsZi5hYm9ydCgpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9XG5cbiAgLy8gcXVlcnlzdHJpbmdcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgcXVlcnkgPSByZXF1ZXN0LnNlcmlhbGl6ZU9iamVjdChxdWVyeSk7XG4gICAgdGhpcy51cmwgKz0gfnRoaXMudXJsLmluZGV4T2YoJz8nKVxuICAgICAgPyAnJicgKyBxdWVyeVxuICAgICAgOiAnPycgKyBxdWVyeTtcbiAgfVxuXG4gIC8vIGluaXRpYXRlIHJlcXVlc3RcbiAgeGhyLm9wZW4odGhpcy5tZXRob2QsIHRoaXMudXJsLCB0cnVlKTtcblxuICAvLyBDT1JTXG4gIGlmICh0aGlzLl93aXRoQ3JlZGVudGlhbHMpIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuXG4gIC8vIGJvZHlcbiAgaWYgKCdHRVQnICE9IHRoaXMubWV0aG9kICYmICdIRUFEJyAhPSB0aGlzLm1ldGhvZCAmJiAnc3RyaW5nJyAhPSB0eXBlb2YgZGF0YSAmJiAhaXNIb3N0KGRhdGEpKSB7XG4gICAgLy8gc2VyaWFsaXplIHN0dWZmXG4gICAgdmFyIHNlcmlhbGl6ZSA9IHJlcXVlc3Quc2VyaWFsaXplW3RoaXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKV07XG4gICAgaWYgKHNlcmlhbGl6ZSkgZGF0YSA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgfVxuXG4gIC8vIHNldCBoZWFkZXIgZmllbGRzXG4gIGZvciAodmFyIGZpZWxkIGluIHRoaXMuaGVhZGVyKSB7XG4gICAgaWYgKG51bGwgPT0gdGhpcy5oZWFkZXJbZmllbGRdKSBjb250aW51ZTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihmaWVsZCwgdGhpcy5oZWFkZXJbZmllbGRdKTtcbiAgfVxuXG4gIC8vIHNlbmQgc3R1ZmZcbiAgdGhpcy5lbWl0KCdyZXF1ZXN0JywgdGhpcyk7XG4gIHhoci5zZW5kKGRhdGEpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0YC5cbiAqL1xuXG5yZXF1ZXN0LlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIElzc3VlIGEgcmVxdWVzdDpcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICByZXF1ZXN0KCdHRVQnLCAnL3VzZXJzJykuZW5kKGNhbGxiYWNrKVxuICogICAgcmVxdWVzdCgnL3VzZXJzJykuZW5kKGNhbGxiYWNrKVxuICogICAgcmVxdWVzdCgnL3VzZXJzJywgY2FsbGJhY2spXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHVybCBvciBjYWxsYmFja1xuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmVxdWVzdChtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdXJsKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KCdHRVQnLCBtZXRob2QpLmVuZCh1cmwpO1xuICB9XG5cbiAgLy8gdXJsIGZpcnN0XG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IFJlcXVlc3QoJ0dFVCcsIG1ldGhvZCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlcXVlc3QobWV0aG9kLCB1cmwpO1xufVxuXG4vKipcbiAqIEdFVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBkYXRhIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5nZXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBIRUFEIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IGRhdGEgb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LmhlYWQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0hFQUQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgZm4gPSBkYXRhLCBkYXRhID0gbnVsbDtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBERUxFVEUgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QuZGVsID0gZnVuY3Rpb24odXJsLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdERUxFVEUnLCB1cmwpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQQVRDSCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR9IGRhdGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBhdGNoID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQQVRDSCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIFBPU1QgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBkYXRhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wb3N0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIGZuID0gZGF0YSwgZGF0YSA9IG51bGw7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogUFVUIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gZGF0YSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucHV0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQVVQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgZm4gPSBkYXRhLCBkYXRhID0gbnVsbDtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYHJlcXVlc3RgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdDtcbiIsIlxuLyoqXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFbWl0dGVyYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufTtcblxuLyoqXG4gKiBNaXhpbiB0aGUgZW1pdHRlciBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpIHtcbiAgICBvYmpba2V5XSA9IEVtaXR0ZXIucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBMaXN0ZW4gb24gdGhlIGdpdmVuIGBldmVudGAgd2l0aCBgZm5gLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9uID1cbkVtaXR0ZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gICh0aGlzLl9jYWxsYmFja3NbZXZlbnRdID0gdGhpcy5fY2FsbGJhY2tzW2V2ZW50XSB8fCBbXSlcbiAgICAucHVzaChmbik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGBldmVudGAgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgYSBzaW5nbGVcbiAqIHRpbWUgdGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuXG4gIGZ1bmN0aW9uIG9uKCkge1xuICAgIHNlbGYub2ZmKGV2ZW50LCBvbik7XG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uLmZuID0gZm47XG4gIHRoaXMub24oZXZlbnQsIG9uKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGBldmVudGAgb3IgYWxsXG4gKiByZWdpc3RlcmVkIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vZmYgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG5cbiAgLy8gYWxsXG4gIGlmICgwID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNwZWNpZmljIGV2ZW50XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XG5cbiAgLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tldmVudF07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxuICB2YXIgY2I7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2IgPSBjYWxsYmFja3NbaV07XG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcbiAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1tldmVudF07XG5cbiAgaWYgKGNhbGxiYWNrcykge1xuICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBjYWxsYmFja3NbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbZXZlbnRdIHx8IFtdO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGVtaXR0ZXIgaGFzIGBldmVudGAgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xufTtcbiIsIlxuLyoqXG4gKiBSZWR1Y2UgYGFycmAgd2l0aCBgZm5gLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7TWl4ZWR9IGluaXRpYWxcbiAqXG4gKiBUT0RPOiBjb21iYXRpYmxlIGVycm9yIGhhbmRsaW5nP1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYXJyLCBmbiwgaW5pdGlhbCl7ICBcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICB2YXIgY3VyciA9IGFyZ3VtZW50cy5sZW5ndGggPT0gM1xuICAgID8gaW5pdGlhbFxuICAgIDogYXJyW2lkeCsrXTtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgY3VyciA9IGZuLmNhbGwobnVsbCwgY3VyciwgYXJyW2lkeF0sICsraWR4LCBhcnIpO1xuICB9XG4gIFxuICByZXR1cm4gY3Vycjtcbn07IiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIm5hbWVcIjogXCJkZXBsb3lyXCIsXG4gIFwidmVyc2lvblwiOiBcIjcuNC4xXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJTaW1wbGlmaWVkIEphdmFTY3JpcHQgY2xpZW50IGxpYnJhcnkgZm9yIG1ha2luZyByZXF1ZXN0cyB0byBEZXBsb3lSLlwiLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImRlcGxveXJcIixcbiAgICBcImRlcGxveXIuaW9cIixcbiAgICBcImFqYXhcIixcbiAgICBcIlJcIixcbiAgICBcImFwaVwiLFxuICAgIFwic2ltcGxlXCJcbiAgXSxcbiAgXCJhdXRob3JcIjogXCJEZXBsb3lSIC0gUmV2b2x1dGlvbiBBbmFseXRpY3MgSW5jLlwiLFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJTZWFuIFdlbGxzXCJcbiAgXSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdDovL2dpdGh1Yi5jb20vZGVwbG95ci9qcy1jbGllbnQtbGlicmFyeS5naXRcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cDovL2RlcGxveXIucmV2b2x1dGlvbmFuYWx5dGljcy5jb20vZG9jdW1lbnRzL2Rldi9jbGllbnQtanNkb2NcIixcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInN0YXJ0XCI6IFwiZ3VscCBzdGFydFwiLFxuICAgIFwiYnVpbGRcIjogXCJndWxwXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYnJvd3NlcmlmeVwiOiBcIl45LjAuM1wiLFxuICAgIFwiZ3VscFwiOiBcIl4zLjguMTFcIixcbiAgICBcImd1bHAtY29ubmVjdFwiOiBcIl4yLjIuMFwiLFxuICAgIFwiZ3VscC1oZWFkZXJcIjogXCJeMS4yLjJcIixcbiAgICBcImd1bHAtanNoaW50XCI6IFwiXjEuOS4yXCIsXG4gICAgXCJndWxwLWxpdmVyZWxvYWRcIjogXCJeMy44LjBcIixcbiAgICBcImd1bHAtcGx1bWJlclwiOiBcIl4wLjYuNlwiLFxuICAgIFwiZ3VscC1yZW5hbWVcIjogXCJeMS4yLjJcIiwgICAgXG4gICAgXCJndWxwLXVnbGlmeVwiOiBcIl4xLjIuMFwiLFxuICAgIFwiZ3VscC11dGlsXCI6IFwiXjMuMC40XCIsXG4gICAgXCJ0YXBlXCI6IFwiXjMuNS4wXCIsXG4gICAgXCJ2aW55bC1zb3VyY2Utc3RyZWFtXCI6IFwiXjEuMC4wXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZC5qc1wiOiBcIl4wLjYuMFwiLCAgICBcbiAgICBcInN1cGVyYWdlbnRcIjogXCJeMC4yMS4wXCIsXG4gICAgXCJ3c1wiOiBcIl4wLjQuMzJcIlxuICB9LFxuICBcIm1haW5cIjogXCJkZXBsb3lyLmpzXCIsXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0gMC4xMC4wXCJcbiAgfSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlIDIuMCBMaWNlbnNlXCIsXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZGVwbG95ci9qcy1jbGllbnQtbGlicmFyeS9pc3N1ZXNcIlxuICB9LFxuICBcImRpcmVjdG9yaWVzXCI6IHtcbiAgICBcImV4YW1wbGVcIjogXCJleGFtcGxlc1wiLFxuICAgIFwidGVzdFwiOiBcInRlc3RcIlxuICB9XG59XG4iXX0= +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkZXBsb3lyLmpzIiwiYXBpcy5qc29uIiwibGliL2RlcHJlY2F0ZWQuanMiLCJsaWIvZW1pdHRlci5qcyIsImxpYi9lbmNvZGVyLmpzIiwibGliL2VzLmpzIiwibGliL2xhbmcuanMiLCJsaWIvbG9nZ2VyLmpzIiwibGliL29wdGlvbmFsLmpzIiwibGliL3F1ZXVlLmpzIiwibGliL3JpbnB1dC5qcyIsImxpYi9yaW5wdXRzLmpzIiwibGliL3J0eXBlcy5qcyIsImxpYi9zZWxmaXNoLmpzIiwibGliL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbGliL19lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvZC5qcy9saWIvRC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9jbGllbnQuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9ub2RlX21vZHVsZXMvY29tcG9uZW50LWVtaXR0ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9ub2RlX21vZHVsZXMvcmVkdWNlLWNvbXBvbmVudC9pbmRleC5qcyIsInBhY2thZ2UuanNvbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOTJDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL2FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3R5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUhBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE1IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxudmFyIHdpbiAgICAgICAgID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSwgICBcbiAgICByZXF1ZXN0ICAgICA9IHJlcXVpcmUoJ3N1cGVyYWdlbnQnKSxcbiAgICBEICAgICAgICAgICA9IHJlcXVpcmUoJ2QuanMnKSxcbiAgICBmcyAgICAgICAgICA9IHJlcXVpcmUoJ2ZzJyksXG4gICAgYXBpcyAgICAgICAgPSByZXF1aXJlKCcuL2FwaXMuanNvbicpLCBcbiAgICBFdmVudFN0cmVhbSA9IHJlcXVpcmUoJy4vbGliL2VzJyksXG4gICAgdXRpbHMgICAgICAgPSByZXF1aXJlKCcuL2xpYi91dGlscycpLFxuICAgIExhbmcgICAgICAgID0gcmVxdWlyZSgnLi9saWIvbGFuZycpLCAgIFxuICAgIExvZ2dlciAgICAgID0gcmVxdWlyZSgnLi9saWIvbG9nZ2VyJyksICAgXG4gICAgUXVldWUgICAgICAgPSByZXF1aXJlKCcuL2xpYi9xdWV1ZScpLFxuICAgIEVtaXR0ZXIgICAgID0gcmVxdWlyZSgnLi9saWIvZW1pdHRlcicpLFxuICAgIGVuY29kZXIgICAgID0gcmVxdWlyZSgnLi9saWIvZW5jb2RlcicpLFxuICAgIEJhc2UgICAgICAgID0gcmVxdWlyZSgnLi9saWIvc2VsZmlzaCcpLkJhc2UsXG4gICAgUklucHV0ICAgICAgPSByZXF1aXJlKCcuL2xpYi9yaW5wdXQnKSwgICAgXG4gICAgUklucHV0cyAgICAgPSByZXF1aXJlKCcuL2xpYi9yaW5wdXRzJyksXG4gICAgbWVyZ2UgICAgICAgPSB1dGlscy5tZXJnZTtcblxuLypcbiAqIFR1cm4gZ2xvYmFsIGxvZ2dpbmcgb2ZmIGJ5IGRlZmF1bHRcbiAqL1xuTG9nZ2VyLnNldExldmVsKExvZ2dlci5PRkYpO1xuXG4vKlxuICogR2xvYmFsIG9wdGlvbnMgdGhhdCBwZXJzaXN0IHRocm91Z2ggYWxsIERlcGxveVIgcmVxdWVzdHMuXG4gKi9cbnZhciBnbG9iYWxPcHRpb25zID0geyBcbiAgY29yczogZmFsc2UsXG4gIGxvZ2dpbmc6IGZhbHNlLFxuICBzdGlja3k6IGZhbHNlLFxuICBjb29raWVzOiBudWxsLFxuICBob3N0OiAnJyxcbiAgYWxsb3dTZWxmU2lnbmVkU1NMQ2VydDogZmFsc2UsXG4gIG1heFJlcXVlc3RzOiBudWxsLCAvLyBubyBzb2NrZXQgcG9vbGluZyBpbiBodHRwLkFnZW50XG4gIGV2ZW50czp7fSxcbiAgc2V0OiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgeyBcbiAgICBpZiAocHJvcCAhPT0gJ3NldCcpIHsgXG4gICAgICBpZiAocHJvcCA9PT0gJ2hvc3QnICYmIHZhbHVlKSB7ICAgICAgICAgXG4gICAgICAgICAvLyBCZSBtb3JlIGZvcmdpdmluZyBvbiB0aGUgZW50ZXJlZCBEZXBsb3lSICdlbmRwb2ludCc6XG4gICAgICAgICAvLyAgIC0gaHR0cChzKTovL2Rob3N0OnBvcnRcbiAgICAgICAgIC8vICAgLSBodHRwKHMpOi8vZGhvc3Q6cG9ydC9kZXBsb3lyXG4gICAgICAgICAvLyAgIC0gZGhvc3Q6cG9ydFxuICAgICAgICAgLy8gICAtIGRob3N0OnBvcnQvZGVwbG95ciAgICAgICAgIFxuICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXC8qJHxcXC8qZGVwbG95clxcLyokLywgJycpO1xuICAgICAgICAgdmFsdWUgPSAobmV3IFJlZ0V4cCgnXihodHRwfGh0dHBzKTovLycsICdpJykpLnRlc3QodmFsdWUpID8gdmFsdWUgOiBcbiAgICAgICAgICAgICdodHRwOi8vJyArIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzW3Byb3BdID0gdmFsdWU7IFxuICAgIH0gXG4gIH1cbn07XG5cbi8qXG4gKiBUaGUgdG9wLWxldmVsIERlcGxveVIgQVBJIHJlc3BvbnNlIGVudGl0aWVzLlxuICovXG52YXIgVE9QTEVWRUxfRU5USVRJRVMgPSBbXG4gICd1c2VyJywgXG4gICdwcm9qZWN0JywgXG4gICd3b3Jrc3BhY2UnLCBcbiAgJ2V4ZWN1dGlvbicsIFxuICAnZGlyZWN0b3J5JywgXG4gICdyZXBvc2l0b3J5JywgXG4gICdwYWNrYWdlcycgXG5dO1xuXG4vKlxuICogTm90aWZ5IGdsb2JhbCBJTyBlcnJvciBldmVudHMgYWNjZXNzaWJsZSBieSBhbGwgc3Vic2NyaWJlcnMgYWNyb3NzIHJlcXVlc3RzLlxuICovXG5mdW5jdGlvbiByYWlzZUdsb2JhbEVycm9ycyhhcGksIHJlcykge1xuICB2YXIgY29kZSAgICA9IHJlcy5kZXBsb3lyID8gcmVzLmRlcGxveXIucmVzcG9uc2UuZXJyb3JDb2RlIDogcmVzLnN0YXR1cyxcbiAgICAgIGNvbnRleHQgPSB0aGlzO1xuXG4gIC8vIC0tIGdsb2JhbCBldmVudHMgaWYgcHJvdmlkZWQgLS1cbiAgaWYgKGdsb2JhbE9wdGlvbnMuZXZlbnRzKSB7XG4gICAgaWYgKCFyZXMuZGVwbG95cikge1xuICAgICAgcmVzID0gcmVzLnRleHQ7XG4gICAgfVxuXG4gICAgY29udGV4dCA9IGdsb2JhbE9wdGlvbnMuZXZlbnRzLmN0eCB8fCBjb250ZXh0O1xuXG4gICAgLy8gLS0gZ2VuZXJhbCBnbG9iYWwgZmFpbHVyZSAtLVxuICAgIGlmIChnbG9iYWxPcHRpb25zLmV2ZW50cy5lcnJvcikge1xuICAgICAgZ2xvYmFsT3B0aW9ucy5ldmVudHMuZXJyb3IuYXBwbHkoY29udGV4dCwgW2FwaSwgcmVzXSk7XG4gICAgfVxuXG4gICAgLy8gLS0gSFRUUCBvciBEZXBsb3lSIGdsb2JhbCBlcnJvcnMgLS0gICAgXG4gICAgaWYgKGdsb2JhbE9wdGlvbnMuZXZlbnRzW2NvZGVdKSB7XG4gICAgICBnbG9iYWxPcHRpb25zLmV2ZW50c1tjb2RlXS5hcHBseShjb250ZXh0LCBbYXBpLCByZXNdKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgYERlcGxveVJgIHJlcXVlc3QgY2xhc3MgaXMgYSB1dGlsaXR5IHRoYXQgYnJva2VycyBIVFRQIHJlcXVlc3RzIHRocm91Z2ggYSBcbiAqIHNpbXBsaWZpZWQgZmx1aWQgaW50ZXJmYWNlIHRvIERlcGxveVIuXG4gKlxuICogQG1vZHVsZSBkZXBsb3lyXG4gKiBAZm9yIGRlcGxveXJcbiAqL1xudmFyIERlcGxveVIgPSBCYXNlLmV4dGVuZChFbWl0dGVyLCBSSW5wdXRzLCB7XG5cbiAgLyoqXG4gICAqIFRoZSBgRGVwbG95UmAgUmVxdWVzdCBjbGFzcyBpcyBhIHV0aWxpdHkgdGhhdCBicm9rZXJzIEhUVFAgcmVxdWVzdHMgdGhyb3VnaCBcbiAgICogYSBzaW1wbGlmaWVkIGZsdWlkIGludGVyZmFjZSB0byBEZXBsb3lSLlxuICAgKiBcbiAgICogQGNsYXNzIFxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFwaSBUaGUgRGVwbG95UiBBUElcbiAgICogQHBhcmFtIHtPYmplY3R9IGxpbmsgVGhlIG9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcgdGhlIHByZXZpb3VzIHJlcXVlc3QuXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShhcGksIGxpbmspIHtcbiAgICAgRW1pdHRlci5pbml0aWFsaXplLmNhbGwodGhpcywge30pO1xuICBcbiAgICAgdmFyIG9wdHMgPSBnbG9iYWxPcHRpb25zO1xuXG4gICAgIGlmICghYXBpc1thcGldKSB7IHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBUEkgXCInICsgYXBpICsgJ1wiJyk7IH1cbiAgICBcbiAgICAgdGhpcy5hcGkgICAgICAgID0gbWVyZ2UoeyAnY2FsbCc6IGFwaSB9LCBhcGlzW2FwaV0pOyAgICBcbiAgICAgdGhpcy5saW5rICAgICAgID0gbGluayB8fCB7fTtcbiAgICAgdGhpcy5xICAgICAgICAgID0gdGhpcy5saW5rLnF1ZXVlIHx8IG5ldyBRdWV1ZSgpO1xuICAgICB0aGlzLmRlZmVycmVkICAgPSB0aGlzLmxpbmsuZGVmZXJyZWQgfHwgRCgpO1xuICAgICB0aGlzLmNvb2tpZXMgICAgPSB0aGlzLmxpbmsuY29va2llcztcbiAgICAgdGhpcy5sb2dnZXIgICAgID0gTG9nZ2VyLmdldChhcGksIExvZ2dlci5PRkYpOyAvLyB0cmFuc2FjdGlvbi1sZXZlbCBsb2dnaW5nXG4gICAgIHRoaXMucGFyYW1zICAgICA9IHt9O1xuICAgICB0aGlzLmlucHV0cyAgICAgPSBbXTsgLy8gcmlucHV0cyBsaXN0IFxuICAgICB0aGlzLm91dHB1dHMgICAgPSBbXTsgLy8gcm91dHB1dCBvYmplY3QgbGlzdFxuICAgICB0aGlzLnJzdHJlYW0gICAgPSBmYWxzZTtcbiAgICAgdGhpcy5kZWxheWVkICAgID0gZmFsc2U7XG4gICAgIHRoaXMuZ2xvYmFsRXZ0cyA9IHRydWU7IC8vIHN1cHByZXNzfHJhaXNlIGdsb2JhbCBldmVudHMgZm90IHRoaXMgYGlvYCAgICAgXG4gICAgIHRoaXMuZmlsZSAgICAgICA9IG51bGw7IFxuICAgICB0aGlzLmVudGl0aWVzICAgPSBudWxsOyBcbiAgICAgdGhpcy5pb0ZpbHRlciAgID0gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9O1xuXG4gICAgIC8vIHByZXNldCBkZXBsb3lyJ3MgYXNzaWduZWQgcmVzcG9uc2UgZm9ybWF0IGZvciBgdGhpc2AgYXBpXG4gICAgIHRoaXMuZGF0YSh7IGZvcm1hdDogdGhpcy5hcGkuZm9ybWF0IH0pO1xuXG4gICAgIC8vIHdyYXAgc3VwZXJhZ2VudCBmb3IgdGhlIGhlYXZ5IGxpZnRpbmcgICAgIFxuICAgICB0aGlzLnJlcSA9IFxuICAgICAgICByZXF1ZXN0W3RoaXMuYXBpLm1ldGhvZC50b0xvd2VyQ2FzZSgpXShvcHRzLmhvc3QgKyAnL2RlcGxveXInICsgYXBpKTtcbiAgICAgdGhpcy5yZXEudGltZW91dCgyMCAqIDYwICogMTAwMCk7IC8vIGRlZmF1bHQgdGltZW91dCAtLT4gMjAgbWludXRlc1xuXG4gICAgIC8vIEFsbCBDT1JTIGRlcGxveXIgY2FsbHMgcmVxdWlyZSBzdGlja3kgc2Vzc2lvbnNcbiAgICAgaWYgKHdpbiAmJiBnbG9iYWxPcHRpb25zLmNvcnMpIHsgdGhpcy5yZXEud2l0aENyZWRlbnRpYWxzKCk7IH1cblxuICAgICAvLyBOb2RlLmpzIC0gYWNjZXNzIGFuIFNTTCBlbmRwb2ludCB3aXRoIHNlbGYgc2lnbmVkIGNlcnRzIGZvciB0ZXN0aW5nfGRldlxuICAgICBpZiAoIXdpbiAmJiBnbG9iYWxPcHRpb25zLmFsbG93U2VsZlNpZ25lZFNTTENlcnQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9ICcwJzsgICAgICAgIFxuICAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBzY29wZSBjb250ZXh0IGZvciB0aGUgY29uZmlndXJlZCBgLmVuZCgpYCBhbmQgYC5lcnJvcigpYCBldmVudCAgICBcbiAgICogaGFuZGxlciBjYWxsYmFja3Mgb24gdGhpcyByZXF1ZXN0LlxuICAgKlxuICAgKiBAbWV0aG9kIGN0eFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCBUaGUgYHRoaXNgIG9iamVjdCBmb3IgdGhlIGNvbmZpZ3VyZWQgYC5lbmQoKWAgYW5kXG4gICAqIGAuZXJyb3IoKWAgZXZlbnQgaGFuZGxlcnMgb24gdGhpcyByZXF1ZXN0LlxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi8gXG4gIGN0eDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB0aGlzLnNjb3BlID0gY29udGV4dCB8fCB0aGlzO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFN1cHByZXNzIG9yIHJhaXNlIGdsb2JhbCBldmVudHMgZm9yIHRoaXMgYGlvYCByZXF1ZXN0LlxuICAgKlxuICAgKiBAbWV0aG9kIGdsb2JhbFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJhaXNlIGB0cnVlYCB0byByYWlzZSBnbG9iYWwgZXZlbnRzLCBgZmFsc2VgIHRvIHN1cHJlc3MgXG4gICAqIGV2ZW50IGZpcmluZyBnbG9iYWxseS5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLlxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi8gIFxuICBnbG9iYWw6IGZ1bmN0aW9uKHJhaXNlKSB7XG4gICAgdGhpcy5nbG9iYWxFdnRzID0gTGFuZy5pc0Jvb2xlYW4ocmFpc2UpID8gcmFpc2UgOiB0aGlzLmdsb2JhbEV2dHM7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSwgIFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZXRhaWxzIGFib3V0IHVzZXIuXG4gICAqICAgXG4gICAqIEBtZXRob2QgYWJvdXRcbiAgICogQHJldHVybiB7T2JqZWN0fSBkZXRhaWxzIGFib3V0IHVzZXIgb3RoZXJ3aWVzIGBudWxsYC5cbiAgICogQGFwaSBwdWJsaWMgICBcbiAgICovXG4gIGFib3V0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzcG9uc2UgPSB0aGlzLnJlcS5yZXM7XG5cbiAgICByZXR1cm4gdGhpcy5hcGlbJ2NhbGwnXSA9PT0gJy9yL3VzZXIvbG9naW4nICYmIHJlc3BvbnNlID8gXG4gICAgICAgICAgIHJlc3BvbnNlLmJvZHkuZ2V0KCd1c2VyJykgOiBudWxsO1xuICB9LCAgXG5cbiAgLyoqXG4gICAqIFNoYXJlcyB0aGUgY29va2llcyBmcm9tIGEgZGlmZnJlbnQgYC5pbygpYCBhZ2VudCB0byBwcmVzZXJ2ZSBzZXNzaW9uIHN0YXRlXG4gICAqIGFjcm9zcyBgdGhpc2AgcmVxdWVzdCBhbmQgYWxsIHJlcXVlc3RzIGNoYWluZWQgdG8gaXQuXG4gICAqXG4gICAqIEBtZXRob2Qgc2hhcmVcbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLlxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi8gIFxuICBzaGFyZTogZnVuY3Rpb24gKGNvb2tpZXMpIHtcbiAgICBpZiAoZ2xvYmFsT3B0aW9ucy5zdGlja3kpIHtcbiAgICAgIGlmIChnbG9iYWxPcHRpb25zLmNvb2tpZXMpIHtcbiAgICAgICAgdGhpcy5jb29raWVzID0gZ2xvYmFsT3B0aW9ucy5jb29raWVzLnNsaWNlKDApOyBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb29raWVzKSB7IFxuICAgICAgICAgIHRoaXMuY29va2llcyA9IGNvb2tpZXMuc2xpY2UoMCk7IFxuICAgICAgICAgIGdsb2JhbE9wdGlvbnMuc2V0KCdjb29raWVzJywgdGhpcy5jb29raWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPSAoY29va2llcyA/IGNvb2tpZXMuc2xpY2UoMCkgOiB0aGlzLmNvb2tpZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBIVFRQIGNvb2tpZSBwcmV2aW91c2x5IHNlbnQgYnkgdGhlIHNlcnZlciB3aXRoIFNldC1Db29raWUuXG4gICAqIFRoaXMgdmFsdWUgY2FuIGJlIHBhc3NlZCB0byBgLnNoYXJlKHJ1c2VyLmdldENvb2tpZXMoKSlgIG9mIGEgZGlmZnJlbnRcbiAgICogYC5pbygpYCBhZ2VudCB0byBwcmVzZXJ2ZSBzZXNzaW9uIHN0YXRlIGFjcm9zcyByZXF1ZXN0cy5cbiAgICpcbiAgICogQG1ldGhvZCBnZXRDb29raWVzXG4gICAqIEByZXR1cm4ge0FycmF5fSBUaGUgSFRUUCBjb29raWUgcHJldmlvdXNseSBzZW50IGJ5IHRoZSBzZXJ2ZXIgd2l0aCBcbiAgICogU2V0LUNvb2tpZS5cbiAgICogQGFwaSBwdWJsaWMgICBcbiAgICovICBcbiAgZ2V0Q29va2llczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmNvb2tpZXM7XG4gIH0sIFxuXG4gIGRlbGF5OiBmdW5jdGlvbiAobXMpIHtcbiAgICAvLyBUT0RPOiBzdXBwb3J0IGRlbGF5ZWQgcmVxdWVzdHMgYmFzZWQgb24gbXMgZm9yIG5vdyB0aGlzIGlzIGp1c3QgYSBwYXVzZS5cbiAgICB0aGlzLmRlbGF5ZWQgPSAhaXNOYU4ocGFyc2VGbG9hdChtcykpICYmIGlzRmluaXRlKG1zKSA/IG1zIDogdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LCAgIFxuXG4gIC8qKlxuICAgKiBVbndpbmQgdGhlIHF1ZXVlIGNoYWluIGNsZWFyaW5nIHJlcXVlc3RzIHRoYXQgbWlnaHQgaGF2ZSBkZWxheXMgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBtZXRob2QgZHJhaW5cbiAgICogQHJldHVybiB7UHJvbWlzZX0gQSBwcm9taXNlIHdyYXBwaW5nIHRoZSByZXNvbHV0aW9uIG9mIGVpdGhlciBcInJlc29sdmVcIiBvclxuICAgKiBcInJlamVjdFwiIGNhbGxiYWNrLlxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi9cbiAgZHJhaW46IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlbGF5ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnEuZmx1c2goKTsgXG5cbiAgICByZXR1cm4gdGhpcy5kZWZlcnJlZC5wcm9taXNlO1xuICB9LCAgIFxuXG4gIC8qKlxuICAgKiBUaGUgYC5wcm9taXNlKClgIG1ldGhvZCByZXR1cm5zIGEgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIFByb21pc2UgdGhhdCBpcyBcbiAgICogcmVzb2x2ZWQgb25jZSBhbGwgRGVwbG95UiBgLmlvKClgIHJlcXVlc3RzIGhhdmUgZW5kZWQuXG4gICAqICAgXG4gICAqIEBtZXRob2QgcHJvbWlzZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2Ugd3JhcHBpbmcgdGhlIHJlc29sdXRpb24gb2YgZWl0aGVyIFwicmVzb2x2ZVwiIG9yXG4gICAqIFwicmVqZWN0XCIgY2FsbGJhY2suXG4gICAqIEBhcGkgcHVibGljXG4gICAqLyAgICAgXG4gIHByb21pc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmVuZCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGVmZXJyZWQucHJvbWlzZTtcbiAgfSxcblxuICAvKipcbiAgICogQWJvcnQgdGhlIERlcGxveVIgcmVxdWVzdC5cbiAgICpcbiAgICogQG1ldGhvZCBhYm9ydCAgXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZy5cbiAgICogQGFwaSBwdWJsaWNcbiAgICovICBcbiAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnJlcS5hYm9ydCgpO1xuICAgIHRoaXMuZW1pdCgnYWJvcnQnKTtcbiAgICB0aGlzLmRlZmVycmVkLnJlamVjdCh0aGlzLl9oYW5kbGVFcnJvcih7IFxuICAgICAgICBzdGF0dXM6ICdhYm9ydCcsXG4gICAgICAgIHRleHQ6ICdEZXBsb3lSIHJlcXVlc3QgYWJvcnRlZC4nXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAvKipcbiAgKiBTZXQgdGltZW91dCB0byBgbXNgLlxuICAqXG4gICogQG1ldGhvZCB0aW1lb3V0ICBcbiAgKiBAcGFyYW0ge051bWJlcn0gbXNcbiAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmdcbiAgKiBAYXBpIHB1YmxpY1xuICAqLyAgXG4gIHRpbWVvdXQ6IGZ1bmN0aW9uIChtcykge1xuICAgIHRoaXMucmVxLnRpbWVvdXQobXMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAvKipcbiAgKiBUdXJuIGxvZ2dpbmcgb24gZm9yIHRoZSBzcGVjaWZpYyB0cmFuc2FjdGlvbi5cbiAgKlxuICAqIEBtZXRob2QgbG9nXG4gICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICogQGFwaSBwdWJsaWNcbiAgKi8gXG4gIGxvZzogZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgdGhpcy5sb2dnZXIuc2V0TGV2ZWwobGV2ZWwgfHwgTG9nZ2VyLkRFQlVHKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHN1Y2Nlc3NmdWwgcmVzcG9uc2VzIHRvIGNvbnRhaW4gb25seSBhIHRvcC1sZXZlbCBEZXBsb3lSIEFQSSBcbiAgICogcmVzcG9uc2UgZW50aXRpZXM6XG4gICAqIC0gJ3VzZXInXG4gICAqIC0gJ3Byb2plY3QnXG4gICAqIC0gJ3dvcmtzcGFjZScgXG4gICAqIC0gJ2V4ZWN1dGlvbicgXG4gICAqIC0gJ2RpcmVjdG9yeScgXG4gICAqIC0gJ3JlcG9zaXRvcnknXG4gICAqIC0gJ3BhY2thZ2VzJyBcbiAgICogICBcbiAgICogQG1ldGhvZCBlbnRpdHlcbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICBlbnRpdHk6IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICB0aGlzLmVudGl0aWVzID0gdXRpbHMuaW5BcnJheShUT1BMRVZFTF9FTlRJVElFUywgZW50aXR5KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSByZXF1ZXN0IGRhdGEgYmVpbmcgc2VudCB0byBhIERlcGxveVIgQVBJLiBcbiAgICpcbiAgICogQG1ldGhvZCBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBvYmplY3QgbGl0ZXJhbCBjb25maWd1cmF0aW9uIGhhc2guIFxuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmdcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIGRhdGE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEgfHwge307ICAgIFxuXG4gICAgLy8gcmVtb3ZlIGFueSBpbmxpbmVkIHJpbnB1dChzKSBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlIHJpbnB1dChzKSBwcm9wZXJ0eVxuICAgIGlmIChkYXRhLnJpbnB1dCB8fCBkYXRhLnJpbnB1dHMpIHtcbiAgICAgIHRoaXMucmlucHV0KGRhdGEucmlucHV0KTtcbiAgICAgIHRoaXMucmlucHV0cyhkYXRhLnJpbnB1dHMpO1xuICAgIH0gXG5cbiAgICAvLyByZW1vdmUgYW55IGByZXNlcnZlZGAgdmFsdWVzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHBhc3NlZCBieSBtaXN0YWtlXG4gICAgdmFyIEJMQUNLTElTVCA9IFsncmlucHV0JywgJ3JpbnB1dHMnLCAnX19jb29raWVzX18nXTtcbiAgICBCTEFDS0xJU1QuZm9yRWFjaChmdW5jdGlvbihwYXJhbSkgeyBkZWxldGUgZGF0YVtwYXJhbV07IH0pOyAgXG5cbiAgICB0aGlzLnBhcmFtcyA9IG1lcmdlKHRoaXMucGFyYW1zLCBkYXRhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIGZpbGUgdG8gYmUgdXBsb2FkZWQuIFxuICAgKlxuICAgKiBAbWV0aG9kIGF0dGFjaFxuICAgKiBAcGFyYW0ge0ZpbGV8QmxvYnxwYXRofSBmaWxlIFRoZSBmaWxlIHRvIGJlIGF0dGFjaGVkIGZvciBhbiB1cGxvYWQuIEZvciBcbiAgICogQnJvd3NlciBlbnZpcm9ubWVudHMgdGhlIEhUTUw1IEZpbGV8QmxvYiBpcyB1c2VkLiBGb3IgdGhlIE5vZGUuanMgXG4gICAqIGVudmlyb25tZW50LCBhIGZpbGUgcGF0aCBpcyBhY2NlcHRlZC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIChvcHRpb25hbCkgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgdXBsb2FkZWQuIFxuICAgKiBUaGlzIG5hbWUgZG9lcyBub3QgaGF2ZSB0byBtYXRjaCB0aGUgYWN0dWFsIHNvdXJjZSBmaWxlbmFtZS5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICBhdHRhY2g6IGZ1bmN0aW9uIChmaWxlLCBmaWxlbmFtZSkge1xuICAgIGlmICh0aGlzLmFwaS51cGxvYWQpIHtcbiAgICAgIHRoaXMuZmlsZSA9IGZpbGU7XG5cbiAgICAgIC8vIG9wdGlvbmFsIGZpbGVuYW1lIGhlcmUgZm9yIGNvbnZlbmllbmNlXG4gICAgICBpZiAoZmlsZW5hbWUpIHsgdGhpcy5kYXRhKCB7IGZpbGVuYW1lOiBmaWxlbmFtZSB9ICk7IH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogU3VwcG9ydGVkIG9ubHkgaW4gTm9kZS5qcywgdGhpcyBtZXRob2Qgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgXG4gICAqIGF0dGFjaCBtZXRob2QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmlsZSBzaG91bGQgYmUgcmVhZCBpbiBhcyBhIHJlYWRhYmxlIFxuICAgKiBzdHJlYW0gZHVyaW5nIGEgZmlsZSB1cGxvYWQuXG4gICAqXG4gICAqIEBtZXRob2Qgc3RyZWFtXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIChvcHRpb25hbCkgdGhlIFJlYWRhYmxlIFN0cmVhbSBvcHRpb25zIGhhc2guXG4gICAqICBgYGBcbiAgICogICAgeyBmbGFnczogJ3InLFxuICAgKiAgICAgIGVuY29kaW5nOiBudWxsLFxuICAgKiAgICAgIGZkOiBudWxsLFxuICAgKiAgICAgIG1vZGU6IDA2NjYsXG4gICAqICAgICAgYXV0b0Nsb3NlOiB0cnVlXG4gICAqICAgIH1cbiAgICogYGBgXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZ1xuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgc3RyZWFtOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5yc3RyZWFtID0gKCF3aW4gJiYgdGhpcy5hcGkudXBsb2FkKTsgLy9ub2RlanMgb25seVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoZSBgZmlsdGVyKM67KWAgbWV0aG9kIHJlbW92ZXMgdGhpcyBEZXBsb3lSIHJlcXVlc3QgZnJvbSB0aGUgcmVxdWVzdCBjaGFpblxuICAgKiBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZG9lcyAqbm90KiBwYXNzIHRoZSB0ZXN0IGltcGxlbWVudGVkIGJ5IGl0LlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICpcbiAgICogYGBgXG4gICAqIC8vIFJlbW92ZSBmcm9tIHRoZSByZXF1ZXN0IGNoYWluXG4gICAqIC5maWx0ZXIoZnVuY3Rpb24oYXJncykge1xuICAgKiAgICByZXR1cm4gNSA+IDEwO1xuICAgKiB9KVxuICAgKlxuICAgKiAvLyBLZWVwIGluIHRoZSByZXF1ZXN0IGNoYWluXG4gICAqIC5maWx0ZXIoZnVuY3Rpb24oYXJncykge1xuICAgKiAgICByZXR1cm4gMTAgPiA1O1xuICAgKiB9KSAgIFxuICAgKiBgYGBcbiAgICpcbiAgICogQG1ldGhvZCBmaWx0ZXJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gzrsgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmdcbiAgICogQGFwaSBwdWJsaWMgICBcbiAgICovXG4gIGZpbHRlcjogZnVuY3Rpb24oZm4pIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuaW9GaWx0ZXIgPSBmdW5jdGlvbihwcmV2QXJncykge1xuICAgICAgICB2YXIgYXJncyA9IHt9LCBrZWVwO1xuXG4gICAgICAgIC8vIGNvcHkgb3ZlciBwcmV2aW91cyBhcmd1bWVudHMgYW5kIGZpbHRlciBvdXQgaW50ZXJuYWwgX19jb29raWVzX18gXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBwcmV2QXJncykge1xuICAgICAgICAgICBpZiAoa2V5ICE9PSAnX19jb29raWVzX18nKSB7IFxuICAgICAgICAgICAgICBhcmdzW2tleV0gPSBwcmV2QXJnc1trZXldO1xuICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZWVwID0gZm4oYXJncyk7XG4gICAgICAgIHJldHVybiAoa2VlcCB8fCBrZWVwID09PSBmYWxzZSA/IGtlZXAgOiB0cnVlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sICBcbiAgXG4gIC8qKlxuICAgKiBBY3RzIGFzIGEgZmluYWxseSBzdGF0ZW1lbnQgYWxsb3dpbmcgeW91IHRvIGV4ZWN1dGUgXCJjbGVhbnVwXCIgdHlwZSB0YXNrcyBcbiAgICogaW4gYSByZXF1ZXN0IGNoYWluLiBJdCBhcnJhbmdlcyBmb3IgY2xlYW51cCB0byBiZSBjYWxsZWQsIHdpdGggbm8gXG4gICAqIGFyZ3VtZW50cywgd2hlbiB0aGUgRGVwbG95UiByZXF1ZXN0IGNoYWluIGlzIGVpdGhlciBjb21wbGV0ZWx5IGZ1bGZpbGxlZCBcbiAgICogb3IgcmVqZWN0ZWQuXG4gICAqXG4gICAqIEBtZXRob2QgZW5zdXJlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IM67IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICAqIEBhcGkgcHVibGljXG4gICAqLyAgXG4gIGVuc3VyZTogZnVuY3Rpb24gKGZuKSB7XG4gICAgdGhpcy5kZWZlcnJlZC5wcm9taXNlLmVuc3VyZShmbik7XG5cbiAgICByZXR1cm4gdGhpcy5kZWZlcnJlZC5wcm9taXNlO1xuICB9LFxuICAgICAgXG4gIC8qKlxuICAgKiBUaGUgZ2VuZXJhbCBmYWlsdXJlIGNhbGxiYWNrLiBJZiBjYWxsZWQsIGFsbCBEZXBsb3lSIGVycm9ycyBmb3IgdGhpcyBcbiAgICogdHJhbnNhY3Rpb24gd2lsbCBiZSByZXR1cm5lZCBoZXJlIHdoZW4gcmFpc2VkLlxuICAgKlxuICAgKiBAbWV0aG9kIGVycm9yXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IM67IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICBlcnJvcjogZnVuY3Rpb24gKGZuKSB7XG4gICAgdGhpcy5vbignZXJyb3InLCBmbik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogU3RyZWFtIHRoZSBEZXBsb3lSIHJlc3BvbnNlIGludG8gdGhlIHBpcGUuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgaWYgXG4gICAqIHRoZSBgLnBpcGUoKWAgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCB0aGUgcmVxdWVzdCB3aWxsIG5vdCBiZSBzZW50LlxuICAgKlxuICAgKiBUaGUgYC5waXBlKClgIG1ldGhvZCBzaG91bGQgYmUgYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBgLmVuZCgpYCBhbmQgXG4gICAqIG5ldmVyIGFsb25nIHNpZGUgb2YgaXQuIGAucGlwZSgpYCBhbmQgYC5lbmQoKWAgYXJlIGFuIGVpdGhlci1vci5cbiAgICpcbiAgICogQG1ldGhvZCBwaXBlXG4gICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gQSBkZXN0aW5hdGlvbiBTdHJlYW0uXG4gICAqIEByZXR1cm4ge1N0cmVhbX0gVGhlIHBhc3NlZCBpbiBkZXN0aW5hdGlvbiBzdHJlYW0gdG8gYmUgdXNlZCBmb3IgYWRkaXRpb25hbCBcbiAgICogcGlwaW5nLlxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgcGlwZTogZnVuY3Rpb24gKGRlc3QpIHtcbiAgICB2YXIgcSAgID0gdGhpcy5xLFxuICAgICAgICBhcGkgPSB0aGlzLmFwaTsgICAgICAgIFxuXG4gICAgcS5hZGQoZnVuY3Rpb24ocmVzcG9uc2VDaGFpbiwgZXJyb3IsIHByZXZBcmdzKSB7ICAgIFxuICAgICAgLy8gYnJha2UgdGhlIGNhbGwgY2hhaW4gb24gZXJyb3IgICAgICBcbiAgICAgIGlmIChlcnJvcikgeyAgICAgICAgXG4gICAgICAgIHRoaXMuZGVmZXJyZWQucmVqZWN0KGVycm9yKTsgICAgICBcbiAgICAgICAgcS5mbHVzaChyZXNwb25zZUNoYWluLCBlcnJvciwgcHJldkFyZ3MpOyAvLyBkcmFpbiB0aGUgcXVldWVcbiAgICAgICAgdGhpcy5fY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLl9wcmVwUmVxdWVzdChyZXNwb25zZUNoYWluLCBwcmV2QXJncyk7XG5cbiAgICAgIExvZ2dlci5pbmZvKCdwaXBlKCknLCBhcGksIHRoaXMucmVxKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3BpcGUoKScsIGFwaSwgdGhpcy5yZXEpOyAgIFxuXG4gICAgICB2YXIgc3RyZWFtID0gdGhpcy5yZXEucGlwZShkZXN0KTtcbiAgICAgIHEueWllbGQodHJ1ZSk7XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgeyB9KTsgICAgXG4gICAgICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkgeyB9KTsgICAgIFxuICAgICAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24oKSB7IH0pOyAgICAgIFxuICAgIH0sIHRoaXMpO1xuICBcbiAgICBpZiAocS5zaXplKCkgPD0gMSkgeyBxLmZsdXNoKCk7IH1cblxuICAgIHJldHVybiBkZXN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBpcyByZWFkeSB0byBiZSBzZW50IHRvIERlcGxveVIuIEl0IGlzIGltcG9ydGFudCBcbiAgICogdG8gbm90ZSB0aGF0IGlmIHRoZSBgLmVuZCgpYCBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIHRoZSByZXF1ZXN0IHdpbGwgbm90IGJlXG4gICAqIHNlbnQuXG4gICAqXG4gICAqIEBtZXRob2QgZW5kXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IM67IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLlxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi8gXG4gIGVuZDogZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHNlbGYgICAgID0gdGhpcyxcbiAgICAgICAgcSAgICAgICAgPSB0aGlzLnEsXG4gICAgICAgIGFwaSAgICAgID0gdGhpcy5hcGksXG4gICAgICAgIGFyZ3MgICAgID0gbnVsbCxcbiAgICAgICAgZW50aXRpZXMgPSAgdGhpcy5lbnRpdGllcztcblxuICAgIHEuYWRkKGZ1bmN0aW9uKHJlc3BvbnNlQ2hhaW4sIGVycm9yLCBwcmV2QXJncykge1xuICAgICAgLy8gYnJlYWsgdGhlIGNhbGwgY2hhaW4gb24gZXJyb3IgICAgICBcbiAgICAgIGlmIChlcnJvcikgeyAgICAgICAgXG4gICAgICAgIHRoaXMuZGVmZXJyZWQucmVqZWN0KGVycm9yKTsgICAgICAgIFxuICAgICAgICBxLmZsdXNoKHJlc3BvbnNlQ2hhaW4sIGVycm9yLCBwcmV2QXJncyk7IC8vIGRyYWluIHRoZSBxdWV1ZVxuICAgICAgICB0aGlzLl9jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICBpZiAoIXRoaXMuaW9GaWx0ZXIocHJldkFyZ3MpKSB7XG4gICAgICAgIGlmIChxLnNpemUoKSA9PT0gMCkgeyBcbiAgICAgICAgICB0aGlzLmRlZmVycmVkLnJlc29sdmUocmVzcG9uc2VDaGFpbiB8fCBwcmV2QXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICBxLmZsdXNoKHJlc3BvbnNlQ2hhaW4sIGVycm9yLCBwcmV2QXJncyk7IC8vIGRyYWluIHRoZSBxdWV1ZVxuICAgICAgICB0aGlzLl9jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMuX3ByZXBSZXF1ZXN0KHJlc3BvbnNlQ2hhaW4sIHByZXZBcmdzKTtcblxuICAgICAgTG9nZ2VyLmluZm8oJ2lvKCknLCBhcGksIHRoaXMucmVxKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ2lvKCknLCBhcGksIHRoaXMucmVxKTsgICAgXG5cbiAgICAgIC8vIHNlbmQgbmV4dCByZXF1ZXN0XG4gICAgICB0aGlzLnJlcS5lbmQoZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgIHNlbGYuc2hhcmUoc2VsZi5jb29raWVzIHx8IHJlcy5oZWFkZXJzWydzZXQtY29va2llJ10pOyAgICAgICAgIFxuXG4gICAgICAgIC8vIC0tIGxvZyBjb29raWVzIGFjcm9zcyByZXF1ZXN0cyAtLVxuICAgICAgICBpZiAoc2VsZi5jb29raWVzKSB7XG4gICAgICAgICAgTG9nZ2VyLmluZm8oJ2Nvb2tpZXMnLCBhcGksIHNlbGYuY29va2llcyk7IFxuICAgICAgICAgIHNlbGYubG9nZ2VyLmluZm8oJ2Nvb2tpZXMnLCBhcGksIHNlbGYuY29va2llcyk7IFxuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IgPSBzZWxmLl9oYW5kbGVFcnJvcihyZXMpO1xuICAgICAgICB2YXIgZHJlcyA9IChyZXMuYm9keSAmJiByZXMuYm9keS5kZXBsb3lyID8gcmVzLmJvZHkgOiByZXMpOyAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICBzZWxmLmlucHV0cyA9IFtdO1xuICAgICAgICBzZWxmLm91dHB1dHMgPSBbXTtcblxuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgIC8vIC0tIExvZyBnbG9iYWwgKyB0cmFuc2FjdGlvbiBsb2cgLS1cbiAgICAgICAgICAgTG9nZ2VyLmluZm8oJ2VuZCgpJywgYXBpLCBkcmVzLCByZXMpO1xuICAgICAgICAgICBzZWxmLmxvZ2dlci5pbmZvKCdlbmQoKScsIGFwaSwgZHJlcywgcmVzKTtcblxuICAgICAgICAgICAvLyAtLSB3YWxrIHJlc3BvbnNlIGZvciB0b3AtbGV2ZWwgZW50aXR5IHJlc3BvbnNlIGFzc2lnbm1lbnQgLS0gICAgICAgIFxuICAgICAgICAgICBpZiAoZW50aXRpZXMpIHsgZHJlcyA9IGRyZXMuZGVwbG95ci5yZXNwb25zZVtlbnRpdGllc10gfHwgZHJlczsgfVxuXG4gICAgICAgICAgIGRyZXMuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7IFxuICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuZ2V0KGRyZXMuZGVwbG95ci5yZXNwb25zZSwga2V5KTsgXG4gICAgICAgICAgIH07XG5cbiAgICAgICAgICAgZHJlcy53b3Jrc3BhY2UgPSBmdW5jdGlvbihuYW1lKSB7IFxuICAgICAgICAgICAgICByZXR1cm4gdXRpbHMud29ya3NwYWNlKGRyZXMuZGVwbG95ci5yZXNwb25zZSwgbmFtZSk7IFxuICAgICAgICAgICB9O1xuXG4gICAgICAgICAgIC8vIC0tIGNhbGxiYWNrIC0tXG4gICAgICAgICAgIGlmIChmbikgeyBhcmdzID0gZm4uYXBwbHkoc2VsZi5zY29wZSwgW2RyZXMsIHJlc3BvbnNlQ2hhaW5dKTt9XG5cbiAgICAgICAgICAgLy8gLS0gbm90aWZ5IHRoYXQgdGhlIHF1ZXVlIGhhcyBiZWVuIGRyYWluZWQuLi4gLS1cbiAgICAgICAgICAgaWYgKHEuc2l6ZSgpID09PSAwKSB7IFxuICAgICAgICAgICAgIHNlbGYuX2NsZWFyKCk7XG4gICAgICAgICAgICAgc2VsZi5kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlQ2hhaW4gfHwgZHJlcyk7XG4gICAgICAgICAgIH0gICAgICAgICAgXG5cbiAgICAgICAgICAgLy8gLS0gaW5jbHVkZSBjb29raWVzIGluIG5leHQgcmVxdWVzdCBpbiB0aGUgcXVldWUgLS1cbiAgICAgICAgICAgYXJncyA9IG1lcmdlKGFyZ3MsIHsgX19jb29raWVzX186IHNlbGYuY29va2llcyB9KTsgICAgICAgICAgXG4gICAgICAgIH0gICAgICAgIFxuXG4gICAgICAgIHEueWllbGQoZmFsc2UpO1xuICAgICAgICBxLmZsdXNoKGRyZXMsIGVycm9yLCBhcmdzKTsgLy8gcGFzcyByZXN1bHR8ZXJyb3J8YXJncyB0byBuZXh0IFxuICAgICAgfSk7XG5cbiAgICAgIHEueWllbGQodHJ1ZSk7XG4gICAgfSwgdGhpcywgdGhpcy5kZWxheWVkKTtcbiAgXG4gICAgaWYgKCF0aGlzLmRlbGF5ZWQgJiYgcS5zaXplKCkgPD0gMSkgeyBxLmZsdXNoKCk7IH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LCBcblxuICAvKiogXG4gICAqIEFkZCBhbiBhZGRpdGlvbmFsIElPIHJlcXVlc3QgdG8gdGhlIGV4c2lzdGluZyBzZXF1ZW50aWFsIHJlcXVlc3QgY2hhaW4uXG4gICAqXG4gICAqIEBtZXRob2QgaW9cbiAgICogQHBhcmFtIHtTdHJpbmd9IGFwaSBPbmUgb2YgdGhlIHN1cHBvcnRlZCBEZXBsb3lSIEFQSXMuXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZy5cbiAgICogQGFwaSBwdWJsaWNcbiAgICovICAgXG4gIGlvOiBmdW5jdGlvbiAoYXBpKSB7ICAgIFxuICAgIHJldHVybiBEZXBsb3lSLm5ldyhhcGksIHsgXG4gICAgICBjb29raWVzOiB0aGlzLmNvb2tpZXMsIFxuICAgICAgcXVldWU6IHRoaXMucSwgXG4gICAgICBkZWZlcnJlZDogdGhpcy5kZWZlcnJlZFxuICAgIH0pO1xuICB9LFxuXG4gIC8qKiBcbiAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGFkZGluZyBhbiBhZGRpdGlvbmFsIHNjcmlwdCBleGVjdXRpb24gdG8gdGhlIFxuICAgKiBleHNpc3Rpbmcgc2VxdWVudGlhbCByZXF1ZXN0IGNoYWluLlxuICAgKlxuICAgKiBAbWV0aG9kIHNjcmlwdFxuICAgKiBAcGFyYW0ge0FyZ3VtZW50c30gQXJndW1lbnRzIHRvIGRlZmluZSB0aGUgZnVsbHkgcXVhbGlmaWVkIHNjcmlwdCBmb3IgXG4gICAqIGV4ZWN1dGlvbi5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLiAgIFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgc2NyaXB0OiBmdW5jdGlvbigpIHtcbiAgICAgdmFyIGFyZ3MgPSB1dGlscy5zaWduYXR1cmUoYXJndW1lbnRzKSxcbiAgICAgICAgIG9wdHMgPSBhcmdzLm9wdHMsXG4gICAgICAgICBhcGkgID0gYXJncy5hcGksXG4gICAgICAgICBsaW5rID0geyBcbiAgICAgICAgICBjb29raWVzOiB0aGlzLmNvb2tpZXMsIFxuICAgICAgICAgIHF1ZXVlOiB0aGlzLnEsIFxuICAgICAgICAgIGRlZmVycmVkOiB0aGlzLmRlZmVycmVkXG4gICAgICAgIH07ICBcblxuICAgIC8vIGNvbnZlbmllbmNlIC0gaWYgdGhlIHByb2plY3QgaXMgYSBib29sZW4gYHRydWVgIHJhdGhlciB0aGFuIGEgcGlkLCBmaXJzdFxuICAgIC8vIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IGFuZCB0aGVuIHByZXBhcmUgdGhlIHByb2plY3QgYXBpIGNhbGwgdG8gZXhlY3V0ZVxuICAgIGlmIChhcmdzLmNyZWF0ZSkge1xuICAgICAgcmV0dXJuIERlcGxveVIubmV3KCcvci9wcm9qZWN0L2NyZWF0ZScsIGxpbmspXG4gICAgICAgICAgICAgICAuZW5kKGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJvamVjdDogcmVzLmdldCgncHJvamVjdCcpLnByb2plY3QgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgLmlvKGFwaSlcbiAgICAgICAgICAgICAgIC5kYXRhKG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRGVwbG95Ui5uZXcoYXBpLCBsaW5rKS5kYXRhKG9wdHMpO1xuICAgIH0gICAgXG4gIH0sXG5cbiAgLyoqIFxuICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWRkaW5nIGFuIGFkZGl0aW9uYWwgcmVwb3NpdG9yeS1tYW5hZ2VkIHNoZWxsIFxuICAgKiBzY3JpcHQgZXhlY3V0aW9uIHRvIHRoZSBleHNpc3Rpbmcgc2VxdWVudGlhbCByZXF1ZXN0IGNoYWluLlxuICAgKlxuICAgKiBUaGlzIGNhbGwgZXhlY3V0ZXMgcmVwb3NpdG9yeS1tYW5hZ2VkIHNoZWxsIHNjcmlwdHMgLnNoLCAuY3NoLCAuYmFzaCwgLmJhdCBcbiAgICogb24gdGhlIERlcGxveVIgc2VydmVyLiBEdWUgdG8gdGhlIHNwZWNpYWwgc2VjdXJpdHkgY29uY2VybnMgYXNzb2NpYXRlZCB3aXRoIFxuICAgKiBleGN1dGluZyBzaGVsbCBzY3JpcHRzIG9uIHRoZSBEZXBsb3lSIHNlcnZlciwgb25seSBzaGVsbCBzY3JpcHRzIG93bmVkIGJ5IFxuICAgKiBfQURNSU5JU1RSQVRPUl8gdXNlcnMgY2FuIGJlIGV4ZWN1dGVkIG9uIHRoaXMgQVBJIGNhbGwuIEFueSBhdHRlbXB0IHRvIFxuICAgKiBleGVjdXRlIGEgc2hlbGwgc2NyaXB0IHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeSB0aGF0IGlzIG5vdCBvd25lZCBieSBhbiBcbiAgICogX0FETUlOSVNUUkFUT1JfIHVzZXIgd2lsbCBiZSByZWplY3RlZC5cbiAgICpcbiAgICogVG8gZXhlY3V0ZSBhIHJlcG9zaXRvcnktbWFuYWdlZCBzaGVsbCBzY3JpcHQgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgXG4gICAqIHBhcmFtZXRlciB2YWx1ZXMgZm9yIF9hdXRob3JfLCBfZGlyZWN0b3J5XywgX2ZpbGVuYW1lXy4gVGhpcyBjYW4gYmVcbiAgICogYWNoaWV2ZWQgYnkgcHJvdmlkaW5nIGEgZnVsbHkgcXVhbGlmaWVkIHNoZWxsIHNjcmlwdCBcbiAgICogYC88YXV0aG9yPi88ZGlyZWN0b3J5Pi88ZmlsZW5hbWU+YCwgZm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICBgYGBcbiAgICogIC5zaGVsbCgnL2FkbWluL2V4dGVybmFsOnB1YmxpYzphZG1pbi9lY2hvLnNoJywgJ2VjaG8uc2ggYXJncyB0byBwYXNzLicpXG4gICAqICBgYGBcbiAgICpcbiAgICogQG1ldGhvZCBzaGVsbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZmlsZXBhdGggdG8gZGVmaW5lIHRoZSBmdWxseSBxdWFsaWZpZWQgc2hlbGwgc2NyaXB0IGZvclxuICAgKiBleGVjdXRpb24uIFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYXJncyAob3B0aW9uYWwpIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW50byB0aGUgc2hlbGwgXG4gICAqIHNjcmlwdCBvbiBleGVjdXRpb24uXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZy4gICBcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIHNoZWxsOiBmdW5jdGlvbihwYXRoLCBhcmdzKSB7ICAgXG4gICAgdmFyIGxpbmsgPSB7IFxuICAgICAgICAgIGNvb2tpZXM6IHRoaXMuY29va2llcywgXG4gICAgICAgICAgcXVldWU6IHRoaXMucSwgXG4gICAgICAgICAgZGVmZXJyZWQ6IHRoaXMuZGVmZXJyZWRcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5zID0gTGFuZy5pc1N0cmluZyhwYXRoKSA/IHBhdGguc3BsaXQoJ1xcLycpIDogW107XG5cbiAgICAvLyBoYW5kbGUgYm90aDogYC9hdXRob3IvZGlyZWN0b3J5L2ZpbGVuYW1lYCAmIGBhdXRob3IvZGlyZWN0b3J5L2ZpbGVuYW1lYFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMykgeyB0b2tlbnMgPSB0b2tlbnMuc2xpY2UoMSk7IH1cblxuICAgIHJldHVybiBEZXBsb3lSLm5ldygnL3IvcmVwb3NpdG9yeS9zaGVsbC9leGVjdXRlJywgbGluaykuZGF0YSh7XG4gICAgICBhdXRob3I6IHRva2Vuc1swXSxcbiAgICAgIGRpcmVjdG9yeTogdG9rZW5zWzFdLFxuICAgICAgZmlsZW5hbWU6IHRva2Vuc1syXSxcbiAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KTtcbiAgfSxcblxuICAvKiogXG4gICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBleGVjdXRpbmcgYSBibG9jayBvZiBSIGNvZGUgb24gdGhlIFIgc2Vzc2lvbi5cblxuICAgKiBFeGFtcGxlOlxuICAgKiAgYGBgXG4gICAqICAuY29kZSgneDwtNScpXG4gICAqICAvLyAtLSBvciAtLVxuICAgKiAgLmNvZGUoJ3g8LTUnLCBwcm9qZWN0SWQpXG4gICAqICBgYGBcbiAgICogICBcbiAgICogQG1ldGhvZCBjb2RlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByIC0gVGhlIGJsb2NrIG9mIFIgY29kZSB0byBleGVjdXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvamVjdCAtIChvcHRpb25hbCkgaWYgb21pdHRlZCBhIG5ldyBwcm9qZWN0IHdpbGwgZmlyc3QgYmUgXG4gICAqIGNyZWF0ZWQgYW5kIHVzZWQsIG90aGVyd2lzZSBpdCB3aWxsIGV4ZWN1dGUgb24gdGhlIFIgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5IFxuICAgKiB0aGlzIGBwcm9qZWN0YC5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLiAgIFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgY29kZTogZnVuY3Rpb24ociwgcHJvamVjdCkge1xuICAgICB2YXIgbGluayA9IHtcbiAgICAgICAgICAgICBjb29raWVzOiB0aGlzLmNvb2tpZXMsXG4gICAgICAgICAgICAgcXVldWU6IHRoaXMucSxcbiAgICAgICAgICAgICBkZWZlcnJlZDogdGhpcy5kZWZlcnJlZFxuICAgICAgICAgfSxcbiAgICAgICAgIGFwaSA9ICcvci9wcm9qZWN0L2V4ZWN1dGUvY29kZSc7XG5cbiAgICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICAgICByZXR1cm4gRGVwbG95Ui5uZXcoJy9yL3Byb2plY3QvY3JlYXRlJywgbGluaylcbiAgICAgICAgICAgICAuZW5kKGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9qZWN0OiByZXMuZ2V0KCdwcm9qZWN0JykucHJvamVjdCB9O1xuICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgLmlvKGFwaSlcbiAgICAgICAgICAgICAuZGF0YSh7IGNvZGU6IHIgfSk7XG4gICAgIH0gZWxzZSB7XG4gICAgICAgICByZXR1cm4gRGVwbG95Ui5uZXcoYXBpLCBsaW5rKS5kYXRhKHsgY29kZTogciwgcHJvamVjdDogcHJvamVjdCB9KTtcbiAgICAgfVxuICB9LFxuICBcbiAgLyoqIFxuICAgKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwcm9qZWN0IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uIFxuICAgKiBpbnN0YW5jZSB3aGVuZXZlciBhIGNsaWVudCBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzLiBUaGlzIGluY2x1ZGVzIGNsb3NpbmcgXG4gICAqIGFueSBzdXBwbGllZCBwcm9qZWN0cyBkb3duIGFuZCBsb2dnaW5nIG91dC5cbiAgICpcbiAgICogQG1ldGhvZCByZWxlYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBwcm9qZWN0cyBUaGUgcHJvamVjdCBvciBsaXN0IG9mIHByb2plY3RzIHRvIGNsb3NlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF1dGggKG9wdGlvbmFsKSB0byByZW1haW4gYXV0aGVudGljYXRlZC5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLiAgIFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgcmVsZWFzZTogZnVuY3Rpb24ocHJvamVjdHMsIGF1dGgpIHtcbiAgICAgcHJvamVjdHMgPSBMYW5nLmlzQXJyYXkocHJvamVjdHMpID8gcHJvamVjdHMgOiBbcHJvamVjdHNdO1xuXG4gICAgIHZhciBzZWxmICAgICA9IHRoaXMsXG4gICAgICAgICBkZWZlcnJlZCA9IEQoKSxcbiAgICAgICAgIGVtcHR5ICAgID0gIXByb2plY3RzIHx8ICFwcm9qZWN0c1swXSxcbiAgICAgICAgIGNvdW50ICAgID0gMCxcbiAgICAgICAgIGxhc3QgICAgID0gIWVtcHR5ID8gcHJvamVjdHMubGVuZ3RoIC0gMSA6IGNvdW50LFxuICAgICAgICAgY29va2llcyAgPSB0aGlzLmdldENvb2tpZXMoKTsgICAgICAgICAgIFxuXG4gICAgZnVuY3Rpb24gbG9nb3V0KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPT09IGxhc3QpIHtcbiAgICAgICAgaWYgKCFhdXRoKSB7XG4gICAgICAgICAgRGVwbG95Ui5uZXcoJy9yL3VzZXIvbG9nb3V0JylcbiAgICAgICAgICAuc2hhcmUoY29va2llcylcbiAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24oKSB7ICAgICAgICAgIFxuICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGZhbHNlKTtcbiAgICAgICAgICB9KSAgICAgIFxuICAgICAgICAgIC5lbmQoZnVuY3Rpb24oKSB7IFxuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5lbnN1cmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLmRlc3Ryb3koKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgIHNlbGYuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9IFxuICAgIH1cblxuICAgIGlmICghZW1wdHkpIHtcbiAgICAgIHByb2plY3RzLmZvckVhY2goZnVuY3Rpb24ocHJvamVjdCkge1xuICAgICAgICBEZXBsb3lSLm5ldygnL3IvcHJvamVjdC9jbG9zZScpXG4gICAgICAgIC5kYXRhKHsgcHJvamVjdDogcHJvamVjdCB9KVxuICAgICAgICAuc2hhcmUoY29va2llcylcbiAgICAgICAgLmVuZCgpXG4gICAgICAgIC5lbnN1cmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbG9nb3V0KGNvdW50KTtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9KTtcbiAgICAgIH0pOyAgIFxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dvdXQoY291bnQpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOyAgXG4gIH0sICBcblxuICAvKiogXG4gICAqIEEgY29udmVuaWVuY2UgYWx0ZXJuYXRpdmUgdG8gbXVsdGlwbGUgYC5yaW5wdXQoKWAgY2FsbHMuIERlZmluZXMgYSBuYW1lIFxuICAgKiBsaXN0IG9mIFIgb2JqZWN0cyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYXMgRGVwbG95Ui1lbmNvZGVkIFIgb2JqZWN0cyBvbiB0aGUgXG4gICAqIHJlc3BvbnNlIG1hcmt1cC5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB+LnJvdXRwdXRzKFsgLi4uIF0pYCBpcyBlcXVpdmFsZW50IHRvIGludm9raW5nIG11bHRpcGxlIFxuICAgKiBgLnJvdXRwdXQoLi4uKWAgY2FsbHMuXG4gICAqXG4gICAqIEBtZXRob2Qgcm91dHB1dHNcbiAgICogQHBhcmFtIHtBcnJheX0gcm9iamVjdHMgQSBuYW1lIGxpc3Qgb2YgUiBvYmplY3RzIHRoYXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybiB7RGVwbG95Un0gZm9yIGNoYWluaW5nLiAgIFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgcm91dHB1dHM6IGZ1bmN0aW9uIChyb3V0cHV0cykge1xuICAgIGlmIChyb3V0cHV0cykgeyB0aGlzLm91dHB1dHMgPSB0aGlzLm91dHB1dHMuY29uY2F0KHJvdXRwdXRzKTsgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIFxuICAvKiogXG4gICAqIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIFIgb2JqZWN0IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBhcyBhIERlcGxveVItZW5jb2RlZCBcbiAgICogUiBvYmplY3Qgb24gdGhlIHJlc3BvbnNlIG1hcmt1cC5cbiAgICpcbiAgICogQG1ldGhvZCByb3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSByb2JqZWN0IFRoZSBuYW1lIG9mIHRoZSBSIG9iamVjdCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm4ge0RlcGxveVJ9IGZvciBjaGFpbmluZy4gICBcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIHJvdXRwdXQ6IGZ1bmN0aW9uIChyb3V0cHV0KSB7XG4gICAgaWYgKHJvdXRwdXQpIHsgdGhpcy5yb3V0cHV0cyhbcm91dHB1dF0pOyB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKiogXG4gICAqIFVzZWQgdG8gcGFzcyBtdWx0aXBsZSBpbnB1dHMgYXQgb25jZSBmcm9tIEphdmFTY3JpcHQgdG8gYW4gUiBzY3JpcHQgdXNpbmcgXG4gICAqIG9uZSBvZiB0aGUgZGVmaW5lZCBgUklucHV0YCBmYWN0b3JpZXMuXG4gICAqXG4gICAqIEBtZXRob2QgcmlucHV0c1xuICAgKiBAcGFyYW0ge0FycmF5fSByaW5wdXRzIFRoZSBgUklucHV0YCBsaXN0IG9mIERlcGxveVItc3BlY2lmaWMgZW5jb2RlZCBSIFxuICAgKiBvYmplY3QgZGF0YSBmb3IgdXNlIG9uIGFuIEFQSSBjYWxsLlxuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmcuICAgXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICByaW5wdXRzOiBmdW5jdGlvbiAocmlucHV0cykge1xuICAgIGlmIChyaW5wdXRzKSB7IHRoaXMuaW5wdXRzID0gdGhpcy5pbnB1dHMuY29uY2F0KHJpbnB1dHMpOyB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKiogXG4gICAqIFVzZWQgdG8gcGFzcyBtdWx0aXBsZSBpbnB1dHMgYXQgb25jZSBmcm9tIEphdmFTY3JpcHQgdG8gYW4gUiBzY3JpcHQgdXNpbmcgXG4gICAqIG9uZSBvZiB0aGUgZGVmaW5lZCBgUklucHV0YCBmYWN0b3JpZXMuXG4gICAqXG4gICAqIEBtZXRob2QgcmlucHV0XG4gICAqIEBwYXJhbSB7UklucHV0fSByaW5wdXQgVGhlIERlcGxveVItc3BlY2lmaWMgZW5jb2RlZCBSIG9iamVjdCBkYXRhIGZvciB1c2UgXG4gICAqIG9uIGFuIEFQSSBjYWxsLiAgIFxuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBmb3IgY2hhaW5pbmcuICAgXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuICByaW5wdXQ6IGZ1bmN0aW9uIChyaW5wdXQpIHtcbiAgICBpZiAocmlucHV0KSB7IHRoaXMuaW5wdXRzLnB1c2gocmlucHV0KTsgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgbGlmZWN5Y2xlIG1ldGhvZC4gRmlyZXMgdGhlIGBkZXN0cm95YCBldmVudCwgcHJpb3IgdG8gaW52b2tpbmcgXG4gICAqIGRlc3RydWN0b3JzIGZvciB0aGUgY2xhc3MgaGllcmFyY2h5LiBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIGAucmVsZWFzZSgpYFxuICAgKiBpcyBjYWxsZWQuXG4gICAqXG4gICAqIEBtZXRob2QgZGVzdHJveVxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi9cbiAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKTtcbiAgICAgIHRoaXMub2ZmQWxsKCk7XG4gICAgXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykge1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IFxuICAgICAgICAgIHRoaXNba2V5XSA9IG51bGw7IFxuICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoKGVycikge31cbiAgfSwgIFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGUgbWV0aG9kc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIF9jbGVhcjogZnVuY3Rpb24oKSB7ICAgIFxuICAgIHRoaXMucGFyYW1zICAgPSB7fTtcbiAgICB0aGlzLmlucHV0cyAgID0gW107XG4gICAgdGhpcy5vdXRwdXRzICA9IFtdO1xuICAgIHRoaXMucnN0cmVhbSAgPSBmYWxzZTtcbiAgICB0aGlzLmRlbGF5ZWQgID0gZmFsc2U7XG4gICAgdGhpcy5hcGkgICAgICA9IG51bGw7ICAgIFxuICAgIHRoaXMuZmlsZSAgICAgPSBudWxsOyAgXG4gICAgdGhpcy5lbnRpdGllcyA9IG51bGw7XG4gICAgdGhpcy5pb0ZpbHRlciA9IG51bGw7XG4gIH0sIFxuXG4gIC8qKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIF9wcmVwUmVxdWVzdDogZnVuY3Rpb24gKHJlc3BvbnNlQ2hhaW4sIGFyZ3MpIHtcbiAgICB2YXIgcmVxICA9IHRoaXMucmVxLFxuICAgICAgICBmaWxlID0gdGhpcy5maWxlO1xuXG4gICAgLy8gc2V0IHRoZSByZXF1ZXN0IHR5cGUgICAgXG4gICAgaWYgKHRoaXMuYXBpLnVwbG9hZCkge1xuICAgICAgIC8vIElmIHRoZSBlbnYgaXMgdGhlIEJyb3dzZXIgdGhlcmUgaXMgbm8gbmVlZCB0byBtYW51YWxseSBzZXQgdGhlXG4gICAgICAgLy8gQ29udGVudC1UeXBlLiBUaGUgYnJvd3NlciB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBcbiAgICAgICAvLyBcIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PS4uLlwiIHZhbHVlLiBJZiB0aGUgZW52IGlzIE5vZGUgd2UgbmVlZFxuICAgICAgIC8vIHRvIHNldCBpdCBtYW51YWxseS5cbiAgICAgICBpZiAoIXdpbikgeyB0aGlzLnJlcS50eXBlKCdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7IH0gICAgXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcS50eXBlKCdmb3JtJyk7XG4gICAgfSAgICBcblxuICAgIHJlcS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsgXG4gICAgICBlcnIgPSBlcnIgfHwgeyAgY29kZTogJ1VOS05PV04gQ09ERScsIHRleHQ6ICdVTktOT1dOIEVSUk9SJyB9O1xuXG4gICAgICB0aGlzLl9oYW5kbGVFcnJvcih7IFxuICAgICAgICBzdGF0dXM6IGVyci5jb2RlIHx8ICdVTktOT1dOIENPREUnLFxuICAgICAgICB0ZXh0OiBlcnJcbiAgICAgIH0pO1xuICAgIH0uYmluZCh0aGlzKSk7ICAgIFxuXG4gICAgdGhpcy5zaGFyZShhcmdzID8gYXJncy5fX2Nvb2tpZXNfXyA6IG51bGwpO1xuXG4gICAgLy8gYXJndW1lbnRzIHJldHVybmVkIGZyb20gcHJldiByZXF1ZXN0J3MgaW8oKS5lbmQoZnVuY3Rpb24oKSB7IHJldHVybiB4OyB9KVxuICAgIGlmIChhcmdzKSB7IFxuICAgICAgIHRoaXMuZGF0YShhcmdzKTtcbiAgICB9IFxuXG4gICAgaWYgKHRoaXMuaW5wdXRzLmxlbmd0aCA+IDApIHsgXG4gICAgICB0aGlzLmRhdGEoeyBpbnB1dHM6IGVuY29kZXIuZW5jb2RlKHRoaXMuaW5wdXRzKSB9KTsgXG4gICAgfVxuICBcbiAgICBpZiAodGhpcy5vdXRwdXRzLmxlbmd0aCA+IDApIHsgXG4gICAgICB0aGlzLmRhdGEoeyByb2JqZWN0czogdGhpcy5vdXRwdXRzLmpvaW4oKSB9KTsgXG4gICAgfSAgICBcblxuICAgIGlmICh0aGlzLmNvb2tpZXMpIHsgICAgIFxuICAgICAgdGhpcy5jb29raWVzLmZvckVhY2goIGZ1bmN0aW9uKGMpIHsgcmVxLnNldCgnQ29va2llJywgYyk7IH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFwaS51cGxvYWQpIHsgICAgXG4gICAgICBmb3IodmFyIHAgaW4gdGhpcy5wYXJhbXMpIHtcbiAgICAgICAgcmVxLmZpZWxkKHAsICh0aGlzLnBhcmFtc1twXSB8fCB0aGlzLnBhcmFtc1twXSA9PT0gZmFsc2UpID8gXG4gICAgICAgICAgIHRoaXMucGFyYW1zW3BdICsgJycgOiAnJyk7XG4gICAgICB9IFxuICAgICAgcmVxLmF0dGFjaCgnZmlsZScsIHRoaXMucnN0cmVhbSA/IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZSkgOiBmaWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxW3RoaXMuYXBpLm1ldGhvZCA9PT0gJ0dFVCcgPyAncXVlcnknIDogJ3NlbmQnXSh0aGlzLnBhcmFtcyk7XG4gICAgfSBcbiAgfSxcblxuICAvKipcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuICBfaGFuZGxlRXJyb3I6IGZ1bmN0aW9uIChyYXcpIHtcbiAgICB2YXIgc3RhdCAgPSByYXcuc3RhdHVzLFxuICAgICAgICByZXMgICA9IChyYXcuYm9keSAmJiByYXcuYm9keS5kZXBsb3lyID8gcmF3LmJvZHkgOiByYXcpLFxuICAgICAgICBlcnJvciA9ICgoc3RhdCAhPT0gMjAwKSB8fCByZXMuZGVwbG95ciAmJiAhcmVzLmRlcGxveXIucmVzcG9uc2Uuc3VjY2Vzcyk7XG5cbiAgICAvLyAtLSBIYW5kbGUgZXJyb3JzIC0tXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXMgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7IFxuICAgICAgICAgIHJldHVybiB1dGlscy5nZXQodGhpcy5kZXBsb3lyLnJlc3BvbnNlLCBrZXkpOyBcbiAgICAgICAgfSxcbiAgICAgICAgZGVwbG95cjogeyAgICAgICAgICBcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBjYWxsOiB0aGlzLmFwaVsnY2FsbCddLFxuICAgICAgICAgICAgZXJyb3JDb2RlOiByZXMuZGVwbG95ciA/IHJlcy5kZXBsb3lyLnJlc3BvbnNlLmVycm9yQ29kZSA6IHN0YXQsXG4gICAgICAgICAgICBlcnJvcjogcmVzLmRlcGxveXIgPyByZXMuZGVwbG95ci5yZXNwb25zZS5lcnJvciA6IHJlcy50ZXh0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBMb2dnZXIuZXJyb3IoJ2Vycm9yKCknLCB0aGlzLmFwaSwgcmVzLCByYXcpO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2Vycm9yKCknLCB0aGlzLmFwaSwgcmVzLCByYXcpO1xuXG4gICAgICAvLyAtLSBub3RpZnkgZ2xvYmFsIGVycm9ycyBmaXJzdCAoaWYgYW55KSBmb3IgdGhpcyBjYWxsIC0tICAgICAgXG4gICAgICBpZiAodGhpcy5nbG9iYWxFdnRzKSB7XG4gICAgICAgIHJhaXNlR2xvYmFsRXJyb3JzKHRoaXMuYXBpWydjYWxsJ10sIHJlcyk7ICAgICAgICBcbiAgICAgIH1cblxuICAgICAgLy8gLS0gdHJhbmFjdGlvbiBsZXZlbCBIVFRQIG9yIERlcGxveVIgZXJyb3JzIGNvbWUgbmV4dCAtLSAgICBcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCByZXMpO1xuICAgICAgdGhpcy5lbWl0KCdkZXBsb3lyLWlvOicgKyByZXMuZGVwbG95ci5yZXNwb25zZS5lcnJvckNvZGUsIHJlcyk7XG4gICAgICB0aGlzLmRlZmVycmVkLnJlamVjdChyZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxufSk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy8gSW5jbHVkZSB0aGUgYGRlcHJlY2F0ZWRgIGpzRGVwbG95UiBmb3Igbm93LlxuaWYgKHdpbikge1xuICB3aW5kb3cuUmV2b2x1dGlvbiA9IHdpbmRvdy5SZXZvbHV0aW9uIHx8IHJlcXVpcmUoJy4vbGliL2RlcHJlY2F0ZWQnKTtcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEV4cG9zZSBmb3IgYSBjbGVhbmVyIGNsaWVudCBhcGkgaW50byBEZXBsb3lSXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qKlxuICAgKiBFeHBvc2VzIHRoZSBgRGVwbG95UmAgb2JqZWN0IGZvciBleHRlbmRpbmcuXG4gICAqXG4gICAqIGBgYHZhciBEZXBsb3lSID0gcmVxdWlyZSgnZGVwbG95cicpLkRlcGxveVI7YGBgXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQGFwaSBwdWJsaWNcbiAgICogQHJldHVybiB7RGVwbG95Un0gVGhlIGBEZXBsb3lSYCBvYmplY3QuXG4gICAqLyAgIFxuICBEZXBsb3lSOiBEZXBsb3lSLFxuXG4gIC8qKlxuICAgKiBFeHBvc2VzIHRoZSBzdXBwb3J0ZWQgRGVwbG95UiBBUElzLlxuICAgKlxuICAgKiBAbWV0aG9kIGFwaXNcbiAgICogQHBhcmFtIHtCb29sZWFufSBmbGF0IChvcHRpb25hbCkgaWYgYHRydWVgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGp1c3QgdGhlIFxuICAgKiBBUEkncyBlbmRwb2ludCBwcm9wZXJ0aWVzLCBmb3IgZXhhbXBsZTogXG4gICAqIGBgYFxuICAgKiBbJy9yL3VzZXIvbG9naW4nLCAnL3IvdXNlci9sb2dvdXQnLCAnL3IvdXNlci9hYm91dCcsIC4uLl1cbiAgICogYGBgXG4gICAqIEBzdGF0aWNcbiAgICogQGFwaSBwdWJsaWNcbiAgICogQHJldHVybiB7T2JqZWN0fEFycmF5fSBUaGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBEZXBsb3lSIHNlcnZlci4gICAgICBcbiAgICovICBcbiAgYXBpczogZnVuY3Rpb24oZmxhdCkge1xuICAgIHJldHVybiBmbGF0ID8gT2JqZWN0LmtleXMoYXBpcykgOiBhcGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgc3RhdGljIG1ldGhvZCBmb3IgY29uZmlndXJpbmcgYWxsIERlcGxveVIgcmVxdWVzdHMuIFNldHRpbmdzIFxuICAgKiBtYWRlIGhlcmUgYXJlIGFwcGxpZWQgZ2xvYmFsbHkgYWNyb3NzIGV2ZXJ5IHJlcXVlc3QuXG4gICAqXG4gICAqIEBtZXRob2QgY29uZmlndXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvYmplY3QgbGl0ZXJhbCBjb25maWd1cmF0aW9uIGhhc2guIFxuICAgKiBAc3RhdGljXG4gICAqIEBjaGFpbmFibGVcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIGNvbmZpZ3VyZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgZm9yICh2YXIgaSBpbiBvcHRpb25zKSB7IGdsb2JhbE9wdGlvbnMuc2V0KGksIG9wdGlvbnNbaV0pOyB9XG5cbiAgICAvLyBhc3NlcnQgZ2xvYmFsIGNvb2tpZXMgYXJlIGVtcHR5IGlmIGdsb2JhbCBgc3RpY2t5YCBqc2Vzc2lvbmlkIGlzIG9mZlxuICAgIGlmICghZ2xvYmFsT3B0aW9ucy5zdGlja3kpICB7IGdsb2JhbE9wdGlvbnMuc2V0KCdjb29raWVzJywgbnVsbCk7IH1cblxuICAgIC8vIHR1cm4gZ2xvYmFsIGxvZ2dpbmcgb258b2ZmIChvZmYgYnkgZGVmYXVsdClcbiAgICBMb2dnZXIuc2V0TGV2ZWwoZ2xvYmFsT3B0aW9ucy5sb2dnaW5nID8gTG9nZ2VyLkRFQlVHIDogTG9nZ2VyLk9GRik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IElPIHJlcXVlc3RzIHRvIGBEZXBsb3lSYC5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgICAgXG4gICAqICAgIGRlcGxveXIuaW8oJy9yL3VzZXIvYWJvdXQnKS5lbmQoY2FsbGJhY2spO1xuICAgKiBgYGBcbiAgICpcbiAgICogQG1ldGhvZCBpb1xuICAgKiBAcGFyYW0ge1N0cmluZ30gYXBpIE9uZSBvZiB0aGUgc3VwcG9ydGVkIERlcGxveVIgQVBJcy5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJuIHtEZXBsb3lSfSBUaGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBEZXBsb3lSIHNlcnZlci5cbiAgICogQGFwaSBwdWJsaWMgICBcbiAgICovXG4gIGlvOiBmdW5jdGlvbihhcGkpIHsgIFxuICAgIHJldHVybiBEZXBsb3lSLm5ldyhhcGkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBzaWduIHRoZSB1c2VyIGluIGJ5IGF1dGhlbnRpY2F0aW5nIHRoZSBjcmVkZW50aWFscyBcbiAgICogd2l0aCB0aGUgRGVwbG95UiBzZXJ2ZXIuICAgXG4gICAqXG4gICAqIEBtZXRob2QgYXV0aFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdXNlcm5hbWUgU3BlY2lmaWVzIHRoZSB1c2VybmFtZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhc3N3b3JkIFNwZWNpZmllcyB0aGUgcGFzc3dvcmQuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybiB7RGVwbG95Un0gVGhlIEhUVFAgcmVxdWVzdCB0byB0aGUgRGVwbG95UiBzZXJ2ZXIuICAgXG4gICAqIEBhcGkgcHVibGljICAgXG4gICAqLyAgIFxuICBhdXRoOiBmdW5jdGlvbih1biwgcHcpIHtcbiAgICB2YXIgZGF0YSA9IHsgdXNlcm5hbWU6IHVuLCBwYXNzd29yZDogcHcgfTtcbiAgICByZXR1cm4gRGVwbG95Ui5uZXcoJy9yL3VzZXIvbG9naW4nKS5kYXRhKGRhdGEpLmVuZCgpOyAgICBcbiAgfSxcblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gc2lnbiB0aGUgdXNlciBpbiBieSBhdXRoZW50aWNhdGluZyB0aGUgY3JlZGVudGlhbHMgXG4gICAqIHdpdGggdGhlIERlcGxveVIgc2VydmVyLiAgIFxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBcbiAgICogICAgZGVwbG95ci5zY3JpcHQoJy90ZXN0dXNlci9yb290L3JlZHVjZS5SJylcbiAgICogICAgZGVwbG95ci5zY3JpcHQoeyBmaWxlbmFtZTogJ3JlZHVjZS5SJywgYXV0aG9yOiAndGVzdHVzZXInLFxuICAgKiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogJ3Jvb3QnfSlcbiAgICogICAgZGVwbG95ci5zY3JpcHQoJ3JlZHVjZS5SJywgJ3Rlc3R1c2VyJywgJ3Jvb3QnKVxuICAgKiAgICBkZXBsb3lyLnNjcmlwdCgnL3Rlc3R1c2VyL3Jvb3QvcmVkdWNlLlInLCBwcm9qZWN0KSAgICAgXG4gICAqIGBgYCAgIFxuICAgKlxuICAgKiBAbWV0aG9kIHNjcmlwdFxuICAgKiBAcGFyYW0ge0FyZ3VtZW50c30gYXJndW1lbnRzIEFyZ3VtZW50cyB0byBkZWZpbmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBzY3JpcHQgXG4gICAqIGZvciBleGVjdXRpb24uXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybiB7RGVwbG95Un0gVGhlIEhUVFAgcmVxdWVzdCB0byB0aGUgRGVwbG95UiBzZXJ2ZXIuICAgXG4gICAqIEBhcGkgcHVibGljICAgXG4gICAqLyAgICAgXG4gIHNjcmlwdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSB1dGlscy5zaWduYXR1cmUoYXJndW1lbnRzKSxcbiAgICAgICAgb3B0cyA9IGFyZ3Mub3B0cyxcbiAgICAgICAgYXBpICA9IGFyZ3MuYXBpOyAgXG5cbiAgICAvLyBjb252ZW5pZW5jZSAtIGlmIHRoZSBwcm9qZWN0IGlzIGEgYm9vbGVuIGB0cnVlYCByYXRoZXIgdGhhbiBhIHBpZCwgZmlyc3RcbiAgICAvLyBjcmVhdGUgYSBuZXcgcHJvamVjdCBhbmQgdGhlbiBwcmVwYXJlIHRoZSBwcm9qZWN0IGFwaSBjYWxsIHRvIGV4ZWN1dGVcbiAgICBpZiAoYXJncy5jcmVhdGUpIHtcbiAgICAgIHJldHVybiBEZXBsb3lSLm5ldygnL3IvcHJvamVjdC9jcmVhdGUnKVxuICAgICAgICAgICAgICAgLmVuZChmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IHByb2plY3Q6IHJlcy5nZXQoJ3Byb2plY3QnKS5wcm9qZWN0IH07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgIC5pbyhhcGkpXG4gICAgICAgICAgICAgICAuZGF0YShvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIERlcGxveVIubmV3KGFwaSkuZGF0YShvcHRzKTtcbiAgICB9XG4gIH0sICBcblxuICAvKipcbiAgICogUnVuIGFuIHNlcmllcyBvZiBjaGFpbmVkIERlcGxveVIgcmVxdWVzdHMgaW4gc2VxdWVuY2UgYW5kIHdpdGhvdXQgb3ZlcmxhcC4gICAgICAgXG4gICAqXG4gICAqIEBtZXRob2QgcGlwbGluZVxuICAgKiBAcGFyYW0ge0FycmF5fSB0YXNrcyBTcGVjaWZpZXMgdGhlIGxpc3Qgb2YgYEZ1bmN0aW9uYCB0YXNrcy5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2Ugd3JhcHBpbmcgdGhlIHJlc29sdXRpb24gb2YgZWl0aGVyIFwicmVzb2x2ZVwiIG9yXG4gICAqIFwicmVqZWN0XCIgY2FsbGJhY2suXG4gICAqIEBhcGkgcHVibGljICAgXG4gICAqL1xuICBwaXBlbGluZTogZnVuY3Rpb24oY2hhaW5zKSB7ICAgICAgXG4gICAgdmFyIGRlcGxveXIgID0gdGhpcyxcbiAgICAgICAgZGVmZXJyZWQgPSBEKCksXG4gICAgICAgIHEgICAgICAgID0gbmV3IFF1ZXVlKCksXG4gICAgICAgIHJlc3VsdHMgID0gW10sXG4gICAgICAgIGVycm9ycyAgID0gW10sXG4gICAgICAgIE5PT1AgICAgID0gbnVsbCwgLy8gTk9PUCBlcnJvcnN8cmVzdWx0cyBmb3IgW2FdIGJhdGNoIHJlcXVlc3QgY2hhaW5cbiAgICAgICAgb3JpZyAgICAgPSB7XG4gICAgICAgICAgc3RpY2t5OiBnbG9iYWxPcHRpb25zLnN0aWNreSxcbiAgICAgICAgICBjb29raWVzOiBnbG9iYWxPcHRpb25zLmNvb2tpZXNcbiAgICAgICAgfTtcblxuICAgIC8vIG1ha2UgYSBjb3B5XG4gICAgY2hhaW5zID0gY2hhaW5zLnNsaWNlKDApO1xuXG4gICAgLy8gdHVybiBzdGlja3kgc2Vzc2lvbiBmb3IgdGhlc2UgcmVxdWVzdCAoaGFja3kpXG4gICAgZGVwbG95ci5jb25maWd1cmUoIHsgc3RpY2t5OiB0cnVlIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkKCkge1xuICAgICAgcS5hZGQoZnVuY3Rpb24oKSB7IFxuICAgICAgICBjaGFpbnMuc2hpZnQoKS5kcmFpbigpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGNoYWluKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGNoYWluKTsgIFxuICAgICAgICAgIGVycm9ycy5wdXNoKE5PT1ApOyAgICAgICAgICAgXG4gICAgICAgICAgaWYgKHEuaXNFbXB0eSgpKSB7IFxuICAgICAgICAgICAgZGVwbG95ci5jb25maWd1cmUob3JpZyk7IC8vIHJlc2V0XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHsgcmVzdWx0czogcmVzdWx0cywgZXJyb3JzOiBlcnJvcnMgfSk7IFxuICAgICAgICAgIH0gIFxuXG4gICAgICAgICAgcS50YWtlKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycikgeyAgICAgICAgICBcbiAgICAgICAgICByZXN1bHRzLnB1c2goTk9PUCk7IFxuICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgLy8gcmVqZWN0aW9ucyBhcmUgb25seSBtZXQgd2hlbiB0aGV5IFthbGxdIGZhaWxcbiAgICAgICAgICBpZiAocS5pc0VtcHR5KCkgJiYgcmVzdWx0cy5sZW5ndGggPT09IDApIHsgXG4gICAgICAgICAgICBkZXBsb3lyLmNvbmZpZ3VyZShvcmlnKTsgLy8gcmVzZXRcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnJvcnMpOyBcbiAgICAgICAgICB9ICBcbiAgICAgICAgICBxLnRha2UoKTtcbiAgICAgICAgfSk7ICAgICAgIFxuICAgICAgfSwgbnVsbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCB0byBhIHNlcSBxdWV1ZSBmb3IgYmV0dGVyIGhhbmRsaW5nXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGNoYWlucy5sZW5ndGg7IGkrKykgeyBhZGQoKTsgfVxuXG4gICAgLy8gc3RhcnQ6IGRlcXVldWUgZmlyc3QgaXRlbSBhbmQgcnVuIGl0XG4gICAgcS50YWtlKCk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgfSxcblxuICAvKipcbiAgICogVGhlIGV2ZW50IHN0cmVhbSBBUEkgaXMgdW5pcXVlIHdpdGhpbiB0aGUgRGVwbG95UiBBUEkgYXMgaXQgc3VwcG9ydHMgcHVzaCBcbiAgICogbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBEZXBsb3lSIHNlcnZlciB0byBjbGllbnQgYXBwbGljYXRpb25zLiBOb3RpZmljYXRpb25zIFxuICAgKiBjb3JyZXNwb25kIHRvIGRpc2NyZXRlIGV2ZW50cyB0aGF0IG9jY3VyIHdpdGhpbiB0aGUgRGVwbG95UiBzZXJ2ZXIuIFRoZXJlIFxuICAgKiBhcmUgZm91ciBkaXN0aW5jdCBldmVudCBjYXRlZ29yaWVzOlxuICAgKiBcbiAgICogLSBTdHJlYW0gTGlmZWN5Y2xlIGV2ZW50c1xuICAgKiAtIEV4ZWN1dGlvbiBldmVudHNcbiAgICogLSBKb2IgTGlmZWN5Y2xlIGV2ZW50c1xuICAgKiAtIE1hbmFnZW1lbnQgZXZlbnRzXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIGBgYFxuICAgKiBkZXBsb3lyLmVzKHsgdXNlcm5hbWU6ICd0ZXN0dXNlcicsIHBhc3N3b3JkOiAnc2VjcmV0JyB9KVxuICAgKiAgICAvLyAtLSBjb25uZWN0aW9uIGNob2ljZXMgZm9yIGV2ZW50IHR5cGVzIC0tXG4gICAqICAgIC5tYW5hZ2VtZW50KCkgIC8vLnNlc3Npb24oKSB8IC5hbGwoKSB8IC5wcm9qZWN0KGlkKSB8IC5qb2IoaWQpXG4gICAqICAgIC5vbignZXM6Z3JpZEhlYXJ0YmVhdCcsIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICogICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09Jyk7XG4gICAqICAgICAgICBjb25zb2xlLmxvZygnZXM6Z3JpZEhlYXJ0YmVhdCcpO1xuICAgKiAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT0nKTsgICAgICAgICAgXG4gICAqICAgICB9KVxuICAgKiAgICAgLm9wZW4oKTtcbiAgICogYGBgXG4gICAqIFxuICAgKiBAbWV0aG9kIGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvYmplY3QgbGl0ZXJhbCBjb25maWd1cmF0aW9uIGhhc2guIFxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm4ge0V2ZW50U3RyZWFtfSBhIG5ldyBgRXZlbnRTdHJlYW1gIGZvciBiaW5kaW5nLlxuICAgKiBAYXBpIHB1YmxpYyAgIFxuICAgKi8gIFxuICBlczogZnVuY3Rpb24ob3B0aW9ucykgeyAgICBcbiAgICB2YXIgc3RyZWFtID0gRXZlbnRTdHJlYW0ubmV3KGdsb2JhbE9wdGlvbnMuaG9zdCwgb3B0aW9ucyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVzZXJuYW1lICYmIG9wdGlvbnMucGFzc3dvcmQpIHtcbiAgICAgIHZhciBydXNlciA9IHRoaXMuYXV0aChvcHRpb25zLnVzZXJuYW1lLCBvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgIHJ1c2VyLmVuc3VyZShmdW5jdGlvbigpIHsgXG4gICAgICAgIHN0cmVhbS5zaGFyZShydXNlci5nZXRDb29raWVzKCkpO1xuICAgICAgICBzdHJlYW0uZmx1c2goKTsgXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyZWFtO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBmYWN0b3J5IGZvciBjcmVhdGluZyBhIERlcGxveVItc3BlY2lmaWMgZW5jb2RlZCBSIG9iamVjdCB0byBiZSBcbiAgICogc2VudCBhcyBpbnB1dCBwYXJhbWV0ZXJzIHRvIGFuIFIgc2NyaXB0LlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBcbiAgICogICAgdmFyIHJpbnB1dCA9IGRlcGxveXIuUklucHV0LmxvZ2ljYWwoJ2xvZ2ljYWxfbmFtZScsIHRydWUpO1xuICAgKiAgICB2YXIgcmlucHV0ID0gZGVwbG95ci5SSW5wdXQubnVtZXJpYygnbnVtZXJpY19uYW1lJywgMTAuNSk7XG4gICAqICAgIHZhciByaW5wdXQgPSBkZXBsb3lyLlJJbnB1dC5pbnRlZ2VyKCdpbnRlZ2VyX25hbWUnLCA1KTtcbiAgICogICAgdmFyIHJpbnB1dCA9IGRlcGxveXIuUklucHV0LmNoYXJhY3RlcignY2hhcmFjdGVyX25hbWUnLCAnSGVsbG8nKTtcbiAgICogICAgLy8gZWN0Li4uXG4gICAqIGBgYFxuICAgKiBAcHJvcGVydHkgUklucHV0XG4gICAqIEBzdGF0aWNcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIFJJbnB1dDoge1xuICAgIG51bWVyaWM6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLm51bWVyaWMoKTtcbiAgICB9LFxuXG4gICAgaW50ZWdlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuaW50ZWdlcigpO1xuICAgIH0sXG5cbiAgICBsb2dpY2FsOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5sb2dpY2FsKCk7XG4gICAgfSxcblxuICAgIGNoYXJhY3RlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuY2hhcmFjdGVyKCk7XG4gICAgfSxcblxuICAgIGRhdGU6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmRhdGUoKTtcbiAgICB9LFxuXG4gICAgcG9zaXhjdDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkucG9zaXhjdCgpO1xuICAgIH0sICBcblxuICAgIG51bWVyaWNWZWN0b3I6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubnVtZXJpY1ZlY3RvcigpO1xuICAgIH0sIFxuXG4gICAgaW50ZWdlclZlY3RvcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuaW50ZWdlclZlY3RvcigpO1xuICAgIH0sXG5cbiAgICBsb2dpY2FsVmVjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubG9naWNhbFZlY3RvcigpO1xuICAgIH0sXG5cbiAgICBjaGFyYWN0ZXJWZWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcbiAgICAgIHJldHVybiBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5jaGFyYWN0ZXJWZWN0b3IoKTtcbiAgICB9LCAgXG5cbiAgICBkYXRlVmVjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuZGF0ZVZlY3RvcigpO1xuICAgIH0sICBcblxuICAgIHBvc2l4Y3RWZWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcbiAgICAgIHJldHVybiBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5wb3NpeGN0VmVjdG9yKCk7XG4gICAgfSxcblxuICAgIGxpc3Q6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmxpc3QoKTsgXG4gICAgfSxcblxuICAgIGRhdGFmcmFtZTogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7IFxuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmRhdGFmcmFtZSgpO1xuICAgIH0sXG4gIFxuICAgIGZhY3RvcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBsZXZlbHMsIGxhYmVscykge1xuICAgICAgdmFyIG9wdHMgPSB7IGxldmVsczogbGV2ZWxzLCBsYWJlbHM6IGxhYmVscyB9O1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUsIG9wdHMpLmZhY3RvcigpO1xuICAgIH0sXG5cbiAgICBvcmRlcmVkOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGxldmVscywgbGFiZWxzKSB7XG4gICAgICB2YXIgb3B0cyA9IHsgbGV2ZWxzOiBsZXZlbHMsIGxhYmVsczogbGFiZWxzIH07XG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSwgb3B0cykub3JkZXJlZCgpO1xuICAgIH0sXG5cbiAgICBudW1lcmljTWF0cml4OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubnVtZXJpY01hdHJpeCgpO1xuICAgIH0sXG5cbiAgICBpbnRlZ2VyTWF0cml4OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuaW50ZWdlck1hdHJpeCgpO1xuICAgIH0sXG5cbiAgICBsb2dpY2FsTWF0cml4OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG4gICAgICByZXR1cm4gUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubG9naWNhbE1hdHJpeCgpO1xuICAgIH0sXG5cbiAgICBjaGFyYWN0ZXJNYXRyaXg6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmNoYXJhY3Rlck1hdHJpeCgpO1xuICAgIH1cbiAgfVxufTtcbn0pLmNhbGwodGhpcyxyZXF1aXJlKCdfcHJvY2VzcycpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW1SbGNHeHZlWEl1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFaUxDSm1hV3hsSWpvaVoyVnVaWEpoZEdWa0xtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxSVZ4dUlDb2dRMjl3ZVhKcFoyaDBJQ2hES1NBeU1ERXdMVEl3TVRVZ1lua2dVbVYyYjJ4MWRHbHZiaUJCYm1Gc2VYUnBZM01nU1c1akxseHVJQ3BjYmlBcUlGUm9hWE1nY0hKdlozSmhiU0JwY3lCc2FXTmxibk5sWkNCMGJ5QjViM1VnZFc1a1pYSWdkR2hsSUhSbGNtMXpJRzltSUZabGNuTnBiMjRnTWk0d0lHOW1JSFJvWlZ4dUlDb2dRWEJoWTJobElFeHBZMlZ1YzJVdUlGUm9hWE1nY0hKdlozSmhiU0JwY3lCa2FYTjBjbWxpZFhSbFpDQlhTVlJJVDFWVVhHNGdLaUJCVGxrZ1JWaFFVa1ZUVXlCUFVpQkpUVkJNU1VWRUlGZEJVbEpCVGxSWkxDQkpUa05NVlVSSlRrY2dWRWhQVTBVZ1QwWWdUazlPTFVsT1JsSkpUa2RGVFVWT1ZDeGNiaUFxSUUxRlVrTklRVTVVUVVKSlRFbFVXU0JQVWlCR1NWUk9SVk5USUVaUFVpQkJJRkJCVWxSSlExVk1RVklnVUZWU1VFOVRSUzRnVUd4bFlYTmxJSEpsWm1WeUlIUnZJSFJvWlZ4dUlDb2dRWEJoWTJobElFeHBZMlZ1YzJVZ01pNHdJQ2hvZEhSd09pOHZkM2QzTG1Gd1lXTm9aUzV2Y21jdmJHbGpaVzV6WlhNdlRFbERSVTVUUlMweUxqQXBJR1p2Y2lCdGIzSmxJRnh1SUNvZ1pHVjBZV2xzY3k1Y2JpQXFMMXh1WEc1MllYSWdkMmx1SUNBZ0lDQWdJQ0FnUFNBb2RIbHdaVzltSUhkcGJtUnZkeUFoUFQwZ0ozVnVaR1ZtYVc1bFpDY3BMQ0FnSUZ4dUlDQWdJSEpsY1hWbGMzUWdJQ0FnSUQwZ2NtVnhkV2x5WlNnbmMzVndaWEpoWjJWdWRDY3BMRnh1SUNBZ0lFUWdJQ0FnSUNBZ0lDQWdJRDBnY21WeGRXbHlaU2duWkM1cWN5Y3BMRnh1SUNBZ0lHWnpJQ0FnSUNBZ0lDQWdJRDBnY21WeGRXbHlaU2duWm5NbktTeGNiaUFnSUNCaGNHbHpJQ0FnSUNBZ0lDQTlJSEpsY1hWcGNtVW9KeTR2WVhCcGN5NXFjMjl1Snlrc0lGeHVJQ0FnSUVWMlpXNTBVM1J5WldGdElEMGdjbVZ4ZFdseVpTZ25MaTlzYVdJdlpYTW5LU3hjYmlBZ0lDQjFkR2xzY3lBZ0lDQWdJQ0E5SUhKbGNYVnBjbVVvSnk0dmJHbGlMM1YwYVd4ekp5a3NYRzRnSUNBZ1RHRnVaeUFnSUNBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOXNZVzVuSnlrc0lDQWdYRzRnSUNBZ1RHOW5aMlZ5SUNBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOXNiMmRuWlhJbktTd2dJQ0JjYmlBZ0lDQlJkV1YxWlNBZ0lDQWdJQ0E5SUhKbGNYVnBjbVVvSnk0dmJHbGlMM0YxWlhWbEp5a3NYRzRnSUNBZ1JXMXBkSFJsY2lBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOWxiV2wwZEdWeUp5a3NYRzRnSUNBZ1pXNWpiMlJsY2lBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOWxibU52WkdWeUp5a3NYRzRnSUNBZ1FtRnpaU0FnSUNBZ0lDQWdQU0J5WlhGMWFYSmxLQ2N1TDJ4cFlpOXpaV3htYVhOb0p5a3VRbUZ6WlN4Y2JpQWdJQ0JTU1c1d2RYUWdJQ0FnSUNBOUlISmxjWFZwY21Vb0p5NHZiR2xpTDNKcGJuQjFkQ2NwTENBZ0lDQmNiaUFnSUNCU1NXNXdkWFJ6SUNBZ0lDQTlJSEpsY1hWcGNtVW9KeTR2YkdsaUwzSnBibkIxZEhNbktTeGNiaUFnSUNCdFpYSm5aU0FnSUNBZ0lDQTlJSFYwYVd4ekxtMWxjbWRsTzF4dVhHNHZLbHh1SUNvZ1ZIVnliaUJuYkc5aVlXd2diRzluWjJsdVp5QnZabVlnWW5rZ1pHVm1ZWFZzZEZ4dUlDb3ZYRzVNYjJkblpYSXVjMlYwVEdWMlpXd29URzluWjJWeUxrOUdSaWs3WEc1Y2JpOHFYRzRnS2lCSGJHOWlZV3dnYjNCMGFXOXVjeUIwYUdGMElIQmxjbk5wYzNRZ2RHaHliM1ZuYUNCaGJHd2dSR1Z3Ykc5NVVpQnlaWEYxWlhOMGN5NWNiaUFxTDF4dWRtRnlJR2RzYjJKaGJFOXdkR2x2Ym5NZ1BTQjdJRnh1SUNCamIzSnpPaUJtWVd4elpTeGNiaUFnYkc5bloybHVaem9nWm1Gc2MyVXNYRzRnSUhOMGFXTnJlVG9nWm1Gc2MyVXNYRzRnSUdOdmIydHBaWE02SUc1MWJHd3NYRzRnSUdodmMzUTZJQ2NuTEZ4dUlDQmhiR3h2ZDFObGJHWlRhV2R1WldSVFUweERaWEowT2lCbVlXeHpaU3hjYmlBZ2JXRjRVbVZ4ZFdWemRITTZJRzUxYkd3c0lDOHZJRzV2SUhOdlkydGxkQ0J3YjI5c2FXNW5JR2x1SUdoMGRIQXVRV2RsYm5SY2JpQWdaWFpsYm5Sek9udDlMRnh1SUNCelpYUTZJR1oxYm1OMGFXOXVLSEJ5YjNBc0lIWmhiSFZsS1NCN0lGeHVJQ0FnSUdsbUlDaHdjbTl3SUNFOVBTQW5jMlYwSnlrZ2V5QmNiaUFnSUNBZ0lHbG1JQ2h3Y205d0lEMDlQU0FuYUc5emRDY2dKaVlnZG1Gc2RXVXBJSHNnSUNBZ0lDQWdJQ0JjYmlBZ0lDQWdJQ0FnSUM4dklFSmxJRzF2Y21VZ1ptOXlaMmwyYVc1bklHOXVJSFJvWlNCbGJuUmxjbVZrSUVSbGNHeHZlVklnSjJWdVpIQnZhVzUwSnpwY2JpQWdJQ0FnSUNBZ0lDOHZJQ0FnTFNCb2RIUndLSE1wT2k4dlpHaHZjM1E2Y0c5eWRGeHVJQ0FnSUNBZ0lDQWdMeThnSUNBdElHaDBkSEFvY3lrNkx5OWthRzl6ZERwd2IzSjBMMlJsY0d4dmVYSmNiaUFnSUNBZ0lDQWdJQzh2SUNBZ0xTQmthRzl6ZERwd2IzSjBYRzRnSUNBZ0lDQWdJQ0F2THlBZ0lDMGdaR2h2YzNRNmNHOXlkQzlrWlhCc2IzbHlJQ0FnSUNBZ0lDQWdYRzRnSUNBZ0lDQWdJQ0IyWVd4MVpTQTlJSFpoYkhWbExuSmxjR3hoWTJVb0wxeGNMeW9rZkZ4Y0x5cGtaWEJzYjNseVhGd3ZLaVF2TENBbkp5azdYRzRnSUNBZ0lDQWdJQ0IyWVd4MVpTQTlJQ2h1WlhjZ1VtVm5SWGh3S0NkZUtHaDBkSEI4YUhSMGNITXBPaTh2Snl3Z0oya25LU2t1ZEdWemRDaDJZV3gxWlNrZ1B5QjJZV3gxWlNBNklGeHVJQ0FnSUNBZ0lDQWdJQ0FnSjJoMGRIQTZMeThuSUNzZ2RtRnNkV1U3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUhSb2FYTmJjSEp2Y0YwZ1BTQjJZV3gxWlRzZ1hHNGdJQ0FnZlNCY2JpQWdmVnh1ZlR0Y2JseHVMeXBjYmlBcUlGUm9aU0IwYjNBdGJHVjJaV3dnUkdWd2JHOTVVaUJCVUVrZ2NtVnpjRzl1YzJVZ1pXNTBhWFJwWlhNdVhHNGdLaTljYm5aaGNpQlVUMUJNUlZaRlRGOUZUbFJKVkVsRlV5QTlJRnRjYmlBZ0ozVnpaWEluTENCY2JpQWdKM0J5YjJwbFkzUW5MQ0JjYmlBZ0ozZHZjbXR6Y0dGalpTY3NJRnh1SUNBblpYaGxZM1YwYVc5dUp5d2dYRzRnSUNka2FYSmxZM1J2Y25rbkxDQmNiaUFnSjNKbGNHOXphWFJ2Y25rbkxDQmNiaUFnSjNCaFkydGhaMlZ6SnlCY2JsMDdYRzVjYmk4cVhHNGdLaUJPYjNScFpua2daMnh2WW1Gc0lFbFBJR1Z5Y205eUlHVjJaVzUwY3lCaFkyTmxjM05wWW14bElHSjVJR0ZzYkNCemRXSnpZM0pwWW1WeWN5QmhZM0p2YzNNZ2NtVnhkV1Z6ZEhNdVhHNGdLaTljYm1aMWJtTjBhVzl1SUhKaGFYTmxSMnh2WW1Gc1JYSnliM0p6S0dGd2FTd2djbVZ6S1NCN1hHNGdJSFpoY2lCamIyUmxJQ0FnSUQwZ2NtVnpMbVJsY0d4dmVYSWdQeUJ5WlhNdVpHVndiRzk1Y2k1eVpYTndiMjV6WlM1bGNuSnZja052WkdVZ09pQnlaWE11YzNSaGRIVnpMRnh1SUNBZ0lDQWdZMjl1ZEdWNGRDQTlJSFJvYVhNN1hHNWNiaUFnTHk4Z0xTMGdaMnh2WW1Gc0lHVjJaVzUwY3lCcFppQndjbTkyYVdSbFpDQXRMVnh1SUNCcFppQW9aMnh2WW1Gc1QzQjBhVzl1Y3k1bGRtVnVkSE1wSUh0Y2JpQWdJQ0JwWmlBb0lYSmxjeTVrWlhCc2IzbHlLU0I3WEc0Z0lDQWdJQ0J5WlhNZ1BTQnlaWE11ZEdWNGREdGNiaUFnSUNCOVhHNWNiaUFnSUNCamIyNTBaWGgwSUQwZ1oyeHZZbUZzVDNCMGFXOXVjeTVsZG1WdWRITXVZM1I0SUh4OElHTnZiblJsZUhRN1hHNWNiaUFnSUNBdkx5QXRMU0JuWlc1bGNtRnNJR2RzYjJKaGJDQm1ZV2xzZFhKbElDMHRYRzRnSUNBZ2FXWWdLR2RzYjJKaGJFOXdkR2x2Ym5NdVpYWmxiblJ6TG1WeWNtOXlLU0I3WEc0Z0lDQWdJQ0JuYkc5aVlXeFBjSFJwYjI1ekxtVjJaVzUwY3k1bGNuSnZjaTVoY0hCc2VTaGpiMjUwWlhoMExDQmJZWEJwTENCeVpYTmRLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZMeUF0TFNCSVZGUlFJRzl5SUVSbGNHeHZlVklnWjJ4dlltRnNJR1Z5Y205eWN5QXRMU0FnSUNCY2JpQWdJQ0JwWmlBb1oyeHZZbUZzVDNCMGFXOXVjeTVsZG1WdWRITmJZMjlrWlYwcElIdGNiaUFnSUNBZ0lHZHNiMkpoYkU5d2RHbHZibk11WlhabGJuUnpXMk52WkdWZExtRndjR3g1S0dOdmJuUmxlSFFzSUZ0aGNHa3NJSEpsYzEwcE8xeHVJQ0FnSUgxY2JpQWdmVnh1ZlZ4dVhHNHZLaXBjYmlBcUlGUm9aU0JnUkdWd2JHOTVVbUFnY21WeGRXVnpkQ0JqYkdGemN5QnBjeUJoSUhWMGFXeHBkSGtnZEdoaGRDQmljbTlyWlhKeklFaFVWRkFnY21WeGRXVnpkSE1nZEdoeWIzVm5hQ0JoSUZ4dUlDb2djMmx0Y0d4cFptbGxaQ0JtYkhWcFpDQnBiblJsY21aaFkyVWdkRzhnUkdWd2JHOTVVaTVjYmlBcVhHNGdLaUJBYlc5a2RXeGxJR1JsY0d4dmVYSmNiaUFxSUVCbWIzSWdaR1Z3Ykc5NWNseHVJQ292WEc1MllYSWdSR1Z3Ykc5NVVpQTlJRUpoYzJVdVpYaDBaVzVrS0VWdGFYUjBaWElzSUZKSmJuQjFkSE1zSUh0Y2JseHVJQ0F2S2lwY2JpQWdJQ29nVkdobElHQkVaWEJzYjNsU1lDQlNaWEYxWlhOMElHTnNZWE56SUdseklHRWdkWFJwYkdsMGVTQjBhR0YwSUdKeWIydGxjbk1nU0ZSVVVDQnlaWEYxWlhOMGN5QjBhSEp2ZFdkb0lGeHVJQ0FnS2lCaElITnBiWEJzYVdacFpXUWdabXgxYVdRZ2FXNTBaWEptWVdObElIUnZJRVJsY0d4dmVWSXVYRzRnSUNBcUlGeHVJQ0FnS2lCQVkyeGhjM01nWEc0Z0lDQXFJRUJqYjI1emRISjFZM1J2Y2x4dUlDQWdLaUJBY0dGeVlXMGdlMU4wY21sdVozMGdZWEJwSUZSb1pTQkVaWEJzYjNsU0lFRlFTVnh1SUNBZ0tpQkFjR0Z5WVcwZ2UwOWlhbVZqZEgwZ2JHbHVheUJVYUdVZ2IySnFaV04wSUd4cGRHVnlZV3dnWTI5dWRHRnBibWx1WnlCMGFHVWdjSEpsZG1sdmRYTWdjbVZ4ZFdWemRDNWNiaUFnSUNvZ1FHRndhU0J3Y21sMllYUmxYRzRnSUNBcUwxeHVJQ0JwYm1sMGFXRnNhWHBsT2lCbWRXNWpkR2x2YmlCcGJtbDBhV0ZzYVhwbEtHRndhU3dnYkdsdWF5a2dlMXh1SUNBZ0lDQkZiV2wwZEdWeUxtbHVhWFJwWVd4cGVtVXVZMkZzYkNoMGFHbHpMQ0I3ZlNrN1hHNGdJRnh1SUNBZ0lDQjJZWElnYjNCMGN5QTlJR2RzYjJKaGJFOXdkR2x2Ym5NN1hHNWNiaUFnSUNBZ2FXWWdLQ0ZoY0dselcyRndhVjBwSUhzZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkSmJuWmhiR2xrSUVGUVNTQmNJaWNnS3lCaGNHa2dLeUFuWENJbktUc2dmVnh1SUNBZ0lGeHVJQ0FnSUNCMGFHbHpMbUZ3YVNBZ0lDQWdJQ0FnUFNCdFpYSm5aU2g3SUNkallXeHNKem9nWVhCcElIMHNJR0Z3YVhOYllYQnBYU2s3SUNBZ0lGeHVJQ0FnSUNCMGFHbHpMbXhwYm1zZ0lDQWdJQ0FnUFNCc2FXNXJJSHg4SUh0OU8xeHVJQ0FnSUNCMGFHbHpMbkVnSUNBZ0lDQWdJQ0FnUFNCMGFHbHpMbXhwYm1zdWNYVmxkV1VnZkh3Z2JtVjNJRkYxWlhWbEtDazdYRzRnSUNBZ0lIUm9hWE11WkdWbVpYSnlaV1FnSUNBOUlIUm9hWE11YkdsdWF5NWtaV1psY25KbFpDQjhmQ0JFS0NrN1hHNGdJQ0FnSUhSb2FYTXVZMjl2YTJsbGN5QWdJQ0E5SUhSb2FYTXViR2x1YXk1amIyOXJhV1Z6TzF4dUlDQWdJQ0IwYUdsekxteHZaMmRsY2lBZ0lDQWdQU0JNYjJkblpYSXVaMlYwS0dGd2FTd2dURzluWjJWeUxrOUdSaWs3SUM4dklIUnlZVzV6WVdOMGFXOXVMV3hsZG1Wc0lHeHZaMmRwYm1kY2JpQWdJQ0FnZEdocGN5NXdZWEpoYlhNZ0lDQWdJRDBnZTMwN1hHNGdJQ0FnSUhSb2FYTXVhVzV3ZFhSeklDQWdJQ0E5SUZ0ZE95QXZMeUJ5YVc1d2RYUnpJR3hwYzNRZ1hHNGdJQ0FnSUhSb2FYTXViM1YwY0hWMGN5QWdJQ0E5SUZ0ZE95QXZMeUJ5YjNWMGNIVjBJRzlpYW1WamRDQnNhWE4wWEc0Z0lDQWdJSFJvYVhNdWNuTjBjbVZoYlNBZ0lDQTlJR1poYkhObE8xeHVJQ0FnSUNCMGFHbHpMbVJsYkdGNVpXUWdJQ0FnUFNCbVlXeHpaVHRjYmlBZ0lDQWdkR2hwY3k1bmJHOWlZV3hGZG5SeklEMGdkSEoxWlRzZ0x5OGdjM1Z3Y0hKbGMzTjhjbUZwYzJVZ1oyeHZZbUZzSUdWMlpXNTBjeUJtYjNRZ2RHaHBjeUJnYVc5Z0lDQWdJQ0JjYmlBZ0lDQWdkR2hwY3k1bWFXeGxJQ0FnSUNBZ0lEMGdiblZzYkRzZ1hHNGdJQ0FnSUhSb2FYTXVaVzUwYVhScFpYTWdJQ0E5SUc1MWJHdzdJRnh1SUNBZ0lDQjBhR2x6TG1sdlJtbHNkR1Z5SUNBZ1BTQm1kVzVqZEdsdmJpZ3BJSHNnY21WMGRYSnVJSFJ5ZFdVN0lIMDdYRzVjYmlBZ0lDQWdMeThnY0hKbGMyVjBJR1JsY0d4dmVYSW5jeUJoYzNOcFoyNWxaQ0J5WlhOd2IyNXpaU0JtYjNKdFlYUWdabTl5SUdCMGFHbHpZQ0JoY0dsY2JpQWdJQ0FnZEdocGN5NWtZWFJoS0hzZ1ptOXliV0YwT2lCMGFHbHpMbUZ3YVM1bWIzSnRZWFFnZlNrN1hHNWNiaUFnSUNBZ0x5OGdkM0poY0NCemRYQmxjbUZuWlc1MElHWnZjaUIwYUdVZ2FHVmhkbmtnYkdsbWRHbHVaeUFnSUNBZ1hHNGdJQ0FnSUhSb2FYTXVjbVZ4SUQwZ1hHNGdJQ0FnSUNBZ0lISmxjWFZsYzNSYmRHaHBjeTVoY0drdWJXVjBhRzlrTG5SdlRHOTNaWEpEWVhObEtDbGRLRzl3ZEhNdWFHOXpkQ0FySUNjdlpHVndiRzk1Y2ljZ0t5QmhjR2twTzF4dUlDQWdJQ0IwYUdsekxuSmxjUzUwYVcxbGIzVjBLREl3SUNvZ05qQWdLaUF4TURBd0tUc2dMeThnWkdWbVlYVnNkQ0IwYVcxbGIzVjBJQzB0UGlBeU1DQnRhVzUxZEdWelhHNWNiaUFnSUNBZ0x5OGdRV3hzSUVOUFVsTWdaR1Z3Ykc5NWNpQmpZV3hzY3lCeVpYRjFhWEpsSUhOMGFXTnJlU0J6WlhOemFXOXVjMXh1SUNBZ0lDQnBaaUFvZDJsdUlDWW1JR2RzYjJKaGJFOXdkR2x2Ym5NdVkyOXljeWtnZXlCMGFHbHpMbkpsY1M1M2FYUm9RM0psWkdWdWRHbGhiSE1vS1RzZ2ZWeHVYRzRnSUNBZ0lDOHZJRTV2WkdVdWFuTWdMU0JoWTJObGMzTWdZVzRnVTFOTUlHVnVaSEJ2YVc1MElIZHBkR2dnYzJWc1ppQnphV2R1WldRZ1kyVnlkSE1nWm05eUlIUmxjM1JwYm1kOFpHVjJYRzRnSUNBZ0lHbG1JQ2doZDJsdUlDWW1JR2RzYjJKaGJFOXdkR2x2Ym5NdVlXeHNiM2RUWld4bVUybG5ibVZrVTFOTVEyVnlkQ2tnZTF4dUlDQWdJQ0FnSUNCd2NtOWpaWE56TG1WdWRpNU9UMFJGWDFSTVUxOVNSVXBGUTFSZlZVNUJWVlJJVDFKSldrVkVJRDBnSnpBbk95QWdJQ0FnSUNBZ1hHNGdJQ0FnSUgxY2JpQWdmU3hjYmx4dUlDQXZLaXBjYmlBZ0lDb2dRbWx1WkhNZ2RHaGxJSE5qYjNCbElHTnZiblJsZUhRZ1ptOXlJSFJvWlNCamIyNW1hV2QxY21Wa0lHQXVaVzVrS0NsZ0lHRnVaQ0JnTG1WeWNtOXlLQ2xnSUdWMlpXNTBJQ0FnSUZ4dUlDQWdLaUJvWVc1a2JHVnlJR05oYkd4aVlXTnJjeUJ2YmlCMGFHbHpJSEpsY1hWbGMzUXVYRzRnSUNBcVhHNGdJQ0FxSUVCdFpYUm9iMlFnWTNSNFhHNGdJQ0FxSUVCd1lYSmhiU0I3VDJKcVpXTjBmU0JqYjI1MFpYaDBJRlJvWlNCZ2RHaHBjMkFnYjJKcVpXTjBJR1p2Y2lCMGFHVWdZMjl1Wm1sbmRYSmxaQ0JnTG1WdVpDZ3BZQ0JoYm1SY2JpQWdJQ29nWUM1bGNuSnZjaWdwWUNCbGRtVnVkQ0JvWVc1a2JHVnljeUJ2YmlCMGFHbHpJSEpsY1hWbGMzUXVYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpJQ0FnWEc0Z0lDQXFMeUJjYmlBZ1kzUjRPaUJtZFc1amRHbHZiaUFvWTI5dWRHVjRkQ2tnZTF4dUlDQWdJSFJvYVhNdWMyTnZjR1VnUFNCamIyNTBaWGgwSUh4OElIUm9hWE03WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmU3hjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVM1Z3Y0hKbGMzTWdiM0lnY21GcGMyVWdaMnh2WW1Gc0lHVjJaVzUwY3lCbWIzSWdkR2hwY3lCZ2FXOWdJSEpsY1hWbGMzUXVYRzRnSUNBcVhHNGdJQ0FxSUVCdFpYUm9iMlFnWjJ4dlltRnNYRzRnSUNBcUlFQndZWEpoYlNCN1FtOXZiR1ZoYm4wZ2NtRnBjMlVnWUhSeWRXVmdJSFJ2SUhKaGFYTmxJR2RzYjJKaGJDQmxkbVZ1ZEhNc0lHQm1ZV3h6WldBZ2RHOGdjM1Z3Y21WemN5QmNiaUFnSUNvZ1pYWmxiblFnWm1seWFXNW5JR2RzYjJKaGJHeDVMbHh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQm1iM0lnWTJoaGFXNXBibWN1WEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDQXFMeUFnWEc0Z0lHZHNiMkpoYkRvZ1puVnVZM1JwYjI0b2NtRnBjMlVwSUh0Y2JpQWdJQ0IwYUdsekxtZHNiMkpoYkVWMmRITWdQU0JNWVc1bkxtbHpRbTl2YkdWaGJpaHlZV2x6WlNrZ1B5QnlZV2x6WlNBNklIUm9hWE11WjJ4dlltRnNSWFowY3p0Y2JseHVJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHVJQ0I5TENBZ1hHNWNiaUFnTHlvcVhHNGdJQ0FxSUZKbGRISnBaWFpsSUdSbGRHRnBiSE1nWVdKdmRYUWdkWE5sY2k1Y2JpQWdJQ29nSUNCY2JpQWdJQ29nUUcxbGRHaHZaQ0JoWW05MWRGeHVJQ0FnS2lCQWNtVjBkWEp1SUh0UFltcGxZM1I5SUdSbGRHRnBiSE1nWVdKdmRYUWdkWE5sY2lCdmRHaGxjbmRwWlhNZ1lHNTFiR3hnTGx4dUlDQWdLaUJBWVhCcElIQjFZbXhwWXlBZ0lGeHVJQ0FnS2k5Y2JpQWdZV0p2ZFhRNklHWjFibU4wYVc5dUtDa2dlMXh1SUNBZ0lIWmhjaUJ5WlhOd2IyNXpaU0E5SUhSb2FYTXVjbVZ4TG5KbGN6dGNibHh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbUZ3YVZzblkyRnNiQ2RkSUQwOVBTQW5MM0l2ZFhObGNpOXNiMmRwYmljZ0ppWWdjbVZ6Y0c5dWMyVWdQeUJjYmlBZ0lDQWdJQ0FnSUNBZ2NtVnpjRzl1YzJVdVltOWtlUzVuWlhRb0ozVnpaWEluS1NBNklHNTFiR3c3WEc0Z0lIMHNJQ0JjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVMmhoY21WeklIUm9aU0JqYjI5cmFXVnpJR1p5YjIwZ1lTQmthV1ptY21WdWRDQmdMbWx2S0NsZ0lHRm5aVzUwSUhSdklIQnlaWE5sY25abElITmxjM05wYjI0Z2MzUmhkR1ZjYmlBZ0lDb2dZV055YjNOeklHQjBhR2x6WUNCeVpYRjFaWE4wSUdGdVpDQmhiR3dnY21WeGRXVnpkSE1nWTJoaGFXNWxaQ0IwYnlCcGRDNWNiaUFnSUNwY2JpQWdJQ29nUUcxbGRHaHZaQ0J6YUdGeVpWeHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtY3VYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpJQ0FnWEc0Z0lDQXFMeUFnWEc0Z0lITm9ZWEpsT2lCbWRXNWpkR2x2YmlBb1kyOXZhMmxsY3lrZ2UxeHVJQ0FnSUdsbUlDaG5iRzlpWVd4UGNIUnBiMjV6TG5OMGFXTnJlU2tnZTF4dUlDQWdJQ0FnYVdZZ0tHZHNiMkpoYkU5d2RHbHZibk11WTI5dmEybGxjeWtnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbU52YjJ0cFpYTWdQU0JuYkc5aVlXeFBjSFJwYjI1ekxtTnZiMnRwWlhNdWMyeHBZMlVvTUNrN0lGeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLR052YjJ0cFpYTXBJSHNnWEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTVqYjI5cmFXVnpJRDBnWTI5dmEybGxjeTV6YkdsalpTZ3dLVHNnWEc0Z0lDQWdJQ0FnSUNBZ1oyeHZZbUZzVDNCMGFXOXVjeTV6WlhRb0oyTnZiMnRwWlhNbkxDQjBhR2x6TG1OdmIydHBaWE1wTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSFJvYVhNdVkyOXZhMmxsY3lBOUlDaGpiMjlyYVdWeklEOGdZMjl2YTJsbGN5NXpiR2xqWlNnd0tTQTZJSFJvYVhNdVkyOXZhMmxsY3lrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDBzWEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRkpsZEhWeWJuTWdkR2hsSUVoVVZGQWdZMjl2YTJsbElIQnlaWFpwYjNWemJIa2djMlZ1ZENCaWVTQjBhR1VnYzJWeWRtVnlJSGRwZEdnZ1UyVjBMVU52YjJ0cFpTNWNiaUFnSUNvZ1ZHaHBjeUIyWVd4MVpTQmpZVzRnWW1VZ2NHRnpjMlZrSUhSdklHQXVjMmhoY21Vb2NuVnpaWEl1WjJWMFEyOXZhMmxsY3lncEtXQWdiMllnWVNCa2FXWm1jbVZ1ZEZ4dUlDQWdLaUJnTG1sdktDbGdJR0ZuWlc1MElIUnZJSEJ5WlhObGNuWmxJSE5sYzNOcGIyNGdjM1JoZEdVZ1lXTnliM056SUhKbGNYVmxjM1J6TGx4dUlDQWdLbHh1SUNBZ0tpQkFiV1YwYUc5a0lHZGxkRU52YjJ0cFpYTmNiaUFnSUNvZ1FISmxkSFZ5YmlCN1FYSnlZWGw5SUZSb1pTQklWRlJRSUdOdmIydHBaU0J3Y21WMmFXOTFjMng1SUhObGJuUWdZbmtnZEdobElITmxjblpsY2lCM2FYUm9JRnh1SUNBZ0tpQlRaWFF0UTI5dmEybGxMbHh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZeUFnSUZ4dUlDQWdLaThnSUZ4dUlDQm5aWFJEYjI5cmFXVnpPaUJtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVkyOXZhMmxsY3p0Y2JpQWdmU3dnWEc1Y2JpQWdaR1ZzWVhrNklHWjFibU4wYVc5dUlDaHRjeWtnZTF4dUlDQWdJQzh2SUZSUFJFODZJSE4xY0hCdmNuUWdaR1ZzWVhsbFpDQnlaWEYxWlhOMGN5QmlZWE5sWkNCdmJpQnRjeUJtYjNJZ2JtOTNJSFJvYVhNZ2FYTWdhblZ6ZENCaElIQmhkWE5sTGx4dUlDQWdJSFJvYVhNdVpHVnNZWGxsWkNBOUlDRnBjMDVoVGlod1lYSnpaVVpzYjJGMEtHMXpLU2tnSmlZZ2FYTkdhVzVwZEdVb2JYTXBJRDhnYlhNZ09pQjBjblZsTzF4dVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDBzSUNBZ1hHNWNiaUFnTHlvcVhHNGdJQ0FxSUZWdWQybHVaQ0IwYUdVZ2NYVmxkV1VnWTJoaGFXNGdZMnhsWVhKcGJtY2djbVZ4ZFdWemRITWdkR2hoZENCdGFXZG9kQ0JvWVhabElHUmxiR0Y1Y3lCaGRIUmhZMmhsWkM1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQmtjbUZwYmx4dUlDQWdLaUJBY21WMGRYSnVJSHRRY205dGFYTmxmU0JCSUhCeWIyMXBjMlVnZDNKaGNIQnBibWNnZEdobElISmxjMjlzZFhScGIyNGdiMllnWldsMGFHVnlJRndpY21WemIyeDJaVndpSUc5eVhHNGdJQ0FxSUZ3aWNtVnFaV04wWENJZ1kyRnNiR0poWTJzdVhHNGdJQ0FxSUVCaGNHa2djSFZpYkdsaklDQWdYRzRnSUNBcUwxeHVJQ0JrY21GcGJqb2dablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJSFJvYVhNdVpHVnNZWGxsWkNBOUlHWmhiSE5sTzF4dUlDQWdJSFJvYVhNdWNTNW1iSFZ6YUNncE95QmNibHh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVJsWm1WeWNtVmtMbkJ5YjIxcGMyVTdYRzRnSUgwc0lDQWdYRzVjYmlBZ0x5b3FYRzRnSUNBcUlGUm9aU0JnTG5CeWIyMXBjMlVvS1dBZ2JXVjBhRzlrSUhKbGRIVnlibk1nWVNCa2VXNWhiV2xqWVd4c2VTQm5aVzVsY21GMFpXUWdVSEp2YldselpTQjBhR0YwSUdseklGeHVJQ0FnS2lCeVpYTnZiSFpsWkNCdmJtTmxJR0ZzYkNCRVpYQnNiM2xTSUdBdWFXOG9LV0FnY21WeGRXVnpkSE1nYUdGMlpTQmxibVJsWkM1Y2JpQWdJQ29nSUNCY2JpQWdJQ29nUUcxbGRHaHZaQ0J3Y205dGFYTmxYRzRnSUNBcUlFQnlaWFIxY200Z2UxQnliMjFwYzJWOUlFRWdjSEp2YldselpTQjNjbUZ3Y0dsdVp5QjBhR1VnY21WemIyeDFkR2x2YmlCdlppQmxhWFJvWlhJZ1hDSnlaWE52YkhabFhDSWdiM0pjYmlBZ0lDb2dYQ0p5WldwbFkzUmNJaUJqWVd4c1ltRmpheTVjYmlBZ0lDb2dRR0Z3YVNCd2RXSnNhV05jYmlBZ0lDb3ZJQ0FnSUNCY2JpQWdjSEp2YldselpUb2dablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJSFJvYVhNdVpXNWtLQ2s3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1a1pXWmxjbkpsWkM1d2NtOXRhWE5sTzF4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkJZbTl5ZENCMGFHVWdSR1Z3Ykc5NVVpQnlaWEYxWlhOMExseHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJR0ZpYjNKMElDQmNiaUFnSUNvZ1FISmxkSFZ5YmlCN1JHVndiRzk1VW4wZ1ptOXlJR05vWVdsdWFXNW5MbHh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZMXh1SUNBZ0tpOGdJRnh1SUNCaFltOXlkRG9nWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUhSb2FYTXVjbVZ4TG1GaWIzSjBLQ2s3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RoWW05eWRDY3BPMXh1SUNBZ0lIUm9hWE11WkdWbVpYSnlaV1F1Y21WcVpXTjBLSFJvYVhNdVgyaGhibVJzWlVWeWNtOXlLSHNnWEc0Z0lDQWdJQ0FnSUhOMFlYUjFjem9nSjJGaWIzSjBKeXhjYmlBZ0lDQWdJQ0FnZEdWNGREb2dKMFJsY0d4dmVWSWdjbVZ4ZFdWemRDQmhZbTl5ZEdWa0xpZGNiaUFnSUNCOUtTazdYRzVjYmlBZ0lDQnlaWFIxY200Z2RHaHBjenRjYmlBZ2ZTeGNibHh1SUM4cUtseHVJQ0FxSUZObGRDQjBhVzFsYjNWMElIUnZJR0J0YzJBdVhHNGdJQ3BjYmlBZ0tpQkFiV1YwYUc5a0lIUnBiV1Z2ZFhRZ0lGeHVJQ0FxSUVCd1lYSmhiU0I3VG5WdFltVnlmU0J0YzF4dUlDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1WjF4dUlDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDb3ZJQ0JjYmlBZ2RHbHRaVzkxZERvZ1puVnVZM1JwYjI0Z0tHMXpLU0I3WEc0Z0lDQWdkR2hwY3k1eVpYRXVkR2x0Wlc5MWRDaHRjeWs3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmU3hjYmx4dUlDOHFLbHh1SUNBcUlGUjFjbTRnYkc5bloybHVaeUJ2YmlCbWIzSWdkR2hsSUhOd1pXTnBabWxqSUhSeVlXNXpZV04wYVc5dUxseHVJQ0FxWEc0Z0lDb2dRRzFsZEdodlpDQnNiMmRjYmlBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQm1iM0lnWTJoaGFXNXBibWRjYmlBZ0tpQkFZWEJwSUhCMVlteHBZMXh1SUNBcUx5QmNiaUFnYkc5bk9pQm1kVzVqZEdsdmJpQW9iR1YyWld3cElIdGNiaUFnSUNCMGFHbHpMbXh2WjJkbGNpNXpaWFJNWlhabGJDaHNaWFpsYkNCOGZDQk1iMmRuWlhJdVJFVkNWVWNwTzF4dVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDBzWEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRVpwYkhSbGNuTWdjM1ZqWTJWemMyWjFiQ0J5WlhOd2IyNXpaWE1nZEc4Z1kyOXVkR0ZwYmlCdmJteDVJR0VnZEc5d0xXeGxkbVZzSUVSbGNHeHZlVklnUVZCSklGeHVJQ0FnS2lCeVpYTndiMjV6WlNCbGJuUnBkR2xsY3pwY2JpQWdJQ29nTFNBbmRYTmxjaWRjYmlBZ0lDb2dMU0FuY0hKdmFtVmpkQ2RjYmlBZ0lDb2dMU0FuZDI5eWEzTndZV05sSnlCY2JpQWdJQ29nTFNBblpYaGxZM1YwYVc5dUp5QmNiaUFnSUNvZ0xTQW5aR2x5WldOMGIzSjVKeUJjYmlBZ0lDb2dMU0FuY21Wd2IzTnBkRzl5ZVNkY2JpQWdJQ29nTFNBbmNHRmphMkZuWlhNbklGeHVJQ0FnS2lBZ0lGeHVJQ0FnS2lCQWJXVjBhRzlrSUdWdWRHbDBlVnh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQm1iM0lnWTJoaGFXNXBibWRjYmlBZ0lDb2dRR0Z3YVNCd2RXSnNhV05jYmlBZ0lDb3ZYRzRnSUdWdWRHbDBlVG9nWm5WdVkzUnBiMjRnS0dWdWRHbDBlU2tnZTF4dUlDQWdJSFJvYVhNdVpXNTBhWFJwWlhNZ1BTQjFkR2xzY3k1cGJrRnljbUY1S0ZSUFVFeEZWa1ZNWDBWT1ZFbFVTVVZUTENCbGJuUnBkSGtwTzF4dVhHNGdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJSDBzWEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRVJsWm1sdVpYTWdkR2hsSUhKbGNYVmxjM1FnWkdGMFlTQmlaV2x1WnlCelpXNTBJSFJ2SUdFZ1JHVndiRzk1VWlCQlVFa3VJRnh1SUNBZ0tseHVJQ0FnS2lCQWJXVjBhRzlrSUdSaGRHRmNiaUFnSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUdSaGRHRWdWR2hsSUc5aWFtVmpkQ0JzYVhSbGNtRnNJR052Ym1acFozVnlZWFJwYjI0Z2FHRnphQzRnWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1WjF4dUlDQWdLaUJBWVhCcElIQjFZbXhwWTF4dUlDQWdLaTljYmlBZ1pHRjBZVG9nWm5WdVkzUnBiMjRnS0dSaGRHRXBJSHRjYmlBZ0lDQmtZWFJoSUQwZ1pHRjBZU0I4ZkNCN2ZUc2dJQ0FnWEc1Y2JpQWdJQ0F2THlCeVpXMXZkbVVnWVc1NUlHbHViR2x1WldRZ2NtbHVjSFYwS0hNcElHRnVaQ0JoZEhSaFkyZ2dkR2hsYlNCMGJ5QjBhR1VnY21sdWNIVjBLSE1wSUhCeWIzQmxjblI1WEc0Z0lDQWdhV1lnS0dSaGRHRXVjbWx1Y0hWMElIeDhJR1JoZEdFdWNtbHVjSFYwY3lrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV5YVc1d2RYUW9aR0YwWVM1eWFXNXdkWFFwTzF4dUlDQWdJQ0FnZEdocGN5NXlhVzV3ZFhSektHUmhkR0V1Y21sdWNIVjBjeWs3WEc0Z0lDQWdmU0JjYmx4dUlDQWdJQzh2SUhKbGJXOTJaU0JoYm5rZ1lISmxjMlZ5ZG1Wa1lDQjJZV3gxWlhNZ2RHaGhkQ0JqYjNWc1pDQm9ZWFpsSUdKbFpXNGdjR0Z6YzJWa0lHSjVJRzFwYzNSaGEyVmNiaUFnSUNCMllYSWdRa3hCUTB0TVNWTlVJRDBnV3lkeWFXNXdkWFFuTENBbmNtbHVjSFYwY3ljc0lDZGZYMk52YjJ0cFpYTmZYeWRkTzF4dUlDQWdJRUpNUVVOTFRFbFRWQzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLSEJoY21GdEtTQjdJR1JsYkdWMFpTQmtZWFJoVzNCaGNtRnRYVHNnZlNrN0lDQmNibHh1SUNBZ0lIUm9hWE11Y0dGeVlXMXpJRDBnYldWeVoyVW9kR2hwY3k1d1lYSmhiWE1zSUdSaGRHRXBPMXh1WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE03WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFRjBkR0ZqYUdWeklHRWdabWxzWlNCMGJ5QmlaU0IxY0d4dllXUmxaQzRnWEc0Z0lDQXFYRzRnSUNBcUlFQnRaWFJvYjJRZ1lYUjBZV05vWEc0Z0lDQXFJRUJ3WVhKaGJTQjdSbWxzWlh4Q2JHOWlmSEJoZEdoOUlHWnBiR1VnVkdobElHWnBiR1VnZEc4Z1ltVWdZWFIwWVdOb1pXUWdabTl5SUdGdUlIVndiRzloWkM0Z1JtOXlJRnh1SUNBZ0tpQkNjbTkzYzJWeUlHVnVkbWx5YjI1dFpXNTBjeUIwYUdVZ1NGUk5URFVnUm1sc1pYeENiRzlpSUdseklIVnpaV1F1SUVadmNpQjBhR1VnVG05a1pTNXFjeUJjYmlBZ0lDb2daVzUyYVhKdmJtMWxiblFzSUdFZ1ptbHNaU0J3WVhSb0lHbHpJR0ZqWTJWd2RHVmtMbHh1SUNBZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1ptbHNaVzVoYldVZ0tHOXdkR2x2Ym1Gc0tTQjBhR1VnYm1GdFpTQnZaaUIwYUdVZ1ptbHNaU0IwYnlCaVpTQjFjR3h2WVdSbFpDNGdYRzRnSUNBcUlGUm9hWE1nYm1GdFpTQmtiMlZ6SUc1dmRDQm9ZWFpsSUhSdklHMWhkR05vSUhSb1pTQmhZM1IxWVd3Z2MyOTFjbU5sSUdacGJHVnVZVzFsTGx4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JtYjNJZ1kyaGhhVzVwYm1kY2JpQWdJQ29nUUdGd2FTQndkV0pzYVdOY2JpQWdJQ292WEc0Z0lHRjBkR0ZqYURvZ1puVnVZM1JwYjI0Z0tHWnBiR1VzSUdacGJHVnVZVzFsS1NCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11WVhCcExuVndiRzloWkNrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVtYVd4bElEMGdabWxzWlR0Y2JseHVJQ0FnSUNBZ0x5OGdiM0IwYVc5dVlXd2dabWxzWlc1aGJXVWdhR1Z5WlNCbWIzSWdZMjl1ZG1WdWFXVnVZMlZjYmlBZ0lDQWdJR2xtSUNobWFXeGxibUZ0WlNrZ2V5QjBhR2x6TG1SaGRHRW9JSHNnWm1sc1pXNWhiV1U2SUdacGJHVnVZVzFsSUgwZ0tUc2dmVnh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNCOUxGeHVYRzRnSUM4cUtseHVJQ0FnS2lCVGRYQndiM0owWldRZ2IyNXNlU0JwYmlCT2IyUmxMbXB6TENCMGFHbHpJRzFsZEdodlpDQjNiM0pyY3lCcGJpQmpiMjVxZFc1amRHbHZiaUIzYVhSb0lIUm9aU0JjYmlBZ0lDb2dZWFIwWVdOb0lHMWxkR2h2WkNCMGJ5QnBibVJwWTJGMFpTQjBhR0YwSUhSb1pTQm1hV3hsSUhOb2IzVnNaQ0JpWlNCeVpXRmtJR2x1SUdGeklHRWdjbVZoWkdGaWJHVWdYRzRnSUNBcUlITjBjbVZoYlNCa2RYSnBibWNnWVNCbWFXeGxJSFZ3Ykc5aFpDNWNiaUFnSUNwY2JpQWdJQ29nUUcxbGRHaHZaQ0J6ZEhKbFlXMWNiaUFnSUNvZ1FIQmhjbUZ0SUh0UFltcGxZM1I5SUc5d2RHbHZibk1nS0c5d2RHbHZibUZzS1NCMGFHVWdVbVZoWkdGaWJHVWdVM1J5WldGdElHOXdkR2x2Ym5NZ2FHRnphQzVjYmlBZ0lDb2dJR0JnWUZ4dUlDQWdLaUFnSUNCN0lHWnNZV2R6T2lBbmNpY3NYRzRnSUNBcUlDQWdJQ0FnWlc1amIyUnBibWM2SUc1MWJHd3NYRzRnSUNBcUlDQWdJQ0FnWm1RNklHNTFiR3dzWEc0Z0lDQXFJQ0FnSUNBZ2JXOWtaVG9nTURZMk5peGNiaUFnSUNvZ0lDQWdJQ0JoZFhSdlEyeHZjMlU2SUhSeWRXVmNiaUFnSUNvZ0lDQWdmVnh1SUNBZ0tpQmdZR0JjYmlBZ0lDb2dRSEpsZEhWeWJpQjdSR1Z3Ykc5NVVuMGdabTl5SUdOb1lXbHVhVzVuWEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDQXFMMXh1SUNCemRISmxZVzA2SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCMGFHbHpMbkp6ZEhKbFlXMGdQU0FvSVhkcGJpQW1KaUIwYUdsekxtRndhUzUxY0d4dllXUXBPeUF2TDI1dlpHVnFjeUJ2Ym14NVhHNWNiaUFnSUNCeVpYUjFjbTRnZEdocGN6dGNiaUFnZlN4Y2JseHVJQ0F2S2lwY2JpQWdJQ29nVkdobElHQm1hV3gwWlhJb3pyc3BZQ0J0WlhSb2IyUWdjbVZ0YjNabGN5QjBhR2x6SUVSbGNHeHZlVklnY21WeGRXVnpkQ0JtY205dElIUm9aU0J5WlhGMVpYTjBJR05vWVdsdVhHNGdJQ0FxSUdsbUlIUm9aU0J3Y205MmFXUmxaQ0JtZFc1amRHbHZiaUJrYjJWeklDcHViM1FxSUhCaGMzTWdkR2hsSUhSbGMzUWdhVzF3YkdWdFpXNTBaV1FnWW5rZ2FYUXVYRzRnSUNBcVhHNGdJQ0FxSUVWNFlXMXdiR1Z6T2x4dUlDQWdLbHh1SUNBZ0tpQmdZR0JjYmlBZ0lDb2dMeThnVW1WdGIzWmxJR1p5YjIwZ2RHaGxJSEpsY1hWbGMzUWdZMmhoYVc1Y2JpQWdJQ29nTG1acGJIUmxjaWhtZFc1amRHbHZiaWhoY21kektTQjdYRzRnSUNBcUlDQWdJSEpsZEhWeWJpQTFJRDRnTVRBN1hHNGdJQ0FxSUgwcFhHNGdJQ0FxWEc0Z0lDQXFJQzh2SUV0bFpYQWdhVzRnZEdobElISmxjWFZsYzNRZ1kyaGhhVzVjYmlBZ0lDb2dMbVpwYkhSbGNpaG1kVzVqZEdsdmJpaGhjbWR6S1NCN1hHNGdJQ0FxSUNBZ0lISmxkSFZ5YmlBeE1DQStJRFU3WEc0Z0lDQXFJSDBwSUNBZ1hHNGdJQ0FxSUdCZ1lGeHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJR1pwYkhSbGNseHVJQ0FnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNET3V5QjBhR1VnWTJGc2JHSmhZMnNnWm5WdVkzUnBiMjR1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1WjF4dUlDQWdLaUJBWVhCcElIQjFZbXhwWXlBZ0lGeHVJQ0FnS2k5Y2JpQWdabWxzZEdWeU9pQm1kVzVqZEdsdmJpaG1iaWtnZTF4dUlDQWdJR2xtSUNobWJpa2dlMXh1SUNBZ0lDQWdkR2hwY3k1cGIwWnBiSFJsY2lBOUlHWjFibU4wYVc5dUtIQnlaWFpCY21kektTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCaGNtZHpJRDBnZTMwc0lHdGxaWEE3WEc1Y2JpQWdJQ0FnSUNBZ0x5OGdZMjl3ZVNCdmRtVnlJSEJ5WlhacGIzVnpJR0Z5WjNWdFpXNTBjeUJoYm1RZ1ptbHNkR1Z5SUc5MWRDQnBiblJsY201aGJDQmZYMk52YjJ0cFpYTmZYeUJjYmlBZ0lDQWdJQ0FnWm05eUlDaDJZWElnYTJWNUlHbHVJSEJ5WlhaQmNtZHpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lHbG1JQ2hyWlhrZ0lUMDlJQ2RmWDJOdmIydHBaWE5mWHljcElIc2dYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHRnlaM05iYTJWNVhTQTlJSEJ5WlhaQmNtZHpXMnRsZVYwN1hHNGdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lHdGxaWEFnUFNCbWJpaGhjbWR6S1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUNoclpXVndJSHg4SUd0bFpYQWdQVDA5SUdaaGJITmxJRDhnYTJWbGNDQTZJSFJ5ZFdVcE8xeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnZEdocGN6dGNiaUFnZlN3Z0lGeHVJQ0JjYmlBZ0x5b3FYRzRnSUNBcUlFRmpkSE1nWVhNZ1lTQm1hVzVoYkd4NUlITjBZWFJsYldWdWRDQmhiR3h2ZDJsdVp5QjViM1VnZEc4Z1pYaGxZM1YwWlNCY0ltTnNaV0Z1ZFhCY0lpQjBlWEJsSUhSaGMydHpJRnh1SUNBZ0tpQnBiaUJoSUhKbGNYVmxjM1FnWTJoaGFXNHVJRWwwSUdGeWNtRnVaMlZ6SUdadmNpQmpiR1ZoYm5Wd0lIUnZJR0psSUdOaGJHeGxaQ3dnZDJsMGFDQnVieUJjYmlBZ0lDb2dZWEpuZFcxbGJuUnpMQ0IzYUdWdUlIUm9aU0JFWlhCc2IzbFNJSEpsY1hWbGMzUWdZMmhoYVc0Z2FYTWdaV2wwYUdWeUlHTnZiWEJzWlhSbGJIa2dablZzWm1sc2JHVmtJRnh1SUNBZ0tpQnZjaUJ5WldwbFkzUmxaQzVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxkR2h2WkNCbGJuTjFjbVZjYmlBZ0lDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGd6cnNnZEdobElHTmhiR3hpWVdOcklHWjFibU4wYVc5dUxseHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtZGNiaUFnSUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFnSUNvdklDQmNiaUFnWlc1emRYSmxPaUJtZFc1amRHbHZiaUFvWm00cElIdGNiaUFnSUNCMGFHbHpMbVJsWm1WeWNtVmtMbkJ5YjIxcGMyVXVaVzV6ZFhKbEtHWnVLVHRjYmx4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG1SbFptVnljbVZrTG5CeWIyMXBjMlU3WEc0Z0lIMHNYRzRnSUNBZ0lDQmNiaUFnTHlvcVhHNGdJQ0FxSUZSb1pTQm5aVzVsY21Gc0lHWmhhV3gxY21VZ1kyRnNiR0poWTJzdUlFbG1JR05oYkd4bFpDd2dZV3hzSUVSbGNHeHZlVklnWlhKeWIzSnpJR1p2Y2lCMGFHbHpJRnh1SUNBZ0tpQjBjbUZ1YzJGamRHbHZiaUIzYVd4c0lHSmxJSEpsZEhWeWJtVmtJR2hsY21VZ2QyaGxiaUJ5WVdselpXUXVYRzRnSUNBcVhHNGdJQ0FxSUVCdFpYUm9iMlFnWlhKeWIzSmNiaUFnSUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ3pyc2dkR2hsSUdOaGJHeGlZV05ySUdaMWJtTjBhVzl1TGx4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JtYjNJZ1kyaGhhVzVwYm1kY2JpQWdJQ29nUUdGd2FTQndkV0pzYVdOY2JpQWdJQ292WEc0Z0lHVnljbTl5T2lCbWRXNWpkR2x2YmlBb1ptNHBJSHRjYmlBZ0lDQjBhR2x6TG05dUtDZGxjbkp2Y2ljc0lHWnVLVHRjYmx4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TzF4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlRkSEpsWVcwZ2RHaGxJRVJsY0d4dmVWSWdjbVZ6Y0c5dWMyVWdhVzUwYnlCMGFHVWdjR2x3WlM0Z1NYUWdhWE1nYVcxd2IzSjBZVzUwSUhSdklHNXZkR1VnZEdoaGRDQnBaaUJjYmlBZ0lDb2dkR2hsSUdBdWNHbHdaU2dwWUNCdFpYUm9iMlFnYVhNZ2JtVjJaWElnWTJGc2JHVmtJSFJvWlNCeVpYRjFaWE4wSUhkcGJHd2dibTkwSUdKbElITmxiblF1WEc0Z0lDQXFYRzRnSUNBcUlGUm9aU0JnTG5CcGNHVW9LV0FnYldWMGFHOWtJSE5vYjNWc1pDQmlaU0JpWlNCMWMyVmtJR0Z6SUdGdUlHRnNkR1Z5Ym1GMGFYWmxJSFJ2SUdBdVpXNWtLQ2xnSUdGdVpDQmNiaUFnSUNvZ2JtVjJaWElnWVd4dmJtY2djMmxrWlNCdlppQnBkQzRnWUM1d2FYQmxLQ2xnSUdGdVpDQmdMbVZ1WkNncFlDQmhjbVVnWVc0Z1pXbDBhR1Z5TFc5eUxseHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJSEJwY0dWY2JpQWdJQ29nUUhCaGNtRnRJSHRUZEhKbFlXMTlJSE4wY21WaGJTQkJJR1JsYzNScGJtRjBhVzl1SUZOMGNtVmhiUzVjYmlBZ0lDb2dRSEpsZEhWeWJpQjdVM1J5WldGdGZTQlVhR1VnY0dGemMyVmtJR2x1SUdSbGMzUnBibUYwYVc5dUlITjBjbVZoYlNCMGJ5QmlaU0IxYzJWa0lHWnZjaUJoWkdScGRHbHZibUZzSUZ4dUlDQWdLaUJ3YVhCcGJtY3VYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpYRzRnSUNBcUwxeHVJQ0J3YVhCbE9pQm1kVzVqZEdsdmJpQW9aR1Z6ZENrZ2UxeHVJQ0FnSUhaaGNpQnhJQ0FnUFNCMGFHbHpMbkVzWEc0Z0lDQWdJQ0FnSUdGd2FTQTlJSFJvYVhNdVlYQnBPeUFnSUNBZ0lDQWdYRzVjYmlBZ0lDQnhMbUZrWkNobWRXNWpkR2x2YmloeVpYTndiMjV6WlVOb1lXbHVMQ0JsY25KdmNpd2djSEpsZGtGeVozTXBJSHNnSUNBZ1hHNGdJQ0FnSUNBdkx5QmljbUZyWlNCMGFHVWdZMkZzYkNCamFHRnBiaUJ2YmlCbGNuSnZjaUFnSUNBZ0lGeHVJQ0FnSUNBZ2FXWWdLR1Z5Y205eUtTQjdJQ0FnSUNBZ0lDQmNiaUFnSUNBZ0lDQWdkR2hwY3k1a1pXWmxjbkpsWkM1eVpXcGxZM1FvWlhKeWIzSXBPeUFnSUNBZ0lGeHVJQ0FnSUNBZ0lDQnhMbVpzZFhOb0tISmxjM0J2Ym5ObFEyaGhhVzRzSUdWeWNtOXlMQ0J3Y21WMlFYSm5jeWs3SUM4dklHUnlZV2x1SUhSb1pTQnhkV1YxWlZ4dUlDQWdJQ0FnSUNCMGFHbHpMbDlqYkdWaGNpZ3BPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQmNiaUFnSUNBZ0lIUm9hWE11WDNCeVpYQlNaWEYxWlhOMEtISmxjM0J2Ym5ObFEyaGhhVzRzSUhCeVpYWkJjbWR6S1R0Y2JseHVJQ0FnSUNBZ1RHOW5aMlZ5TG1sdVptOG9KM0JwY0dVb0tTY3NJR0Z3YVN3Z2RHaHBjeTV5WlhFcE8xeHVJQ0FnSUNBZ2RHaHBjeTVzYjJkblpYSXVhVzVtYnlnbmNHbHdaU2dwSnl3Z1lYQnBMQ0IwYUdsekxuSmxjU2s3SUNBZ1hHNWNiaUFnSUNBZ0lIWmhjaUJ6ZEhKbFlXMGdQU0IwYUdsekxuSmxjUzV3YVhCbEtHUmxjM1FwTzF4dUlDQWdJQ0FnY1M1NWFXVnNaQ2gwY25WbEtUdGNiaUFnSUNBZ0lITjBjbVZoYlM1dmJpZ25aWEp5YjNJbkxDQm1kVzVqZEdsdmJpQW9LU0I3SUgwcE95QWdJQ0JjYmlBZ0lDQWdJSE4wY21WaGJTNXZiaWduWlc1a0p5d2dablZ1WTNScGIyNG9LU0I3SUgwcE95QWdJQ0FnWEc0Z0lDQWdJQ0J6ZEhKbFlXMHViMjRvSjJSaGRHRW5MQ0JtZFc1amRHbHZiaWdwSUhzZ2ZTazdJQ0FnSUNBZ1hHNGdJQ0FnZlN3Z2RHaHBjeWs3WEc0Z0lGeHVJQ0FnSUdsbUlDaHhMbk5wZW1Vb0tTQThQU0F4S1NCN0lIRXVabXgxYzJnb0tUc2dmVnh1WEc0Z0lDQWdjbVYwZFhKdUlHUmxjM1E3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFbHVaR2xqWVhSbGN5QjBhR0YwSUhSb1pTQnlaWEYxWlhOMElHbHpJSEpsWVdSNUlIUnZJR0psSUhObGJuUWdkRzhnUkdWd2JHOTVVaTRnU1hRZ2FYTWdhVzF3YjNKMFlXNTBJRnh1SUNBZ0tpQjBieUJ1YjNSbElIUm9ZWFFnYVdZZ2RHaGxJR0F1Wlc1a0tDbGdJRzFsZEdodlpDQnBjeUJ1WlhabGNpQmpZV3hzWldRZ2RHaGxJSEpsY1hWbGMzUWdkMmxzYkNCdWIzUWdZbVZjYmlBZ0lDb2djMlZ1ZEM1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQmxibVJjYmlBZ0lDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGd6cnNnZEdobElHTmhiR3hpWVdOcklHWjFibU4wYVc5dUxseHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtY3VYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpYRzRnSUNBcUx5QmNiaUFnWlc1a09pQm1kVzVqZEdsdmJpQW9abTRwSUh0Y2JpQWdJQ0IyWVhJZ2MyVnNaaUFnSUNBZ1BTQjBhR2x6TEZ4dUlDQWdJQ0FnSUNCeElDQWdJQ0FnSUNBOUlIUm9hWE11Y1N4Y2JpQWdJQ0FnSUNBZ1lYQnBJQ0FnSUNBZ1BTQjBhR2x6TG1Gd2FTeGNiaUFnSUNBZ0lDQWdZWEpuY3lBZ0lDQWdQU0J1ZFd4c0xGeHVJQ0FnSUNBZ0lDQmxiblJwZEdsbGN5QTlJQ0IwYUdsekxtVnVkR2wwYVdWek8xeHVYRzRnSUNBZ2NTNWhaR1FvWm5WdVkzUnBiMjRvY21WemNHOXVjMlZEYUdGcGJpd2daWEp5YjNJc0lIQnlaWFpCY21kektTQjdYRzRnSUNBZ0lDQXZMeUJpY21WaGF5QjBhR1VnWTJGc2JDQmphR0ZwYmlCdmJpQmxjbkp2Y2lBZ0lDQWdJRnh1SUNBZ0lDQWdhV1lnS0dWeWNtOXlLU0I3SUNBZ0lDQWdJQ0JjYmlBZ0lDQWdJQ0FnZEdocGN5NWtaV1psY25KbFpDNXlaV3BsWTNRb1pYSnliM0lwT3lBZ0lDQWdJQ0FnWEc0Z0lDQWdJQ0FnSUhFdVpteDFjMmdvY21WemNHOXVjMlZEYUdGcGJpd2daWEp5YjNJc0lIQnlaWFpCY21kektUc2dMeThnWkhKaGFXNGdkR2hsSUhGMVpYVmxYRzRnSUNBZ0lDQWdJSFJvYVhNdVgyTnNaV0Z5S0NrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0x5OWNiaUFnSUNBZ0lHbG1JQ2doZEdocGN5NXBiMFpwYkhSbGNpaHdjbVYyUVhKbmN5a3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIRXVjMmw2WlNncElEMDlQU0F3S1NCN0lGeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdVpHVm1aWEp5WldRdWNtVnpiMngyWlNoeVpYTndiMjV6WlVOb1lXbHVJSHg4SUhCeVpYWkJjbWR6S1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSEV1Wm14MWMyZ29jbVZ6Y0c5dWMyVkRhR0ZwYml3Z1pYSnliM0lzSUhCeVpYWkJjbWR6S1RzZ0x5OGdaSEpoYVc0Z2RHaGxJSEYxWlhWbFhHNGdJQ0FnSUNBZ0lIUm9hWE11WDJOc1pXRnlLQ2s3WEc0Z0lDQWdJQ0FnSUhKbGRIVnlianRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJRnh1SUNBZ0lDQWdkR2hwY3k1ZmNISmxjRkpsY1hWbGMzUW9jbVZ6Y0c5dWMyVkRhR0ZwYml3Z2NISmxka0Z5WjNNcE8xeHVYRzRnSUNBZ0lDQk1iMmRuWlhJdWFXNW1ieWduYVc4b0tTY3NJR0Z3YVN3Z2RHaHBjeTV5WlhFcE8xeHVJQ0FnSUNBZ2RHaHBjeTVzYjJkblpYSXVhVzVtYnlnbmFXOG9LU2NzSUdGd2FTd2dkR2hwY3k1eVpYRXBPeUFnSUNCY2JseHVJQ0FnSUNBZ0x5OGdjMlZ1WkNCdVpYaDBJSEpsY1hWbGMzUmNiaUFnSUNBZ0lIUm9hWE11Y21WeExtVnVaQ2htZFc1amRHbHZiaWh5WlhNcElIdGNiaUFnSUNBZ0lDQWdjMlZzWmk1emFHRnlaU2h6Wld4bUxtTnZiMnRwWlhNZ2ZId2djbVZ6TG1obFlXUmxjbk5iSjNObGRDMWpiMjlyYVdVblhTazdJQ0FnSUNBZ0lDQWdYRzVjYmlBZ0lDQWdJQ0FnTHk4Z0xTMGdiRzluSUdOdmIydHBaWE1nWVdOeWIzTnpJSEpsY1hWbGMzUnpJQzB0WEc0Z0lDQWdJQ0FnSUdsbUlDaHpaV3htTG1OdmIydHBaWE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQk1iMmRuWlhJdWFXNW1ieWduWTI5dmEybGxjeWNzSUdGd2FTd2djMlZzWmk1amIyOXJhV1Z6S1RzZ1hHNGdJQ0FnSUNBZ0lDQWdjMlZzWmk1c2IyZG5aWEl1YVc1bWJ5Z25ZMjl2YTJsbGN5Y3NJR0Z3YVN3Z2MyVnNaaTVqYjI5cmFXVnpLVHNnWEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQmxjbkp2Y2lBOUlITmxiR1l1WDJoaGJtUnNaVVZ5Y205eUtISmxjeWs3WEc0Z0lDQWdJQ0FnSUhaaGNpQmtjbVZ6SUQwZ0tISmxjeTVpYjJSNUlDWW1JSEpsY3k1aWIyUjVMbVJsY0d4dmVYSWdQeUJ5WlhNdVltOWtlU0E2SUhKbGN5azdJQ0FnSUNBZ0lDQWdJQ0FnSUZ4dUlDQWdJQ0FnWEc0Z0lDQWdJQ0FnSUhObGJHWXVhVzV3ZFhSeklEMGdXMTA3WEc0Z0lDQWdJQ0FnSUhObGJHWXViM1YwY0hWMGN5QTlJRnRkTzF4dVhHNGdJQ0FnSUNBZ0lHbG1JQ2doWlhKeWIzSXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0x5OGdMUzBnVEc5bklHZHNiMkpoYkNBcklIUnlZVzV6WVdOMGFXOXVJR3h2WnlBdExWeHVJQ0FnSUNBZ0lDQWdJQ0JNYjJkblpYSXVhVzVtYnlnblpXNWtLQ2tuTENCaGNHa3NJR1J5WlhNc0lISmxjeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lITmxiR1l1Ykc5bloyVnlMbWx1Wm04b0oyVnVaQ2dwSnl3Z1lYQnBMQ0JrY21WekxDQnlaWE1wTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQzh2SUMwdElIZGhiR3NnY21WemNHOXVjMlVnWm05eUlIUnZjQzFzWlhabGJDQmxiblJwZEhrZ2NtVnpjRzl1YzJVZ1lYTnphV2R1YldWdWRDQXRMU0FnSUNBZ0lDQWdYRzRnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxiblJwZEdsbGN5a2dleUJrY21WeklEMGdaSEpsY3k1a1pYQnNiM2x5TG5KbGMzQnZibk5sVzJWdWRHbDBhV1Z6WFNCOGZDQmtjbVZ6T3lCOVhHNWNiaUFnSUNBZ0lDQWdJQ0FnWkhKbGN5NW5aWFFnUFNCbWRXNWpkR2x2YmloclpYa3BJSHNnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjFkR2xzY3k1blpYUW9aSEpsY3k1a1pYQnNiM2x5TG5KbGMzQnZibk5sTENCclpYa3BPeUJjYmlBZ0lDQWdJQ0FnSUNBZ2ZUdGNibHh1SUNBZ0lDQWdJQ0FnSUNCa2NtVnpMbmR2Y210emNHRmpaU0E5SUdaMWJtTjBhVzl1S0c1aGJXVXBJSHNnWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjFkR2xzY3k1M2IzSnJjM0JoWTJVb1pISmxjeTVrWlhCc2IzbHlMbkpsYzNCdmJuTmxMQ0J1WVcxbEtUc2dYRzRnSUNBZ0lDQWdJQ0FnSUgwN1hHNWNiaUFnSUNBZ0lDQWdJQ0FnTHk4Z0xTMGdZMkZzYkdKaFkyc2dMUzFjYmlBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1p1S1NCN0lHRnlaM01nUFNCbWJpNWhjSEJzZVNoelpXeG1Mbk5qYjNCbExDQmJaSEpsY3l3Z2NtVnpjRzl1YzJWRGFHRnBibDBwTzMxY2JseHVJQ0FnSUNBZ0lDQWdJQ0F2THlBdExTQnViM1JwWm5rZ2RHaGhkQ0IwYUdVZ2NYVmxkV1VnYUdGeklHSmxaVzRnWkhKaGFXNWxaQzR1TGlBdExWeHVJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2NTNXphWHBsS0NrZ1BUMDlJREFwSUhzZ1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnYzJWc1ppNWZZMnhsWVhJb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNCelpXeG1MbVJsWm1WeWNtVmtMbkpsYzI5c2RtVW9jbVZ6Y0c5dWMyVkRhR0ZwYmlCOGZDQmtjbVZ6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdmU0FnSUNBZ0lDQWdJQ0JjYmx4dUlDQWdJQ0FnSUNBZ0lDQXZMeUF0TFNCcGJtTnNkV1JsSUdOdmIydHBaWE1nYVc0Z2JtVjRkQ0J5WlhGMVpYTjBJR2x1SUhSb1pTQnhkV1YxWlNBdExWeHVJQ0FnSUNBZ0lDQWdJQ0JoY21keklEMGdiV1Z5WjJVb1lYSm5jeXdnZXlCZlgyTnZiMnRwWlhOZlh6b2djMlZzWmk1amIyOXJhV1Z6SUgwcE95QWdJQ0FnSUNBZ0lDQmNiaUFnSUNBZ0lDQWdmU0FnSUNBZ0lDQWdYRzVjYmlBZ0lDQWdJQ0FnY1M1NWFXVnNaQ2htWVd4elpTazdYRzRnSUNBZ0lDQWdJSEV1Wm14MWMyZ29aSEpsY3l3Z1pYSnliM0lzSUdGeVozTXBPeUF2THlCd1lYTnpJSEpsYzNWc2RIeGxjbkp2Y254aGNtZHpJSFJ2SUc1bGVIUWdYRzRnSUNBZ0lDQjlLVHRjYmx4dUlDQWdJQ0FnY1M1NWFXVnNaQ2gwY25WbEtUdGNiaUFnSUNCOUxDQjBhR2x6TENCMGFHbHpMbVJsYkdGNVpXUXBPMXh1SUNCY2JpQWdJQ0JwWmlBb0lYUm9hWE11WkdWc1lYbGxaQ0FtSmlCeExuTnBlbVVvS1NBOFBTQXhLU0I3SUhFdVpteDFjMmdvS1RzZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUgwc0lGeHVYRzRnSUM4cUtpQmNiaUFnSUNvZ1FXUmtJR0Z1SUdGa1pHbDBhVzl1WVd3Z1NVOGdjbVZ4ZFdWemRDQjBieUIwYUdVZ1pYaHphWE4wYVc1bklITmxjWFZsYm5ScFlXd2djbVZ4ZFdWemRDQmphR0ZwYmk1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQnBiMXh1SUNBZ0tpQkFjR0Z5WVcwZ2UxTjBjbWx1WjMwZ1lYQnBJRTl1WlNCdlppQjBhR1VnYzNWd2NHOXlkR1ZrSUVSbGNHeHZlVklnUVZCSmN5NWNiaUFnSUNvZ1FISmxkSFZ5YmlCN1JHVndiRzk1VW4wZ1ptOXlJR05vWVdsdWFXNW5MbHh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZMXh1SUNBZ0tpOGdJQ0JjYmlBZ2FXODZJR1oxYm1OMGFXOXVJQ2hoY0drcElIc2dJQ0FnWEc0Z0lDQWdjbVYwZFhKdUlFUmxjR3h2ZVZJdWJtVjNLR0Z3YVN3Z2V5QmNiaUFnSUNBZ0lHTnZiMnRwWlhNNklIUm9hWE11WTI5dmEybGxjeXdnWEc0Z0lDQWdJQ0J4ZFdWMVpUb2dkR2hwY3k1eExDQmNiaUFnSUNBZ0lHUmxabVZ5Y21Wa09pQjBhR2x6TG1SbFptVnljbVZrWEc0Z0lDQWdmU2s3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FJRnh1SUNBZ0tpQkRiMjUyWlc1cFpXNWpaU0JtZFc1amRHbHZiaUJtYjNJZ1lXUmthVzVuSUdGdUlHRmtaR2wwYVc5dVlXd2djMk55YVhCMElHVjRaV04xZEdsdmJpQjBieUIwYUdVZ1hHNGdJQ0FxSUdWNGMybHpkR2x1WnlCelpYRjFaVzUwYVdGc0lISmxjWFZsYzNRZ1kyaGhhVzR1WEc0Z0lDQXFYRzRnSUNBcUlFQnRaWFJvYjJRZ2MyTnlhWEIwWEc0Z0lDQXFJRUJ3WVhKaGJTQjdRWEpuZFcxbGJuUnpmU0JCY21kMWJXVnVkSE1nZEc4Z1pHVm1hVzVsSUhSb1pTQm1kV3hzZVNCeGRXRnNhV1pwWldRZ2MyTnlhWEIwSUdadmNpQmNiaUFnSUNvZ1pYaGxZM1YwYVc5dUxseHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtY3VJQ0FnWEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDQXFMMXh1SUNCelkzSnBjSFE2SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUNCMllYSWdZWEpuY3lBOUlIVjBhV3h6TG5OcFoyNWhkSFZ5WlNoaGNtZDFiV1Z1ZEhNcExGeHVJQ0FnSUNBZ0lDQWdiM0IwY3lBOUlHRnlaM011YjNCMGN5eGNiaUFnSUNBZ0lDQWdJR0Z3YVNBZ1BTQmhjbWR6TG1Gd2FTeGNiaUFnSUNBZ0lDQWdJR3hwYm1zZ1BTQjdJRnh1SUNBZ0lDQWdJQ0FnSUdOdmIydHBaWE02SUhSb2FYTXVZMjl2YTJsbGN5d2dYRzRnSUNBZ0lDQWdJQ0FnY1hWbGRXVTZJSFJvYVhNdWNTd2dYRzRnSUNBZ0lDQWdJQ0FnWkdWbVpYSnlaV1E2SUhSb2FYTXVaR1ZtWlhKeVpXUmNiaUFnSUNBZ0lDQWdmVHNnSUZ4dVhHNGdJQ0FnTHk4Z1kyOXVkbVZ1YVdWdVkyVWdMU0JwWmlCMGFHVWdjSEp2YW1WamRDQnBjeUJoSUdKdmIyeGxiaUJnZEhKMVpXQWdjbUYwYUdWeUlIUm9ZVzRnWVNCd2FXUXNJR1pwY25OMFhHNGdJQ0FnTHk4Z1kzSmxZWFJsSUdFZ2JtVjNJSEJ5YjJwbFkzUWdZVzVrSUhSb1pXNGdjSEpsY0dGeVpTQjBhR1VnY0hKdmFtVmpkQ0JoY0drZ1kyRnNiQ0IwYnlCbGVHVmpkWFJsWEc0Z0lDQWdhV1lnS0dGeVozTXVZM0psWVhSbEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1JHVndiRzk1VWk1dVpYY29KeTl5TDNCeWIycGxZM1F2WTNKbFlYUmxKeXdnYkdsdWF5bGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDNWxibVFvWm5WdVkzUnBiMjRvY21WektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdleUJ3Y205cVpXTjBPaUJ5WlhNdVoyVjBLQ2R3Y205cVpXTjBKeWt1Y0hKdmFtVmpkQ0I5TzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdWFXOG9ZWEJwS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG1SaGRHRW9iM0IwY3lrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQkVaWEJzYjNsU0xtNWxkeWhoY0drc0lHeHBibXNwTG1SaGRHRW9iM0IwY3lrN1hHNGdJQ0FnZlNBZ0lDQmNiaUFnZlN4Y2JseHVJQ0F2S2lvZ1hHNGdJQ0FxSUVOdmJuWmxibWxsYm1ObElHWjFibU4wYVc5dUlHWnZjaUJoWkdScGJtY2dZVzRnWVdSa2FYUnBiMjVoYkNCeVpYQnZjMmwwYjNKNUxXMWhibUZuWldRZ2MyaGxiR3dnWEc0Z0lDQXFJSE5qY21sd2RDQmxlR1ZqZFhScGIyNGdkRzhnZEdobElHVjRjMmx6ZEdsdVp5QnpaWEYxWlc1MGFXRnNJSEpsY1hWbGMzUWdZMmhoYVc0dVhHNGdJQ0FxWEc0Z0lDQXFJRlJvYVhNZ1kyRnNiQ0JsZUdWamRYUmxjeUJ5WlhCdmMybDBiM0o1TFcxaGJtRm5aV1FnYzJobGJHd2djMk55YVhCMGN5QXVjMmdzSUM1amMyZ3NJQzVpWVhOb0xDQXVZbUYwSUZ4dUlDQWdLaUJ2YmlCMGFHVWdSR1Z3Ykc5NVVpQnpaWEoyWlhJdUlFUjFaU0IwYnlCMGFHVWdjM0JsWTJsaGJDQnpaV04xY21sMGVTQmpiMjVqWlhKdWN5QmhjM052WTJsaGRHVmtJSGRwZEdnZ1hHNGdJQ0FxSUdWNFkzVjBhVzVuSUhOb1pXeHNJSE5qY21sd2RITWdiMjRnZEdobElFUmxjR3h2ZVZJZ2MyVnlkbVZ5TENCdmJteDVJSE5vWld4c0lITmpjbWx3ZEhNZ2IzZHVaV1FnWW5rZ1hHNGdJQ0FxSUY5QlJFMUpUa2xUVkZKQlZFOVNYeUIxYzJWeWN5QmpZVzRnWW1VZ1pYaGxZM1YwWldRZ2IyNGdkR2hwY3lCQlVFa2dZMkZzYkM0Z1FXNTVJR0YwZEdWdGNIUWdkRzhnWEc0Z0lDQXFJR1Y0WldOMWRHVWdZU0J6YUdWc2JDQnpZM0pwY0hRZ2MzUnZjbVZrSUdsdUlIUm9aU0J5WlhCdmMybDBiM0o1SUhSb1lYUWdhWE1nYm05MElHOTNibVZrSUdKNUlHRnVJRnh1SUNBZ0tpQmZRVVJOU1U1SlUxUlNRVlJQVWw4Z2RYTmxjaUIzYVd4c0lHSmxJSEpsYW1WamRHVmtMbHh1SUNBZ0tseHVJQ0FnS2lCVWJ5QmxlR1ZqZFhSbElHRWdjbVZ3YjNOcGRHOXllUzF0WVc1aFoyVmtJSE5vWld4c0lITmpjbWx3ZENCMGFHVWdZMkZzYkdWeUlHMTFjM1FnY0hKdmRtbGtaU0JjYmlBZ0lDb2djR0Z5WVcxbGRHVnlJSFpoYkhWbGN5Qm1iM0lnWDJGMWRHaHZjbDhzSUY5a2FYSmxZM1J2Y25sZkxDQmZabWxzWlc1aGJXVmZMaUJVYUdseklHTmhiaUJpWlZ4dUlDQWdLaUJoWTJocFpYWmxaQ0JpZVNCd2NtOTJhV1JwYm1jZ1lTQm1kV3hzZVNCeGRXRnNhV1pwWldRZ2MyaGxiR3dnYzJOeWFYQjBJRnh1SUNBZ0tpQmdMenhoZFhSb2IzSStMenhrYVhKbFkzUnZjbmsrTHp4bWFXeGxibUZ0WlQ1Z0xDQm1iM0lnWlhoaGJYQnNaVHBjYmlBZ0lDcGNiaUFnSUNvZ0lHQmdZRnh1SUNBZ0tpQWdMbk5vWld4c0tDY3ZZV1J0YVc0dlpYaDBaWEp1WVd3NmNIVmliR2xqT21Ga2JXbHVMMlZqYUc4dWMyZ25MQ0FuWldOb2J5NXphQ0JoY21keklIUnZJSEJoYzNNdUp5bGNiaUFnSUNvZ0lHQmdZRnh1SUNBZ0tseHVJQ0FnS2lCQWJXVjBhRzlrSUhOb1pXeHNYRzRnSUNBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCbWFXeGxjR0YwYUNCMGJ5QmtaV1pwYm1VZ2RHaGxJR1oxYkd4NUlIRjFZV3hwWm1sbFpDQnphR1ZzYkNCelkzSnBjSFFnWm05eVhHNGdJQ0FxSUdWNFpXTjFkR2x2Ymk0Z1hHNGdJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JoY21keklDaHZjSFJwYjI1aGJDa2dZWEpuZFcxbGJuUnpJSFJ2SUdKbElIQmhjM05sWkNCcGJuUnZJSFJvWlNCemFHVnNiQ0JjYmlBZ0lDb2djMk55YVhCMElHOXVJR1Y0WldOMWRHbHZiaTVjYmlBZ0lDb2dRSEpsZEhWeWJpQjdSR1Z3Ykc5NVVuMGdabTl5SUdOb1lXbHVhVzVuTGlBZ0lGeHVJQ0FnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ0FnS2k5Y2JpQWdjMmhsYkd3NklHWjFibU4wYVc5dUtIQmhkR2dzSUdGeVozTXBJSHNnSUNCY2JpQWdJQ0IyWVhJZ2JHbHVheUE5SUhzZ1hHNGdJQ0FnSUNBZ0lDQWdZMjl2YTJsbGN6b2dkR2hwY3k1amIyOXJhV1Z6TENCY2JpQWdJQ0FnSUNBZ0lDQnhkV1YxWlRvZ2RHaHBjeTV4TENCY2JpQWdJQ0FnSUNBZ0lDQmtaV1psY25KbFpEb2dkR2hwY3k1a1pXWmxjbkpsWkZ4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQjBiMnRsYm5NZ1BTQk1ZVzVuTG1selUzUnlhVzVuS0hCaGRHZ3BJRDhnY0dGMGFDNXpjR3hwZENnblhGd3ZKeWtnT2lCYlhUdGNibHh1SUNBZ0lDOHZJR2hoYm1Sc1pTQmliM1JvT2lCZ0wyRjFkR2h2Y2k5a2FYSmxZM1J2Y25rdlptbHNaVzVoYldWZ0lDWWdZR0YxZEdodmNpOWthWEpsWTNSdmNua3ZabWxzWlc1aGJXVmdYRzRnSUNBZ2FXWWdLSFJ2YTJWdWN5NXNaVzVuZEdnZ1BpQXpLU0I3SUhSdmEyVnVjeUE5SUhSdmEyVnVjeTV6YkdsalpTZ3hLVHNnZlZ4dVhHNGdJQ0FnY21WMGRYSnVJRVJsY0d4dmVWSXVibVYzS0NjdmNpOXlaWEJ2YzJsMGIzSjVMM05vWld4c0wyVjRaV04xZEdVbkxDQnNhVzVyS1M1a1lYUmhLSHRjYmlBZ0lDQWdJR0YxZEdodmNqb2dkRzlyWlc1eld6QmRMRnh1SUNBZ0lDQWdaR2x5WldOMGIzSjVPaUIwYjJ0bGJuTmJNVjBzWEc0Z0lDQWdJQ0JtYVd4bGJtRnRaVG9nZEc5clpXNXpXekpkTEZ4dUlDQWdJQ0FnWVhKbmN6b2dZWEpuYzF4dUlDQWdJSDBwTzF4dUlDQjlMRnh1WEc0Z0lDOHFLaUJjYmlBZ0lDb2dRMjl1ZG1WdWFXVnVZMlVnWm5WdVkzUnBiMjRnWm05eUlHVjRaV04xZEdsdVp5QmhJR0pzYjJOcklHOW1JRklnWTI5a1pTQnZiaUIwYUdVZ1VpQnpaWE56YVc5dUxseHVYRzRnSUNBcUlFVjRZVzF3YkdVNlhHNGdJQ0FxSUNCZ1lHQmNiaUFnSUNvZ0lDNWpiMlJsS0NkNFBDMDFKeWxjYmlBZ0lDb2dJQzh2SUMwdElHOXlJQzB0WEc0Z0lDQXFJQ0F1WTI5a1pTZ25lRHd0TlNjc0lIQnliMnBsWTNSSlpDbGNiaUFnSUNvZ0lHQmdZRnh1SUNBZ0tpQWdJRnh1SUNBZ0tpQkFiV1YwYUc5a0lHTnZaR1ZjYmlBZ0lDb2dRSEJoY21GdElIdFRkSEpwYm1kOUlISWdMU0JVYUdVZ1lteHZZMnNnYjJZZ1VpQmpiMlJsSUhSdklHVjRaV04xZEdVdVhHNGdJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J3Y205cVpXTjBJQzBnS0c5d2RHbHZibUZzS1NCcFppQnZiV2wwZEdWa0lHRWdibVYzSUhCeWIycGxZM1FnZDJsc2JDQm1hWEp6ZENCaVpTQmNiaUFnSUNvZ1kzSmxZWFJsWkNCaGJtUWdkWE5sWkN3Z2IzUm9aWEozYVhObElHbDBJSGRwYkd3Z1pYaGxZM1YwWlNCdmJpQjBhR1VnVWlCelpYTnphVzl1SUdsa1pXNTBhV1pwWldRZ1lua2dYRzRnSUNBcUlIUm9hWE1nWUhCeWIycGxZM1JnTGx4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JtYjNJZ1kyaGhhVzVwYm1jdUlDQWdYRzRnSUNBcUlFQmhjR2tnY0hWaWJHbGpYRzRnSUNBcUwxeHVJQ0JqYjJSbE9pQm1kVzVqZEdsdmJpaHlMQ0J3Y205cVpXTjBLU0I3WEc0Z0lDQWdJSFpoY2lCc2FXNXJJRDBnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJR052YjJ0cFpYTTZJSFJvYVhNdVkyOXZhMmxsY3l4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0J4ZFdWMVpUb2dkR2hwY3k1eExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUdSbFptVnljbVZrT2lCMGFHbHpMbVJsWm1WeWNtVmtYRzRnSUNBZ0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnSUNBZ1lYQnBJRDBnSnk5eUwzQnliMnBsWTNRdlpYaGxZM1YwWlM5amIyUmxKenRjYmx4dUlDQWdJQ0JwWmlBb0lYQnliMnBsWTNRcElIdGNiaUFnSUNBZ0lDQWdJSEpsZEhWeWJpQkVaWEJzYjNsU0xtNWxkeWduTDNJdmNISnZhbVZqZEM5amNtVmhkR1VuTENCc2FXNXJLVnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDNWxibVFvWm5WdVkzUnBiMjRvY21WektTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjdJSEJ5YjJwbFkzUTZJSEpsY3k1blpYUW9KM0J5YjJwbFkzUW5LUzV3Y205cVpXTjBJSDA3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdmU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQXVhVzhvWVhCcEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUM1a1lYUmhLSHNnWTI5a1pUb2djaUI5S1R0Y2JpQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUhKbGRIVnliaUJFWlhCc2IzbFNMbTVsZHloaGNHa3NJR3hwYm1zcExtUmhkR0VvZXlCamIyUmxPaUJ5TENCd2NtOXFaV04wT2lCd2NtOXFaV04wSUgwcE8xeHVJQ0FnSUNCOVhHNGdJSDBzWEc0Z0lGeHVJQ0F2S2lvZ1hHNGdJQ0FxSUZKbGJHVmhjMlVnWVc1NUlISmxjMmxrZFdGc0lIQnliMnBsWTNRZ2NtVnpiM1Z5WTJWeklHRnpjMjlqYVdGMFpXUWdkMmwwYUNCMGFHVWdZWEJ3YkdsallYUnBiMjRnWEc0Z0lDQXFJR2x1YzNSaGJtTmxJSGRvWlc1bGRtVnlJR0VnWTJ4cFpXNTBJR0Z3Y0d4cFkyRjBhVzl1SUhSbGNtMXBibUYwWlhNdUlGUm9hWE1nYVc1amJIVmtaWE1nWTJ4dmMybHVaeUJjYmlBZ0lDb2dZVzU1SUhOMWNIQnNhV1ZrSUhCeWIycGxZM1J6SUdSdmQyNGdZVzVrSUd4dloyZHBibWNnYjNWMExseHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJSEpsYkdWaGMyVmNiaUFnSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ4UVhKeVlYbDlJSEJ5YjJwbFkzUnpJRlJvWlNCd2NtOXFaV04wSUc5eUlHeHBjM1FnYjJZZ2NISnZhbVZqZEhNZ2RHOGdZMnh2YzJVdVhHNGdJQ0FxSUVCd1lYSmhiU0I3UW05dmJHVmhibjBnWVhWMGFDQW9iM0IwYVc5dVlXd3BJSFJ2SUhKbGJXRnBiaUJoZFhSb1pXNTBhV05oZEdWa0xseHVJQ0FnS2lCQWNtVjBkWEp1SUh0RVpYQnNiM2xTZlNCbWIzSWdZMmhoYVc1cGJtY3VJQ0FnWEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqWEc0Z0lDQXFMMXh1SUNCeVpXeGxZWE5sT2lCbWRXNWpkR2x2Ymlod2NtOXFaV04wY3l3Z1lYVjBhQ2tnZTF4dUlDQWdJQ0J3Y205cVpXTjBjeUE5SUV4aGJtY3VhWE5CY25KaGVTaHdjbTlxWldOMGN5a2dQeUJ3Y205cVpXTjBjeUE2SUZ0d2NtOXFaV04wYzEwN1hHNWNiaUFnSUNBZ2RtRnlJSE5sYkdZZ0lDQWdJRDBnZEdocGN5eGNiaUFnSUNBZ0lDQWdJR1JsWm1WeWNtVmtJRDBnUkNncExGeHVJQ0FnSUNBZ0lDQWdaVzF3ZEhrZ0lDQWdQU0FoY0hKdmFtVmpkSE1nZkh3Z0lYQnliMnBsWTNSeld6QmRMRnh1SUNBZ0lDQWdJQ0FnWTI5MWJuUWdJQ0FnUFNBd0xGeHVJQ0FnSUNBZ0lDQWdiR0Z6ZENBZ0lDQWdQU0FoWlcxd2RIa2dQeUJ3Y205cVpXTjBjeTVzWlc1bmRHZ2dMU0F4SURvZ1kyOTFiblFzWEc0Z0lDQWdJQ0FnSUNCamIyOXJhV1Z6SUNBOUlIUm9hWE11WjJWMFEyOXZhMmxsY3lncE95QWdJQ0FnSUNBZ0lDQWdYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQnNiMmR2ZFhRb2FXNWtaWGdwSUh0Y2JpQWdJQ0FnSUdsbUlDaHBibVJsZUNBOVBUMGdiR0Z6ZENrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVdGMWRHZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNCRVpYQnNiM2xTTG01bGR5Z25MM0l2ZFhObGNpOXNiMmR2ZFhRbktWeHVJQ0FnSUNBZ0lDQWdJQzV6YUdGeVpTaGpiMjlyYVdWektWeHVJQ0FnSUNBZ0lDQWdJQzVsY25KdmNpaG1kVzVqZEdsdmJpZ3BJSHNnSUNBZ0lDQWdJQ0FnWEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV1psY25KbFpDNXlaV3BsWTNRb1ptRnNjMlVwTzF4dUlDQWdJQ0FnSUNBZ0lIMHBJQ0FnSUNBZ1hHNGdJQ0FnSUNBZ0lDQWdMbVZ1WkNobWRXNWpkR2x2YmlncElIc2dYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pXWmxjbkpsWkM1eVpYTnZiSFpsS0hSeWRXVXBPMXh1SUNBZ0lDQWdJQ0FnSUgwcFhHNGdJQ0FnSUNBZ0lDQWdMbVZ1YzNWeVpTaG1kVzVqZEdsdmJpZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lITmxiR1l1WkdWemRISnZlU2dwTzF4dUlDQWdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUdSbFptVnljbVZrTG5KbGMyOXNkbVVvZEhKMVpTazdYRzRnSUNBZ0lDQWdJQ0FnYzJWc1ppNWtaWE4wY205NUtDazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDBnWEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0NGbGJYQjBlU2tnZTF4dUlDQWdJQ0FnY0hKdmFtVmpkSE11Wm05eVJXRmphQ2htZFc1amRHbHZiaWh3Y205cVpXTjBLU0I3WEc0Z0lDQWdJQ0FnSUVSbGNHeHZlVkl1Ym1WM0tDY3ZjaTl3Y205cVpXTjBMMk5zYjNObEp5bGNiaUFnSUNBZ0lDQWdMbVJoZEdFb2V5QndjbTlxWldOME9pQndjbTlxWldOMElIMHBYRzRnSUNBZ0lDQWdJQzV6YUdGeVpTaGpiMjlyYVdWektWeHVJQ0FnSUNBZ0lDQXVaVzVrS0NsY2JpQWdJQ0FnSUNBZ0xtVnVjM1Z5WlNobWRXNWpkR2x2YmlncElIdGNiaUFnSUNBZ0lDQWdJQ0JzYjJkdmRYUW9ZMjkxYm5RcE8xeHVJQ0FnSUNBZ0lDQWdJR052ZFc1MEt5czdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnZlNrN0lDQWdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUd4dloyOTFkQ2hqYjNWdWRDazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUdSbFptVnljbVZrTG5CeWIyMXBjMlU3SUNCY2JpQWdmU3dnSUZ4dVhHNGdJQzhxS2lCY2JpQWdJQ29nUVNCamIyNTJaVzVwWlc1alpTQmhiSFJsY201aGRHbDJaU0IwYnlCdGRXeDBhWEJzWlNCZ0xuSnBibkIxZENncFlDQmpZV3hzY3k0Z1JHVm1hVzVsY3lCaElHNWhiV1VnWEc0Z0lDQXFJR3hwYzNRZ2IyWWdVaUJ2WW1wbFkzUnpJSFJvWVhRZ2QybHNiQ0JpWlNCeVpYUjFjbTVsWkNCaGN5QkVaWEJzYjNsU0xXVnVZMjlrWldRZ1VpQnZZbXBsWTNSeklHOXVJSFJvWlNCY2JpQWdJQ29nY21WemNHOXVjMlVnYldGeWEzVndMbHh1SUNBZ0tseHVJQ0FnS2lCRFlXeHNhVzVuSUhSb2FYTWdiV1YwYUc5a0lINHVjbTkxZEhCMWRITW9XeUF1TGk0Z1hTbGdJR2x6SUdWeGRXbDJZV3hsYm5RZ2RHOGdhVzUyYjJ0cGJtY2diWFZzZEdsd2JHVWdYRzRnSUNBcUlHQXVjbTkxZEhCMWRDZ3VMaTRwWUNCallXeHNjeTVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxkR2h2WkNCeWIzVjBjSFYwYzF4dUlDQWdLaUJBY0dGeVlXMGdlMEZ5Y21GNWZTQnliMkpxWldOMGN5QkJJRzVoYldVZ2JHbHpkQ0J2WmlCU0lHOWlhbVZqZEhNZ2RHaGhkQ0IzYVd4c0lHSmxJSEpsZEhWeWJtVmtMbHh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQm1iM0lnWTJoaGFXNXBibWN1SUNBZ1hHNGdJQ0FxSUVCaGNHa2djSFZpYkdsalhHNGdJQ0FxTDF4dUlDQnliM1YwY0hWMGN6b2dablZ1WTNScGIyNGdLSEp2ZFhSd2RYUnpLU0I3WEc0Z0lDQWdhV1lnS0hKdmRYUndkWFJ6S1NCN0lIUm9hWE11YjNWMGNIVjBjeUE5SUhSb2FYTXViM1YwY0hWMGN5NWpiMjVqWVhRb2NtOTFkSEIxZEhNcE95QjlYRzVjYmlBZ0lDQnlaWFIxY200Z2RHaHBjenRjYmlBZ2ZTeGNiaUFnWEc0Z0lDOHFLaUJjYmlBZ0lDb2dSR1ZtYVc1bGN5QjBhR1VnYm1GdFpTQnZaaUIwYUdVZ1VpQnZZbXBsWTNRZ2RHaGhkQ0IzYVd4c0lHSmxJSEpsZEhWeWJtVmtJR0Z6SUdFZ1JHVndiRzk1VWkxbGJtTnZaR1ZrSUZ4dUlDQWdLaUJTSUc5aWFtVmpkQ0J2YmlCMGFHVWdjbVZ6Y0c5dWMyVWdiV0Z5YTNWd0xseHVJQ0FnS2x4dUlDQWdLaUJBYldWMGFHOWtJSEp2ZFhSd2RYUmNiaUFnSUNvZ1FIQmhjbUZ0SUh0VGRISnBibWQ5SUhKdlltcGxZM1FnVkdobElHNWhiV1VnYjJZZ2RHaGxJRklnYjJKcVpXTjBJSFJvWVhRZ2QybHNiQ0JpWlNCeVpYUjFjbTVsWkM1Y2JpQWdJQ29nUUhKbGRIVnliaUI3UkdWd2JHOTVVbjBnWm05eUlHTm9ZV2x1YVc1bkxpQWdJRnh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZMXh1SUNBZ0tpOWNiaUFnY205MWRIQjFkRG9nWm5WdVkzUnBiMjRnS0hKdmRYUndkWFFwSUh0Y2JpQWdJQ0JwWmlBb2NtOTFkSEIxZENrZ2V5QjBhR2x6TG5KdmRYUndkWFJ6S0Z0eWIzVjBjSFYwWFNrN0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNCOUxGeHVYRzRnSUM4cUtpQmNiaUFnSUNvZ1ZYTmxaQ0IwYnlCd1lYTnpJRzExYkhScGNHeGxJR2x1Y0hWMGN5QmhkQ0J2Ym1ObElHWnliMjBnU21GMllWTmpjbWx3ZENCMGJ5QmhiaUJTSUhOamNtbHdkQ0IxYzJsdVp5QmNiaUFnSUNvZ2IyNWxJRzltSUhSb1pTQmtaV1pwYm1Wa0lHQlNTVzV3ZFhSZ0lHWmhZM1J2Y21sbGN5NWNiaUFnSUNwY2JpQWdJQ29nUUcxbGRHaHZaQ0J5YVc1d2RYUnpYRzRnSUNBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUhKcGJuQjFkSE1nVkdobElHQlNTVzV3ZFhSZ0lHeHBjM1FnYjJZZ1JHVndiRzk1VWkxemNHVmphV1pwWXlCbGJtTnZaR1ZrSUZJZ1hHNGdJQ0FxSUc5aWFtVmpkQ0JrWVhSaElHWnZjaUIxYzJVZ2IyNGdZVzRnUVZCSklHTmhiR3d1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1Wnk0Z0lDQmNiaUFnSUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFnSUNvdlhHNGdJSEpwYm5CMWRITTZJR1oxYm1OMGFXOXVJQ2h5YVc1d2RYUnpLU0I3WEc0Z0lDQWdhV1lnS0hKcGJuQjFkSE1wSUhzZ2RHaHBjeTVwYm5CMWRITWdQU0IwYUdsekxtbHVjSFYwY3k1amIyNWpZWFFvY21sdWNIVjBjeWs3SUgxY2JseHVJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHVJQ0I5TEZ4dVhHNGdJQzhxS2lCY2JpQWdJQ29nVlhObFpDQjBieUJ3WVhOeklHMTFiSFJwY0d4bElHbHVjSFYwY3lCaGRDQnZibU5sSUdaeWIyMGdTbUYyWVZOamNtbHdkQ0IwYnlCaGJpQlNJSE5qY21sd2RDQjFjMmx1WnlCY2JpQWdJQ29nYjI1bElHOW1JSFJvWlNCa1pXWnBibVZrSUdCU1NXNXdkWFJnSUdaaFkzUnZjbWxsY3k1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQnlhVzV3ZFhSY2JpQWdJQ29nUUhCaGNtRnRJSHRTU1c1d2RYUjlJSEpwYm5CMWRDQlVhR1VnUkdWd2JHOTVVaTF6Y0dWamFXWnBZeUJsYm1OdlpHVmtJRklnYjJKcVpXTjBJR1JoZEdFZ1ptOXlJSFZ6WlNCY2JpQWdJQ29nYjI0Z1lXNGdRVkJKSUdOaGJHd3VJQ0FnWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJsY0d4dmVWSjlJR1p2Y2lCamFHRnBibWx1Wnk0Z0lDQmNiaUFnSUNvZ1FHRndhU0J3ZFdKc2FXTmNiaUFnSUNvdlhHNGdJSEpwYm5CMWREb2dablZ1WTNScGIyNGdLSEpwYm5CMWRDa2dlMXh1SUNBZ0lHbG1JQ2h5YVc1d2RYUXBJSHNnZEdocGN5NXBibkIxZEhNdWNIVnphQ2h5YVc1d2RYUXBPeUI5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JpQWdmU3hjYmx4dUlDQXZLaXBjYmlBZ0lDb2dSR1Z6ZEhKdmVTQnNhV1psWTNsamJHVWdiV1YwYUc5a0xpQkdhWEpsY3lCMGFHVWdZR1JsYzNSeWIzbGdJR1YyWlc1MExDQndjbWx2Y2lCMGJ5QnBiblp2YTJsdVp5QmNiaUFnSUNvZ1pHVnpkSEoxWTNSdmNuTWdabTl5SUhSb1pTQmpiR0Z6Y3lCb2FXVnlZWEpqYUhrdUlFTmhiR3hsWkNCcGJuUmxjbTVoYkd4NUlIZG9aVzRnWUM1eVpXeGxZWE5sS0NsZ1hHNGdJQ0FxSUdseklHTmhiR3hsWkM1Y2JpQWdJQ3BjYmlBZ0lDb2dRRzFsZEdodlpDQmtaWE4wY205NVhHNGdJQ0FxSUVCaGNHa2djSFZpYkdsaklDQWdYRzRnSUNBcUwxeHVJQ0JrWlhOMGNtOTVPaUJtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lIUm9hWE11WlcxcGRDZ25aR1Z6ZEhKdmVTY3BPMXh1SUNBZ0lDQWdkR2hwY3k1dlptWkJiR3dvS1R0Y2JpQWdJQ0JjYmlBZ0lDQWdJR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQjBhR2x6S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtaGhjMDkzYmxCeWIzQmxjblI1S0d0bGVTa3BJSHNnWEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjMXRyWlhsZElEMGdiblZzYkRzZ1hHNGdJQ0FnSUNBZ0lDQWdaR1ZzWlhSbElIUm9hWE5iYTJWNVhUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMGdZMkYwWTJnb1pYSnlLU0I3ZlZ4dUlDQjlMQ0FnWEc1Y2JpQWdMeThnTFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMxY2JpQWdMeThnVUhKcGRtRjBaU0J0WlhSb2IyUnpYRzRnSUM4dklDMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFQmhjR2tnY0hKcGRtRjBaVnh1SUNBZ0tpOWNiaUFnWDJOc1pXRnlPaUJtZFc1amRHbHZiaWdwSUhzZ0lDQWdYRzRnSUNBZ2RHaHBjeTV3WVhKaGJYTWdJQ0E5SUh0OU8xeHVJQ0FnSUhSb2FYTXVhVzV3ZFhSeklDQWdQU0JiWFR0Y2JpQWdJQ0IwYUdsekxtOTFkSEIxZEhNZ0lEMGdXMTA3WEc0Z0lDQWdkR2hwY3k1eWMzUnlaV0Z0SUNBOUlHWmhiSE5sTzF4dUlDQWdJSFJvYVhNdVpHVnNZWGxsWkNBZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0IwYUdsekxtRndhU0FnSUNBZ0lEMGdiblZzYkRzZ0lDQWdYRzRnSUNBZ2RHaHBjeTVtYVd4bElDQWdJQ0E5SUc1MWJHdzdJQ0JjYmlBZ0lDQjBhR2x6TG1WdWRHbDBhV1Z6SUQwZ2JuVnNiRHRjYmlBZ0lDQjBhR2x6TG1sdlJtbHNkR1Z5SUQwZ2JuVnNiRHRjYmlBZ2ZTd2dYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFQmhjR2tnY0hKcGRtRjBaVnh1SUNBZ0tpOWNiaUFnWDNCeVpYQlNaWEYxWlhOME9pQm1kVzVqZEdsdmJpQW9jbVZ6Y0c5dWMyVkRhR0ZwYml3Z1lYSm5jeWtnZTF4dUlDQWdJSFpoY2lCeVpYRWdJRDBnZEdocGN5NXlaWEVzWEc0Z0lDQWdJQ0FnSUdacGJHVWdQU0IwYUdsekxtWnBiR1U3WEc1Y2JpQWdJQ0F2THlCelpYUWdkR2hsSUhKbGNYVmxjM1FnZEhsd1pTQWdJQ0JjYmlBZ0lDQnBaaUFvZEdocGN5NWhjR2t1ZFhCc2IyRmtLU0I3WEc0Z0lDQWdJQ0FnTHk4Z1NXWWdkR2hsSUdWdWRpQnBjeUIwYUdVZ1FuSnZkM05sY2lCMGFHVnlaU0JwY3lCdWJ5QnVaV1ZrSUhSdklHMWhiblZoYkd4NUlITmxkQ0IwYUdWY2JpQWdJQ0FnSUNBdkx5QkRiMjUwWlc1MExWUjVjR1V1SUZSb1pTQmljbTkzYzJWeUlIZHBiR3dnWVhWMGIyMWhkR2xqWVd4c2VTQnpaWFFnZEdobElGeHVJQ0FnSUNBZ0lDOHZJRndpYlhWc2RHbHdZWEowTDJadmNtMHRaR0YwWVRzZ1ltOTFibVJoY25rOUxpNHVYQ0lnZG1Gc2RXVXVJRWxtSUhSb1pTQmxibllnYVhNZ1RtOWtaU0IzWlNCdVpXVmtYRzRnSUNBZ0lDQWdMeThnZEc4Z2MyVjBJR2wwSUcxaGJuVmhiR3g1TGx4dUlDQWdJQ0FnSUdsbUlDZ2hkMmx1S1NCN0lIUm9hWE11Y21WeExuUjVjR1VvSjIxMWJIUnBjR0Z5ZEM5bWIzSnRMV1JoZEdFbktUc2dmU0FnSUNCY2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVZ4TG5SNWNHVW9KMlp2Y20wbktUdGNiaUFnSUNCOUlDQWdJRnh1WEc0Z0lDQWdjbVZ4TG05dUtDZGxjbkp2Y2ljc0lHWjFibU4wYVc5dUtHVnljaWtnZXlCY2JpQWdJQ0FnSUdWeWNpQTlJR1Z5Y2lCOGZDQjdJQ0JqYjJSbE9pQW5WVTVMVGs5WFRpQkRUMFJGSnl3Z2RHVjRkRG9nSjFWT1MwNVBWMDRnUlZKU1QxSW5JSDA3WEc1Y2JpQWdJQ0FnSUhSb2FYTXVYMmhoYm1Sc1pVVnljbTl5S0hzZ1hHNGdJQ0FnSUNBZ0lITjBZWFIxY3pvZ1pYSnlMbU52WkdVZ2ZId2dKMVZPUzA1UFYwNGdRMDlFUlNjc1hHNGdJQ0FnSUNBZ0lIUmxlSFE2SUdWeWNseHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZTNWlhVzVrS0hSb2FYTXBLVHNnSUNBZ1hHNWNiaUFnSUNCMGFHbHpMbk5vWVhKbEtHRnlaM01nUHlCaGNtZHpMbDlmWTI5dmEybGxjMTlmSURvZ2JuVnNiQ2s3WEc1Y2JpQWdJQ0F2THlCaGNtZDFiV1Z1ZEhNZ2NtVjBkWEp1WldRZ1puSnZiU0J3Y21WMklISmxjWFZsYzNRbmN5QnBieWdwTG1WdVpDaG1kVzVqZEdsdmJpZ3BJSHNnY21WMGRYSnVJSGc3SUgwcFhHNGdJQ0FnYVdZZ0tHRnlaM01wSUhzZ1hHNGdJQ0FnSUNBZ2RHaHBjeTVrWVhSaEtHRnlaM01wTzF4dUlDQWdJSDBnWEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTVwYm5CMWRITXViR1Z1WjNSb0lENGdNQ2tnZXlCY2JpQWdJQ0FnSUhSb2FYTXVaR0YwWVNoN0lHbHVjSFYwY3pvZ1pXNWpiMlJsY2k1bGJtTnZaR1VvZEdocGN5NXBibkIxZEhNcElIMHBPeUJjYmlBZ0lDQjlYRzRnSUZ4dUlDQWdJR2xtSUNoMGFHbHpMbTkxZEhCMWRITXViR1Z1WjNSb0lENGdNQ2tnZXlCY2JpQWdJQ0FnSUhSb2FYTXVaR0YwWVNoN0lISnZZbXBsWTNSek9pQjBhR2x6TG05MWRIQjFkSE11YW05cGJpZ3BJSDBwT3lCY2JpQWdJQ0I5SUNBZ0lGeHVYRzRnSUNBZ2FXWWdLSFJvYVhNdVkyOXZhMmxsY3lrZ2V5QWdJQ0FnWEc0Z0lDQWdJQ0IwYUdsekxtTnZiMnRwWlhNdVptOXlSV0ZqYUNnZ1puVnVZM1JwYjI0b1l5a2dleUJ5WlhFdWMyVjBLQ2REYjI5cmFXVW5MQ0JqS1RzZ2ZTazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLSFJvYVhNdVlYQnBMblZ3Ykc5aFpDa2dleUFnSUNCY2JpQWdJQ0FnSUdadmNpaDJZWElnY0NCcGJpQjBhR2x6TG5CaGNtRnRjeWtnZTF4dUlDQWdJQ0FnSUNCeVpYRXVabWxsYkdRb2NDd2dLSFJvYVhNdWNHRnlZVzF6VzNCZElIeDhJSFJvYVhNdWNHRnlZVzF6VzNCZElEMDlQU0JtWVd4elpTa2dQeUJjYmlBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV3WVhKaGJYTmJjRjBnS3lBbkp5QTZJQ2NuS1R0Y2JpQWdJQ0FnSUgwZ1hHNGdJQ0FnSUNCeVpYRXVZWFIwWVdOb0tDZG1hV3hsSnl3Z2RHaHBjeTV5YzNSeVpXRnRJRDhnWm5NdVkzSmxZWFJsVW1WaFpGTjBjbVZoYlNobWFXeGxLU0E2SUdacGJHVXBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCeVpYRmJkR2hwY3k1aGNHa3ViV1YwYUc5a0lEMDlQU0FuUjBWVUp5QS9JQ2R4ZFdWeWVTY2dPaUFuYzJWdVpDZGRLSFJvYVhNdWNHRnlZVzF6S1R0Y2JpQWdJQ0I5SUZ4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkFZWEJwSUhCeWFYWmhkR1ZjYmlBZ0lDb3ZYRzRnSUY5b1lXNWtiR1ZGY25KdmNqb2dablZ1WTNScGIyNGdLSEpoZHlrZ2UxeHVJQ0FnSUhaaGNpQnpkR0YwSUNBOUlISmhkeTV6ZEdGMGRYTXNYRzRnSUNBZ0lDQWdJSEpsY3lBZ0lEMGdLSEpoZHk1aWIyUjVJQ1ltSUhKaGR5NWliMlI1TG1SbGNHeHZlWElnUHlCeVlYY3VZbTlrZVNBNklISmhkeWtzWEc0Z0lDQWdJQ0FnSUdWeWNtOXlJRDBnS0NoemRHRjBJQ0U5UFNBeU1EQXBJSHg4SUhKbGN5NWtaWEJzYjNseUlDWW1JQ0Z5WlhNdVpHVndiRzk1Y2k1eVpYTndiMjV6WlM1emRXTmpaWE56S1R0Y2JseHVJQ0FnSUM4dklDMHRJRWhoYm1Sc1pTQmxjbkp2Y25NZ0xTMWNiaUFnSUNCcFppQW9aWEp5YjNJcElIdGNiaUFnSUNBZ0lISmxjeUE5SUh0Y2JpQWdJQ0FnSUNBZ1oyVjBPaUJtZFc1amRHbHZiaWhyWlhrcElIc2dYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFYwYVd4ekxtZGxkQ2gwYUdsekxtUmxjR3h2ZVhJdWNtVnpjRzl1YzJVc0lHdGxlU2s3SUZ4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQmtaWEJzYjNseU9pQjdJQ0FnSUNBZ0lDQWdJRnh1SUNBZ0lDQWdJQ0FnSUhKbGMzQnZibk5sT2lCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J6ZFdOalpYTnpPaUJtWVd4elpTeGNiaUFnSUNBZ0lDQWdJQ0FnSUdOaGJHdzZJSFJvYVhNdVlYQnBXeWRqWVd4c0oxMHNYRzRnSUNBZ0lDQWdJQ0FnSUNCbGNuSnZja052WkdVNklISmxjeTVrWlhCc2IzbHlJRDhnY21WekxtUmxjR3h2ZVhJdWNtVnpjRzl1YzJVdVpYSnliM0pEYjJSbElEb2djM1JoZEN4Y2JpQWdJQ0FnSUNBZ0lDQWdJR1Z5Y205eU9pQnlaWE11WkdWd2JHOTVjaUEvSUhKbGN5NWtaWEJzYjNseUxuSmxjM0J2Ym5ObExtVnljbTl5SURvZ2NtVnpMblJsZUhSY2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDA3WEc1Y2JpQWdJQ0FnSUV4dloyZGxjaTVsY25KdmNpZ25aWEp5YjNJb0tTY3NJSFJvYVhNdVlYQnBMQ0J5WlhNc0lISmhkeWs3WEc0Z0lDQWdJQ0IwYUdsekxteHZaMmRsY2k1bGNuSnZjaWduWlhKeWIzSW9LU2NzSUhSb2FYTXVZWEJwTENCeVpYTXNJSEpoZHlrN1hHNWNiaUFnSUNBZ0lDOHZJQzB0SUc1dmRHbG1lU0JuYkc5aVlXd2daWEp5YjNKeklHWnBjbk4wSUNocFppQmhibmtwSUdadmNpQjBhR2x6SUdOaGJHd2dMUzBnSUNBZ0lDQmNiaUFnSUNBZ0lHbG1JQ2gwYUdsekxtZHNiMkpoYkVWMmRITXBJSHRjYmlBZ0lDQWdJQ0FnY21GcGMyVkhiRzlpWVd4RmNuSnZjbk1vZEdocGN5NWhjR2xiSjJOaGJHd25YU3dnY21WektUc2dJQ0FnSUNBZ0lGeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQXZMeUF0TFNCMGNtRnVZV04wYVc5dUlHeGxkbVZzSUVoVVZGQWdiM0lnUkdWd2JHOTVVaUJsY25KdmNuTWdZMjl0WlNCdVpYaDBJQzB0SUNBZ0lGeHVJQ0FnSUNBZ2RHaHBjeTVsYldsMEtDZGxjbkp2Y2ljc0lISmxjeWs3WEc0Z0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJSbGNHeHZlWEl0YVc4Nkp5QXJJSEpsY3k1a1pYQnNiM2x5TG5KbGMzQnZibk5sTG1WeWNtOXlRMjlrWlN3Z2NtVnpLVHRjYmlBZ0lDQWdJSFJvYVhNdVpHVm1aWEp5WldRdWNtVnFaV04wS0hKbGN5azdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUdWeWNtOXlPMXh1SUNCOVhHNTlLVHRjYmx4dUx5b3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xTDF4dUx5b3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xTDF4dUx5b3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xTDF4dVhHNHZMeUJKYm1Oc2RXUmxJSFJvWlNCZ1pHVndjbVZqWVhSbFpHQWdhbk5FWlhCc2IzbFNJR1p2Y2lCdWIzY3VYRzVwWmlBb2QybHVLU0I3WEc0Z0lIZHBibVJ2ZHk1U1pYWnZiSFYwYVc5dUlEMGdkMmx1Wkc5M0xsSmxkbTlzZFhScGIyNGdmSHdnY21WeGRXbHlaU2duTGk5c2FXSXZaR1Z3Y21WallYUmxaQ2NwTzF4dWZWeHVYRzR2S2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3ZYRzR2S2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3ZYRzR2S2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3FLaW9xS2lvcUtpb3ZYRzVjYmk4cUtseHVJQ29nUlhod2IzTmxJR1p2Y2lCaElHTnNaV0Z1WlhJZ1kyeHBaVzUwSUdGd2FTQnBiblJ2SUVSbGNHeHZlVkpjYmlBcUwxeHViVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQjdYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVjRjRzl6WlhNZ2RHaGxJR0JFWlhCc2IzbFNZQ0J2WW1wbFkzUWdabTl5SUdWNGRHVnVaR2x1Wnk1Y2JpQWdJQ3BjYmlBZ0lDb2dZR0JnZG1GeUlFUmxjR3h2ZVZJZ1BTQnlaWEYxYVhKbEtDZGtaWEJzYjNseUp5a3VSR1Z3Ykc5NVVqdGdZR0JjYmlBZ0lDcGNiaUFnSUNvZ1FITjBZWFJwWTF4dUlDQWdLaUJBWVhCcElIQjFZbXhwWTF4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JVYUdVZ1lFUmxjR3h2ZVZKZ0lHOWlhbVZqZEM1Y2JpQWdJQ292SUNBZ1hHNGdJRVJsY0d4dmVWSTZJRVJsY0d4dmVWSXNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVjRjRzl6WlhNZ2RHaGxJSE4xY0hCdmNuUmxaQ0JFWlhCc2IzbFNJRUZRU1hNdVhHNGdJQ0FxWEc0Z0lDQXFJRUJ0WlhSb2IyUWdZWEJwYzF4dUlDQWdLaUJBY0dGeVlXMGdlMEp2YjJ4bFlXNTlJR1pzWVhRZ0tHOXdkR2x2Ym1Gc0tTQnBaaUJnZEhKMVpXQWdkMmxzYkNCeVpYUjFjbTRnWVc0Z1lYSnlZWGtnYjJZZ2FuVnpkQ0IwYUdVZ1hHNGdJQ0FxSUVGUVNTZHpJR1Z1WkhCdmFXNTBJSEJ5YjNCbGNuUnBaWE1zSUdadmNpQmxlR0Z0Y0d4bE9pQmNiaUFnSUNvZ1lHQmdYRzRnSUNBcUlGc25MM0l2ZFhObGNpOXNiMmRwYmljc0lDY3ZjaTkxYzJWeUwyeHZaMjkxZENjc0lDY3ZjaTkxYzJWeUwyRmliM1YwSnl3Z0xpNHVYVnh1SUNBZ0tpQmdZR0JjYmlBZ0lDb2dRSE4wWVhScFkxeHVJQ0FnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ0FnS2lCQWNtVjBkWEp1SUh0UFltcGxZM1I4UVhKeVlYbDlJRlJvWlNCSVZGUlFJSEpsY1hWbGMzUWdkRzhnZEdobElFUmxjR3h2ZVZJZ2MyVnlkbVZ5TGlBZ0lDQWdJRnh1SUNBZ0tpOGdJRnh1SUNCaGNHbHpPaUJtZFc1amRHbHZiaWhtYkdGMEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdac1lYUWdQeUJQWW1wbFkzUXVhMlY1Y3loaGNHbHpLU0E2SUdGd2FYTTdYRzRnSUgwc1hHNWNiaUFnTHlvcVhHNGdJQ0FxSUZKbGNISmxjMlZ1ZEhNZ1lTQnpkR0YwYVdNZ2JXVjBhRzlrSUdadmNpQmpiMjVtYVdkMWNtbHVaeUJoYkd3Z1JHVndiRzk1VWlCeVpYRjFaWE4wY3k0Z1UyVjBkR2x1WjNNZ1hHNGdJQ0FxSUcxaFpHVWdhR1Z5WlNCaGNtVWdZWEJ3YkdsbFpDQm5iRzlpWVd4c2VTQmhZM0p2YzNNZ1pYWmxjbmtnY21WeGRXVnpkQzVjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxkR2h2WkNCamIyNW1hV2QxY21WY2JpQWdJQ29nUUhCaGNtRnRJSHRQWW1wbFkzUjlJRzl3ZEdsdmJuTWdWR2hsSUc5aWFtVmpkQ0JzYVhSbGNtRnNJR052Ym1acFozVnlZWFJwYjI0Z2FHRnphQzRnWEc0Z0lDQXFJRUJ6ZEdGMGFXTmNiaUFnSUNvZ1FHTm9ZV2x1WVdKc1pWeHVJQ0FnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ0FnS2k5Y2JpQWdZMjl1Wm1sbmRYSmxPaUJtZFc1amRHbHZiaWh2Y0hScGIyNXpLU0I3WEc0Z0lDQWdiM0IwYVc5dWN5QTlJRzl3ZEdsdmJuTWdmSHdnZTMwN1hHNWNiaUFnSUNCbWIzSWdLSFpoY2lCcElHbHVJRzl3ZEdsdmJuTXBJSHNnWjJ4dlltRnNUM0IwYVc5dWN5NXpaWFFvYVN3Z2IzQjBhVzl1YzF0cFhTazdJSDFjYmx4dUlDQWdJQzh2SUdGemMyVnlkQ0JuYkc5aVlXd2dZMjl2YTJsbGN5QmhjbVVnWlcxd2RIa2dhV1lnWjJ4dlltRnNJR0J6ZEdsamEzbGdJR3B6WlhOemFXOXVhV1FnYVhNZ2IyWm1YRzRnSUNBZ2FXWWdLQ0ZuYkc5aVlXeFBjSFJwYjI1ekxuTjBhV05yZVNrZ0lIc2daMnh2WW1Gc1QzQjBhVzl1Y3k1elpYUW9KMk52YjJ0cFpYTW5MQ0J1ZFd4c0tUc2dmVnh1WEc0Z0lDQWdMeThnZEhWeWJpQm5iRzlpWVd3Z2JHOW5aMmx1WnlCdmJueHZabVlnS0c5bVppQmllU0JrWldaaGRXeDBLVnh1SUNBZ0lFeHZaMmRsY2k1elpYUk1aWFpsYkNobmJHOWlZV3hQY0hScGIyNXpMbXh2WjJkcGJtY2dQeUJNYjJkblpYSXVSRVZDVlVjZ09pQk1iMmRuWlhJdVQwWkdLVHRjYmx4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TzF4dUlDQjlMRnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkdZV04wYjNKNUlHWnZjaUJqY21WaGRHbHVaeUJ1WlhjZ1NVOGdjbVZ4ZFdWemRITWdkRzhnWUVSbGNHeHZlVkpnTGx4dUlDQWdLbHh1SUNBZ0tpQkZlR0Z0Y0d4bE9seHVJQ0FnS2lCZ1lHQWdJQ0JjYmlBZ0lDb2dJQ0FnWkdWd2JHOTVjaTVwYnlnbkwzSXZkWE5sY2k5aFltOTFkQ2NwTG1WdVpDaGpZV3hzWW1GamF5azdYRzRnSUNBcUlHQmdZRnh1SUNBZ0tseHVJQ0FnS2lCQWJXVjBhRzlrSUdsdlhHNGdJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0JoY0drZ1QyNWxJRzltSUhSb1pTQnpkWEJ3YjNKMFpXUWdSR1Z3Ykc5NVVpQkJVRWx6TGx4dUlDQWdLaUJBYzNSaGRHbGpYRzRnSUNBcUlFQnlaWFIxY200Z2UwUmxjR3h2ZVZKOUlGUm9aU0JJVkZSUUlISmxjWFZsYzNRZ2RHOGdkR2hsSUVSbGNHeHZlVklnYzJWeWRtVnlMbHh1SUNBZ0tpQkFZWEJwSUhCMVlteHBZeUFnSUZ4dUlDQWdLaTljYmlBZ2FXODZJR1oxYm1OMGFXOXVLR0Z3YVNrZ2V5QWdYRzRnSUNBZ2NtVjBkWEp1SUVSbGNHeHZlVkl1Ym1WM0tHRndhU2s3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFTnZiblpsYm1sbGJtTmxJR1oxYm1OMGFXOXVJSFJ2SUhOcFoyNGdkR2hsSUhWelpYSWdhVzRnWW5rZ1lYVjBhR1Z1ZEdsallYUnBibWNnZEdobElHTnlaV1JsYm5ScFlXeHpJRnh1SUNBZ0tpQjNhWFJvSUhSb1pTQkVaWEJzYjNsU0lITmxjblpsY2k0Z0lDQmNiaUFnSUNwY2JpQWdJQ29nUUcxbGRHaHZaQ0JoZFhSb1hHNGdJQ0FxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0IxYzJWeWJtRnRaU0JUY0dWamFXWnBaWE1nZEdobElIVnpaWEp1WVcxbExseHVJQ0FnS2lCQWNHRnlZVzBnZTFOMGNtbHVaMzBnY0dGemMzZHZjbVFnVTNCbFkybG1hV1Z6SUhSb1pTQndZWE56ZDI5eVpDNWNiaUFnSUNvZ1FITjBZWFJwWTF4dUlDQWdLaUJBY21WMGRYSnVJSHRFWlhCc2IzbFNmU0JVYUdVZ1NGUlVVQ0J5WlhGMVpYTjBJSFJ2SUhSb1pTQkVaWEJzYjNsU0lITmxjblpsY2k0Z0lDQmNiaUFnSUNvZ1FHRndhU0J3ZFdKc2FXTWdJQ0JjYmlBZ0lDb3ZJQ0FnWEc0Z0lHRjFkR2c2SUdaMWJtTjBhVzl1S0hWdUxDQndkeWtnZTF4dUlDQWdJSFpoY2lCa1lYUmhJRDBnZXlCMWMyVnlibUZ0WlRvZ2RXNHNJSEJoYzNOM2IzSmtPaUJ3ZHlCOU8xeHVJQ0FnSUhKbGRIVnliaUJFWlhCc2IzbFNMbTVsZHlnbkwzSXZkWE5sY2k5c2IyZHBiaWNwTG1SaGRHRW9aR0YwWVNrdVpXNWtLQ2s3SUNBZ0lGeHVJQ0I5TEZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJEYjI1MlpXNXBaVzVqWlNCbWRXNWpkR2x2YmlCMGJ5QnphV2R1SUhSb1pTQjFjMlZ5SUdsdUlHSjVJR0YxZEdobGJuUnBZMkYwYVc1bklIUm9aU0JqY21Wa1pXNTBhV0ZzY3lCY2JpQWdJQ29nZDJsMGFDQjBhR1VnUkdWd2JHOTVVaUJ6WlhKMlpYSXVJQ0FnWEc0Z0lDQXFYRzRnSUNBcUlFVjRZVzF3YkdVNlhHNGdJQ0FxSUdCZ1lGeHVJQ0FnS2lBZ0lDQmtaWEJzYjNseUxuTmpjbWx3ZENnbkwzUmxjM1IxYzJWeUwzSnZiM1F2Y21Wa2RXTmxMbEluS1Z4dUlDQWdLaUFnSUNCa1pYQnNiM2x5TG5OamNtbHdkQ2g3SUdacGJHVnVZVzFsT2lBbmNtVmtkV05sTGxJbkxDQmhkWFJvYjNJNklDZDBaWE4wZFhObGNpY3NYRzRnSUNBcUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdaR2x5WldOMGIzSjVPaUFuY205dmRDZDlLVnh1SUNBZ0tpQWdJQ0JrWlhCc2IzbHlMbk5qY21sd2RDZ25jbVZrZFdObExsSW5MQ0FuZEdWemRIVnpaWEluTENBbmNtOXZkQ2NwWEc0Z0lDQXFJQ0FnSUdSbGNHeHZlWEl1YzJOeWFYQjBLQ2N2ZEdWemRIVnpaWEl2Y205dmRDOXlaV1IxWTJVdVVpY3NJSEJ5YjJwbFkzUXBJQ0FnSUNCY2JpQWdJQ29nWUdCZ0lDQWdYRzRnSUNBcVhHNGdJQ0FxSUVCdFpYUm9iMlFnYzJOeWFYQjBYRzRnSUNBcUlFQndZWEpoYlNCN1FYSm5kVzFsYm5SemZTQmhjbWQxYldWdWRITWdRWEpuZFcxbGJuUnpJSFJ2SUdSbFptbHVaU0IwYUdVZ1puVnNiSGtnY1hWaGJHbG1hV1ZrSUhOamNtbHdkQ0JjYmlBZ0lDb2dabTl5SUdWNFpXTjFkR2x2Ymk1Y2JpQWdJQ29nUUhOMFlYUnBZMXh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVaWEJzYjNsU2ZTQlVhR1VnU0ZSVVVDQnlaWEYxWlhOMElIUnZJSFJvWlNCRVpYQnNiM2xTSUhObGNuWmxjaTRnSUNCY2JpQWdJQ29nUUdGd2FTQndkV0pzYVdNZ0lDQmNiaUFnSUNvdklDQWdJQ0JjYmlBZ2MyTnlhWEIwT2lCbWRXNWpkR2x2YmlncElIdGNiaUFnSUNCMllYSWdZWEpuY3lBOUlIVjBhV3h6TG5OcFoyNWhkSFZ5WlNoaGNtZDFiV1Z1ZEhNcExGeHVJQ0FnSUNBZ0lDQnZjSFJ6SUQwZ1lYSm5jeTV2Y0hSekxGeHVJQ0FnSUNBZ0lDQmhjR2tnSUQwZ1lYSm5jeTVoY0drN0lDQmNibHh1SUNBZ0lDOHZJR052Ym5abGJtbGxibU5sSUMwZ2FXWWdkR2hsSUhCeWIycGxZM1FnYVhNZ1lTQmliMjlzWlc0Z1lIUnlkV1ZnSUhKaGRHaGxjaUIwYUdGdUlHRWdjR2xrTENCbWFYSnpkRnh1SUNBZ0lDOHZJR055WldGMFpTQmhJRzVsZHlCd2NtOXFaV04wSUdGdVpDQjBhR1Z1SUhCeVpYQmhjbVVnZEdobElIQnliMnBsWTNRZ1lYQnBJR05oYkd3Z2RHOGdaWGhsWTNWMFpWeHVJQ0FnSUdsbUlDaGhjbWR6TG1OeVpXRjBaU2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJRVJsY0d4dmVWSXVibVYzS0NjdmNpOXdjbTlxWldOMEwyTnlaV0YwWlNjcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdVpXNWtLR1oxYm1OMGFXOXVLSEpsY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIc2djSEp2YW1WamREb2djbVZ6TG1kbGRDZ25jSEp2YW1WamRDY3BMbkJ5YjJwbFkzUWdmVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnTG1sdktHRndhU2xjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQzVrWVhSaEtHOXdkSE1wTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1JHVndiRzk1VWk1dVpYY29ZWEJwS1M1a1lYUmhLRzl3ZEhNcE8xeHVJQ0FnSUgxY2JpQWdmU3dnSUZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJTZFc0Z1lXNGdjMlZ5YVdWeklHOW1JR05vWVdsdVpXUWdSR1Z3Ykc5NVVpQnlaWEYxWlhOMGN5QnBiaUJ6WlhGMVpXNWpaU0JoYm1RZ2QybDBhRzkxZENCdmRtVnliR0Z3TGlBZ0lDQWdJQ0JjYmlBZ0lDcGNiaUFnSUNvZ1FHMWxkR2h2WkNCd2FYQnNhVzVsWEc0Z0lDQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlIUmhjMnR6SUZOd1pXTnBabWxsY3lCMGFHVWdiR2x6ZENCdlppQmdSblZ1WTNScGIyNWdJSFJoYzJ0ekxseHVJQ0FnS2lCQWMzUmhkR2xqWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMUJ5YjIxcGMyVjlJRUVnY0hKdmJXbHpaU0IzY21Gd2NHbHVaeUIwYUdVZ2NtVnpiMngxZEdsdmJpQnZaaUJsYVhSb1pYSWdYQ0p5WlhOdmJIWmxYQ0lnYjNKY2JpQWdJQ29nWENKeVpXcGxZM1JjSWlCallXeHNZbUZqYXk1Y2JpQWdJQ29nUUdGd2FTQndkV0pzYVdNZ0lDQmNiaUFnSUNvdlhHNGdJSEJwY0dWc2FXNWxPaUJtZFc1amRHbHZiaWhqYUdGcGJuTXBJSHNnSUNBZ0lDQmNiaUFnSUNCMllYSWdaR1Z3Ykc5NWNpQWdQU0IwYUdsekxGeHVJQ0FnSUNBZ0lDQmtaV1psY25KbFpDQTlJRVFvS1N4Y2JpQWdJQ0FnSUNBZ2NTQWdJQ0FnSUNBZ1BTQnVaWGNnVVhWbGRXVW9LU3hjYmlBZ0lDQWdJQ0FnY21WemRXeDBjeUFnUFNCYlhTeGNiaUFnSUNBZ0lDQWdaWEp5YjNKeklDQWdQU0JiWFN4Y2JpQWdJQ0FnSUNBZ1RrOVBVQ0FnSUNBZ1BTQnVkV3hzTENBdkx5Qk9UMDlRSUdWeWNtOXljM3h5WlhOMWJIUnpJR1p2Y2lCYllWMGdZbUYwWTJnZ2NtVnhkV1Z6ZENCamFHRnBibHh1SUNBZ0lDQWdJQ0J2Y21sbklDQWdJQ0E5SUh0Y2JpQWdJQ0FnSUNBZ0lDQnpkR2xqYTNrNklHZHNiMkpoYkU5d2RHbHZibk11YzNScFkydDVMRnh1SUNBZ0lDQWdJQ0FnSUdOdmIydHBaWE02SUdkc2IySmhiRTl3ZEdsdmJuTXVZMjl2YTJsbGMxeHVJQ0FnSUNBZ0lDQjlPMXh1WEc0Z0lDQWdMeThnYldGclpTQmhJR052Y0hsY2JpQWdJQ0JqYUdGcGJuTWdQU0JqYUdGcGJuTXVjMnhwWTJVb01DazdYRzVjYmlBZ0lDQXZMeUIwZFhKdUlITjBhV05yZVNCelpYTnphVzl1SUdadmNpQjBhR1Z6WlNCeVpYRjFaWE4wSUNob1lXTnJlU2xjYmlBZ0lDQmtaWEJzYjNseUxtTnZibVpwWjNWeVpTZ2dleUJ6ZEdsamEzazZJSFJ5ZFdVZ2ZTazdYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQmhaR1FvS1NCN1hHNGdJQ0FnSUNCeExtRmtaQ2htZFc1amRHbHZiaWdwSUhzZ1hHNGdJQ0FnSUNBZ0lHTm9ZV2x1Y3k1emFHbG1kQ2dwTG1SeVlXbHVLQ2xjYmlBZ0lDQWdJQ0FnTG5Sb1pXNG9ablZ1WTNScGIyNG9ZMmhoYVc0cElIdGNiaUFnSUNBZ0lDQWdJQ0J5WlhOMWJIUnpMbkIxYzJnb1kyaGhhVzRwT3lBZ1hHNGdJQ0FnSUNBZ0lDQWdaWEp5YjNKekxuQjFjMmdvVGs5UFVDazdJQ0FnSUNBZ0lDQWdJQ0JjYmlBZ0lDQWdJQ0FnSUNCcFppQW9jUzVwYzBWdGNIUjVLQ2twSUhzZ1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrWlhCc2IzbHlMbU52Ym1acFozVnlaU2h2Y21sbktUc2dMeThnY21WelpYUmNiaUFnSUNBZ0lDQWdJQ0FnSUdSbFptVnljbVZrTG5KbGMyOXNkbVVvZXlCeVpYTjFiSFJ6T2lCeVpYTjFiSFJ6TENCbGNuSnZjbk02SUdWeWNtOXljeUI5S1RzZ1hHNGdJQ0FnSUNBZ0lDQWdmU0FnWEc1Y2JpQWdJQ0FnSUNBZ0lDQnhMblJoYTJVb0tUdGNiaUFnSUNBZ0lDQWdmU3dnWm5WdVkzUnBiMjRvWlhKeUtTQjdJQ0FnSUNBZ0lDQWdJRnh1SUNBZ0lDQWdJQ0FnSUhKbGMzVnNkSE11Y0hWemFDaE9UMDlRS1RzZ1hHNGdJQ0FnSUNBZ0lDQWdaWEp5YjNKekxuQjFjMmdvWlhKeUtUdGNiaUFnSUNBZ0lDQWdJQ0F2THlCeVpXcGxZM1JwYjI1eklHRnlaU0J2Ym14NUlHMWxkQ0IzYUdWdUlIUm9aWGtnVzJGc2JGMGdabUZwYkZ4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2h4TG1selJXMXdkSGtvS1NBbUppQnlaWE4xYkhSekxteGxibWQwYUNBOVBUMGdNQ2tnZXlCY2JpQWdJQ0FnSUNBZ0lDQWdJR1JsY0d4dmVYSXVZMjl1Wm1sbmRYSmxLRzl5YVdjcE95QXZMeUJ5WlhObGRGeHVJQ0FnSUNBZ0lDQWdJQ0FnWkdWbVpYSnlaV1F1Y21WcVpXTjBLR1Z5Y205eWN5azdJRnh1SUNBZ0lDQWdJQ0FnSUgwZ0lGeHVJQ0FnSUNBZ0lDQWdJSEV1ZEdGclpTZ3BPMXh1SUNBZ0lDQWdJQ0I5S1RzZ0lDQWdJQ0FnWEc0Z0lDQWdJQ0I5TENCdWRXeHNMQ0IwY25WbEtUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QmpiMjUyWlhKMElIUnZJR0VnYzJWeElIRjFaWFZsSUdadmNpQmlaWFIwWlhJZ2FHRnVaR3hwYm1kY2JpQWdJQ0JtYjNJb2RtRnlJR2tnUFNBd095QnBJRHdnWTJoaGFXNXpMbXhsYm1kMGFEc2dhU3NyS1NCN0lHRmtaQ2dwT3lCOVhHNWNiaUFnSUNBdkx5QnpkR0Z5ZERvZ1pHVnhkV1YxWlNCbWFYSnpkQ0JwZEdWdElHRnVaQ0J5ZFc0Z2FYUmNiaUFnSUNCeExuUmhhMlVvS1R0Y2JseHVJQ0FnSUhKbGRIVnliaUJrWldabGNuSmxaQzV3Y205dGFYTmxPMXh1SUNCOUxGeHVYRzRnSUM4cUtseHVJQ0FnS2lCVWFHVWdaWFpsYm5RZ2MzUnlaV0Z0SUVGUVNTQnBjeUIxYm1seGRXVWdkMmwwYUdsdUlIUm9aU0JFWlhCc2IzbFNJRUZRU1NCaGN5QnBkQ0J6ZFhCd2IzSjBjeUJ3ZFhOb0lGeHVJQ0FnS2lCdWIzUnBabWxqWVhScGIyNXpJR1p5YjIwZ2RHaGxJRVJsY0d4dmVWSWdjMlZ5ZG1WeUlIUnZJR05zYVdWdWRDQmhjSEJzYVdOaGRHbHZibk11SUU1dmRHbG1hV05oZEdsdmJuTWdYRzRnSUNBcUlHTnZjbkpsYzNCdmJtUWdkRzhnWkdselkzSmxkR1VnWlhabGJuUnpJSFJvWVhRZ2IyTmpkWElnZDJsMGFHbHVJSFJvWlNCRVpYQnNiM2xTSUhObGNuWmxjaTRnVkdobGNtVWdYRzRnSUNBcUlHRnlaU0JtYjNWeUlHUnBjM1JwYm1OMElHVjJaVzUwSUdOaGRHVm5iM0pwWlhNNlhHNGdJQ0FxSUZ4dUlDQWdLaUF0SUZOMGNtVmhiU0JNYVdabFkzbGpiR1VnWlhabGJuUnpYRzRnSUNBcUlDMGdSWGhsWTNWMGFXOXVJR1YyWlc1MGMxeHVJQ0FnS2lBdElFcHZZaUJNYVdabFkzbGpiR1VnWlhabGJuUnpYRzRnSUNBcUlDMGdUV0Z1WVdkbGJXVnVkQ0JsZG1WdWRITmNiaUFnSUNwY2JpQWdJQ29nUlhoaGJYQnNaVHBjYmlBZ0lDb2dZR0JnWEc0Z0lDQXFJR1JsY0d4dmVYSXVaWE1vZXlCMWMyVnlibUZ0WlRvZ0ozUmxjM1IxYzJWeUp5d2djR0Z6YzNkdmNtUTZJQ2R6WldOeVpYUW5JSDBwWEc0Z0lDQXFJQ0FnSUM4dklDMHRJR052Ym01bFkzUnBiMjRnWTJodmFXTmxjeUJtYjNJZ1pYWmxiblFnZEhsd1pYTWdMUzFjYmlBZ0lDb2dJQ0FnTG0xaGJtRm5aVzFsYm5Rb0tTQWdMeTh1YzJWemMybHZiaWdwSUh3Z0xtRnNiQ2dwSUh3Z0xuQnliMnBsWTNRb2FXUXBJSHdnTG1wdllpaHBaQ2xjYmlBZ0lDb2dJQ0FnTG05dUtDZGxjenBuY21sa1NHVmhjblJpWldGMEp5d2dablZ1WTNScGIyNG9aR0YwWVNrZ2UxeHVJQ0FnS2lBZ0lDQWdJQ0FnWTI5dWMyOXNaUzVzYjJjb0p6MDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMG5LVHRjYmlBZ0lDb2dJQ0FnSUNBZ0lHTnZibk52YkdVdWJHOW5LQ2RsY3pwbmNtbGtTR1ZoY25SaVpXRjBKeWs3WEc0Z0lDQXFJQ0FnSUNBZ0lDQmpiMjV6YjJ4bExteHZaeWduUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNjcE95QWdJQ0FnSUNBZ0lDQmNiaUFnSUNvZ0lDQWdJSDBwWEc0Z0lDQXFJQ0FnSUNBdWIzQmxiaWdwTzF4dUlDQWdLaUJnWUdCY2JpQWdJQ29nWEc0Z0lDQXFJRUJ0WlhSb2IyUWdaWE5jYmlBZ0lDb2dRSEJoY21GdElIdFBZbXBsWTNSOUlHOXdkR2x2Ym5NZ1ZHaGxJRzlpYW1WamRDQnNhWFJsY21Gc0lHTnZibVpwWjNWeVlYUnBiMjRnYUdGemFDNGdYRzRnSUNBcUlFQnpkR0YwYVdOY2JpQWdJQ29nUUhKbGRIVnliaUI3UlhabGJuUlRkSEpsWVcxOUlHRWdibVYzSUdCRmRtVnVkRk4wY21WaGJXQWdabTl5SUdKcGJtUnBibWN1WEc0Z0lDQXFJRUJoY0drZ2NIVmliR2xqSUNBZ1hHNGdJQ0FxTHlBZ1hHNGdJR1Z6T2lCbWRXNWpkR2x2YmlodmNIUnBiMjV6S1NCN0lDQWdJRnh1SUNBZ0lIWmhjaUJ6ZEhKbFlXMGdQU0JGZG1WdWRGTjBjbVZoYlM1dVpYY29aMnh2WW1Gc1QzQjBhVzl1Y3k1b2IzTjBMQ0J2Y0hScGIyNXpLVHRjYmx4dUlDQWdJR2xtSUNodmNIUnBiMjV6SUNZbUlHOXdkR2x2Ym5NdWRYTmxjbTVoYldVZ0ppWWdiM0IwYVc5dWN5NXdZWE56ZDI5eVpDa2dlMXh1SUNBZ0lDQWdkbUZ5SUhKMWMyVnlJRDBnZEdocGN5NWhkWFJvS0c5d2RHbHZibk11ZFhObGNtNWhiV1VzSUc5d2RHbHZibk11Y0dGemMzZHZjbVFwTzF4dUlDQWdJQ0FnY25WelpYSXVaVzV6ZFhKbEtHWjFibU4wYVc5dUtDa2dleUJjYmlBZ0lDQWdJQ0FnYzNSeVpXRnRMbk5vWVhKbEtISjFjMlZ5TG1kbGRFTnZiMnRwWlhNb0tTazdYRzRnSUNBZ0lDQWdJSE4wY21WaGJTNW1iSFZ6YUNncE95QmNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCemRISmxZVzA3WEc0Z0lIMHNYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFUmxabWx1WlhNZ2RHaGxJR1poWTNSdmNua2dabTl5SUdOeVpXRjBhVzVuSUdFZ1JHVndiRzk1VWkxemNHVmphV1pwWXlCbGJtTnZaR1ZrSUZJZ2IySnFaV04wSUhSdklHSmxJRnh1SUNBZ0tpQnpaVzUwSUdGeklHbHVjSFYwSUhCaGNtRnRaWFJsY25NZ2RHOGdZVzRnVWlCelkzSnBjSFF1WEc0Z0lDQXFYRzRnSUNBcUlFVjRZVzF3YkdVNlhHNGdJQ0FxSUdCZ1lGeHVJQ0FnS2lBZ0lDQjJZWElnY21sdWNIVjBJRDBnWkdWd2JHOTVjaTVTU1c1d2RYUXViRzluYVdOaGJDZ25iRzluYVdOaGJGOXVZVzFsSnl3Z2RISjFaU2s3WEc0Z0lDQXFJQ0FnSUhaaGNpQnlhVzV3ZFhRZ1BTQmtaWEJzYjNseUxsSkpibkIxZEM1dWRXMWxjbWxqS0NkdWRXMWxjbWxqWDI1aGJXVW5MQ0F4TUM0MUtUdGNiaUFnSUNvZ0lDQWdkbUZ5SUhKcGJuQjFkQ0E5SUdSbGNHeHZlWEl1VWtsdWNIVjBMbWx1ZEdWblpYSW9KMmx1ZEdWblpYSmZibUZ0WlNjc0lEVXBPMXh1SUNBZ0tpQWdJQ0IyWVhJZ2NtbHVjSFYwSUQwZ1pHVndiRzk1Y2k1U1NXNXdkWFF1WTJoaGNtRmpkR1Z5S0NkamFHRnlZV04wWlhKZmJtRnRaU2NzSUNkSVpXeHNieWNwTzF4dUlDQWdLaUFnSUNBdkx5QmxZM1F1TGk1Y2JpQWdJQ29nWUdCZ1hHNGdJQ0FxSUVCd2NtOXdaWEowZVNCU1NXNXdkWFJjYmlBZ0lDb2dRSE4wWVhScFkxeHVJQ0FnS2lCQVlYQnBJSEIxWW14cFkxeHVJQ0FnS2k5Y2JpQWdVa2x1Y0hWME9pQjdYRzRnSUNBZ2JuVnRaWEpwWXpvZ1puVnVZM1JwYjI0Z0tHNWhiV1VzSUhaaGJIVmxLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdVa2x1Y0hWMExtNWxkeWh1WVcxbExDQjJZV3gxWlNrdWJuVnRaWEpwWXlncE8xeHVJQ0FnSUgwc1hHNWNiaUFnSUNCcGJuUmxaMlZ5T2lCbWRXNWpkR2x2YmlBb2JtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQlNTVzV3ZFhRdWJtVjNLRzVoYldVc0lIWmhiSFZsS1M1cGJuUmxaMlZ5S0NrN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUd4dloybGpZV3c2SUdaMWJtTjBhVzl1SUNodVlXMWxMQ0IyWVd4MVpTa2dlMXh1SUNBZ0lDQWdjbVYwZFhKdUlGSkpibkIxZEM1dVpYY29ibUZ0WlN3Z2RtRnNkV1VwTG14dloybGpZV3dvS1R0Y2JpQWdJQ0I5TEZ4dVhHNGdJQ0FnWTJoaGNtRmpkR1Z5T2lCbWRXNWpkR2x2YmlBb2JtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQlNTVzV3ZFhRdWJtVjNLRzVoYldVc0lIWmhiSFZsS1M1amFHRnlZV04wWlhJb0tUdGNiaUFnSUNCOUxGeHVYRzRnSUNBZ1pHRjBaVG9nWm5WdVkzUnBiMjRnS0c1aGJXVXNJSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1VrbHVjSFYwTG01bGR5aHVZVzFsTENCMllXeDFaU2t1WkdGMFpTZ3BPMXh1SUNBZ0lIMHNYRzVjYmlBZ0lDQndiM05wZUdOME9pQm1kVzVqZEdsdmJpQW9ibUZ0WlN3Z2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJTU1c1d2RYUXVibVYzS0c1aGJXVXNJSFpoYkhWbEtTNXdiM05wZUdOMEtDazdYRzRnSUNBZ2ZTd2dJRnh1WEc0Z0lDQWdiblZ0WlhKcFkxWmxZM1J2Y2pvZ1puVnVZM1JwYjI0b2JtRnRaU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQlNTVzV3ZFhRdWJtVjNLRzVoYldVc0lIWmhiSFZsS1M1dWRXMWxjbWxqVm1WamRHOXlLQ2s3WEc0Z0lDQWdmU3dnWEc1Y2JpQWdJQ0JwYm5SbFoyVnlWbVZqZEc5eU9pQm1kVzVqZEdsdmJpQW9ibUZ0WlN3Z2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJTU1c1d2RYUXVibVYzS0c1aGJXVXNJSFpoYkhWbEtTNXBiblJsWjJWeVZtVmpkRzl5S0NrN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUd4dloybGpZV3hXWldOMGIzSTZJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQjJZV3gxWlNrZ2V5QmNiaUFnSUNBZ0lISmxkSFZ5YmlCU1NXNXdkWFF1Ym1WM0tHNWhiV1VzSUhaaGJIVmxLUzVzYjJkcFkyRnNWbVZqZEc5eUtDazdYRzRnSUNBZ2ZTeGNibHh1SUNBZ0lHTm9ZWEpoWTNSbGNsWmxZM1J2Y2pvZ1puVnVZM1JwYjI0Z0tHNWhiV1VzSUhaaGJIVmxLU0I3SUZ4dUlDQWdJQ0FnY21WMGRYSnVJRkpKYm5CMWRDNXVaWGNvYm1GdFpTd2dkbUZzZFdVcExtTm9ZWEpoWTNSbGNsWmxZM1J2Y2lncE8xeHVJQ0FnSUgwc0lDQmNibHh1SUNBZ0lHUmhkR1ZXWldOMGIzSTZJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQjJZV3gxWlNrZ2V5QmNiaUFnSUNBZ0lISmxkSFZ5YmlCU1NXNXdkWFF1Ym1WM0tHNWhiV1VzSUhaaGJIVmxLUzVrWVhSbFZtVmpkRzl5S0NrN1hHNGdJQ0FnZlN3Z0lGeHVYRzRnSUNBZ2NHOXphWGhqZEZabFkzUnZjam9nWm5WdVkzUnBiMjRnS0c1aGJXVXNJSFpoYkhWbEtTQjdJRnh1SUNBZ0lDQWdjbVYwZFhKdUlGSkpibkIxZEM1dVpYY29ibUZ0WlN3Z2RtRnNkV1VwTG5CdmMybDRZM1JXWldOMGIzSW9LVHRjYmlBZ0lDQjlMRnh1WEc0Z0lDQWdiR2x6ZERvZ1puVnVZM1JwYjI0Z0tHNWhiV1VzSUhaaGJIVmxLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdVa2x1Y0hWMExtNWxkeWh1WVcxbExDQjJZV3gxWlNrdWJHbHpkQ2dwT3lCY2JpQWdJQ0I5TEZ4dVhHNGdJQ0FnWkdGMFlXWnlZVzFsT2lCbWRXNWpkR2x2YmlBb2JtRnRaU3dnZG1Gc2RXVXBJSHNnWEc0Z0lDQWdJQ0J5WlhSMWNtNGdVa2x1Y0hWMExtNWxkeWh1WVcxbExDQjJZV3gxWlNrdVpHRjBZV1p5WVcxbEtDazdYRzRnSUNBZ2ZTeGNiaUFnWEc0Z0lDQWdabUZqZEc5eU9pQm1kVzVqZEdsdmJpQW9ibUZ0WlN3Z2RtRnNkV1VzSUd4bGRtVnNjeXdnYkdGaVpXeHpLU0I3WEc0Z0lDQWdJQ0IyWVhJZ2IzQjBjeUE5SUhzZ2JHVjJaV3h6T2lCc1pYWmxiSE1zSUd4aFltVnNjem9nYkdGaVpXeHpJSDA3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdVa2x1Y0hWMExtNWxkeWh1WVcxbExDQjJZV3gxWlN3Z2IzQjBjeWt1Wm1GamRHOXlLQ2s3WEc0Z0lDQWdmU3hjYmx4dUlDQWdJRzl5WkdWeVpXUTZJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQjJZV3gxWlN3Z2JHVjJaV3h6TENCc1lXSmxiSE1wSUh0Y2JpQWdJQ0FnSUhaaGNpQnZjSFJ6SUQwZ2V5QnNaWFpsYkhNNklHeGxkbVZzY3l3Z2JHRmlaV3h6T2lCc1lXSmxiSE1nZlR0Y2JpQWdJQ0FnSUhKbGRIVnliaUJTU1c1d2RYUXVibVYzS0c1aGJXVXNJSFpoYkhWbExDQnZjSFJ6S1M1dmNtUmxjbVZrS0NrN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUc1MWJXVnlhV05OWVhSeWFYZzZJR1oxYm1OMGFXOXVJQ2h1WVcxbExDQjJZV3gxWlNrZ2V5QmNiaUFnSUNBZ0lISmxkSFZ5YmlCU1NXNXdkWFF1Ym1WM0tHNWhiV1VzSUhaaGJIVmxLUzV1ZFcxbGNtbGpUV0YwY21sNEtDazdYRzRnSUNBZ2ZTeGNibHh1SUNBZ0lHbHVkR1ZuWlhKTllYUnlhWGc2SUdaMWJtTjBhVzl1SUNodVlXMWxMQ0IyWVd4MVpTa2dleUJjYmlBZ0lDQWdJSEpsZEhWeWJpQlNTVzV3ZFhRdWJtVjNLRzVoYldVc0lIWmhiSFZsS1M1cGJuUmxaMlZ5VFdGMGNtbDRLQ2s3WEc0Z0lDQWdmU3hjYmx4dUlDQWdJR3h2WjJsallXeE5ZWFJ5YVhnNklHWjFibU4wYVc5dUlDaHVZVzFsTENCMllXeDFaU2tnZXlCY2JpQWdJQ0FnSUhKbGRIVnliaUJTU1c1d2RYUXVibVYzS0c1aGJXVXNJSFpoYkhWbEtTNXNiMmRwWTJGc1RXRjBjbWw0S0NrN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUdOb1lYSmhZM1JsY2sxaGRISnBlRG9nWm5WdVkzUnBiMjRnS0c1aGJXVXNJSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z1VrbHVjSFYwTG01bGR5aHVZVzFsTENCMllXeDFaU2t1WTJoaGNtRmpkR1Z5VFdGMGNtbDRLQ2s3WEc0Z0lDQWdmVnh1SUNCOVhHNTlPeUpkZlE9PSIsIm1vZHVsZS5leHBvcnRzPXtcbiAgICBcIi9yL3VzZXIvbG9naW5cIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci91c2VyL2xvZ291dFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3VzZXIvYWJvdXRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci91c2VyL2F1dG9zYXZlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvdXNlci9yZWxlYXNlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9jcmVhdGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3Bvb2xcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3JlY3ljbGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2xpc3RcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3BpbmdcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2Fib3V0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9hYm91dC91cGRhdGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3NhdmVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3NhdmVhc1wiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvY2xvc2VcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2dyYW50XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9pbXBvcnRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCIsXG4gICAgICAgIFwidXBsb2FkXCI6IHRydWVcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4cG9ydFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvZGVsZXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9leGVjdXRlL2NvZGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4ZWN1dGUvc2NyaXB0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9leGVjdXRlL2ludGVycnVwdFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvZXhlY3V0ZS9jb25zb2xlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9leGVjdXRlL2hpc3RvcnlcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4ZWN1dGUvZmx1c2hcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4ZWN1dGUvcmVzdWx0L2xpc3RcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2V4ZWN1dGUvcmVzdWx0L2Rvd25sb2FkXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9leGVjdXRlL3Jlc3VsdC9kZWxldGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3dvcmtzcGFjZS9saXN0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2UvZ2V0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2UvdXBsb2FkXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiLFxuICAgICAgICBcInVwbG9hZFwiOiB0cnVlXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2UvdHJhbnNmZXJcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3dvcmtzcGFjZS9wdXNoXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2Uvc2F2ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3Qvd29ya3NwYWNlL3N0b3JlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC93b3Jrc3BhY2UvbG9hZFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3Qvd29ya3NwYWNlL2RlbGV0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvZGlyZWN0b3J5L2xpc3RcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2RpcmVjdG9yeS91cGxvYWRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCIsXG4gICAgICAgIFwidXBsb2FkXCI6IHRydWVcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2RpcmVjdG9yeS90cmFuc2ZlclwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvZGlyZWN0b3J5L3dyaXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9kaXJlY3RvcnkvdXBkYXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9kaXJlY3Rvcnkvc3RvcmVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2RpcmVjdG9yeS9sb2FkXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcHJvamVjdC9kaXJlY3RvcnkvZG93bmxvYWRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L2RpcmVjdG9yeS9kZWxldGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3BhY2thZ2UvbGlzdFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3Byb2plY3QvcGFja2FnZS9hdHRhY2hcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9wcm9qZWN0L3BhY2thZ2UvZGV0YWNoXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3Ivam9iL2xpc3RcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9qb2Ivc3VibWl0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3Ivam9iL3NjaGVkdWxlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3Ivam9iL3F1ZXJ5XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3Ivam9iL2NhbmNlbFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL2pvYi9kZWxldGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9saXN0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvY3JlYXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvcmVuYW1lXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvY29weVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L21vdmVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS91cGRhdGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L3NjcmlwdC9saXN0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9zY3JpcHQvZXhlY3V0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvc2NyaXB0L3JlbmRlclwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvc2NyaXB0L2ludGVycnVwdFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvc2hlbGwvZXhlY3V0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L2FyY2hpdmVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS91cGxvYWRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCIsXG4gICAgICAgIFwidXBsb2FkXCI6IHRydWVcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9kb3dubG9hZFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L2RlbGV0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS9saXN0XCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9maWxlL2ZldGNoXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9maWxlL2ZldGNoXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9maWxlL3VwbG9hZFwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIixcbiAgICAgICAgXCJ1cGxvYWRcIjogdHJ1ZVxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS90cmFuc2ZlclwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS93cml0ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS91cGRhdGVcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvZGlmZlwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3JlcG9zaXRvcnkvZmlsZS9yZXZlcnRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvZ3JhbnRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvZG93bmxvYWRcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvZGVsZXRlXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJQT1NUXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IFwianNvblwiXG4gICAgfSxcblxuICAgIFwiL3IvcmVwb3NpdG9yeS9maWxlL2NvcHlcIjoge1xuICAgICAgICBcIm1ldGhvZFwiOiBcIlBPU1RcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9LFxuXG4gICAgXCIvci9yZXBvc2l0b3J5L2ZpbGUvbW92ZVwiOiB7XG4gICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICBcImZvcm1hdFwiOiBcImpzb25cIlxuICAgIH0sXG5cbiAgICBcIi9yL3NlcnZlci9pbmZvXCI6IHtcbiAgICAgICAgXCJtZXRob2RcIjogXCJHRVRcIixcbiAgICAgICAgXCJmb3JtYXRcIjogXCJqc29uXCJcbiAgICB9XG59XG4iLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xudmFyIExhbmcgPSByZXF1aXJlKCcuL2xhbmcnKSxcbiAgICBCYXNlID0gcmVxdWlyZSgnLi9zZWxmaXNoJykuQmFzZSxcbiAgICBSSW5wdXQgPSByZXF1aXJlKCcuL3JpbnB1dCcpO1xuXG52YXIgRGVwcmVjYXRlZCxcbiAgICBlbWl0dGVyLFxuICAgIF9jb25maWcgPSB7fSxcbiAgICBUT1BMRVZFTF9FTlRJVElFUyA9IFtcbiAgICAgICAgJ3VzZXInLFxuICAgICAgICAncHJvamVjdCcsXG4gICAgICAgICd3b3Jrc3BhY2UnLFxuICAgICAgICAnZXhlY3V0aW9uJyxcbiAgICAgICAgJ2RpcmVjdG9yeScsXG4gICAgICAgICdyZXBvc2l0b3J5JyxcbiAgICAgICAgJ3BhY2thZ2VzJ1xuICAgIF07XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudmFyIFNlc3Npb25NYW5hZ2VyID0ge1xuICAgIEVORFBPSU5UX1dISVRFTElTVDoge1xuICAgICAgICBsb2dpbjogJy9yL3VzZXIvbG9naW4nLFxuICAgICAgICBsb2dvdXQ6ICcvci91c2VyL2xvZ291dCcsXG4gICAgICAgIHByb2plY3RDcmVhdGU6ICcvci9wcm9qZWN0L2NyZWF0ZScsXG4gICAgICAgIHByb2plY3RDbG9zZTogJy9yL3Byb2plY3QvY2xvc2UnLFxuICAgICAgICBwcm9qZWN0QWJvdXRVcGRhdGU6ICcvci9wcm9qZWN0L2Fib3V0L3VwZGF0ZScsXG4gICAgICAgIHByb2plY3RTYXZlOiAnL3IvcHJvamVjdC9zYXZlJyxcbiAgICAgICAgcHJvamVjdFNhdmVBczogJy9yL3Byb2plY3Qvc2F2ZWFzJyxcbiAgICAgICAgLy8gLS0tIHByaXZhdGUgQVBJUyAtLS1cbiAgICAgICAgY2xpZW50UHJvamVjdFNhdmU6ICcvci9jbGllbnQvcHJvamVjdC9zYXZlJyxcbiAgICAgICAgY2xpZW50UHJvamVjdENsb3NlOiAnL3IvY2xpZW50L3Byb2plY3QvY2xvc2UnXG4gICAgfSxcblxuICAgIHNlc3Npb246IHt9LFxuXG4gICAgY29uZmlnOiB7fSxcblxuICAgIHNldFVubG9hZENvbmZpZzogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICBkaXNhYmxlYXV0b3NhdmU6IGNvbmZpZy5kaXNhYmxlYXV0b3NhdmUgfHwgdHJ1ZSxcbiAgICAgICAgICAgIGRyb3B3b3Jrc3BhY2U6IGNvbmZpZy5kcm9wd29ya3NwYWNlIHx8IHRydWUsXG4gICAgICAgICAgICBkcm9wZGlyZWN0b3J5OiBjb25maWcuZHJvcGRpcmVjdG9yeSB8fCB0cnVlLFxuICAgICAgICAgICAgZHJvcGhpc3Rvcnk6IGNvbmZpZy5kcm9waGlzdG9yeSB8fCB0cnVlLFxuICAgICAgICAgICAgZmx1c2hoaXN0b3J5OiBjb25maWcuZmx1c2hoaXN0b3J5IHx8IHRydWVcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIHNldFNlc3Npb246IGZ1bmN0aW9uKHNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB9LFxuICAgIHNldFByb2plY3Q6IGZ1bmN0aW9uKHByb2plY3QpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnByb2plY3QgPSBwcm9qZWN0O1xuICAgIH0sXG4gICAgY2xlYXJTZXNzaW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uID0ge307XG4gICAgfSxcbiAgICBjbGVhclByb2plY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNlc3Npb24ucHJvamVjdCA9IG51bGw7XG4gICAgfSxcbiAgICB1bmxvYWRIYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBwcm9qZWN0ID0gdGhpcy5zZXNzaW9uLnByb2plY3Q7XG4gICAgICAgICAgICBpZiAocHJvamVjdCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9jb25maWc7XG4gICAgICAgICAgICAgICAgZGF0YS5wcm9qZWN0ID0gcHJvamVjdC5pZDtcbiAgICAgICAgICAgICAgICBkYXRhLnByb2plY3Rjb29raWUgPSBwcm9qZWN0LmNvb2tpZTtcblxuICAgICAgICAgICAgICAgIGRlcGxveXIuaW8oJy9yL3Byb2plY3QvY2xvc2UnKVxuICAgICAgICAgICAgICAgICAgICAuZGF0YShkYXRhKVxuICAgICAgICAgICAgICAgICAgICAuc3luYygpXG4gICAgICAgICAgICAgICAgICAgIC5lbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBmb3JtYXQocmVzcG9uc2UsIHRyYW5zRW50aXR5KSB7XG4gICAgLy8gLS0gdHJhbnNhY3Rpb24gZW50aXR5IGZvcm1hdHMgb3ZlcnJpZGUgZ2xvYmFsIGVudGl0eSBmb3JtYXRzIC0tICBcbiAgICAvL3ZhciBmb3JtYXQgPSB0cmFuc0VudGl0eSB8fCBfY29uZmlnLmVudGl0eTtcbiAgICB2YXIgZm9ybWF0ID0gdHJhbnNFbnRpdHkgfHwgZ2xvYmFsQ29uZmlnLmVudGl0eTtcblxuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAgdmFyIHJlc09iaiA9IHJlc3BvbnNlLmRlcGxveXIucmVzcG9uc2UsXG4gICAgICAgICAgICAvLyAtLSB0b3AtbGV2ZWwgZW50aXRpZXMgLS1cbiAgICAgICAgICAgIGVudGl0aWVzID0gVE9QTEVWRUxfRU5USVRJRVM7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGVudGl0aWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIGVudGl0eSA9IGVudGl0aWVzW2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKHJlc09ialtlbnRpdHldICYmIGZvcm1hdFtlbnRpdHldKSB7IC8vIHJlc3BvbnNlIGVudGl0eSBoaXRcbiAgICAgICAgICAgICAgICAvLyAtLSB1c2VyLWRlZmluZWQgcGFyc2UgZm9yIHRvcC1sZXZlbCBlbnRpdHkgLS0gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdFtlbnRpdHldLnBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0U2NvcGUgPSBmb3JtYXRbZW50aXR5XS5zY29wZSB8fCB0aGlzO1xuICAgICAgICAgICAgICAgICAgICByZXNPYmpbZW50aXR5XSA9IGZvcm1hdFtlbnRpdHldLnBhcnNlci5jYWxsKGZvcm1hdFNjb3BlLCByZXNPYmpbZW50aXR5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VFbmRwb2ludChyZXNwb25zZSwgZW5kcG9pbnQsIGFyZ3MpIHtcblxuICAgIHZhciByZXNPYmogPSByZXNwb25zZS5kZXBsb3lyLnJlc3BvbnNlLFxuICAgICAgICBFTkRQT0lOVCA9IFNlc3Npb25NYW5hZ2VyLkVORFBPSU5UX1dISVRFTElTVDtcblxuICAgIHN3aXRjaCAoZW5kcG9pbnQpIHtcblxuICAgICAgICBjYXNlIEVORFBPSU5ULmxvZ2luOlxuXG4gICAgICAgICAgICBTZXNzaW9uTWFuYWdlci5zZXRTZXNzaW9uKHtcbiAgICAgICAgICAgICAgICBodHRwY29va2llOiByZXNPYmouaHR0cGNvb2tpZSxcbiAgICAgICAgICAgICAgICB1c2VyOiByZXNPYmoudXNlcixcbiAgICAgICAgICAgICAgICBsaW1pdHM6IHJlc09iai5saW1pdHMsXG4gICAgICAgICAgICAgICAgcHJvamVjdDogbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEVORFBPSU5ULmxvZ291dDpcbiAgICAgICAgICAgIFNlc3Npb25NYW5hZ2VyLmNsZWFyU2Vzc2lvbigpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBFTkRQT0lOVC5wcm9qZWN0Q2xvc2U6XG4gICAgICAgIGNhc2UgRU5EUE9JTlQuY2xpZW50UHJvamVjdENsb3NlOlxuICAgICAgICAgICAgU2Vzc2lvbk1hbmFnZXIuY2xlYXJQcm9qZWN0KCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEVORFBPSU5ULnByb2plY3RDcmVhdGU6XG4gICAgICAgIGNhc2UgRU5EUE9JTlQucHJvamVjdEFib3V0VXBkYXRlOlxuICAgICAgICBjYXNlIEVORFBPSU5ULnByb2plY3RTYXZlOlxuICAgICAgICBjYXNlIEVORFBPSU5ULnByb2plY3RTYXZlQXM6XG4gICAgICAgIGNhc2UgRU5EUE9JTlQuY2xpZW50UHJvamVjdFNhdmU6XG4gICAgICAgICAgICB2YXIgcHJvamVjdCA9IHJlc09iai5wcm9qZWN0O1xuICAgICAgICAgICAgU2Vzc2lvbk1hbmFnZXIuc2V0UHJvamVjdCh7XG4gICAgICAgICAgICAgICAgaWQ6IHByb2plY3QucHJvamVjdCxcbiAgICAgICAgICAgICAgICBjb29raWU6IHByb2plY3QuY29va2llXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgfSAvLyBlbmQgc3dpdGNoXG5cbiAgICBEZXByZWNhdGVkLkV2ZW50LmZpcmUoJ0RlcGxveVI6ZW5kcG9pbnRDaGFuZ2UnLCB7XG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgZW5kcG9pbnQ6IGVuZHBvaW50LFxuICAgICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gY2FtZWxDYXNlKGlucHV0KSB7XG4gICAgLy8gY29udmVydCBmb3JtYXQ6ICcvci91c2VyL2xvZ2luJyAtLT4gJ3VzZXJMb2dpbidcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoJ1xcL3JcXC8nLCAnJyk7XG4gICAgcmV0dXJuIGlucHV0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFwvKC4pL2csIGZ1bmN0aW9uKG1hdGNoLCBzZWdtZW50KSB7XG4gICAgICAgIHJldHVybiBzZWdtZW50LnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG59XG5cbi8vIHR1cm4gdGhlIG9sZCBkZXByZWNhdGVkIGlucHV0cyBpbnRvIG5ldyBpbnB1dHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZUlucHV0cyhpbnB1dHMpIHtcbiAgICB2YXIgcmlucHV0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmlucHV0cy5wdXNoKGlucHV0c1tpXS5ub3JtYWxpemUoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJpbnB1dHM7XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBUaGUgRGVwcmVjYXRlZCBpbnRlcmZhY2UuXG4gKi9cbnZhciBSRGF0YSA9IEJhc2UuZXh0ZW5kKHtcbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbih0eXBlLCByY2xhc3MsIHJpbnB1dCkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnJjbGFzcyA9IHJjbGFzcztcbiAgICAgICAgdGhpcy5yaW5wdXQgPSByaW5wdXQ7XG4gICAgfSxcblxuICAgIGdldFR5cGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlO1xuICAgIH0sXG5cbiAgICBnZXRSQ2xhc3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yY2xhc3M7XG4gICAgfSxcblxuICAgIGdldE5hbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaW5wdXQubmFtZTtcbiAgICB9LFxuXG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaW5wdXQudmFsdWU7XG4gICAgfSxcblxuICAgIGdldExldmVsczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJpbnB1dC5sZXZlbHM7XG4gICAgfSxcblxuICAgIGdldExhYmVsczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJpbnB1dC5sYWJlbHM7XG4gICAgfSxcblxuICAgIGdldE9yZGVyZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaW5wdXQub3JkZXJlZDtcbiAgICB9LFxuXG4gICAgbm9ybWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmlucHV0O1xuICAgIH1cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7ICBcbiAgXG59XG5cbmZ1bmN0aW9uIGRlYnVnKG1zZykgeyAgXG59XG5cbkVtaXR0ZXIucHJvdG90eXBlID0ge1xuXG4gIGV2ZW50czoge30sXG5cbiAgc2NvcGU6IG51bGwsXG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsaXN0ZW5lci4gIE11bHRpcGxlIGNhbiBiZSBhZGRlZCBwZXIgbmFtZS4gIEFsaWFzZWQgYXMgYG9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgQSBjYWxsYmFja1xuICAgKi9cbiAgb246IGZ1bmN0aW9uKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgdGhpcy5ldmVudHNbbmFtZV0gPSBbXTsgfSAgICAgICAgXG5cbiAgICB0aGlzLmV2ZW50c1tuYW1lXS5wdXNoKGhhbmRsZXIpO1xuICAgIGRlYnVnKCdFbWl0dGVyLm9uKFwiJyArIG5hbWUgKyAnXCIpJyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogVHJpZ2dlcnMgYWxsIG1hdGNoaW5nIGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgYW4gZXZlbnQgZmlyZWRcbiAgICovXG4gIGVtaXQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgcmV0dXJuIHRoaXM7IH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ldmVudHNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYnVnKCdGaXJlZCBldmVudDogXCInICsgbmFtZSArICdcIicpO1xuICAgICAgdGhpcy5ldmVudHNbbmFtZV1baV0uYXBwbHkodGhpcy5zY29wZSB8fCB0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgICAgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIG1hdGNoaW5nIGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgYW4gZXZlbnQgd2FzIHJlbW92ZWRcbiAgICovXG4gIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLmV2ZW50cykge1xuICAgICAgICBkZWxldGUgdGhpcy5ldmVudHNbZV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuYW1lIGluIHRoaXMuZXZlbnRzID09PSBmYWxzZSkgeyByZXR1cm4gdGhpczsgfVxuICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzW25hbWVdOyAgICAgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcmVtb3ZlTGlzdGVuZXJBdDogZnVuY3Rpb24obmFtZSwgaW5kZXgpIHtcbiAgICB2YXIgYXJyYXkgPSB0aGlzLmV2ZW50c1tuYW1lXSxcbiAgICAgICAgcmVzdCA9IGFycmF5LnNsaWNlKGluZGV4ICsgMSk7XG5cbiAgICBhcnJheS5sZW5ndGggPSBpbmRleDtcbiAgICBhcnJheS5wdXNoLmFwcGx5KGFycmF5LCByZXN0KTtcbiAgICB0aGlzLmV2ZW50c1tuYW1lXSA9IGFycmF5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgYmFzZWQgb24gdGhlIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIGFuIGV2ZW50IHdhcyByZW1vdmVkXG4gICAqL1xuICBvZmY6IGZ1bmN0aW9uKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgcmV0dXJuIHRoaXM7IH1cblxuICAgIC8vIHJlbW92ZSBhbGwgZXZlbnRzIGhhbmRsZXJzIGJ5IHRoaXMgbmFtZVxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICAgIH0gZWxzZSB7IC8vIHJlbW92ZSBhbGwgZXZlbnRzIGhhbmRsZXJzID09ICdoYW5kbGVyJyBieSB0aGlzIG5hbWVcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ldmVudHNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzW25hbWVdW2ldID09IGhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyQXQobmFtZSwgaSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IFxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5cblxuZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG5cbi8qKlxuICogUHJvdmlkZXMgc2ltcGxlIGFkYXB0ZXIgbWV0aG9kcyB3aGljaCB3cmFwIHRoZSByYXcgPGNvZGU+UmV2b2x1dGlvbi5EZXBsb3lSLmlvKC4uLik8L2NvZGU+XG4gKiByZW1vdGUgRGVwbG95UiBBUEkgQUpBWCB0cmFuc2FjdGlvbnMuIFRoZXNlIG1ldGhvZHMgYXJlIGFuIG9wdC1pbiBmZWF0dXJlIHRvXG4gKiBjb21wbGVtZW50IHRoZSBsb3cgbGV2ZWwgRGVwbG95UiBJTyBjb21tdW5pY2F0aW9uLlxuICpcbiAqIEBjbGFzcyBSZXZvbHV0aW9uLkRlcGxveVIuUHVibGljQWRhcHRlclxuICogQGV4dGVuc2lvbmZvciBSZXZvbHV0aW9uLkRlcGxveVJcbiAqL1xuXG5EZXByZWNhdGVkID0ge1xuICAgIHZlcnNpb246IHJlcXVpcmUoJy4uL3BhY2thZ2UnKS52ZXJzaW9uLFxuXG4gICAgRXZlbnQ6IHtcbiAgICAgICAgb246IGZ1bmN0aW9uKHR5cGUsIGZuLCBzY29wZSkge1xuICAgICAgICAgICAgZW1pdHRlci5vbih0eXBlLCBmbiwgc2NvcGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRldGFjaDogZnVuY3Rpb24odHlwZSwgZm4sIG9iaikge1xuICAgICAgICAgICAgZW1pdHRlci5vZmYodHlwZSwgZm4pOyAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIFJEYXRhRmFjdG9yeToge1xuICAgICAgICBjcmVhdGVOdW1lcmljOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygncHJpbWl0aXZlJywgJ251bWVyaWMnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5udW1lcmljKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUludGVnZXI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdwcmltaXRpdmUnLCAnaW50ZWdlcicsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmludGVnZXIoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlQm9vbGVhbjogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ3ByaW1pdGl2ZScsICdudW1lcmljJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubG9naWNhbCgpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVTdHJpbmc6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdwcmltaXRpdmUnLCAnY2hhcmFjdGVyJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuY2hhcmFjdGVyKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZURhdGU6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdkYXRlJywgJ0RhdGUnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5kYXRlKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVBPU0lYRGF0ZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ2RhdGUnLCAnUE9TSVhjdCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLnBvc2l4Y3QoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlTnVtZXJpY1ZlY3RvcjogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ3ZlY3RvcicsICdudW1lcmljJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubnVtZXJpY1ZlY3RvcigpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVJbnRlZ2VyVmVjdG9yOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygndmVjdG9yJywgJ2ludGVnZXInLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5pbnRlZ2VyVmVjdG9yKCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZUJvb2xlYW5WZWN0b3I6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCd2ZWN0b3InLCAnbG9naWNhbCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmxvZ2ljYWxWZWN0b3IoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlU3RyaW5nVmVjdG9yOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygndmVjdG9yJywgJ2NoYXJhY3RlcicsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmNoYXJhY3RlclZlY3RvcigpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVEYXRlVmVjdG9yOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygndHlwZScsICdEYXRlJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkuZGF0ZVZlY3RvcigpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVQT1NJWERhdGVWZWN0b3I6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCd2ZWN0b3InLCAnUE9TSVhjdCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLnBvc2l4Y3RWZWN0b3IoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlTGlzdDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ2xpc3QnLCAnbGlzdCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmxpc3QoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlRGF0YWZyYW1lOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygnZGF0YWZyYW1lJywgJ2RhdGEuZnJhbWUnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5kYXRhZnJhbWUoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlRmFjdG9yOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgb3JkZXJlZCwgbGV2ZWxzLCBsYWJlbHMpIHtcbiAgICAgICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgICAgIGxldmVsczogbGV2ZWxzLFxuICAgICAgICAgICAgICAgIGxhYmVsczogbGFiZWxzXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAob3JkZXJlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ2ZhY3RvcicsICdmYWN0b3InLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlLCBvcHRzKS5vcmRlcmVkKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdmYWN0b3InLCAnZmFjdG9yJywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSwgb3B0cykuZmFjdG9yKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZU51bWVyaWNNYXRyaXg6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUkRhdGEubmV3KCdtYXRyaXgnLCAnbWF0cml4JywgUklucHV0Lm5ldyhuYW1lLCB2YWx1ZSkubnVtZXJpY01hdHJpeCgpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVJbnRlZ2VyTWF0cml4OiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJEYXRhLm5ldygnbWF0cml4JywgJ21hdHJpeCcsIFJJbnB1dC5uZXcobmFtZSwgdmFsdWUpLmludGVnZXJNYXRyaXgoKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlQm9vbGVhbk1hdHJpeDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ21hdHJpeCcsICdtYXRyaXgnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5sb2dpY2FsTWF0cml4KCkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZVN0cmluZ01hdHJpeDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBSRGF0YS5uZXcoJ21hdHJpeCcsICdtYXRyaXgnLCBSSW5wdXQubmV3KG5hbWUsIHZhbHVlKS5jaGFyYWN0ZXJNYXRyaXgoKSk7XG4gICAgICAgIH1cbiAgICB9LCAvLyBSRGF0YUZhY3RvcnlcblxuICAgIERlcGxveVI6IHtcblxuICAgICAgICBpbml0OiBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcblxuICAgICAgICAgICAgLy8gLS0tIEFzc2VydCBKU0RlcGxveSBjb21wYXRhYmlsaXR5IGFnYWluc3QgdGhlIGNvbm5lY3RlZCBEZXBsb3lSIHZlcnNpb24gLS0tXG4gICAgICAgICAgICBpZiAoY29uZmlnLmNvbXBhdGliaWxpdHkpIHtcbiAgICAgICAgICAgICAgICAvL2NvbXBhdGliaWxpdHlDaGVjaygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gRXZlbnQgcmVnaXN0cmF0aW9uIC0tLVxuICAgICAgICAgICAgaWYgKGNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRzID0gY29uZmlnLmV2ZW50cztcblxuICAgICAgICAgICAgICAgIC8vIC0tIE1hbmFnZSBjbGVhbnVwIG9uIGJyb3dzZXIgY2xvc2UgKGNsb3NlIHByb2plY3QsIGxvZ291dCwgZWN0Li4uKS0tXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50cy51bmxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1hbmFnZXIuc2V0VW5sb2FkQ29uZmlnKGV2ZW50cy51bmxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGVkLkV2ZW50Lm9uKCdkZXBsb3lSOnVubG9hZCcsIFNlc3Npb25NYW5hZ2VyLnVubG9hZEhhbmRsZXIsIFNlc3Npb25NYW5hZ2VyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyAtLSBJTyBHbG9iYWwgRXZlbnRzIC0tXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50cy5nbG9iYWxJTykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2NvcGUgPSBldmVudHMuZ2xvYmFsSU8uc2NvcGUgfHwgd2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlID0gZXZlbnRzLmdsb2JhbElPLmxpZmVjeWNsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBldmVudHMuZ2xvYmFsSU8uc3RhdHVzQ29kZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gbGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZC5FdmVudC5vbignZGVwbG95Ui1pbzonICsgZXZlbnROYW1lLCBsaWZlY3ljbGVbZXZlbnROYW1lXSwgc2NvcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBzdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZC5FdmVudC5vbignZGVwbG95Ui1pbzonICsgZXZlbnROYW1lLCBzdGF0dXNDb2RlW2V2ZW50TmFtZV0sIHNjb3BlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTmV3IEFQSVxuICAgICAgICAgICAgZGVwbG95ci5jb25maWd1cmUoe1xuICAgICAgICAgICAgICAgIGhvc3Q6IGNvbmZpZy5kZXBsb3lyVVJJLFxuICAgICAgICAgICAgICAgIGNvcnM6IGNvbmZpZy5kZXBsb3lyVVJJID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxvZ2dpbmc6IGNvbmZpZy5sb2dnaW5nLFxuICAgICAgICAgICAgICAgIHN0aWNreTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW86IGZ1bmN0aW9uKGFwaSwgY29uZmlnLCBjYikge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1wiJyArIGNhbWVsQ2FzZShhcGkpICsgJygpXCIgQVBJIGlzIG5vdyBkZXByZWNhdGVkLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYiA9IGNiIHx8IHt9O1xuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuXG4gICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb24gPSBjb25maWcudHJhbnNhY3Rpb24gfHwge30sXG4gICAgICAgICAgICAgICAgdHJhbnNBcmdzID0gdHJhbnNhY3Rpb25bJ2FyZ3VtZW50cyddLFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSB0cmFuc2FjdGlvbi5zdGF0dXNDb2RlIHx8IHt9LFxuICAgICAgICAgICAgICAgIHNjb3BlID0gY2Iuc2NvcGUgfHwgd2luZG93LFxuICAgICAgICAgICAgICAgIHJvdXRwdXRzID0gY29uZmlnLnJvYmplY3RzLFxuICAgICAgICAgICAgICAgIHJpbnB1dHMgPSBjb25maWcuaW5wdXRzOyAvLyBjb25maWcuaW5wdXRzID0gUi5EZXBsb3lSLnBhcnNlSW5wdXRzKGNvbmZpZy5pbnB1dHMpO1xuXG4gICAgICAgICAgICAvLyAtLS0gb21pdCBkZXByZWNhdGVkIHByb3BzIC0tLVxuICAgICAgICAgICAgaWYgKGNvbmZpZy50cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcudHJhbnNhY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcubWV0aG9kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZy5vbikge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcub247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnLmZvcm1hdCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuZm9ybWF0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbnB1dHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLmlucHV0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25maWcucm9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLnJvYmplY3RzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gbWFrZSB0aGUgbmV3IHJlcXVlc3QgLS0tXG4gICAgICAgICAgICB2YXIgaW8gPSBkZXBsb3lyLmlvKGFwaSlcbiAgICAgICAgICAgICAgICAuZGF0YShjb25maWcgfHwge30pXG4gICAgICAgICAgICAgICAgLmVycm9yKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbC1mYWlsdXJlXG4gICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnZGVwbG95Ui1pbzpmYWlsdXJlJywgW3Jlc3BvbnNlLCBhcGksIHRyYW5zQXJnc10pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLWZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNiLmZhaWx1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmZhaWx1cmUuYXBwbHkoc2NvcGUsIFtyZXNwb25zZSwgYXBpLCB0cmFuc0FyZ3NdKTsgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbC1zdGF0dXNFcnJvclxuICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoKCdkZXBsb3lSLWlvOicgKyBjb2RlKSwgW3Jlc3BvbnNlLCBhcGksIHRyYW5zQXJnc10pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmlucHV0cykge1xuICAgICAgICAgICAgICAgIGlvLnJpbnB1dHMobm9ybWFsaXplSW5wdXRzKHJpbnB1dHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb3V0cHV0cykge1xuICAgICAgICAgICAgICAgIGlvLnJvdXRwdXRzKHJvdXRwdXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5zeW5jKSB7XG4gICAgICAgICAgICAgICAgaW8uc3luYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBpby50aW1lb3V0KHRyYW5zYWN0aW9uLnRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gRXJyb3Igc3RhdHVzIGNvZGUgLS0tIC8vXG4gICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSkge1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHN0YXR1c0NvZGUpIHsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpby5vbignZGVwbG95ci1pbzonICsgZXZlbnROYW1lLCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNiID0gc3RhdHVzQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXNUZXh0ID0gcmVzcG9uc2UuZGVwbG95ci5yZXNwb25zZS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSByZXNwb25zZS5kZXBsb3lyLnJlc3BvbnNlLmVycm9yQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiW3N0YXR1c10uYXBwbHkoc2NvcGUsIFtyZXNwb25zZSwgc3RhdHVzLCBzdGF0dXNUZXh0LCBhcGksIHRyYW5zQXJnc10pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgLy8gQEBAQFRPRE8gQEBAQEBAXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGdsb2JhbC1zdGFydFxuICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdkZXBsb3lSLWlvOnN0YXJ0Jyk7XG5cbiAgICAgICAgICAgIC8vLyB0cmFuc2FjdGlvbi1zdGFydFxuICAgICAgICAgICAgaWYgKGNiLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgY2Iuc3RhcnQuYXBwbHkoc2NvcGUsIFthcGksIHRyYW5zQXJnc10pOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW8uZW5kKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsLWNvbXBsZXRlXG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdkZXBsb3lSLWlvOmNvbXBsZXRlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbi1jb21wbGV0ZVxuICAgICAgICAgICAgICAgIGlmIChjYi5jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYi5jb21wbGV0ZS5hcHBseShzY29wZSwgW3Jlc3BvbnNlLCBhcGksIHRyYW5zQXJnc10pOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbWFuaXB1bGF0aW9uIG9mIHRoZSByZXNwb25zZVxuICAgICAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBmb3JtYXQocmVzcG9uc2UsIHRyYW5zYWN0aW9uLmVudGl0eSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsLXN1Y2Nlc3NcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoJ2RlcGxveVItaW86c3VjY2VzcycsIFtyZXNwb25zZSwgYXBpXSk7XG5cbiAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbi1zdWNjZXNzXG4gICAgICAgICAgICAgICAgaWYgKGNiLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY2Iuc3VjY2Vzcy5hcHBseShzY29wZSwgW3Jlc3BvbnNlLCBhcGksIHRyYW5zQXJnc10pOyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsLWVuZFxuICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnZGVwbG95Ui1pbzplbmQnLCBbcmVzcG9uc2UsIGFwaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24tZW5kXG4gICAgICAgICAgICAgICAgaWYgKGNiLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICBjYi5lbmQuYXBwbHkoc2NvcGUsIFtyZXNwb25zZSwgYXBpLCB0cmFuc0FyZ3NdKTsgXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gaW87XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYXR0ZW5zIGEgZ2l2ZW4gPGNvZGU+UmV2b2x1dGlvbi5SRGF0YTwvY29kZT4gdHlwZSBpbnRvIGEgSlNPTlxuICAgICAgICAgKiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBleHBlY3RlZCBEZXBsb3lSIGlucHV0IGZvcm1hdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwYXJzZUlucHV0c1xuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHJkYXRhIEFuIEFycmF5IG9mIFJEYXRhIE9iamVjdHMgdG8gYmUgZmxhdHRlbmVkLlxuICAgICAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBmbGF0dGVuZCBSRGF0YSBKU09OIHN0cmluZyByZXByZXNlbnRpbmcgdGhlXG4gICAgICAgICAqIERlcGxveVIgaW5wdXQgZm9ybWF0LlxuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2VJbnB1dHM6IGZ1bmN0aW9uKHJkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gcmRhdGE7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBQcm9qZWN0IFdvcmtzcGFjZSBBUElzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBsaXN0cyB0aGUgb2JqZWN0cyBpbiB0aGUgd29ya3NwYWNlIGZvciB0aGUgcHJvamVjdCBpbmRpY2F0ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFdvcmtzcGFjZUxpc3RcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJvb3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgb2JqZWN0IGdyYXBoIHJvb3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y2xheno8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgUiBjbGFzcyBiYXNlZCBmaWx0ZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsdGVyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIFIgb2JqZWN0IG5hbWUgYmFzZWQgZmlsdGVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGUsIGxpbWl0cyByZXR1cm5lZCBvYmplY3RzIHRvIG9iamVjdFxuICAgICAgICAgKiAgICAgICB0eXBlcyB3aXRoIHN1cHBvcnRlZCBSZXZvRGVwbG95Ui1lbmNvZGluZ1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cGFnZXNpemU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBwYWdlIHNpemUgZm9yIHBhZ2luZyByZXN1bHRzIGluIHJlc3BvbnNlXG4gICAgICAgICAqICAgICAgIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cGFnZW9mZnNldDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHBhZ2Ugb2Zmc2V0IGZvciBwYWdpbmcgcmVzdWx0cyBpbiByZXNwb25zZVxuICAgICAgICAgKiAgICAgICBtYXJrdXBcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0V29ya3NwYWNlTGlzdDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvd29ya3NwYWNlL2xpc3QnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJldHJpZXZlcyBSZXZvRGVwbG95Ui1lbmNvZGVkIG9iamVjdHMgZnJvbSB0aGUgd29ya3NwYWNlIGZvciB0aGVcbiAgICAgICAgICogc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFdvcmtzcGFjZUdldFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvYmplY3QgbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cm9vdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5vcHRpb25hbCkgc3BlY2lmaWVzIG9iamVjdCBncmFwaCByb290PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0YXJ0PC9kdD5cbiAgICAgICAgICogICAgPGRkPm9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG9mZnNldCBpbnRvIG9iamVjdCBkYXRhPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pmxlbmd0aDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5vcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBzZWdtZW50IG9mIG9iamVjdCBkYXRhIHRvIHJldHJpZXZlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+aW5maW5pdHk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGEgY3VzdG9tIHZhbHVlIGZvciBJbmZpbml0eSBhcHBlYXJpbmcgaW4gUlxuICAgICAgICAgKiAgICAgICBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiB0aGUgY2FsbCwgb3RoZXJ3aXNlIEluZmluaXR5IGlzIHJlcHJlc2VudGVkXG4gICAgICAgICAqICAgICAgIGJ5IDB4N2ZmMDAwMDAwMDAwMDAwMExcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+bmFuPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyBjdXN0b20gdmFsdWUgZm9yIE5hTiBhcHBlYXJpbmcgaW4gUiBvYmplY3QgZGF0YVxuICAgICAgICAgKiAgICAgICByZXR1cm5lZCBvbiB0aGUgY2FsbCwgb3RoZXJ3aXNlIE5hTiBpcyByZXByZXNlbnRlZCBieSBudWxsXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5lbmNvZGVEYXRhRnJhbWVQcmltaXRpdmVBc1ZlY3RvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGF0YS5mcmFtZSBwcmltaXRpdmVzIGFyZSBlbmNvZGVkXG4gICAgICAgICAqICAgICAgIHZlY3RvcnMgaW4gUiBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiBjYWxsXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFdvcmtzcGFjZUdldDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvd29ya3NwYWNlL2dldCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgdXBsb2FkcyBhIGJpbmFyeSBvYmplY3QgZnJvbSBmaWxlIGludG8gdGhlIHdvcmtzcGFjZSBmb3IgdGhlXG4gICAgICAgICAqIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RXb3Jrc3BhY2VVcGxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlPC9kdD5cbiAgICAgICAgICogICAgPGRkPmZpbGUgY29udGVudDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFdvcmtzcGFjZVVwbG9hZDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IFwidGV4dFwiO1xuICAgICAgICAgICAgdmFyIGlvQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5mb3JtSWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3dvcmtzcGFjZS91cGxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHRyYW5zZmVycyBhIGJpbmFyeSBvYmplY3QgZnJvbSBhIFVSTCBpbnRvIHRoZSB3b3Jrc3BhY2UgZm9yIHRoZVxuICAgICAgICAgKiBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0V29ya3NwYWNlVHJhbnNmZXJcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZmlsZSBmb3VuZCBvbiB0aGUgVVJMPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnVybDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIFVSTDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFdvcmtzcGFjZVRyYW5zZmVyOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC93b3Jrc3BhY2UvdHJhbnNmZXInLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHB1c2hlcyBhIFJldm9EZXBsb3lSLWVuY29kZWQgb2JqZWN0IGludG8gdGhlIHdvcmtzcGFjZSBmb3IgdGhlXG4gICAgICAgICAqIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RXb3Jrc3BhY2VQdXNoXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBSZXZvRGVwbG95Ui1lbmNvZGVkIG9iamVjdCBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y3N2aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJpbWl0aXZlIG5hbWUvdmFsdWUgaW5wdXRzPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0V29ya3NwYWNlUHVzaDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvd29ya3NwYWNlL3B1c2gnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHNhdmVzIHRoZSB3b3Jrc3BhY2UgdG8gYSBmaWxlIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlXG4gICAgICAgICAqIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiB0aGUgbmFtZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIG9uIHRoZSBjYWxsIHRoZW4gb25seSB0aGUgbmFtZWQgb2JqZWN0XG4gICAgICAgICAqIGlzIHNhdmVkIGFzIGEgYmluYXJ5IG9iamVjdCBmaWxlIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gT3RoZXJ3aXNlIHRoZVxuICAgICAgICAgKiBlbnRpcmUgY29udGVudHMgb2YgdGhlIHdvcmtzcGFjZSBhcmUgc2F2ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFdvcmtzcGFjZVNhdmVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBuYW1lZCBvYmplY3QgZm9yIHNhdmluZzwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGRlc2NyaXB0aW9uIHRvIGFjY29tcGFueSB0aGUgc2F2ZWQgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBuZXcgZmlsZSB3aWxsIGJlIHJlbmFtZWQgdG8gYXZvaWRcbiAgICAgICAgICogICAgICAgb3ZlcndyaXRpbmdcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0V29ya3NwYWNlU2F2ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvd29ya3NwYWNlL3NhdmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHN0b3JlcyB0aGUgd29ya3NwYWNlIGFzIGEgYmluYXJ5IG9iamVjdCB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIG5hbWUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBvbiB0aGUgY2FsbCwgdGhlbiBvbmx5IHRoZSBuYW1lZCBvYmplY3RcbiAgICAgICAgICogaXMgc3RvcmVkIGFzIGEgYmluYXJ5IG9iamVjdCBpbiB0aGUgcmVwb3NpdG9yeS4gT3RoZXJ3aXNlIHRoZSBlbnRpcmVcbiAgICAgICAgICogY29udGVudHMgb2YgdGhlIHdvcmtzcGFjZSBhcmUgc3RvcmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RXb3Jrc3BhY2VTdG9yZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBuYW1lZCBvYmplY3QgZm9yIHN0b3Jpbmc8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgZGVzY3JpcHRpb24gdG8gYWNjb21wYW55IHRoZSBzYXZlZCBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZ3M8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVwb3NpdG9yeSBmaWxlXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXN0cmljdGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJvbGUgbmFtZXMsIHdoaWNoIG1ha2VzIHRoZSBmaWxlXG4gICAgICAgICAqICAgICAgIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCB1c2VycyB3aXRoIHRoZXNlIHJvbGVzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBmaWxlIHdpbGwgYmUgc2hhcmVkLCB3aGljaFxuICAgICAgICAgKiAgICAgICBtYWtlcyB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnB1Ymxpc2hlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGZpbGUgd2lsbCBiZSBwdWJsaXNoZWQsIHdoaWNoXG4gICAgICAgICAqICAgICAgIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0Pm5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIG5ldyBmaWxlIHdpbGwgYmUgcmVuYW1lZCB0b1xuICAgICAgICAgKiAgICAgICBhdm9pZCBvdmVyd3JpdGluZ1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiAgPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0V29ya3NwYWNlU3RvcmU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3dvcmtzcGFjZS9zdG9yZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgbG9hZHMgYSBiaW5hcnkgb2JqZWN0IGZyb20gYSBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGludG8gdGhlXG4gICAgICAgICAqIHdvcmtzcGFjZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RXb3Jrc3BhY2VMb2FkXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXBvPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBhdXRob3I8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSB2ZXJzaW9uPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFdvcmtzcGFjZUxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3dvcmtzcGFjZS9sb2FkJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkZWxldGVzIGFuIG9iamVjdCBmcm9tIHRoZSB3b3Jrc3BhY2UgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0V29ya3NwYWNlRGVsZXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgb2JqZWN0IG5hbWU8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RXb3Jrc3BhY2VEZWxldGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3dvcmtzcGFjZS9kZWxldGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFByb2plY3QgTWFuYWdlbWVudCBBUElzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGNyZWF0ZXMgYSBuZXcgcHJvamVjdCBmb3IgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAgICAgICAqIElmIHRoZSBwcm9qZWN0bmFtZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIG9uIHRoZSBjYWxsLCB0aGVuIHRoZSBuZXdseVxuICAgICAgICAgKiBjcmVhdGVkIHByb2plY3Qgd2lsbCBiZSBhIHBlcnNpc3RlbnQgcHJvamVjdCAuIElmIHRoZSBwcm9qZWN0bmFtZSBwYXJhbWV0ZXJcbiAgICAgICAgICogaXMgb21pdHRlZCBvbiB0aGUgY2FsbCwgdGhlbiB0aGUgbmV3bHkgY3JlYXRlZCBwcm9qZWN0IHdpbGwgYmUgYSB0ZW1wb3JhcnlcbiAgICAgICAgICogcHJvamVjdC4gVGhlIHByb2plY3RkZXNjciBwYXJhbWV0ZXIgaXMgaWdub3JlZCBpZiB0aGUgcHJvamVjdG5hbWUgcGFyYW1ldGVyXG4gICAgICAgICAqIGlzIG9taXR0ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBibGFja2JveCBwYXJhbWV0ZXIgZW5zdXJlcyB0aGF0IGNhbGxzIG9uIHRoZSB0ZW1wb3JhcnkgcHJvamVjdCBhcmVcbiAgICAgICAgICogbGltaXRlZCB0byB0aGUgQmxhY2tib3ggQVBJIENvbnRyb2xzIC5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNpbmcgdGhlIGlucHV0cyAsIHByZWxvYWRmaWxlICwgcHJlbG9hZG9iamVjdCBhbmQgYWRvcHQgcGFyYW1ldGVycyB0aGVcbiAgICAgICAgICogcHJvamVjdCBjYW4gYmUgcHJlLWluaXRpYWxpemVkIHdpdGggZGF0YSBpbiB0aGUgd29ya3NwYWNlIGFuZC9vciB3b3JraW5nXG4gICAgICAgICAqIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGlucHV0cyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcGFzcyBSZXZvRGVwbG95Ui1lbmNvZGVkIFIgb2JqZWN0XG4gICAgICAgICAqIHZhbHVlcyBhcyBpbnB1dHMuIFRoZXNlIGlucHV0cyBhcmUgdHVybmVkIGludG8gUiBvYmplY3RzIGluIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICogb2YgdGhlIG5ldyBSIHNlc3Npb24gYmVmb3JlIHRoZSBjYWxsIHJldHVybnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBwcmVsb2FkZmlsZSBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBvbmUgb3IgbW9yZSBmaWxlcyBmcm9tXG4gICAgICAgICAqIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBuZXcgUiBzZXNzaW9uIGJlZm9yZSB0aGVcbiAgICAgICAgICogY2FsbCByZXR1cm5zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcHJlbG9hZG9iamVjdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBvbmUgb3IgbW9yZSBiaW5hcnkgUlxuICAgICAgICAgKiBvYmplY3RzICguckRhdGEpIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya3NwYWNlIG9mIHRoZSBuZXcgUlxuICAgICAgICAgKiBzZXNzaW9uIGJlZm9yZSB0aGUgY2FsbCByZXR1cm5zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgYWRvcHQgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgYSBwcmUtZXhpc3RpbmcgcHJvamVjdFxuICAgICAgICAgKiB3b3Jrc3BhY2UsIHByb2plY3Qgd29ya2luZyBkaXJlY3RvcnkgYW5kL29yIHByb2plY3QgcGFja2FnZSBkZXBlbmRlbmNpZXNcbiAgICAgICAgICogaW50byB0aGUgbmV3IFIgc2Vzc2lvbiBiZWZvcmUgdGhlIGNhbGwgcmV0dXJucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0Q3JlYXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdG5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBuYW1lcyBhIG5ldyBwZXJzaXN0ZW50IHByb2plY3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdGRlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgZGVzY3JpYmVzIGEgbmV3IHBlcnNpc3RlbnQgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ibGFja2JveDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSB3aGVuIGVuYWJsZWQsIGEgdGVtcG9yYXJ5IHByb2plY3QgaXMgbGltaXRlZCB0byBibGFja2JveFxuICAgICAgICAgKiAgICAgICBBUEkgY29udHJvbHNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgaW5wdXRzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmNzdmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByaW1pdGl2ZSBuYW1lL3ZhbHVlIGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZWF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLFxuICAgICAgICAgKiAgICAgICBhdXRob3ItcGVyLXByZWxvYWRmaWxlbmFtZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGV2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLFxuICAgICAgICAgKiAgICAgICB2ZXJzaW9uLXBlci1wcmVsb2FkZmlsZW5hbWVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgb2JqZWN0ICguckRhdGEpXG4gICAgICAgICAqICAgICAgIGZpbGVuYW1lc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZG9iamVjdGF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLFxuICAgICAgICAgKiAgICAgICBhdXRob3ItcGVyLXByZWxvYWRvYmplY3RuYW1lXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucyxcbiAgICAgICAgICogICAgICAgdmVyc2lvbi1wZXItb2JqZWN0LXByZWxvYWRvYmplY3RuYW1lXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZGVudGlmaWVzIHRoZSBwcm9qZWN0IHdob3NlIHdvcmtzcGFjZSBpcyB0byBiZSBhZG9wdGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdGRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZGVudGlmaWVzIHRoZSBwcm9qZWN0IHdob3NlIGRpcmVjdG9yeSBpcyB0byBiZSBhZG9wdGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHBhY2thZ2VzPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlkZW50aWZpZXMgdGhlIHByb2plY3Qgd2hvc2UgcGFja2FnZSBkZXBlbmRlbmNpZXMgYXJlIHRvXG4gICAgICAgICAqICAgICAgIGJlIGFkb3B0ZWRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0Q3JlYXRlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9jcmVhdGUnLCBjb25maWcsIGNhbGxiYWNrKTsgICAgICAgICAgICBcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGNyZWF0ZXMgYSBwb29sIG9mIHRlbXBvcmFyeSBwcm9qZWN0cyBmb3IgdGhlIGN1cnJlbnRseVxuICAgICAgICAgKiBhdXRoZW50aWNhdGVkIHVzZXIuIFRoZSBjYWxsZXIgY2FuIHNwZWNpZnkgdGhlaXIgcHJlZmVycmVkIG51bWJlciBvZlxuICAgICAgICAgKiBwcm9qZWN0cyB0byBjcmVhdGUgdXNpbmcgdGhlIHBvb2xzaXplIHBhcmFtZXRlci4gUmV2b0RlcGxveVIgd2lsbCBhdHRlbXB0XG4gICAgICAgICAqIHRvIGNyZWF0ZSB1cCB0byBwb29sc2l6ZSBudW1iZXIgb2YgcHJvamVjdHMuIEhvd2V2ZXIsIHN0YW5kYXJkIGNvbVxuICAgICAgICAgKiBwb2xpY3kgY29udHJhaW50cyBhcHBseSB0byBpbmRpdmlkdWFsIHVzZXJzIGFuZCBvbiB0aGUgZ3JpZCBzbyB0aGVyZSBpcyBub1xuICAgICAgICAgKiBndWFyYW50ZWUgdGhhdCBwb29sc2l6ZSBwcm9qZWN0cyB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGUgbnVtYmVyIG9mXG4gICAgICAgICAqIHByb2plY3RzIHJldHVybmVkIG9uIHRoaXMgY2FsbCBpcyBsZXNzIHRoYW4gcG9vbHNpemUgdGhlIGNhbGxlciBjYW4gaW5zcGVjdFxuICAgICAgICAgKiB0aGUgZXJyb3IgYW5kIGVycm9yQ29kZSBwcm9wZXJ0aWVzIGluIHRoZSByZXNwb25zZSBtYXJrdXAgdG8gZGV0ZXJtaW5lXG4gICAgICAgICAqIGV4YWN0bHkgd2h5IHRoZWlyIHBvb2wgc2l6ZSB3YXMgbGltaXRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGJsYWNrYm94IHBhcmFtZXRlciBlbnN1cmVzIHRoYXQgY2FsbHMgb24gZWFjaCBwcm9qZWN0IGluIHRoZSBwb29sIGFyZVxuICAgICAgICAgKiBsaW1pdGVkIHRvIHRoZSBCbGFja2JveCBBUEkgQ29udHJvbHMgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBVc2luZyB0aGUgaW5wdXRzLCBwcmVsb2FkZmlsZSwgcHJlbG9hZG9iamVjdCBhbmQgYWRvcHQgcGFyYW1ldGVycyBlYWNoXG4gICAgICAgICAqIHByb2plY3QgaW4gdGhlIHBvb2wgY2FuIGJlIHByZS1pbml0aWFsaXplZCB3aXRoIGRhdGEgaW4gdGhlIHdvcmtzcGFjZVxuICAgICAgICAgKiBhbmQvb3Igd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZCBSIG9iamVjdFxuICAgICAgICAgKiB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0cyBpbiB0aGUgd29ya3NwYWNlXG4gICAgICAgICAqIG9mIHRoZSBuZXcgUiBzZXNzaW9uIGJlZm9yZSB0aGUgY2FsbCByZXR1cm5zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcHJlbG9hZGZpbGUgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmUgZmlsZXMgZnJvbVxuICAgICAgICAgKiB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgbmV3IFIgc2Vzc2lvbiBiZWZvcmUgdGhlXG4gICAgICAgICAqIGNhbGwgcmV0dXJucy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHByZWxvYWRvYmplY3QgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmUgYmluYXJ5IFJcbiAgICAgICAgICogb2JqZWN0cyAoLnJEYXRhKSBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgbmV3IFJcbiAgICAgICAgICogc2Vzc2lvbiBiZWZvcmUgdGhlIGNhbGwgcmV0dXJucy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGFkb3B0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIGEgcHJlLWV4aXN0aW5nIHByb2plY3RcbiAgICAgICAgICogd29ya3NwYWNlLCBwcm9qZWN0IHdvcmtpbmcgZGlyZWN0b3J5IGFuZC9vciBwcm9qZWN0IHBhY2thZ2UgZGVwZW5kZW5jaWVzXG4gICAgICAgICAqIGludG8gdGhlIG5ldyBSIHNlc3Npb24gYmVmb3JlIHRoZSBjYWxsIHJldHVybnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFBvb2xcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wb29sc2l6ZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD50aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIHBvb2wgb2YgdGVtcG9yYXJ5IHByb2plY3RzPC9kZD5cbiAgICAgICAgICogICAgPGR0PmJsYWNrYm94PC9kZD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgd2hlbiBlbmFibGVkLCBlYWNoIHRlbXBvcmFyeSBwcm9qZWN0IGluIHRoZSBwb29sIGlzIGxpbWl0ZWQgdG8gYmxhY2tib3ggQVBJIGNvbnRyb2xzPC9kZD5cbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgaW5wdXRzPC9kZD5cbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxlYXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1wcmVsb2FkZmlsZW5hbWU8L2RkPlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGV2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgb2JqZWN0ICguckRhdGEpIGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLCB2ZXJzaW9uLXBlci1vYmplY3QtcHJlbG9hZG9iamVjdG5hbWU8L2RkPlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHR3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCB3b3Jrc3BhY2UgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5hZG9wdGRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIGRpcmVjdG9yeSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICogICAgPGR0PmFkb3B0cGFja2FnZXM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCBwYWNrYWdlIGRlcGVuZGVuY2llcyBhcmUgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFBvb2w6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3Bvb2wnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJlY3ljbGVzIHRoZSBSIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0IGJ5IGRlbGV0aW5nXG4gICAgICAgICAqIGFsbCBSIG9iamVjdHMgZnJvbSB0aGUgd29ya3NwYWNlIGFuZCBhbGwgZmlsZXMgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIFJlY3ljbGluZyBhIHByb2plY3QgaXMgYSBjb252ZW5pZW50IGFuZCBlZmZpY2llbnQgYWx0ZXJuYXRpdmUgdG8gc3RhcnRpbmdcbiAgICAgICAgICogb3ZlciBieSBjbG9zaW5nIGFuIGV4aXN0aW5nIHByb2plY3QgYW5kIHRoZW4gY3JlYXRpbmcgYSBuZXcgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0UmVjeWNsZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5wcmVzZXJ2ZXdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBvYmplY3RzIGluIHRoZSB3b3Jrc3BhY2UgYXJlIHByZXNlcnZlZCBvbiByZWN5Y2xlPC9kZD5cbiAgICAgICAgICogICAgPGR0PnByZXNlcnZlZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGVzIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhcmUgcHJlc2VydmVkIG9uIHJlY3ljbGU8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RSZWN5Y2xlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9yZWN5Y2xlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBsaXN0cyBhbGwgcHJvamVjdHMgb3duZWQgYnkgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXJcbiAgICAgICAgICogYW5kL29yIGFsbCBwcm9qZWN0cyBzaGFyZWQgYnkgb3RoZXIgdXNlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNoYXJlZCBwcm9qZWN0cyBhcmUgYXZhaWxhYmxlIGFzIHJlYWQtb25seSBwcm9qZWN0cyB0byB0aGUgY2FsbGVyLiBUaGVcbiAgICAgICAgICogc2hhcmVkIG9yIHByaXZhdGUgbmF0dXJlIG9mIGEgcHJvamVjdCBjYW4gYmUgY29udHJvbGxlZCB1c2luZyB0aGVcbiAgICAgICAgICogPGNvZGU+L3IvcHJvamVjdC9hYm91dC91cGRhdGU8L2NvZGU+IGNhbGxcbiAgICAgICAgICogPGEgaHJlZj1cIiNtZXRob2RfcHJvamVjdEFib3V0VXBkYXRlXCI+cHJvamVjdEFib3V0VXBkYXRlPC9hPi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0TGlzdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnNoYXJlZHByb2plY3RzYWxzbzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSB3aGVuIHRydWUsIHRoZSBwcm9qZWN0IHJlc3BvbnNlIGxpc3QgY29udGFpbnMgdGhlIGNhbGxlcidzXG4gICAgICAgICAqICAgICAgIHByb2plY3RzIHBsdXMgcHJvamVjdHMgc2hhcmVkIGJ5IG90aGVyIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWRwcm9qZWN0c29ubHk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiB0cnVlLCB0aGUgcHJvamVjdCByZXNwb25zZSBsaXN0IGNvbnRhaW5zIG9ubHlcbiAgICAgICAgICogICAgICAgcHJvamVjdHMgc2hhcmVkIGJ5IG90aGVyIHVzZXJzIGFuZCBub3QgdGhlIHVzZXJzJ3Mgb3duIHByb2plY3RzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pc29yZGVyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiB0cnVlLCB0aGUgcHJvamVjdCByZXNwb25zZSBsaXN0IGlzIG9yZGVyZWQgaW4gYVxuICAgICAgICAgKiAgICAgICBtb3N0LXJlY2VudGx5LW1vZGlmaWVkIGZpcnN0IG9yZGVyLiBPdGhlcndpc2UgdGhlIGxpc3QgaXMgb3JkZXJlZFxuICAgICAgICAgKiAgICAgICBjaHJvbm9sb2dpY2FsbHkgYnkgY3JlYXRpb24gZGF0ZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9saXN0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgcGluZ3MgdGhlIHNwZWNpZmllZCBwcm9qZWN0IHRvIGRldGVybWluZSBpZiB0aGUgcHJvamVjdCBpcyBsaXZlXG4gICAgICAgICAqIG9uIHRoZSBSZXZvRGVwbG95UiBncmlkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RQaW5nXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogIDxkbD5cbiAgICAgICAgICogICAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFBpbmc6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3BpbmcnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJldHJpZXZlcyBhIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgdGhlIHNwZWNpZmllZFxuICAgICAgICAgKiBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RBYm91dFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RBYm91dDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvYWJvdXQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwZGF0ZXMgYSBzZXQgb2YgcHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0QWJvdXRVcGRhdGVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHByb2plY3QgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bG9uZ2Rlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IGxvbmcgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzcGVjaWZpZXMgdGhhdCB0aGUgcHJvamVjdCBpcyBhXG4gICAgICAgICAqICAgICAgIHNoYXJlZCBwcm9qZWN0XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0Y29va2llPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNsaWVudC1hcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9qZWN0IGNvb2tpZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiAgPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0QWJvdXRVcGRhdGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2Fib3V0L3VwZGF0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgc2F2ZXMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIHByb2plY3QgaW5kaWNhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgc2V0IG9mIGRyb3AgcGFyYW1ldGVycyBhbGxvd3MgdGhlIGNhbGxlciB0byBzZWxlY3RpdmVseSBkcm9wIGFzcGVjdHMsXG4gICAgICAgICAqIHN1Y2ggYXMgd29ya3NwYWNlLCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgZXhlY3V0aW9uIGhpc3Rvcnkgb2YgdGhlIHByb2plY3RcbiAgICAgICAgICogc3RhdGUgd2hlbiBzYXZpbmcuIFRoZSBmbHVzaGhpc3RvcnkgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHByZXNlcnZlXG4gICAgICAgICAqIHRoZSBwcm9qZWN0IGV4ZWN1dGlvbiBoaXN0b3J5IGl0c2VsZiB3aGlsZSBkZXN0cm95aW5nIGFsbCBnZW5lcmF0ZWQgY29uc29sZVxuICAgICAgICAgKiBvdXRwdXQgYW5kIHJlc3VsdHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaGlzdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0U2F2ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHByb2plY3QgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bG9uZ2Rlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IGxvbmcgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgc3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlzIGEgc2hhcmVkIHByb2plY3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdGNvb2tpZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNsaWVudC1hcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9qZWN0IGNvb2tpZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9wd29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGNvbnRlbnQgb2YgdGhlIHByb2plY3QncyB3b3Jrc3BhY2UgaXMgZHJvcHBlZCBvbiBzYXZlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRyb3BkaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgY29udGVudCBvZiB0aGUgcHJvamVjdCdzIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGRyb3BwZWQgb24gc2F2ZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9waGlzdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBwcm9qZWN0J3MgZXhlY3V0aW9uIGhpc3RvcnkgaXMgZHJvcHBlZCBvbiBzYXZlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZsdXNoaGlzdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBwcm9qZWN0J3MgZXhlY3V0aW9uIGhpc3RvcnkgaXMgZmx1c2hlZCBvbiBzYXZlPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0U2F2ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvc2F2ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgc2F2ZXMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0IHRvIGEgbmV3XG4gICAgICAgICAqIHBlcnNpc3RlbnQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHNldCBvZiBkcm9wIHBhcmFtZXRlcnMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2VsZWN0aXZlbHkgZHJvcCBhc3BlY3RzLFxuICAgICAgICAgKiBzdWNoIGFzIHdvcmtzcGFjZSwgd29ya2luZyBkaXJlY3RvcnksIG9yIGV4ZWN1dGlvbiBoaXN0b3J5IG9mIHRoZSBwcm9qZWN0XG4gICAgICAgICAqIHN0YXRlIHdoZW4gc2F2aW5nIHRvIHRoZSBuZXcgcHJvamVjdC4gVGhlIGZsdXNoaGlzdG9yeSBwYXJhbWV0ZXIgYWxsb3dzIHRoZVxuICAgICAgICAgKiBjYWxsZXIgdG8gcHJlc2VydmUgdGhlIHByb2plY3QgZXhlY3V0aW9uIGhpc3RvcnkgaXRzZWxmIGZvciB0aGUgbmV3IHByb2plY3RcbiAgICAgICAgICogd2hpbGUgZHJvcHBpbmcgYWxsIGdlbmVyYXRlZCBjb25zb2xlIG91dHB1dCBhbmQgcmVzdWx0cyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAgICAgICAqIG9yaWdpbmFsIGhpc3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdFNhdmVhc1xuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgbmV3IHByb2plY3QgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgbmV3IHByb2plY3QgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bG9uZ2Rlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuZXcgcHJvamVjdCBsb25nIGRlc2NyaXB0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnNoYXJlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHNwZWNpZmllcyB0aGUgbmV3IHByb2plY3QgaXMgYSBzaGFyZWQgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0Y29va2llPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgY2xpZW50LWFwcGxpY2F0aW9uIHNwZWNpZmljIGNvb2tpZSBmb3IgdGhlIG5ldyBwcm9qZWN0PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRyb3B3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgY29udGVudCBvZiB0aGUgb3JpZ2luYWwgcHJvamVjdCdzIHdvcmtzcGFjZSBpcyBkcm9wcGVkIHdoZW4gc2F2aW5nIHRvIHRoZSBuZXcgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9wZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGNvbnRlbnQgb2YgdGhlIHByb2plY3QncyB3b3JraW5nIGRpcmVjdG9yeSBpcyBkcm9wcGVkIHdoZW4gc2F2aW5nIHRvIHRoZSBuZXcgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9waGlzdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBwcm9qZWN0J3MgZXhlY3V0aW9uIGhpc3RvcnkgaXMgZHJvcHBlZCB3aGVuIHNhdmluZyB0byB0aGUgbmV3IHByb2plY3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Zmx1c2hoaXN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIHByb2plY3QncyBleGVjdXRpb24gaGlzdG9yeSBpcyBmbHVzaGVkIHdoZW4gc2F2aW5nIHRvIHRoZSBuZXcgcHJvamVjdDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdFNhdmVhczogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3Qvc2F2ZWFzJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBjbG9zZXMgdGhlIHByb2plY3QgaW5kaWNhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBDbG9zaW5nIGEgbGl2ZSBwcm9qZWN0IHJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0XG4gICAgICAgICAqIG9uIHRoZSBSZXZvRGVwbG95UiBncmlkLiBJZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSBwZXJzaXN0ZW50IHByb2plY3RcbiAgICAgICAgICogdGhlbiB0aGUgZGVmYXVsdCBhdXRvc2F2ZSBzZW1hbnRpY3Mgd2lsbCBjYXVzZSB0aGUgcHJvamVjdCB0byBiZSBzYXZlZFxuICAgICAgICAgKiBhdXRvbWF0aWNhbGx5LiBUaGUgY2FsbGVyIGNhbiBvdmVycmlkZSB0aGF0IGRlZmF1bHQgYmVoYXZpb3IgdXNpbmcgdGhlXG4gICAgICAgICAqIGRpc2FibGVhdXRvc2F2ZSBwYXJhbWV0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBzZXQgb2YgZHJvcCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gc2VsZWN0aXZlbHkgZHJvcCBhc3BlY3RzLFxuICAgICAgICAgKiBzdWNoIGFzIHdvcmtzcGFjZSwgd29ya2luZyBkaXJlY3RvcnksIG9yIGV4ZWN1dGlvbiBoaXN0b3J5LCBvZiB0aGUgcHJvamVjdFxuICAgICAgICAgKiBzdGF0ZSB3aGVuIGNsb3NpbmcuIFRoZSBmbHVzaGhpc3RvcnkgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvXG4gICAgICAgICAqIHByZXNlcnZlIHRoZSBwcm9qZWN0IGV4ZWN1dGlvbiBoaXN0b3J5IGl0c2VsZiB3aGlsZSBkZXN0cm95aW5nIGFsbFxuICAgICAgICAgKiBnZW5lcmF0ZWQgY29uc29sZSBvdXRwdXQgYW5kIHJlc3VsdHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaGlzdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0Q2xvc2VcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGlzYWJsZWF1dG9zYXZlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGRlZmF1bHQgYXV0b3NhdmUgc2VtYW50aWNzIGZvciBwZXJzaXN0ZW50IHByb2plY3RzIGFyZSBkaXNhYmxlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0Y29va2llPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgY2xpZW50LWFwcGxpY2F0aW9uIHNwZWNpZmljIHByb2plY3QgY29va2llPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRyb3B3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgY29udGVudCBvZiB0aGUgcHJvamVjdCdzIHdvcmtzcGFjZSBpcyBkcm9wcGVkIG9uIGNsb3NlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRyb3BkaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgY29udGVudCBvZiB0aGUgcHJvamVjdCdzIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGRyb3BwZWQgb24gY2xvc2U8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZHJvcGhpc3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgcHJvamVjdCdzIGV4ZWN1dGlvbiBoaXN0b3J5IGlzIGRyb3BwZWQgb24gY2xvc2U8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Zmx1c2hoaXN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIHByb2plY3QncyBleGVjdXRpb24gaGlzdG9yeSBpcyBmbHVzaGVkIG9uIGNsb3NlPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0Q2xvc2U6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2Nsb3NlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBncmFudHMgYXV0aG9yc2hpcCBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgdG8gb3RoZXIgdXNlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEdyYW50XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uZXdhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVzZXJuYW1lcyBpbmRpY2F0aW5nIHRoZSBuZXdcbiAgICAgICAgICogICAgICAgb3duZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEdyYW50OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9ncmFudCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgaW1wb3J0cyB0aGUgc3BlY2lmaWVkIHByb2plY3QgYXJjaGl2ZSBhcyBhIG5ldyBwZXJzaXN0ZW50XG4gICAgICAgICAqIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEltcG9ydFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGFyY2hpdmUgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlPC9kdD5cbiAgICAgICAgICogICAgPGRkPi4uLmZpbGUgY29udGVudC4uLjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIG5ld2x5IGltcG9ydGVkIHByb2plY3RcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0SW1wb3J0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICB2YXIgaW9Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGF0YTogY29uZmlnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgZm9ybToge1xuICAgICAgICAgICAgICAgICAgICBpZDogY29uZmlnLmZvcm1JZFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb246IGNhbGxiYWNrXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvaW1wb3J0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZXhwb3J0cyBhIGNvbXByZXNzZWQgYXJjaGl2ZSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBzZXQgb2YgZHJvcCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gc2VsZWN0aXZlbHkgZHJvcCBhc3BlY3RzLFxuICAgICAgICAgKiBzdWNoIGFzIHdvcmtzcGFjZSwgd29ya2luZyBkaXJlY3RvcnksIG9yIGV4ZWN1dGlvbiBoaXN0b3J5IG9mIHRoZSBwcm9qZWN0XG4gICAgICAgICAqIHN0YXRlIHdoZW4gZ2VuZXJhdGluZyB0aGUgYXJjaGl2ZS4gVGhlIGZsdXNoaGlzdG9yeSBwYXJhbWV0ZXIgYWxsb3dzIHRoZVxuICAgICAgICAgKiBjYWxsZXIgdG8gcHJlc2VydmUgdGhlIHByb2plY3QgZXhlY3V0aW9uIGhpc3RvcnkgaXRzZWxmIHdoaWxlIGV4Y2x1ZGluZyBhbGxcbiAgICAgICAgICogZ2VuZXJhdGVkIGNvbnNvbGUgb3V0cHV0IGFuZCByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGhpc3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4cG9ydFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kcm9wd29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGNvbnRlbnQgb2YgdGhlIHByb2plY3QncyB3b3Jrc3BhY2UgaXMgZHJvcHBlZCBvbiBleHBvcnQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZHJvcGRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBjb250ZW50IG9mIHRoZSBwcm9qZWN0J3Mgd29ya2luZyBkaXJlY3RvcnkgaXMgZHJvcHBlZCBvbiBleHBvcnQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZHJvcGhpc3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgcHJvamVjdCdzIGV4ZWN1dGlvbiBoaXN0b3J5IGlzIGRyb3BwZWQgb24gZXhwb3J0PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZsdXNoaGlzdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBwcm9qZWN0J3MgZXhlY3V0aW9uIGhpc3RvcnkgaXMgZmx1c2hlZCBvbiBleHBvcnQ8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeHBvcnQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4cG9ydCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZGVsZXRlcyB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqIERlbGV0aW5nIGEgcHJvamVjdCBpcyBhIHBlcm1hbmVudCBvcGVyYXRpb24gdGhhdCBjYW5ub3QgYmUgdW5kb25lIG9yXG4gICAgICAgICAqIHJlY292ZXJlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RGVsZXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0RGVsZXRlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kZWxldGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFByb2plY3QgRXhlY3V0aW9uIEFQSXNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZXhlY3V0ZXMgYSBibG9jayBvZiBSIGNvZGUgb24gdGhlIFIgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5IHRoZVxuICAgICAgICAgKiBwcm9qZWN0IHBhcmFtZXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogUGxlYXNlIG5vdGUgdGhlIGZvbGxvd2luZyBwcmUgYW5kIHBvc3QgZXhlY3V0aW9uIHBhcmFtZXRlcnM6XG4gICAgICAgICAqXG4gICAgICAgICAqIDxzdHJvbmc+UHJlLWV4ZWN1dGlvbiBwYXJhbWV0ZXJzOjwvc3Ryb25nPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8b2w+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIGlucHV0cyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcGFzcyBSZXZvRGVwbG95Ui1lbmNvZGVkXG4gICAgICAgICAqICAgICAgIFIgb2JqZWN0IHZhbHVlcyBhcyBpbnB1dHMuIFRoZXNlIGlucHV0cyBhcmUgdHVybmVkIGludG8gUiBvYmplY3RzXG4gICAgICAgICAqICAgICAgIGluIHRoZSB3b3Jrc3BhY2UgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2FkZmlsZSBwYXJhbWV0ZXJzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmVcbiAgICAgICAgICogICAgICAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgdGhlXG4gICAgICAgICAqICAgICAgIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHByZWxvYWRvYmplY3QgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmVcbiAgICAgICAgICogICAgICAgYmluYXJ5IFIgb2JqZWN0cyAoLnJEYXRhKSBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtzcGFjZVxuICAgICAgICAgKiAgICAgICBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIGFkb3B0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIGEgcHJlLWV4aXN0aW5nXG4gICAgICAgICAqICAgICAgIHByb2plY3Qgd29ya3NwYWNlLCBwcm9qZWN0IHdvcmtpbmcgZGlyZWN0b3J5IGFuZC9vciBwcm9qZWN0IHBhY2thZ2VcbiAgICAgICAgICogICAgICAgZGVwZW5kZW5jaWVzIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5Qb3N0LWV4ZWN1dGlvbiBwYXJhbWV0ZXJzOjwvc3Ryb25nPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8b2w+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHJvYmplY3RzIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygb2JqZWN0IG5hbWVzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBhcyBSZXZvRGVwbG95Ui1lbmNvZGVkIFJcbiAgICAgICAgICogICAgICAgb2JqZWN0cyBvbiB0aGUgcmVzcG9uc2UgbWFya3VwIGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWZpbGUgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXJcbiAgICAgICAgICogICAgICAgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jlb2JqZWN0IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdHMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXdvcmtzcGFjZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIGVudGlyZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2UgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZGlyZWN0b3J5IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgdGFyZ2V0XG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGZvciBzdG9yZWQgZmlsZXMgYW5kIG9iamVjdHMgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlbmV3dmVyc2lvbiBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY3JlYXRlIG5ld1xuICAgICAgICAgKiAgICAgICB2ZXJzaW9ucyBvZiBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLiBCeSBkZWZhdWx0LCBzdG9yZWQgZmlsZXMgb3ZlcndyaXRlIGFueSBwcmUtZXhpc3RpbmcgZmlsZVxuICAgICAgICAgKiAgICAgICBieSB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXB1YmxpYyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gYXNzaWduIHB1YmxpYyBhY2Nlc3NcbiAgICAgICAgICogICAgICAgdG8gZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICpcbiAgICAgICAgICogIDxzdHJvbmc+U29tZSBrZXkgZGF0YSBpbmRpY2F0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGw6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPmNvZGUgLSBpbmRpY2F0ZXMgdGhlIGNvZGUgdGhhdCBoYXMgYmVlbiBleGVjdXRlZDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgY29uc29sZSAtIGluZGljYXRlcyB0aGUgY29uc29sZSBvdXRwdXQgcmVzdWx0aW5nIGZyb20gdGhlIGNvZGVcbiAgICAgICAgICogICAgICAgZXhlY3V0aW9uXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgcmVzdWx0cyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIFIgZ3JhcGhpY3NcbiAgICAgICAgICogICAgICAgZGV2aWNlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgYXJ0aWZhY3RzIC0gaW5kaWNhdGVzIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBvciBtb2RpZmllZCBpbiB0aGVcbiAgICAgICAgICogICAgICAgd29ya2luZyBkaXJlY3RvcnlcbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBvYmplY3RzIC0gIGluZGljYXRlcyB0aGUgbGlzdCBvZiBSIG9iamVjdHMgcmV0dXJuZWQgZnJvbSB0aGVcbiAgICAgICAgICogICAgICAgd29ya3NwYWNlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgZmlsZXMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIG9iamVjdHMgc3RvcmVkIGluIHRoZVxuICAgICAgICAgKiAgICAgICByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgaW50ZXJydXB0ZWQgLSBpbmRpY2F0ZXMgdGhlIGludGVycnVwdGVkIHN0YXR1cyBvZiBleGVjdXRpb25cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBlcnJvciAtIG9uIGZhaWx1cmUsIGluZGljYXRlcyB0aGUgcmVhc29uIGZvciBmYWlsdXJlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgZXJyb3JDb2RlIC0gb24gZmFpbHVyZSwgaW5kaWNhdGVzIHRoZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4ZWN1dGVDb2RlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jb2RlPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgYmxvY2sgb2YgUiBjb2RlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgc2NyaXB0IGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jc3ZpbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmltaXRpdmUgbmFtZS92YWx1ZSBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZXZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBvYmplY3QgKC5yRGF0YSkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRvYmplY3RuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3R2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLW9iamVjdC1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHdvcmtzcGFjZSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggZGlyZWN0b3J5IGlzIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHRwYWNrYWdlczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIHRhZyB0aGF0IGxhYmVscyB0aGUgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmVjaG9vZmY8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlIFIgY29tbWFuZHMgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBjb25zb2xlIG91dHB1dDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jb25zb2xlb2ZmPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSBjb25zb2xlIG91dHB1dCBpcyBub3QgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmdyYXBoaWNzPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIFIgZ3JhcGhpY3MgZGV2aWNlIGZvciBleGVjdXRpb246IHBuZyBvciBzdmc8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5ncmFwaGljc3dpZHRoPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIHdpZHRoIGZvciBSIGdyYXBoaWNzIGRldmljZSBpbWFnZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5ncmFwaGljc2hlaWdodDwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBoZWlnaHQgZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnJvYmplY3RzPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvYmplY3RzIGZvciByZXRyaWV2YWwgZm9sbG93aW5nIHRoZSBleGVjdXRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5zdG9yZWZpbGU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmtpbmcgZGlyZWN0b3J5IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnN0b3Jlb2JqZWN0PC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3Jrc3BhY2Ugb2JqZWN0IG5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+c3RvcmV3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGZpbGVuYW1lICguckRhdGEpIHdoZXJlIHdvcmtzcGFjZSBjb250ZW50cyB3aWxsIGJlIHNhdmVkIGluIHRoZSByZXBvc2l0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+c3RvcmVuZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5zdXJlcyBlYWNoIGZpbGUgc3RvcmVkIGluXG4gICAgICAgICAqICAgIHJlcG9zaXRvcnkgcmVzdWx0cyBpbiBuZXcgdmVyc2lvbiBiZWluZyBjcmVhdGVkIGlmIG5lZWRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnN0b3JlcHVibGljPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaGVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5pbmZpbml0eTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgSW5maW5pdHkgYXBwZWFyaW5nIGluIFIgb2JqZWN0XG4gICAgICAgICAqICAgIGRhdGEgcmV0dXJuZWQgb24gY2FsbCwgb3RoZXJ3aXNlIEluZmluaXR5IGlzIHJlcHJlc2VudGVkIGJ5IDxjb2RlPjB4N2ZmMDAwMDAwMDAwMDAwMEw8L2NvZGU+XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0Pm5hbjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgTmFOIGFwcGVhcmluZyBpbiBSIG9iamVjdCBkYXRhXG4gICAgICAgICAqICAgIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBOYU4gaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+bnVsbDwvY29kZT48L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5lbmNvZGVEYXRhRnJhbWVQcmltaXRpdmVBc1ZlY3RvcjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRhdGEuZnJhbWUgcHJpbWl0aXZlcyBhcmUgZW5jb2RlZCB2ZWN0b3JzIGluIFIgb2JqZWN0IGRhdGEgcmV0dXJuZWQgb24gY2FsbDwvZGQ+XG4gICAgICAgICAqICA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeGVjdXRlQ29kZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9leGVjdXRlL2NvZGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBleGVjdXRlcyBleGVjdXRlcyByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0cyBvciBleHRlcm5hbCBzY3JpcHRzXG4gICAgICAgICAqIG9uIHRoZSBSIHNlc3Npb24gaWRlbnRpZmllZCBieSB0aGUgcHJvamVjdCBwYXJhbWV0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZVxuICAgICAgICAgKiBwYXJhbWV0ZXIgdmFsdWVzIGZvciBmaWxlbmFtZSwgYXV0aG9yIGFuZCBvcHRpb25hbGx5IHZlcnNpb24uIFRvIGV4ZWN1dGVcbiAgICAgICAgICogYSBjaGFpbiBvZiByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0cyB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhXG4gICAgICAgICAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyBvbiB0aGUgZmlsZW5hbWUgLCBhdXRob3IgYW5kIG9wdGlvbmFsbHlcbiAgICAgICAgICogdmVyc2lvbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBleGVjdXRlIGEgc2luZ2xlIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkIFVSTCBvclxuICAgICAgICAgKiBmaWxlIHBhdGggdXNpbmcgdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gVG8gZXhlY3V0ZSBhIGNoYWluIG9mXG4gICAgICAgICAqIGV4dGVybmFsIHNjcmlwdHMgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXNcbiAgICAgICAgICogb24gdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gTm90ZSwgdG8gZXhlY3V0ZSBhbiBleHRlcm5hbCBzY3JpcHQgdGhlXG4gICAgICAgICAqIGNhbGxlciBtdXN0IGhhdmUgUE9XRVJfVVNFUiBwcml2aWxlZ2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlOiBBIGNoYWluZWQgZXhlY3V0aW9uIGV4ZWN1dGVzIGVhY2ggb2YgdGhlIHNjcmlwdHMgaWRlbnRpZmllZCBvbiB0aGVcbiAgICAgICAgICogY2FsbCBpbiBhIHNlcXVlbnRpYWwgZmFzaGlvbiBvbiB0aGUgUiBzZXNzaW9uLCB3aXRoIGV4ZWN1dGlvbiBvY2N1cmluZyBpblxuICAgICAgICAgKiB0aGUgb3JkZXIgc3BlY2lmaWVkIG9uIHRoZSBwYXJhbWV0ZXIgbGlzdC5cbiAgICAgICAgICpcbiAgICAgICAgICogUGxlYXNlIG5vdCB0aGUgZm9sbG93aW5nIHByZSBhbmQgcG9zdCBleGVjdXRpb24gcGFyYW1ldGVyczpcbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5QcmUtZXhlY3V0aW9uIHBhcmFtZXRlcnM6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgaW5wdXRzIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBwYXNzIFJldm9EZXBsb3lSLWVuY29kZWRcbiAgICAgICAgICogICAgICAgUiBvYmplY3QgdmFsdWVzIGFzIGlucHV0cy4gVGhlc2UgaW5wdXRzIGFyZSB0dXJuZWQgaW50byBSIG9iamVjdHNcbiAgICAgICAgICogICAgICAgaW4gdGhlIHdvcmtzcGFjZSBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHByZWxvYWRmaWxlIHBhcmFtZXRlcnMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gbG9hZCBvbmUgb3IgbW9yZVxuICAgICAgICAgKiAgICAgICBmaWxlcyBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJlZm9yZSB0aGVcbiAgICAgICAgICogICAgICAgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcHJlbG9hZG9iamVjdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBvbmUgb3IgbW9yZVxuICAgICAgICAgKiAgICAgICBiaW5hcnkgUiBvYmplY3RzICguckRhdGEpIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya3NwYWNlXG4gICAgICAgICAqICAgICAgIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgYWRvcHQgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgYSBwcmUtZXhpc3RpbmdcbiAgICAgICAgICogICAgICAgcHJvamVjdCB3b3Jrc3BhY2UsIHByb2plY3Qgd29ya2luZyBkaXJlY3RvcnkgYW5kL29yIHByb2plY3QgcGFja2FnZVxuICAgICAgICAgKiAgICAgICBkZXBlbmRlbmNpZXMgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlBvc3QtZXhlY3V0aW9uIHBhcmFtZXRlcnM6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcm9iamVjdHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiBvYmplY3QgbmFtZXMgdGhhdCB3aWxsIGJlIHJldHVybmVkIGFzIFJldm9EZXBsb3lSLWVuY29kZWQgUlxuICAgICAgICAgKiAgICAgICBvYmplY3RzIG9uIHRoZSByZXNwb25zZSBtYXJrdXAgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZmlsZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZFxuICAgICAgICAgKiAgICAgICBsaXN0IG9mIHdvcmtpbmcgZGlyZWN0b3J5IGZpbGVzIHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlclxuICAgICAgICAgKiAgICAgICB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVvYmplY3QgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3Jrc3BhY2Ugb2JqZWN0cyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlXG4gICAgICAgICAqICAgICAgIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jld29ya3NwYWNlIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzdG9yZSB0aGUgZW50aXJlXG4gICAgICAgICAqICAgICAgIHdvcmtzcGFjZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVkaXJlY3RvcnkgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgYSB0YXJnZXRcbiAgICAgICAgICogICAgICAgcmVwb3NpdG9yeSBkaXJlY3RvcnkgZm9yIHN0b3JlZCBmaWxlcyBhbmQgb2JqZWN0cyBhZnRlciB0aGUgZXhlY3V0aW9uXG4gICAgICAgICAqICAgICAgIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVuZXd2ZXJzaW9uIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBjcmVhdGUgbmV3XG4gICAgICAgICAqICAgICAgIHZlcnNpb25zIG9mIGVhY2ggc3RvcmVkIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuIEJ5IGRlZmF1bHQsIHN0b3JlZCBmaWxlcyBvdmVyd3JpdGUgYW55IHByZS1leGlzdGluZyBmaWxlXG4gICAgICAgICAqICAgICAgIGJ5IHRoZSBzYW1lIG5hbWUuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlcHVibGljIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBhc3NpZ24gcHVibGljIGFjY2Vzc1xuICAgICAgICAgKiAgICAgICB0byBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlxuICAgICAgICAgKiAgICBTb21lIG9mIHRoZSBrZXkgZGF0YSBpbmRpY2F0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGxcbiAgICAgICAgICogICAgaW5jbHVkZTpcbiAgICAgICAgICogPC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBjb25zb2xlIC0gaW5kaWNhdGVzIHRoZSBjb25zb2xlIG91dHB1dCByZXN1bHRpbmcgZnJvbSB0aGUgc2NyaXB0XG4gICAgICAgICAqICAgICAgIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIHJlc3VsdHMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBSIGdyYXBoaWNzXG4gICAgICAgICAqICAgICAgIGRldmljZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGFydGlmYWN0cyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgb3IgbW9kaWZpZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgb2JqZWN0cyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBSIG9iamVjdHMgcmV0dXJuZWQgZnJvbSB0aGUgd29ya3NwYWNlXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgZmlsZXMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIG9iamVjdHMgc3RvcmVkIGluIHRoZVxuICAgICAgICAgKiAgICAgICByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5pbnRlcnJ1cHRlZCAtIGluZGljYXRlcyB0aGUgaW50ZXJydXB0ZWQgc3RhdHVzIG9mIGV4ZWN1dGlvbjwvbGk+XG4gICAgICAgICAqICAgIDxsaT5lcnJvciAtIG9uIGZhaWx1cmUsIGluZGljYXRlcyB0aGUgcmVhc29uIGZvciBmYWlsdXJlPC9saT5cbiAgICAgICAgICogICAgPGxpPmVycm9yQ29kZSAtIG9uIGZhaWx1cmUsIGluZGljYXRlcyB0aGUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZTwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4ZWN1dGVTY3JpcHRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiAgPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5LW1hbmFnZWQgZGlyZWN0b3JpZXMgZm9yXG4gICAgICAgICAqICAgICAgIHNjcmlwdHMsIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItZmlsZW5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLCB2ZXJzaW9uLXBlci1maWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5leHRlcm5hbHNvdXJjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFVSTHMgb3IgZmlsZSBwYXRocyB0byBleHRlcm5hbCBzY3JpcHRzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgc2NyaXB0IGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jc3ZpbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmltaXRpdmUgbmFtZS92YWx1ZSBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZXZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBvYmplY3QgKC5yRGF0YSkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRvYmplY3RuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3R2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLW9iamVjdC1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHdvcmtzcGFjZSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggZGlyZWN0b3J5IGlzIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZGQ+YWRvcHRwYWNrYWdlczwvZGQ+XG4gICAgICAgICAqICAgIDxkdD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBhZG9wdGVkPC9kdD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIHRhZyB0aGF0IGxhYmVscyB0aGUgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmVjaG9vZmY8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlIFIgY29tbWFuZHMgd2lsbCBub3QgYXBwZWFyIGluIHRoZSBjb25zb2xlIG91dHB1dDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBwcmVmZXJyZWQgUiBncmFwaGljcyBkZXZpY2UgZm9yIGV4ZWN1dGlvbjogcG5nIG9yIHN2ZzwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljc3dpZHRoPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCB3aWR0aCBmb3IgUiBncmFwaGljcyBkZXZpY2UgaW1hZ2VzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmdyYXBoaWNzaGVpZ2h0PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBoZWlnaHQgZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yb2JqZWN0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9iamVjdHMgZm9yIHJldHJpZXZhbCBmb2xsb3dpbmcgdGhlIGV4ZWN1dGlvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZWZpbGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVvYmplY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3Jrc3BhY2Ugb2JqZWN0IG5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3Jld29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgZmlsZW5hbWUgKC5yRGF0YSkgd2hlcmUgd29ya3NwYWNlIGNvbnRlbnRzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVuZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuc3VyZXMgZWFjaCBmaWxlIHN0b3JlZCBpbiByZXBvc2l0b3J5IHJlc3VsdHMgaW4gbmV3IHZlcnNpb24gYmVpbmcgY3JlYXRlZCBpZiBuZWVkZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVwdWJsaWM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaGVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5maW5pdHk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgY3VzdG9tIHZhbHVlIGZvciBJbmZpbml0eSBhcHBlYXJpbmcgaW4gUiBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiBjYWxsLCBvdGhlcndpc2UgSW5maW5pdHkgaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+MHg3ZmYwMDAwMDAwMDAwMDAwTDwvY29kZT48L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmFuPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgTmFOIGFwcGVhcmluZyBpbiBSIG9iamVjdCBkYXRhIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBOYU4gaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+bnVsbDwvY29kZT48L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZW5jb2RlRGF0YUZyYW1lUHJpbWl0aXZlQXNWZWN0b3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGF0YS5mcmFtZSBwcmltaXRpdmVzIGFyZSBlbmNvZGVkIHZlY3RvcnMgaW4gUiBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiBjYWxsPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEV4ZWN1dGVTY3JpcHQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvc2NyaXB0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBpbnRlcnJ1cHRzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBvbiBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RXhlY3V0ZUludGVycnVwdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqICA8ZGw+XG4gICAgICAgICAqICAgICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqICA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeGVjdXRlSW50ZXJydXB0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9leGVjdXRlL2ludGVycnVwdCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgcmV0cmlldmVzIHRoZSBSIGNvbnNvbGUgb3V0cHV0IGZvciB0aGUgbGF0ZXN0IGV4ZWN1dGlvbiBvblxuICAgICAgICAgKiBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RXhlY3V0ZUNvbnNvbGVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiAgPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEV4ZWN1dGVDb25zb2xlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9leGVjdXRlL2NvbnNvbGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJldHJpZXZlcyB0aGUgZXhlY3V0aW9uIGhpc3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogU29tZSBvZiB0aGUga2V5IGRhdGEgaW5kaWNhdGVkIGZvciBlYWNoIGhpc3RvcnkgaXRlbSBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqIG9uIHRoaXMgY2FsbCBpbmNsdWRlOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8b2w+XG4gICAgICAgICAqICA8bGk+Y29kZSAtIGluZGljYXRlcyB0aGUgY29kZSB0aGF0IGhhcyBiZWVuIGV4ZWN1dGVkPC9saT5cbiAgICAgICAgICogIDxsaT5jb25zb2xlIC0gaW5kaWNhdGVzIHRoZSBjb25zb2xlIG91dHB1dCByZXN1bHRpbmcgZnJvbSB0aGUgY29kZSBleGVjdXRpb248L2xpPlxuICAgICAgICAgKiAgPGxpPnJlc3VsdHNHZW5lcmF0ZWQgLSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBnZW5lcmF0ZWQgcmVzdWx0cyBvbiB0aGUgZXhlY3V0aW9uPC9saT5cbiAgICAgICAgICogIDxsaT5yZXN1bHRzQXZhaWxhYmxlIC0gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZ2VuZXJhdGVkIHJlc3VsdHMgc3RpbGwgc3RvcmVkIG9uIHRoZSBleGVjdXRpb248L2xpPlxuICAgICAgICAgKiAgPGxpPnJlc291cmNlVXNhZ2UgLSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgc3RvcmFnZSBieXRlIGNvdW50IGZvciByZXN1bHRzIG9uIHRoZSBleGVjdXRpb248L2xpPlxuICAgICAgICAgKiAgPGxpPmV4ZWN1dGlvbiAtIGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIGlkZW50aWZpZXIsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgb24gL3IvcHJvamVjdC9leGVjdXRpb24vcmVzdWx0IGNhbGxzIHRvIHJldHJpZXZlIG9yIG1hbmFnZSByZXN1bHRzPC9saT5cbiAgICAgICAgICogIDxsaT5pbnRlcnJ1cHRlZCAtIGluZGljYXRlcyB0aGUgaW50ZXJydXB0ZWQgc3RhdHVzIG9mIGV4ZWN1dGlvbjwvbGk+XG4gICAgICAgICAqICA8bGk+ZXJyb3IgLSBvbiBmYWlsdXJlLCBpbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZTwvbGk+XG4gICAgICAgICAqICA8bGk+ZXJyb3JDb2RlIC0gb24gZmFpbHVyZSwgaW5kaWNhdGVzIHRoZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RXhlY3V0ZUhpc3RvcnlcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbHRlcmRlcHRoPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgbWF4IG51bWJlciBvZiBleGVjdXRpb25zIHRvIGJlIHJldHVybmVkIGluIHRoZSBoaXN0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmV4ZWN1dGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhlY3V0aW9uIGlkZW50aWZpZXJzIG9uIHdoaWNoIHRvIGZpbHRlciBoaXN0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbHRlcnRhZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgZXhlY3V0aW9uIHRhZyBvbiB3aGljaCB0byBmaWx0ZXIgaGlzdG9yeTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXZlcnNlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgZXhlY3V0aW9uIGhpc3RvcnkgaXMgcmV0dXJuZWQgaW4gYVxuICAgICAgICAgKiAgICAgICByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICAgICAgICogICAgPC9kdD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0RXhlY3V0ZUhpc3Rvcnk6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvaGlzdG9yeScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZmx1c2hlcyBleGVjdXRpb25zIGluIHRoZSBoaXN0b3J5IG9uIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICogRmx1c2hpbmcgYW4gZXhlY3V0aW9uIGRlbGV0ZXMgYm90aCB0aGUgUiBjb25zb2xlIG91dHB1dCBhbmQgdGhlIGdlbmVyYXRlZFxuICAgICAgICAgKiByZXN1bHRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV4ZWN1dGlvbiBidXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogaXRzZWxmIGZyb20gdGhlIGhpc3RvcnkuIEJ5IG9taXR0aW5nIHRoZSBleGVjdXRpb24gcGFyYW1ldGVyLCB0aGUgY2FsbGVyXG4gICAgICAgICAqIGNhbiBmbHVzaCBldmVyeSBleGVjdXRpb24gaW4gdGhlIGhpc3Rvcnkgb24gdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGZsdXNoaW5nIGZhY2lsaXR5IGlzIHByb3ZpZGVkIHRvIGhlbHAgdXNlcnMgbWFuYWdlIHRoZSBsZXZlbHMgb2ZcbiAgICAgICAgICogcmVzb3VyY2UgdXNhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIHBlcnNpc3RlbnQgcHJvamVjdHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4ZWN1dGVGbHVzaFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqICA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmV4ZWN1dGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4ZWN1dGlvbiBpZGVudGlmaWVyczwvZGQ+XG4gICAgICAgICAqICA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeGVjdXRlRmx1c2g6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvZmx1c2gnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGxpc3RzIHRoZSBleGVjdXRpb24gcmVzdWx0cyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBCeSBzcGVjaWZ5aW5nIGEgdmFsdWUgZm9yIHRoZSBleGVjdXRpb24gcGFyYW1ldGVyIHRoZSBjYWxsZXIgY2FuIGxpbWl0IHRoZVxuICAgICAgICAgKiByZXNwb25zZSB0byB0aG9zZSByZXN1bHRzIGZvdW5kIG9uIGEgc3BlY2lmaWMgZXhlY3V0aW9uIG9yIHNldCBvZlxuICAgICAgICAgKiBleGVjdXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiA8YmxvY2txdW90ZT5cbiAgICAgICAgICogICAgSW1wb3J0YW50ISBUaGUgVVJMcyBpbmRpY2F0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGwgcmVtYWluXG4gICAgICAgICAqICAgIHZhbGlkIGZvciBhcyBsb25nIGFzIHRoZSByZXN1bHRzIHJlbWFpbiBwYXJ0IG9mIHRoZSBwcm9qZWN0LlxuICAgICAgICAgKiA8L2Jsb2NrcXVvdGU+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdEV4ZWN1dGVSZXN1bHRMaXN0XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5leGVjdXRpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhlY3V0aW9uIGlkZW50aWZpZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEV4ZWN1dGVSZXN1bHRMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9leGVjdXRlL3Jlc3VsdC9saXN0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkb3dubG9hZHMgdGhlIGV4ZWN1dGlvbiByZXN1bHRzIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEJ5IHNwZWNpZnlpbmcgYSB2YWx1ZSBmb3IgdGhlIGV4ZWN1dGlvbiBwYXJhbWV0ZXIgdGhlIGNhbGxlciBjYW4gZG93bmxvYWRcbiAgICAgICAgICogb25seSByZXN1bHRzIG9uIHRoZSBzcGVjaWZpZWQgZXhlY3V0aW9ucy4gQnkgc3BlY2lmeWluZyBhIHZhbHVlIGZvciB0aGVcbiAgICAgICAgICogZmlsZW5hbWUgcGFyYW1ldGVyIHRoZSBjYWxsZXIgY2FuIGRvd25sb2FkIGEgc3BlY2lmaWMgcmVzdWx0IG9uIHRoZVxuICAgICAgICAgKiBzcGVjaWZpZWQgZXhlY3V0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RFeGVjdXRlUmVzdWx0RG93bmxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmV4ZWN1dGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleGVjdXRpb24gaWRlbnRpZmllcnNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgcmVzdWx0IGZpbGUgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbmxpbmU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gcmVzcG9uc2UgaGVhZGVyXG4gICAgICAgICAqICAgICAgIGluZGljYXRpbmcgYXR0YWNobWVudCBpcyBvbWl0dGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqICA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3RFeGVjdXRlUmVzdWx0RG93bmxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvcmVzdWx0L2Rvd25sb2FkJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkZWxldGVzIHRoZSBleGVjdXRpb24gcmVzdWx0cyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBCeSBzcGVjaWZ5aW5nIGEgdmFsdWUgZm9yIHRoZSBleGVjdXRpb24gcGFyYW1ldGVyIHRoZSBjYWxsZXIgY2FuIGRlbGV0ZVxuICAgICAgICAgKiBvbmx5IHRob3NlIHJlc3VsdHMgb24gdGhlIHNwZWNpZmllZCBleGVjdXRpb25zLiBCeSBzcGVjaWZ5aW5nIGEgdmFsdWUgZm9yXG4gICAgICAgICAqIHRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgdGhlIGNhbGxlciBjYW4gZGVsZXRlIGEgc3BlY2lmaWMgcmVzdWx0IG9uIHRoZVxuICAgICAgICAgKiBzcGVjaWZpZWQgZXhlY3V0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RXhlY3V0ZVJlc3VsdERlbGV0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICA8ZHQ+ZXhlY3V0aW9uPC9kdD5cbiAgICAgICAgICogICA8ZGQ+XG4gICAgICAgICAqICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleGVjdXRpb24gaWRlbnRpZmllcnNcbiAgICAgICAgICogICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgcmVzdWx0IGZpbGUgbmFtZTwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdEV4ZWN1dGVSZXN1bHREZWxldGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2V4ZWN1dGUvcmVzdWx0L2RlbGV0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gUHJvamVjdCBEaXJlY3RvcnkgQVBJc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBsaXN0cyB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgZmlsdGVyIHBhcmFtZXRlciBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjYWxsIHRvIGZpbHRlciwgdGhlIHR5cGVzIG9mXG4gICAgICAgICAqIGZpbGVzIHJldHVybmVkIGFjY29yZGluZyB0byB0aGVpciBjYXRlZ29yeS4gVGhlIGZvbGxvd2luZyBmaWx0ZXIgdmFsdWVzIGFyZVxuICAgICAgICAgKiBzdXBwb3J0ZWQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIDxvbD5cbiAgICAgICAgICogICAgPGxpPnBsb3QgLSBmaWxlcyBlbmRpbmcgd2l0aCBhIC5wbmcsIC5zdmcgb3IgLmpwZyBleHRlbnNpb248L2xpPlxuICAgICAgICAgKiAgICA8bGk+c2NyaXB0IC0gZmlsZXMgZW5kaW5nIHdpdGggYSAuUiBvciAuciBleHRlbnNpb248L2xpPlxuICAgICAgICAgKiAgICA8bGk+UiAtIGZpbGVzIGVuZGluZyB3aXRoIGEgLnJEYXRhIG9yIC5yZGF0YSBleHRlbnNpb248L2xpPlxuICAgICAgICAgKiAgICA8bGk+ZGF0YSAtIGZpbGVzIGVuZGluZyB3aXRoIGEgLmNzdiBvciAueGxzIGV4dGVuc2lvbjwvbGk+XG4gICAgICAgICAqICAgIDxsaT50ZXh0IC0gZmlsZXMgZW5kaW5nIHdpdGggYSAudHh0IGV4dGVuc2lvbjwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdERpcmVjdG9yeUxpc3RcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbHRlcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgZmlsdGVyIGJ5IGNhdGVnb3J5IHZhbHVlPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0RGlyZWN0b3J5TGlzdDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvZGlyZWN0b3J5L2xpc3QnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwbG9hZHMgYSBmaWxlIGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWVkXG4gICAgICAgICAqIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdERpcmVjdG9yeVVwbG9hZFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+Li4uZmlsZSBjb250ZW50Li4uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBkZXNjcmlwdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGggZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5vdmVyd3JpdGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyBmaWxlIG9mIHNhbWUgbmFtZTwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeVVwbG9hZDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IFwidGV4dFwiO1xuICAgICAgICAgICAgdmFyIGlvQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5mb3JtSWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L2RpcmVjdG9yeS91cGxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHRyYW5zZmVycyBhIGZpbGUgZnJvbSBhIFVSTCBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlXG4gICAgICAgICAqIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3REaXJlY3RvcnlUcmFuc2ZlclxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnVybDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIFVSTCBmb3IgdGhlIGZpbGU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm92ZXJ3cml0ZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIG92ZXJ3cml0ZXMgdGhlIGV4aXN0aW5nIGZpbGUgb2Ygc2FtZSBuYW1lPC9kZD5cbiAgICAgICAgICogIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeVRyYW5zZmVyOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kaXJlY3RvcnkvdHJhbnNmZXInLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHdyaXRlcyBhIHRleHQgZmlsZSBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmllZFxuICAgICAgICAgKiBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3REaXJlY3RvcnlXcml0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRleHQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSB0ZXh0IGNvbnRlbnQgZm9yIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRlbGltaXRlcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjdXN0b20gZGVsaW1pdGVyIGZvciB0ZXh0IHdoZW4gd3JpdGluZ1xuICAgICAgICAgKiAgICAgICBtdWx0aXBsZSBmaWxlcywgZGVmYXVsdHMgdG8gIywjXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgZGVzY3JpcHRpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGZpbGU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+b3ZlcndyaXRlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgb3ZlcndyaXRlcyB0aGUgZXhpc3RpbmcgZmlsZSBvZiBzYW1lIG5hbWU8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3REaXJlY3RvcnlXcml0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvZGlyZWN0b3J5L3dyaXRlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqIFxuICAgICAgICAgKiBUaGlzIGNhbGwgdXBkYXRlcyBhIGZpbGUgbmFtZSBhbmQvb3IgZGVzY3JpcHRpb24gaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdERpcmVjdG9yeVVwZGF0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgbmV3IG5hbWUgZm9yIHRoZSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWNlcyB0aGUgbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5vdmVyd3JpdGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyBmaWxlIG9mIHNhbWUgbmFtZTwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeVVwZGF0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvZGlyZWN0b3J5L3VwZGF0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgc3RvcmVzIGEgZmlsZSBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RGlyZWN0b3J5U3RvcmVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBmaWxlIGZvciBzdG9yaW5nPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRlc2NyPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgZGVzY3JpcHRpb24gdG8gYWNjb21wYW55IHRoZSBzYXZlZCBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZ3M8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCByZXBvc2l0b3J5IGZpbGVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJvbGUgbmFtZXMsIHdoaWNoIG1ha2VzIHRoZSBmaWxlXG4gICAgICAgICAqICAgICAgICB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMgd2l0aCB0aGVzZSByb2xlc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgc2hhcmVkICwgd2hpY2ggbWFrZXMgdGhlIGZpbGVcbiAgICAgICAgICogICAgICAgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGUgd2lsbCBiZSBwdWJsaXNoZWQgLCB3aGljaCBtYWtlcyB0aGVcbiAgICAgICAgICogICAgICAgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgbmV3IGZpbGUgd2lsbCBiZSByZW5hbWVkIHRvIGF2b2lkIG92ZXJ3cml0aW5nXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeVN0b3JlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kaXJlY3Rvcnkvc3RvcmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGxvYWRzIGEgZmlsZSBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvclxuICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcHJvamVjdERpcmVjdG9yeUxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgYXV0aG9yIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb248L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3REaXJlY3RvcnlMb2FkOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kaXJlY3RvcnkvbG9hZCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZG93bmxvYWRzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBjb250ZW50cyBmb3IgdGhlIHNwZWNpZmllZFxuICAgICAgICAgKiBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBCeSBzcGVjaWZ5aW5nIGEgc2luZ2xlIHZhbHVlIGZvciB0aGUgZmlsZW5hbWUgcGFyYW1ldGVyLCB0aGUgY2FsbGVyIGNhblxuICAgICAgICAgKiBkb3dubG9hZCBhIHNwZWNpZmljIGZpbGUuIEJ5IHNwZWNpZnlpbmcgbXVsdGlwbGUgdmFsdWVzIGZvciB0aGUgZmlsZW5hbWVcbiAgICAgICAgICogcGFyYW1ldGVyLCB0aGUgY2FsbGVyIGNhbiBkb3dubG9hZCBhIHppcCBhcmNoaXZlIG9mIHRob3NlIGZpbGVzLiBCeVxuICAgICAgICAgKiBvbWl0dGluZyB0aGUgZmlsZW5hbWUgcGFyYW1ldGVyLCB0aGVuIHRoZSBjYWxsZXIgY2FuIGRvd25sb2FkIGEgemlwIGFyY2hpdmVcbiAgICAgICAgICogd2l0aCBhbGwgb2YgdGhlIGZpbGVzIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RGlyZWN0b3J5RG93bmxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGNvbW1hLXNlcGFyYXRlZCBmaWxlIG5hbWVzIGZvciBkb3dubG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbmxpbmU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gcmVzcG9uc2UgaGVhZGVyXG4gICAgICAgICAqICAgICAgIGluZGljYXRpbmcgYXR0YWNobWVudCBpcyBvbWl0dGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeURvd25sb2FkOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcHJvamVjdC9kaXJlY3RvcnkvZG93bmxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGRlbGV0ZXMgZmlsZXMgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZWRcbiAgICAgICAgICogcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0RGlyZWN0b3J5RGVsZXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIG5hbWVzIGZvciBkZWxldGlvbjwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJvamVjdERpcmVjdG9yeURlbGV0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvZGlyZWN0b3J5L2RlbGV0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gUHJvamVjdCBQYWNrYWdlIEFQSXNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgbGlzdHMgUiBwYWNrYWdlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RQYWNrYWdlTGlzdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5zdGFsbGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICBpZiB0cnVlLCByZXNwb25zZSBsaXN0cyBhbGwgcGFja2FnZXMgaW5zdGFsbGVkIGluIHByb2plY3QgZW52aXJvbm1lbnRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0UGFja2FnZUxpc3Q6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9wcm9qZWN0L3BhY2thZ2UvbGlzdCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgYXR0YWNoZXMgUiBwYWNrYWdlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHByb2plY3RQYWNrYWdlQXR0YWNoXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+cHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgdGhlIHByb2plY3QgaWRlbnRpZmllcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFIgcGFja2FnZSBuYW1lcyB0byBhdHRhY2g8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cmVwbzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBSIHJlcG9zaXRvcnkgbG9jYXRpb24gZm9yIG5hbWVkIHBhY2thZ2VzPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0UGFja2FnZUF0dGFjaDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvcGFja2FnZS9hdHRhY2gnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGRldGFjaGVzIFIgcGFja2FnZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBwcm9qZWN0UGFja2FnZURldGFjaFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBSIHBhY2thZ2UgbmFtZXMgdG8gZGV0YWNoPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBwcm9qZWN0UGFja2FnZURldGFjaDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3Byb2plY3QvcGFja2FnZS9kZXRhY2gnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFVzZXIgQVBJc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBzaWducyB0aGUgdXNlciBpbiBieSBhdXRoZW50aWNhdGluZyB0aGUgY3JlZGVudGlhbHMgd2l0aCB0aGVcbiAgICAgICAgICogUmV2b0RlcGxveVIgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHVzZXJMb2dpblxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnVzZXJuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgdXNlcm5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cGFzc3dvcmQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwYXNzd29yZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXNhYmxlYXV0b3NhdmU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiB0cnVlLCBkaXNhYmxlcyBhdXRvc2F2ZSBzZW1hbnRpY3MgZm9yIHBlcnNpc3RlbnRcbiAgICAgICAgICogICAgICAgcHJvamVjdHNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyTG9naW46IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci91c2VyL2xvZ2luJywgY29uZmlnLCBjYWxsYmFjayk7ICAgICAgICAgICAgXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBzaWducyBvdXQgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgdXNlckxvZ291dFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnVzZXJjb29raWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiBzcGVjaWZpZWQsIHZhbHVlIHNldHMgYXBwbGljYXRpb24tc3BlY2lmaWMgcGVyc2lzdGVudFxuICAgICAgICAgKiAgICAgICB1c2VyIGNvb2tpZSwgd2hpY2ggaXMgcmV0cmlldmFibGUgb24gcmVzcG9uc2UgdG9cbiAgICAgICAgICogICAgICAgPGEgaHJlZj1cIiNtZXRob2RfdXNlckxvZ2luXCI+dXNlckxvZ2luPC9hPiBjYWxsLlxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJMb2dvdXQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci91c2VyL2xvZ291dCcsIGNvbmZpZywgY2FsbGJhY2spOyAgICAgICAgICAgIFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgcmV0cmlldmVzIGRldGFpbHMgYWJvdXQgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuIFRoZVxuICAgICAgICAgKiBkZXRhaWxzIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBtYXJrdXAgb24gdGhpcyBjYWxsIGFyZSBleGFjdGx5IHRoZSBzYW1lXG4gICAgICAgICAqIGRldGFpbHMgYXMgdGhvc2UgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGVcbiAgICAgICAgICogPGEgaHJlZj1cIiNtZXRob2RfdXNlckxvZ2luXCI+dXNlckxvZ2luPC9hPiBjYWxsLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHVzZXJBYm91dFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFib3V0OiBmdW5jdGlvbihjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3VzZXIvYWJvdXQnLCB7fSwgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYXV0b3NhdmUgc2VtYW50aWNzIG9uIHBlcnNpc3RlbnQgcHJvamVjdHNcbiAgICAgICAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCB1c2VycyBIVFRQIHNlc3Npb24uIEJ5IGRlZmF1bHQsIGFsbCBsaXZlXG4gICAgICAgICAqIHBlcnNpc3RlbnQgcHJvamVjdHMgYXJlIGF1dG9zYXZlZCB1bmRlciB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gICAgICAgICAqXG4gICAgICAgICAqIDx1bD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBXaGVuIGEgdXNlciBjbG9zZXMgYSBwcm9qZWN0IHVzaW5nIHRoZVxuICAgICAgICAgKiAgICAgICA8YSBocmVmPVwiI21ldGhvZF9wcm9qZWN0Q2xvc2VcIj5wcm9qZWN0Q2xvc2U8L2E+IGNhbGwuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgV2hlbiBhIHVzZXIgc2lnbnMtb3V0IHVzaW5nIHRoZVxuICAgICAgICAgKiAgICAgICA8YSBocmVmPVwiI21ldGhvZF91c2VyTG9nb3V0XCI+dXNlckxvZ291dDwvYT4gY2FsbC5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBXaGVuIGEgdXNlciBpcyBhdXRvbWF0aWNhbGx5IHNpZ25lZC1vdXQgYnkgdGhlIHN5c3RlbSBhZnRlciBhXG4gICAgICAgICAqICAgICAgIHByb2xvbmdlZCBwZXJpb2Qgb2YgaW5hY3Rpdml0eS5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC91bD5cbiAgICAgICAgICpcbiAgICAgICAgICogV2hlbiB0aGUgYXV0b3NhdmUgZmVhdHVyZSBpcyBkaXNhYmxlZCBhIHVzZXIgbXVzdCBtYWtlIGFuIGV4cGxpY2l0IGNhbGwgb25cbiAgICAgICAgICogPGEgaHJlZj1cIiNtZXRob2RfcHJvamVjdFNhdmVcIj5wcm9qZWN0U2F2ZTwvYT4gaW4gb3JkZXIgdG8gc2F2ZSBhIHByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgdXNlckF1dG9zYXZlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZW5hYmxlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgdG9nZ2xlcyBhdXRvc2F2ZSBzZW1hbnRpY3MgZm9yIHBlcnNpc3RlbnQgcHJvamVjdHMuPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQXV0b3NhdmU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci91c2VyL2F1dG9zYXZlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBSZXBvc2l0b3J5IFNjcmlwdCBBUElzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGxpc3RzIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGNhbGwgaXMgYXZhaWxhYmxlIHRvIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2Vycy4gSG93ZXZlciwgaWZcbiAgICAgICAgICogdGhlIGNhbGxlciBpcyBhbiBhbm9ueW1vdXMgdXNlciB0aGVuIG9ubHkgcHVibGlzaGVkIHNjcmlwdHMgd2lsbCBiZVxuICAgICAgICAgKiByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlTY3JpcHRMaXN0XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgd2hlbiBzcGVjaWZpZWQsIGNhbGwgcmV0dXJucyBsaXN0IG9mIHNjcmlwdCB2ZXJzaW9ucyBmb3JcbiAgICAgICAgICogICAgICAgZmlsZW5hbWVcbiAgICAgICAgICogICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBmaWxlcyB0aGF0IGFyZSByZXN0cmljdGVkIGJ1dFxuICAgICAgICAgKiAgICAgICB2aXNpYmxlIG9yIHNoYXJlZCBieSBvdGhlciB1c2VycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzY3JpcHRzIHB1Ymxpc2hlZCBieSBvdGhlciB1c2VycyBhcmVcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlTY3JpcHRMaXN0OiBmdW5jdGlvbihjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvc2NyaXB0L2xpc3QnLCB7fSwgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGV4ZWN1dGVzIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzIG9yIGV4dGVybmFsIHNjcmlwdHMgb24gYW5cbiAgICAgICAgICogQW5vbnltb3VzIFByb2plY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZVxuICAgICAgICAgKiBwYXJhbWV0ZXIgdmFsdWVzIGZvciBmaWxlbmFtZSwgYXV0aG9yIGFuZCBvcHRpb25hbGx5IHZlcnNpb24uIFRvIGV4ZWN1dGUgYVxuICAgICAgICAgKiBjaGFpbiBvZiByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0cyB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhXG4gICAgICAgICAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyBvbiB0aGUgZmlsZW5hbWUgLCBhdXRob3IgYW5kIG9wdGlvbmFsbHlcbiAgICAgICAgICogdmVyc2lvbiBwYXJhbWV0ZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBleGVjdXRlIGEgc2luZ2xlIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIHZhbGlkIFVSTFxuICAgICAgICAgKiBvciBmaWxlIHBhdGggdXNpbmcgdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gVG8gZXhlY3V0ZSBhIGNoYWluIG9mXG4gICAgICAgICAqIGV4dGVybmFsIHNjcmlwdHMgdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZlxuICAgICAgICAgKiB2YWx1ZXMgb24gdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gTm90ZSwgdG8gZXhlY3V0ZSBhbiBleHRlcm5hbCBzY3JpcHRcbiAgICAgICAgICogdGhlIGNhbGxlciBtdXN0IGhhdmUgUE9XRVJfVVNFUiBwcml2aWxlZ2VzIHNvIHRoaXMgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAqIHRvIGFub255bW91cyB1c2VycyBvbiB0aGlzIGNhbGwuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGU6IEEgY2hhaW5lZCBleGVjdXRpb24gZXhlY3V0ZXMgZWFjaCBvZiB0aGUgc2NyaXB0cyBpZGVudGlmaWVkIG9uIHRoZVxuICAgICAgICAgKiBjYWxsIGluIGEgc2VxdWVudGlhbCBmYXNoaW9uIG9uIHRoZSBSIHNlc3Npb24sIHdpdGggZXhlY3V0aW9uIG9jY3VyaW5nIGluXG4gICAgICAgICAqIHRoZSBvcmRlciBzcGVjaWZpZWQgb24gdGhlIHBhcmFtZXRlciBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlByZS1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZFxuICAgICAgICAgKiAgICAgICBSIG9iamVjdCB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0c1xuICAgICAgICAgKiAgICAgICBpbiB0aGUgd29ya3NwYWNlIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcHJlbG9hZGZpbGUgcGFyYW1ldGVycyBhbGxvd3MgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2Fkb2JqZWN0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGJpbmFyeSBSIG9iamVjdHMgKC5yRGF0YSkgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICogICAgICAgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBhZG9wdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBhIHByZS1leGlzdGluZ1xuICAgICAgICAgKiAgICAgICBwcm9qZWN0IHdvcmtzcGFjZSwgcHJvamVjdCB3b3JraW5nIGRpcmVjdG9yeSBhbmQvb3IgcHJvamVjdCBwYWNrYWdlXG4gICAgICAgICAqICAgICAgIGRlcGVuZGVuY2llcyBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxzdHJvbmc+UG9zdC1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSByb2JqZWN0cyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZFxuICAgICAgICAgKiAgICAgICBsaXN0IG9mIG9iamVjdCBuYW1lcyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYXMgUmV2b0RlcGxveVItZW5jb2RlZCBSXG4gICAgICAgICAqICAgICAgIG9iamVjdHMgb24gdGhlIHJlc3BvbnNlIG1hcmt1cCBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVmaWxlIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya2luZyBkaXJlY3RvcnkgZmlsZXMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyXG4gICAgICAgICAqICAgICAgIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZW9iamVjdCBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZFxuICAgICAgICAgKiAgICAgICBsaXN0IG9mIHdvcmtzcGFjZSBvYmplY3RzIHRvIGJlIHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGVcbiAgICAgICAgICogICAgICAgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmV3b3Jrc3BhY2UgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHN0b3JlIHRoZSBlbnRpcmVcbiAgICAgICAgICogICAgICAgd29ya3NwYWNlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWRpcmVjdG9yeSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3BlY2lmeSBhIHRhcmdldFxuICAgICAgICAgKiAgICAgICByZXBvc2l0b3J5IGRpcmVjdG9yeSBmb3Igc3RvcmVkIGZpbGVzIGFuZCBvYmplY3RzIGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZW5ld3ZlcnNpb24gcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNyZWF0ZSBuZXdcbiAgICAgICAgICogICAgICAgdmVyc2lvbnMgb2YgZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uXG4gICAgICAgICAqICAgICAgIGNvbXBsZXRlcy4gQnkgZGVmYXVsdCwgc3RvcmVkIGZpbGVzIG92ZXJ3cml0ZSBhbnkgcHJlLWV4aXN0aW5nIGZpbGVcbiAgICAgICAgICogICAgICAgYnkgdGhlIHNhbWUgbmFtZS5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVwdWJsaWMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIGFzc2lnbiBwdWJsaWMgYWNjZXNzXG4gICAgICAgICAqICAgICAgIHRvIGVhY2ggc3RvcmVkIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIGluZmluaXR5ICwgbmFuIGFuZCBlbmNvZGVEYXRhRnJhbWVQcmltaXRpdmVBc1ZlY3RvciBwYXJhbWV0ZXJzXG4gICAgICAgICAqICAgICAgIGFsbG93IHRoZSBjYWxsZXIgdG8gY29udHJvbCBob3cgUmV2b0RlcGxveVItZW5jb2RlZCBSIG9iamVjdCBkYXRhIGlzXG4gICAgICAgICAqICAgICAgIGVuY29kZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmtrdXAuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqICA8c3Ryb25nPlxuICAgICAgICAgKiAgICAgU29tZSBrZXkgZGF0YSBpbmRpY2F0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGw6XG4gICAgICAgICAqICA8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogIDxvbD5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBjb25zb2xlIC0gaW5kaWNhdGVzIHRoZSBjb25zb2xlIG91dHB1dCByZXN1bHRpbmcgZnJvbSB0aGUgY29kZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb25cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICByZXN1bHRzIC0gaW5kaWNhdGVzIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUgUiBncmFwaGljc1xuICAgICAgICAgKiAgICAgICBkZXZpY2VcbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBhcnRpZmFjdHMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIG9yIG1vZGlmaWVkIGluIHRoZVxuICAgICAgICAgKiAgICAgICB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIG9iamVjdHMgLSAgaW5kaWNhdGVzIHRoZSBsaXN0IG9mIFIgb2JqZWN0cyByZXR1cm5lZCBmcm9tIHRoZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2VcbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBmaWxlcyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBmaWxlcyBhbmQgb2JqZWN0cyBzdG9yZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXNcbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPmludGVycnVwdGVkIC0gaW5kaWNhdGVzIHRoZSBpbnRlcnJ1cHRlZCBzdGF0dXMgb2YgZXhlY3V0aW9uPC9saT5cbiAgICAgICAgICogICAgPGxpPmVycm9yIC0gb24gZmFpbHVyZSwgaW5kaWNhdGVzIHRoZSByZWFzb24gZm9yIGZhaWx1cmU8L2xpPlxuICAgICAgICAgKiAgICA8bGk+ZXJyb3JDb2RlIC0gb24gZmFpbHVyZSwgaW5kaWNhdGVzIHRoZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5U2NyaXB0RXhlY3V0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PnByb2plY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSBwcm9qZWN0IGlkZW50aWZpZXI8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+Y29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnktbWFuYWdlZCBkaXJlY3RvcmllcyBmb3JcbiAgICAgICAgICogICAgICAgc2NyaXB0cywgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1maWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLWZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmV4dGVybmFsc291cmNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyBvciBmaWxlIHBhdGhzIHRvIGV4dGVybmFsIHNjcmlwdHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgUmV2b0RlcGxveVItZW5jb2RlZCBzY3JpcHQgaW5wdXRzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmNzdmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByaW1pdGl2ZSBuYW1lL3ZhbHVlIGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZWF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxldmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLCB2ZXJzaW9uLXBlci1wcmVsb2FkZmlsZW5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZG9iamVjdG5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IG9iamVjdCAoLnJEYXRhKSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZG9iamVjdGF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcHJlbG9hZG9iamVjdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZG9iamVjdHZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItb2JqZWN0LXByZWxvYWRvYmplY3RuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0d29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggd29ya3NwYWNlIGlzIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHRkaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCBkaXJlY3RvcnkgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHBhY2thZ2VzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggcGFja2FnZSBkZXBlbmRlbmNpZXMgYXJlIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YmxhY2tib3g8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgZXhlY3V0aW9uIHdpbGwgb2NjdXIgb24gdGhlIEhUVFAgYmxhY2tib3hcbiAgICAgICAgICogICAgICAgcHJvamVjdCBmb3IgdGhlIGN1cnJlbnQgSFRUUCBzZXNzaW9uXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnJlY3ljbGU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCByZWN5Y2xlcyB0aGUgUiBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSFRUUFxuICAgICAgICAgKiAgICAgICBibGFja2JveCBwcm9qZWN0IG9uIHRoZSBjdXJyZW50IEhUVFAgc2Vzc2lvblxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dGFnPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIGEgdGFnIHRoYXQgbGFiZWxzIHRoZSBleGVjdXRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZWNob29mZjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBwcmVmZXJyZWQgUiBncmFwaGljcyBkZXZpY2UgZm9yIGV4ZWN1dGlvbjogcG5nIG9yIHN2ZzwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljc3dpZHRoPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCB3aWR0aCBmb3IgUiBncmFwaGljcyBkZXZpY2UgaW1hZ2VzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmdyYXBoaWNzaGVpZ2h0PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBoZWlnaHQgZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yb2JqZWN0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9iamVjdHMgZm9yIHJldHJpZXZhbCBmb2xsb3dpbmcgdGhlIGV4ZWN1dGlvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZWZpbGU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVvYmplY3Q8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3Jrc3BhY2Ugb2JqZWN0IG5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3Jld29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgZmlsZW5hbWUgKC5yRGF0YSkgd2hlcmUgd29ya3NwYWNlIGNvbnRlbnRzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVuZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGVuc3VyZXMgZWFjaCBmaWxlIHN0b3JlZCBpbiByZXBvc2l0b3J5IHJlc3VsdHMgaW4gbmV3IHZlcnNpb24gYmVpbmcgY3JlYXRlZCBpZiBuZWVkZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVwdWJsaWM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaGVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5maW5pdHk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgSW5maW5pdHkgYXBwZWFyaW5nIGluIFIgb2JqZWN0XG4gICAgICAgICAqICAgICAgIGRhdGEgcmV0dXJuZWQgb24gY2FsbCwgb3RoZXJ3aXNlIEluZmluaXR5IGlzIHJlcHJlc2VudGVkIGJ5XG4gICAgICAgICAqICAgICAgIDxjb2RlPjB4N2ZmMDAwMDAwMDAwMDAwMEw8L2NvZGU+XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW48L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgTmFOIGFwcGVhcmluZyBpbiBSIG9iamVjdCBkYXRhXG4gICAgICAgICAqICAgICAgIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBOYU4gaXMgcmVwcmVzZW50ZWQgYnkgPGNvZGU+bnVsbDwvY29kZT5cbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmVuY29kZURhdGFGcmFtZVByaW1pdGl2ZUFzVmVjdG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkYXRhLmZyYW1lIHByaW1pdGl2ZXMgYXJlIGVuY29kZWRcbiAgICAgICAgICogICAgICAgdmVjdG9ycyBpbiBSIG9iamVjdCBkYXRhIHJldHVybmVkIG9uIGNhbGxcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5U2NyaXB0RXhlY3V0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvc2NyaXB0L2V4ZWN1dGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZXhlY3V0ZXMgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdHMgb3IgZXh0ZXJuYWwgc2NyaXB0cyBvbiBhblxuICAgICAgICAgKiBBbm9ueW1vdXMgUHJvamVjdCBhbmQgcmV0dXJucyBhIHNpbXBsZSBIVE1MIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0c1xuICAgICAgICAgKiBnZW5lcmF0ZWQgb24gdGhlIGV4ZWN1dGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogT24gYSBzdWNjZXNzZnVsIGV4ZWN1dGlvbiwgdGhlIEhUTUwgcGFnZSB3aWxsIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBkYXRhXG4gICAgICAgICAqIHdoZW4gYXZhaWxhYmxlIG9uIHRoZSByZXNwb25zZTpcbiAgICAgICAgICpcbiAgICAgICAgICogPHVsPlxuICAgICAgICAgKiAgICA8bGk+UiBjb25zb2xlIG91dHB1dDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5SIHdvcmtzcGFjZSBvYmplY3QgZGF0YTwvbGk+XG4gICAgICAgICAqICAgIDxsaT5SIGdlbmVyYXRlZCBwbG90czwvbGk+XG4gICAgICAgICAqICAgIDxsaT5MaW5rcyB0byBSIHdvcmtpbmcgZGlyZWN0b3J5IGFydGlmYWN0czwvbGk+XG4gICAgICAgICAqICAgIDxsaT5MaW5rcyB0byBSZXBvc2l0b3J5IHN0b3JlZCBhcnRpZmFjdHM8L2xpPlxuICAgICAgICAgKiA8L3VsPlxuICAgICAgICAgKlxuICAgICAgICAgKiBPbiBhIGZhaWxlZCBleGVjdXRpb24sIHRoZSBIVE1MIHBhZ2Ugd2lsbCBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgICogaW5kaWNhdGluZyB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUgYW5kIHdoZW4gYXZhaWxhYmxlLCBSIGNvbnNvbGUgb3V0cHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgQVBJIGNhbGwgbWFrZXMgaXQgdmVyeSBzaW1wbGUgdG8gaW50ZWdyYXRlIG91dHB1dHMgZ2VuZXJhdGVkIGJ5XG4gICAgICAgICAqIFJldm9EZXBsb3lSLW1hbmFnZWQgUiBzY3JpcHRzIGludG8gYW55IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9uLiBJdCBjYW4gYWxzb1xuICAgICAgICAgKiBiZSB1c2VkIGFzIGEgdmVyeSBzaW1wbGUgdGVzdCBhbmQgZGVidWdnaW5nIGFpZCBmb3IgUiBzY3JpcHQgYW5kXG4gICAgICAgICAqIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZVxuICAgICAgICAgKiBwYXJhbWV0ZXIgdmFsdWVzIGZvciBmaWxlbmFtZSAsIGF1dGhvciBhbmQgb3B0aW9uYWxseSB2ZXJzaW9uIC4gVG8gZXhlY3V0ZVxuICAgICAgICAgKiBhIGNoYWluIG9mIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGFcbiAgICAgICAgICogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzIG9uIHRoZSBmaWxlbmFtZSAsIGF1dGhvciBhbmQgb3B0aW9uYWxseVxuICAgICAgICAgKiB2ZXJzaW9uIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGV4ZWN1dGUgYSBzaW5nbGUgZXh0ZXJuYWwgc2NyaXB0IHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgdmFsaWQgVVJMIG9yXG4gICAgICAgICAqIGZpbGUgcGF0aCB1c2luZyB0aGUgZXh0ZXJuYWxzb3VyY2UgcGFyYW1ldGVyLiBUbyBleGVjdXRlIGEgY2hhaW4gb2ZcbiAgICAgICAgICogZXh0ZXJuYWwgc2NyaXB0cyB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlc1xuICAgICAgICAgKiBvbiB0aGUgZXh0ZXJuYWxzb3VyY2UgcGFyYW1ldGVyLiBOb3RlLCB0byBleGVjdXRlIGFuIGV4dGVybmFsIHNjcmlwdCB0aGVcbiAgICAgICAgICogY2FsbGVyIG11c3QgaGF2ZSBQT1dFUl9VU0VSIHByaXZpbGVnZXMgc28gdGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgdG9cbiAgICAgICAgICogYW5vbnltb3VzIHVzZXJzIG9uIHRoaXMgY2FsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZTogQSBjaGFpbmVkIGV4ZWN1dGlvbiBleGVjdXRlcyBlYWNoIG9mIHRoZSBzY3JpcHRzIGlkZW50aWZpZWQgb24gdGhlXG4gICAgICAgICAqIGNhbGwgaW4gYSBzZXF1ZW50aWFsIGZhc2hpb24gb24gdGhlIFIgc2Vzc2lvbiwgd2l0aCBleGVjdXRpb24gb2NjdXJpbmcgaW5cbiAgICAgICAgICogdGhlIG9yZGVyIHNwZWNpZmllZCBvbiB0aGUgcGFyYW1ldGVyIGxpc3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFBsZWFzZSBub3RlIHRoZSBmb2xsb3dpbmcgcHJlIGFuZCBwb3N0IGV4ZWN1dGlvbiBwYXJhbWV0ZXJzOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlByZS1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZFxuICAgICAgICAgKiAgICAgICBSIG9iamVjdCB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0c1xuICAgICAgICAgKiAgICAgICBpbiB0aGUgd29ya3NwYWNlIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgY3N2aW5wdXRzIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBwYXNzIFIgb2JqZWN0IHByaW1pdGl2ZVxuICAgICAgICAgKiAgICAgICB2YWx1ZXMgYXMgY29tbWEtc2VwYXJhdGVkIG5hbWUvdmFsdWUgcGFpcnMuIFRoZXNlIGlucHV0cyBhcmUgdHVybmVkXG4gICAgICAgICAqICAgICAgIGludG8gUiBvYmplY3RzIGluIHRoZSB3b3Jrc3BhY2UgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2FkZmlsZSBwYXJhbWV0ZXJzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmVcbiAgICAgICAgICogICAgICAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBiZWZvcmUgdGhlXG4gICAgICAgICAqICAgICAgIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHByZWxvYWRvYmplY3QgcGFyYW1ldGVycyBhbGxvdyB0aGUgY2FsbGVyIHRvIGxvYWQgb25lIG9yIG1vcmVcbiAgICAgICAgICogICAgICAgYmluYXJ5IFIgb2JqZWN0cyAoLnJEYXRhKSBmcm9tIHRoZSByZXBvc2l0b3J5IGludG8gdGhlIHdvcmtzcGFjZVxuICAgICAgICAgKiAgICAgICBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIGFkb3B0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIGEgcHJlLWV4aXN0aW5nXG4gICAgICAgICAqICAgICAgIHByb2plY3Qgd29ya3NwYWNlLCBwcm9qZWN0IHdvcmtpbmcgZGlyZWN0b3J5IGFuZC9vciBwcm9qZWN0IHBhY2thZ2VcbiAgICAgICAgICogICAgICAgZGVwZW5kZW5jaWVzIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5Qb3N0LWV4ZWN1dGlvbiBwYXJhbWV0ZXJzOjwvc3Ryb25nPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8b2w+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHJvYmplY3RzIHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygb2JqZWN0IG5hbWVzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBhcyBSZXZvRGVwbG95Ui1lbmNvZGVkIFJcbiAgICAgICAgICogICAgICAgb2JqZWN0cyBvbiB0aGUgcmVzcG9uc2UgbWFya3VwIGFmdGVyIHRoZSBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWZpbGUgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXJcbiAgICAgICAgICogICAgICAgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jlb2JqZWN0IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdHMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXdvcmtzcGFjZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIGVudGlyZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2UgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZGlyZWN0b3J5IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgdGFyZ2V0XG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGZvciBzdG9yZWQgZmlsZXMgYW5kIG9iamVjdHMgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlbmV3dmVyc2lvbiBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY3JlYXRlIG5ld1xuICAgICAgICAgKiAgICAgICB2ZXJzaW9ucyBvZiBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLiBCeSBkZWZhdWx0LCBzdG9yZWQgZmlsZXMgb3ZlcndyaXRlIGFueSBwcmUtZXhpc3RpbmcgZmlsZVxuICAgICAgICAgKiAgICAgICBieSB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXB1YmxpYyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gYXNzaWduIHB1YmxpYyBhY2Nlc3NcbiAgICAgICAgICogICAgICAgdG8gZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgIFRoZSBpbmZpbml0eSAsIG5hbiBhbmQgZW5jb2RlRGF0YUZyYW1lUHJpbWl0aXZlQXNWZWN0b3IgcGFyYW1ldGVyc1xuICAgICAgICAgKiAgICAgIGFsbG93IHRoZSBjYWxsZXIgdG8gY29udHJvbCBob3cgUmV2b0RlcGxveVItZW5jb2RlZCBSIG9iamVjdCBkYXRhIGlzXG4gICAgICAgICAqICAgICAgZW5jb2RlZCBpbiB0aGUgcmVzcG9uc2UgbWFya2t1cC5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogPC9vbD5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5Tb21lIGtleSBkYXRhIGluZGljYXRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwIG9uIHRoaXMgY2FsbDo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGNvbnNvbGUgLSBpbmRpY2F0ZXMgdGhlIFIgY29uc29sZSBvdXRwdXQgcmVzdWx0aW5nIGZyb20gdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIHJlc3VsdHMgLSBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBSIGdyYXBoaWNzXG4gICAgICAgICAqICAgICAgIGRldmljZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGFydGlmYWN0cyAtIGluZGljYXRlcyB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQgb3IgbW9kaWZpZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgb2JqZWN0cyAtICBpbmRpY2F0ZXMgdGhlIGxpc3Qgb2YgUiBvYmplY3RzIHJldHVybmVkIGZyb20gdGhlXG4gICAgICAgICAqICAgICAgIHdvcmtzcGFjZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGZpbGVzIC0gaW5kaWNhdGVzIHRoZSBsaXN0IG9mIGZpbGVzIGFuZCBvYmplY3RzIHN0b3JlZCBpbiB0aGVcbiAgICAgICAgICogICAgICAgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlc1xuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGludGVycnVwdGVkIC0gaW5kaWNhdGVzIHRoZSBpbnRlcnJ1cHRlZCBzdGF0dXMgb2YgZXhlY3V0aW9uXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgZXJyb3IgLSBvbiBmYWlsdXJlLCBpbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIGVycm9yQ29kZSAtIG9uIGZhaWx1cmUsIGluZGljYXRlcyB0aGUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZVxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlTY3JpcHRSZW5kZXJcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcHJvamVjdCBpZGVudGlmaWVyPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRcbiAgICAgICAgICogICAgICAgZmlsZW5hbWVzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeS1tYW5hZ2VkIGRpcmVjdG9yaWVzIGZvclxuICAgICAgICAgKiAgICAgICBzY3JpcHRzLCBkZWZhdWx0cyB0byByb290XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgb25lIGF1dGhvciBwZXIgZmlsZW5hbWVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIG9uZSB2ZXJzaW9uIHBlciBmaWxlbmFtZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZXh0ZXJuYWxzb3VyY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyBvciBmaWxlIHBhdGhzIHRvIGV4dGVybmFsXG4gICAgICAgICAqICAgICAgIHNjcmlwdHNcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgc2NyaXB0IGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jc3ZpbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmltaXRpdmUgbmFtZS92YWx1ZSBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBmaWxlbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGVhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2FkZmlsZXZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBvYmplY3QgKC5yRGF0YSkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3RhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdXRob3JzLCBhdXRob3ItcGVyLXByZWxvYWRvYmplY3RuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRvYmplY3R2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLW9iamVjdC1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdHdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHdvcmtzcGFjZSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWRlbnRpZmllcyBwcm9qZWN0IGZyb20gd2hpY2ggZGlyZWN0b3J5IGlzIHRvIGJlIGFkb3B0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHRwYWNrYWdlczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+YmxhY2tib3g8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBleGVjdXRpb24gd2lsbCBvY2N1ciBvbiB0aGUgSFRUUCBibGFja2JveCBwcm9qZWN0IGZvciB0aGUgY3VycmVudCBIVFRQIHNlc3Npb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5yZWN5Y2xlPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCByZWN5Y2xlcyB0aGUgUiBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSFRUUCBibGFja2JveCBwcm9qZWN0IG9uIHRoZSBjdXJyZW50IEhUVFAgc2Vzc2lvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD50YWc8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSB0YWcgdGhhdCBsYWJlbHMgdGhlIGV4ZWN1dGlvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5lY2hvb2ZmPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSBSIGNvbW1hbmRzIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgY29uc29sZSBvdXRwdXQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y29uc29sZW9mZjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUgY29uc29sZSBvdXRwdXQgaXMgbm90IHJldHVybmVkIGluIHRoZSByZXNwb25zZSBtYXJrdXA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Z3JhcGhpY3M8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIFIgZ3JhcGhpY3MgZGV2aWNlIGZvciBleGVjdXRpb246IHBuZyBvciBzdmc8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Z3JhcGhpY3N3aWR0aDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBwcmVmZXJyZWQgd2lkdGggZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5ncmFwaGljc2hlaWdodDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBwcmVmZXJyZWQgaGVpZ2h0IGZvciBSIGdyYXBoaWNzIGRldmljZSBpbWFnZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cm9iamVjdHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvYmplY3RzIGZvciByZXRyaWV2YWwgZm9sbG93aW5nIHRoZSBleGVjdXRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmVmaWxlPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29ya2luZyBkaXJlY3RvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3Jlb2JqZWN0PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdCBuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZXdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGZpbGVuYW1lICguckRhdGEpIHdoZXJlIHdvcmtzcGFjZSBjb250ZW50cyB3aWxsIGJlIHNhdmVkIGluIHRoZSByZXBvc2l0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3JlbmV3dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbnN1cmVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gcmVwb3NpdG9yeSByZXN1bHRzIGluIG5ldyB2ZXJzaW9uIGJlaW5nIGNyZWF0ZWQgaWYgbmVlZGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3JlcHVibGljPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2hlcyBlYWNoIGZpbGUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmluZmluaXR5PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyBjdXN0b20gdmFsdWUgZm9yIEluZmluaXR5IGFwcGVhcmluZyBpbiBSIG9iamVjdFxuICAgICAgICAgKiAgICAgICBkYXRhIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBJbmZpbml0eSBpcyByZXByZXNlbnRlZCBieVxuICAgICAgICAgKiAgICAgICAweDdmZjAwMDAwMDAwMDAwMDBMXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uYW48L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGN1c3RvbSB2YWx1ZSBmb3IgTmFOIGFwcGVhcmluZyBpbiBSIG9iamVjdCBkYXRhXG4gICAgICAgICAqICAgICAgIHJldHVybmVkIG9uIGNhbGwsIG90aGVyd2lzZSBOYU4gaXMgcmVwcmVzZW50ZWQgYnkgbnVsbFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZW5jb2RlRGF0YUZyYW1lUHJpbWl0aXZlQXNWZWN0b3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgZGF0YS5mcmFtZSBwcmltaXRpdmVzIGFyZSBlbmNvZGVkIHZlY3RvcnMgaW4gUlxuICAgICAgICAgKiAgICAgICBvYmplY3QgZGF0YSByZXR1cm5lZCBvbiBjYWxsXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeVNjcmlwdFJlbmRlcjogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvc2NyaXB0L3JlbmRlcicsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgaW50ZXJydXB0cyB0aGUgY3VycmVudCBleGVjdXRpb24gb24gdGhlIEhUVFAgQmxhY2tib3ggcHJvamVjdFxuICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgSFRUUCBzZXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlTY3JpcHRJbnRlcnJ1cHRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlTY3JpcHRJbnRlcnJ1cHQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9zY3JpcHQvaW50ZXJydXB0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBSZXBvc2l0b3J5IEZpbGUgQVBJc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBsaXN0cyByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGV0TGlzdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHdoZW4gc3BlY2lmaWVkLCBjYWxsIHJldHVybnMgbGlzdCBvZiBzY3JpcHQgdmVyc2lvbnMgZm9yXG4gICAgICAgICAqICAgICAgIGZpbGVuYW1lXG4gICAgICAgICAqICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbGVzIHRoYXQgYXJlIHJlc3RyaWN0ZWQgYnV0XG4gICAgICAgICAqICAgICAgIHZpc2libGUgb3Igc2hhcmVkIGJ5IG90aGVyIHVzZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNjcmlwdHMgcHVibGlzaGVkIGJ5IG90aGVyIHVzZXJzIGFyZVxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jYXRlZ29yeUZpbHRlcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSB3aGVuIHNwZWNpZmllZCBsaXN0IG9mIGZpbGVzIGluIHJlc3BvbnNlIG1hcmt1cCBpcyBsaW1pdGVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeUZpbGVMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2xpc3QnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCB1cGxvYWRzIGEgZmlsZSBmcm9tIHRoZSB1c2VyJ3MgY29tcHV0ZXIgdG8gdGhlIHJlcG9zaXRvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVVcGxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgbmFtZSBvZiB0aGUgZmlsZSB0byB1cGxvYWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4uLi5maWxlIGNvbnRlbnQuLi48L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXBsb2FkZWQgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dGFnczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0YWcgd29yZHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHJlcG9zaXRvcnkgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXN0cmljdGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByb2xlIG5hbWVzLCB3aGljaCBtYWtlcyB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMgd2l0aCB0aGVzZSByb2xlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICA8ZHQ+c2hhcmVkPC9kdD5cbiAgICAgICAgICogICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgc2hhcmVkIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCB1c2VyczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgZmlsZSB3aWxsIGJlIHB1Ymxpc2hlZCB3aGljaCBtYWtlcyB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2VyczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIHJlcG9zaXRvcnkgd2lsbCBjcmVhdGUgbmV3IHZlcnNpb24gcmF0aGVyIHRoYW4gb3ZlcndyaXRlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5ld3ZlcnNpb25tc2c8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiBuZXd2ZXJzaW9uIGlzIHRydWUsIG1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdpdGggbmV3IHZlcnNpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBpbnB1dHMgcHJvcGVydHkgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm91dHB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG91dHB1dHMgcHJvcGVydHkgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0PC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RmlsZVVwbG9hZDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IFwidGV4dFwiO1xuICAgICAgICAgICAgdmFyIGlvQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5mb3JtSWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2ZpbGUvdXBsb2FkJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCB0cmFuc2ZlcnMgYSBmaWxlIGZyb20gYSBVUkwgdG8gdGhlIHJlcG9zaXRvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVUcmFuc2ZlclxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBuYW1lIG9mIHRoZSBmaWxlIHRvIHVwbG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD51cmw8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIGEgdXJsIG9mIHRoZSBmaWxlIHRvIHVwbG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXBsb2FkZWQgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD50YWdzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVwb3NpdG9yeSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJvbGUgbmFtZXMsIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCB1c2VycyB3aXRoIHRoZXNlIHJvbGVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGUgd2lsbCBiZSBzaGFyZWQgd2hpY2ggbWFrZXMgdGhlIGZpbGUgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnB1Ymxpc2hlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgcHVibGlzaGVkIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgcmVwb3NpdG9yeSB3aWxsIGNyZWF0ZSBuZXcgdmVyc2lvbiByYXRoZXIgdGhhbiBvdmVyd3JpdGU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbm1zZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIG5ld3ZlcnNpb24gaXMgdHJ1ZSwgbWVzc2FnZSB0byBhc3NvY2lhdGUgd2l0aCBuZXcgdmVyc2lvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIGlucHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+b3V0cHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgb3V0cHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQ8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlVHJhbnNmZXI6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2ZpbGUvdHJhbnNmZXInLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHdyaXRlcyBhIHRleHQgZmlsZSB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZVdyaXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIG5hbWUgb2YgdGhlIGZpbGUgdG8gdXBsb2FkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRleHQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+c3BlY2lmaWVzIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gdXBsb2FkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXBsb2FkZWRcbiAgICAgICAgICogICAgICAgZmlsZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dGFnczwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGFnIHdvcmRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSByZXBvc2l0b3J5IGZpbGVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByb2xlIG5hbWVzLCB3aGljaCBtYWtlc1xuICAgICAgICAgKiAgICAgICB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMgd2l0aCB0aGVzZSByb2xlc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2hhcmU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgaWxlIGlzIHNoYXJlZCBhbmQgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgcHVibGlzaGVkIHdoaWNoIG1ha2VzIHRoZSBmaWxlXG4gICAgICAgICAqICAgICAgIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uZXd2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIHRoZSByZXBvc2l0b3J5IHdpbGwgY3JlYXRlIG5ldyB2ZXJzaW9uIHJhdGhlclxuICAgICAgICAgKiAgICAgICB0aGFuIG92ZXJ3cml0ZVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbm1zZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiBuZXd2ZXJzaW9uIGlzIHRydWUsIG1lc3NhZ2UgdG8gYXNzb2NpYXRlIHdpdGggbmV3XG4gICAgICAgICAqICAgICAgIHZlcnNpb25cbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmlucHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIGlucHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZFxuICAgICAgICAgKiAgICAgICBzY3JpcHRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm91dHB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBvdXRwdXRzIHByb3BlcnR5IG9uIGEgcmVwb3NpdG9yeS1tYW5hZ2VkXG4gICAgICAgICAqICAgICAgIHNjcmlwdFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlV3JpdGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2ZpbGUvd3JpdGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwZGF0ZXMgdGhlIHByb3BlcnRpZXMgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZVVwZGF0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBuYW1lIG9mIHRoZSBmaWxlIHRvIHVwbG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgYSBkZXNjcmlwdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdXBsb2FkZWQgZmlsZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD50YWdzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVwb3NpdG9yeSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgKG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByb2xlIG5hbWVzLCB3aGljaCBtYWtlc1xuICAgICAgICAgKiAgICAgICB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMgd2l0aCB0aGVzZSByb2xlc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgPGR0PnNoYXJlZDwvZHQ+XG4gICAgICAgICAqICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgZmlsZSB3aWxsIGJlIHNoYXJlZCB3aGljaCBtYWtlcyB0aGUgZmlsZSB2aXNpYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGUgd2lsbCBiZSBwdWJsaXNoZWQgd2hpY2ggbWFrZXMgdGhlIGZpbGUgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIGFuZCBhbm9ueW1vdXMgdXNlcnM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBpbnB1dHMgcHJvcGVydHkgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm91dHB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG91dHB1dHMgcHJvcGVydHkgb24gYSByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0PC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RmlsZVVwZGF0ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvZmlsZS91cGRhdGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJldmVydHMgdGhlIGN1cnJlbnQgd29ya2luZyBjb3B5IG9mIGEgZmlsZSB0byBhIHNwZWNpZmljIHZlcnNpb25cbiAgICAgICAgICogZm91bmQgaW4gdGhlIGZpbGVzIHZlcnNpb24gaGlzdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZVJldmVydFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyBuYW1lIG9mIHRoZSBmaWxlIHRvIHVwbG9hZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb24gdG8gcmV2ZXJ0IGludG8gdGhlIGN1cnJlbnQgd29ya2luZyBjb3B5PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIGRlc2NyaXB0aW9uIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB1cGxvYWRlZCBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJvbGUgbmFtZXMsIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCB1c2VycyB3aXRoIHRoZXNlIHJvbGVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICAgPGRkPihvcHRpb25hbCkgaWYgdHJ1ZSwgdGhlIGZpbGUgd2lsbCBiZSBzaGFyZWQgd2hpY2ggbWFrZXMgdGhlIGZpbGUgdmlzaWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnB1Ymxpc2hlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIHRydWUsIHRoZSBmaWxlIHdpbGwgYmUgcHVibGlzaGVkIHdoaWNoIG1ha2VzIHRoZSBmaWxlIHZpc2libGUgdG8gYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiB0cnVlLCB0aGUgcmVwb3NpdG9yeSB3aWxsIGNyZWF0ZSBuZXcgdmVyc2lvbiByYXRoZXIgdGhhbiBvdmVyd3JpdGU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbm1zZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIG5ld3ZlcnNpb24gaXMgdHJ1ZSwgbWVzc2FnZSB0byBhc3NvY2lhdGUgd2l0aCBuZXcgdmVyc2lvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIGlucHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+b3V0cHV0czwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgb3V0cHV0cyBwcm9wZXJ0eSBvbiBhIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQ8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlUmV2ZXJ0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL3JldmVydCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZ2VuZXJhdGVzIGEgZGlmZiBiZXR3ZWVuIHRoZSBjdXJyZW50IHdvcmtpbmcgY29weSBvZiBhIGZpbGUgYW5kXG4gICAgICAgICAqIGEgc3BlY2lmaWMgdmVyc2lvbiBmb3VuZCBpbiB0aGUgZmlsZXMgdmVyc2lvbiBoaXN0b3J5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlGaWxlRGlmZlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIGF1dGhvcjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICBzcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSB2ZXJzaW9uIHRvIGRpZmYgYWdhaW5zdCB0aGUgY3VycmVudFxuICAgICAgICAgKiAgICAgICB3b3JraW5nIGNvcHlcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeUZpbGVEaWZmOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2RpZmYnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGdyYW50cyBvd25lcnNoaXAgcmlnaHRzIG9uIGEgZmlsZSB0byBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGVkXG4gICAgICAgICAqIHVzZXJzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlLCB1bmxpa2UgbW9zdCByZXBvc2l0b3J5IEFQSXMgdGhhdCByZXF1aXJlIGJvdGggZmlsZW5hbWUgYW5kIGF1dGhvclxuICAgICAgICAgKiBwYXJhbWV0ZXJzLCB0aGVyZSBpcyBubyBleHBsaWNpdCBhdXRob3IgcGFyYW1ldGVyIG9uIHRoaXMgY2FsbC4gVGhlIGF1dGhvclxuICAgICAgICAgKiBpcyB1bmRlcnN0b29kIHRvIGJlIHRoZSBjYWxsZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVHcmFudFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPnNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcmVwb3NpdG9yeSBmaWxlPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0Pm5ld2F1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4gc3BlY2lmaWVzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZ3JhbnRlZSB1c2VybmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cmV2b2tlYXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJldm9rZWUgdXNlcm5hbWVzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RmlsZUdyYW50OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2dyYW50JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkb3dubG9hZHMgYSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZURvd25sb2FkXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICAgIDxkdD5maWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPnNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5hdXRob3I8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgYXV0aG9yPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb248L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlRG93bmxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2ZpbGUvZG93bmxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGRlbGV0ZXMgYSBmaWxlIGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVEZWxldGVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+c3BlY2lmaWVzIHRoZSByZXBvc2l0b3J5IGZpbGUgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlGaWxlRGVsZXRlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2RlbGV0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZmV0Y2hlcyB0aGUgbGF0ZXN0IG1ldGEtZGF0YSBvbiBhIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeUZpbGVGZXRjaFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBhdXRob3JcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb25cbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RmlsZUZldGNoOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2ZldGNoJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBjb3BpZXMgb25lIG9yIG1vcmUgcmVwb3NpdG9yeS1tYW5hZ2VkIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvblxuICAgICAgICAgKiBkaXJlY3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYWxyZWFkeSBjb250YWlucyBhIGZpbGVuYW1lIG1hdGNoaW5nIGFuXG4gICAgICAgICAqIGluY29taW5nIGZpbGVuYW1lLCB0aGVuIGEgbmV3IHZlcnNpb24gb2YgdGhlIGZpbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlGaWxlQ29weVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD5zcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSBuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXN0aW5hdGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIHVzZXIgZGlyZWN0b3J5IGluXG4gICAgICAgICAqICAgICAgIHRoZSByZXBvc2l0b3J5XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD52ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgcmVwb3NpdG9yeSBmaWxlIHZlcnNpb25cbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVyZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmV3IGZpbGVuYW1lcyBmb3IgY29waWVkIGZpbGVzXG4gICAgICAgICAqICAgICAgIGlkZW50aWZpZWQgb24gZmlsZW5hbWUgcGFyYW1ldGVyXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeUZpbGVDb3B5OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL2NvcHknLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIG1vdmVzIG9uZSBvciBtb3JlIHJlcG9zaXRvcnktbWFuYWdlZCBmaWxlcyB0byB0aGUgZGVzdGluYXRpb25cbiAgICAgICAgICogZGlyZWN0b3J5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFscmVhZHkgY29udGFpbnMgYSBmaWxlbmFtZSBtYXRjaGluZyBhblxuICAgICAgICAgKiBpbmNvbWluZyBmaWxlbmFtZSwgdGhlbiBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RmlsZU1vdmVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+c3BlY2lmaWVzIHRoZSByZXBvc2l0b3J5IGZpbGUgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzdGluYXRpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiB1c2VyIGRpcmVjdG9yeSBpblxuICAgICAgICAgKiAgICAgICB0aGUgcmVwb3NpdG9yeVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHJlcG9zaXRvcnkgZmlsZSB2ZXJzaW9uXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeUZpbGVNb3ZlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9maWxlL21vdmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFJlcG9zaXRvcnkgRGlyZWN0b3J5IEFQSXNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgbGlzdHMgcmVwb3NpdG9yeS1tYW5hZ2VkIGRpcmVjdG9yaWVzLlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhIGxpc3Qgb2YgdGhlIGNhbGxlcidzIHVzZXIgZGlyZWN0b3JpZXMgKCByb290IGFuZCBjdXN0b20gKSBhcmVcbiAgICAgICAgICogcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cC5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIHVzZXJmaWxlcyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgZmlsZXMgaW4gYWxsIG9mIHRoZSBjYWxsZXInc1xuICAgICAgICAgKiB1c2VyIGRpcmVjdG9yaWVzIGFyZSBsaXN0ZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cC4gTm90ZSwgZGVwZW5kaW5nIG9uIHRoZVxuICAgICAgICAgKiBudW1iZXIgb2YgZmlsZXMgb3duZWQgYnkgdGhlIGNhbGxlciwgd2hlbiB0aGlzIHBhcmFtZXRlciBpcyBlbmFibGVkIHRoZVxuICAgICAgICAgKiByZXNwb25zZSBtYXJrdXAgcmV0dXJuZWQgb24gdGhpcyBjYWxsIGNhbiBiZSBhIHZlcmJvc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBkaXJlY3RvcnkgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCB0aGVuIG9ubHkgdGhlIGZpbGVzIGluIHRoZVxuICAgICAgICAgKiBkaXJlY3RvcnkgaW5kaWNhdGVkIGFyZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkIHRvIHJldHVybiBmaWxlcyBpbiB0aGUgY2FsbGVyJ3MgYXJjaGl2ZWRcbiAgICAgICAgICogZGlyZWN0b3JpZXMgYW5kL29yIGZpbGVzIGluIHRoZSBSZXN0cmljdGVkICwgU2hhcmVkIGFuZCBQdWJsaWMgc3lzdGVtXG4gICAgICAgICAqIGRpcmVjdG9yaWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlOiBUaGUgbWV0YWRhdGEgcHJvcGVydHkgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cCBvbiB0aGlzIGNhbGwgaXMgcHJvdmlkZWRcbiAgICAgICAgICogYXMgYSBjb252ZW5pZW5jZSBmb3IgY2xpZW50IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuIEl0IHByb3ZpZGVzIGEgY29tcGxldGVcbiAgICAgICAgICogbGlzdCBmbyB0aGUgdXNlciBkaXJlY3RvcmllcyBhdmFpbGFibGUgdG8gdGhlIGN1cnJlbnQgY2FsbGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlEaXJlY3RvcnlMaXN0XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+dXNlcmZpbGVzPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHNwZWNpZmllZCwgZmlsZXMgaW4gYWxsIHVzZXIgZGlyZWN0b3JpZXMgYXJlIGxpc3RlZCBpblxuICAgICAgICAgKiAgICAgICB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YXJjaGl2ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgZmlsZXMgZm91bmQgaW4gYXJjaGl2ZWQgZGlyZWN0b3JpZXMgYXJlIGluY2x1ZGVkXG4gICAgICAgICAqICAgICAgIGluIHRoZSByZXNwb25zZSBtYXJrdXBcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnNoYXJlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiB0cnVlLCBmaWxlcyB0aGF0IGFyZSByZXN0cmljdGVkIGJ1dCB2aXNpYmxlIG9yIHNoYXJlZFxuICAgICAgICAgKiAgICAgICBieSBvdGhlciB1c2VycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIGZpbGVzIHRoYXQgYXJlIHB1Ymxpc2hlZCBieSBvdGhlciB1c2VycyBhcmVcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvbGlzdCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgY3JlYXRlcyBhIHJlcG9zaXRvcnktbWFuYWdlZCBjdXN0b20gZGlyZWN0b3J5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiB0aGUgbmFtZSBvZiB0aGUgbmV3IGN1c3RvbSBkaXJlY3RvcnkgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIGNhbGxlciB0aGVcbiAgICAgICAgICogcmVzcG9uc2UgbWFya3VwIHdpbGwgaW5kaWNhdGUgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeURpcmVjdG9yeUxpc3RcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlDcmVhdGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9jcmVhdGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHJlbmFtZXMgYW4gZXhpc3RpbmcgcmVwb3NpdG9yeS1tYW5hZ2VkIHVzZXIgZGlyZWN0b3J5XG4gICAgICAgICAqICggY3VzdG9tIG9yIGFyY2hpdmVkICkuIFdoZW4gcmVuYW1pbmcgYSB1c2VyIGRpcmVjdG9yeSwgYWxsIGZpbGVzIGluIHRoZVxuICAgICAgICAgKiBzb3VyY2UgZGlyZWN0b3J5IGFyZSBhdXRvbWF0aWNhbGx5IG1vdmVkIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIElmXG4gICAgICAgICAqIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgdGhlIGNhbGwgd2lsbCBiZSByZWplY3RlZCBhbmQgdGhlXG4gICAgICAgICAqIHJlc3BvbnNlIG1hcmt1cCB3aWxsIGluZGljYXRlIGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBZb3UgY2FuIHVzZSB0aGlzIGNhbGwgdG8gY29udmVydCBhbiBhcmNoaXZlZCBkaXJlY3RvcnkgYmFjayBpbnRvIGEgY3VzdG9tXG4gICAgICAgICAqIGRpcmVjdG9yeSwgZXNzZW50aWFsbHkgdW5hcmNoaXZpbmcgdGhlIGFyY2hpdmVkIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZTogWW91IGNhbiBub3QgcmVuYW1lIHRoZSByb290IGRpcmVjdG9yeS4gVG8gbW92ZSBmaWxlcyBmcm9tIHRoZSByb290XG4gICAgICAgICAqIGRpcmVjdG9yeSB1c2UgdGhlIC9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L21vdmUgY2FsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5JbXBvcnRhbnQ6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgY2FsbCB3aWxsIG9ubHkgbW92ZSBmaWxlcyB0aGF0IGFyZSBvd25lZCBieSBhIHNpbmdsZSBhdXRob3IgdG8gdGhlXG4gICAgICAgICAqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gSWYgYSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeVxuICAgICAgICAgKiBoYXMgbXVsdGlwbGUgYXV0aG9ycywgYXMgYSByZXN1bHQgb2YgY29sbGFib3JhdGlvbiB1c2luZyB0aGVcbiAgICAgICAgICogL3IvcmVwb3NpdG9yeS9maWxlL2dyYW50IGNhbGwsIHRoZSBmaWxlIHdpbGwgbm90IGJlIG1vdmVkIHRvIHRoZVxuICAgICAgICAgKiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kIGEgd2FybmluZyB0byB0aGF0IGFmZmVjdCB3aWxsIGJlIGluZGljYXRlZCBpbiB0aGVcbiAgICAgICAgICogcmVzcG9uc2UgbWFya3VwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlEaXJlY3RvcnlSZW5hbWVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzdGluYXRpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGN1c3RvbSBkaXJlY3RvcnlcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RGlyZWN0b3J5UmVuYW1lOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9yZW5hbWUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogXG4gICAgICAgICAqIFRoaXMgY2FsbCBjb3BpZXMgb25lIG9yIG1vcmUgcmVwb3NpdG9yeS1tYW5hZ2VkIGZpbGVzIGZyb20gYSBzb3VyY2UgdXNlclxuICAgICAgICAgKiBkaXJlY3RvcnkgdG8gYSBkZXN0aW5hdGlvbiB1c2VyIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgZmlsZXMgaW5kaWNhdGVkIG9uIHRoYXRcbiAgICAgICAgICogcGFyYW1ldGVyIGFyZSBjb3BpZWQuIE90aGVyd2lzZSwgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZVxuICAgICAgICAgKiBjb3BpZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGVuc3VyZSBjb3B5aW5nIGZpbGVzIGRvZXMgbm90IGFjY2lkZW50YWxseSBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGVzXG4gICAgICAgICAqIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGFsbCBjb3BpZWQgZmlsZXMgYXJlIGNyZWF0ZWQgYXMgbmV3IHZlcnNpb25zXG4gICAgICAgICAqIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeURpcmVjdG9yeUNvcHlcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzdGluYXRpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGN1c3RvbSBkaXJlY3RvcnlcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVuYW1lcyB0byBiZSBjb3BpZWQuIElmIG9taXR0ZWQsXG4gICAgICAgICAqICAgICAgIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgY29waWVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5maWxlcmVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5ldyBmaWxlbmFtZXMgZm9yIGNvcGllZCBmaWxlc1xuICAgICAgICAgKiAgICAgICBpZGVudGlmaWVkIG9uIGZpbGVuYW1lIHBhcmFtZXRlclxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlDb3B5OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3IvcmVwb3NpdG9yeS9kaXJlY3RvcnkvY29weScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgbW92ZXMgb25lIG9yIG1vcmUgcmVwb3NpdG9yeS1tYW5hZ2VkIGZpbGVzIGZyb20gYSBzb3VyY2UgdXNlclxuICAgICAgICAgKiBkaXJlY3RvcnkgdG8gYSBkZXN0aW5hdGlvbiB1c2VyIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgZmlsZXMgaW5kaWNhdGVkIG9uIHRoYXRcbiAgICAgICAgICogcGFyYW1ldGVyIGFyZSBtb3ZlZC4gT3RoZXJ3aXNlLCBhbGwgZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIG1vdmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBlbnN1cmUgbW92aW5nIGZpbGVzIGRvZXMgbm90IGFjY2lkZW50YWxseSBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGVzXG4gICAgICAgICAqIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGFsbCBtb3ZlZCBmaWxlcyBhcmUgY3JlYXRlZCBhcyBuZXcgdmVyc2lvbnNcbiAgICAgICAgICogaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogPHN0cm9uZz5JbXBvcnRhbnQ6PC9zdHJvbmc+XG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgY2FsbCB3aWxsIG9ubHkgbW92ZSBmaWxlcyB0aGF0IGFyZSBvd25lZCBieSBhIHNpbmdsZSBhdXRob3IgdG8gdGhlXG4gICAgICAgICAqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gSWYgYSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeVxuICAgICAgICAgKiBoYXMgbXVsdGlwbGUgYXV0aG9ycywgYXMgcmVzdWx0IG9mIGNvbGxhYm9yYXRpb24gdXNpbmcgdGhlXG4gICAgICAgICAqIC9yL3JlcG9zaXRvcnkvZmlsZS9ncmFudCBjYWxsLCB0aGUgZmlsZSB3aWxsIG5vdCBiZSBtb3ZlZCB0byB0aGVcbiAgICAgICAgICogZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCBhIHdhcm5pbmcgdG8gdGhhdCBhZmZlY3Qgd2lsbCBiZSBpbmRpY2F0ZWQgaW4gdGhlXG4gICAgICAgICAqIHJlc3BvbnNlIG1hcmt1cC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RGlyZWN0b3J5TW92ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXBvc2l0b3J5IGRpcmVjdG9yeSwgZGVmYXVsdHMgdG8gcm9vdFxuICAgICAgICAgKiAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgbWFya3VwXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXN0aW5hdGlvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG5ldyBuYW1lIGZvciB0aGUgZGVzdGluYXRpb24gY3VzdG9tIGRpcmVjdG9yeVxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGJlIGNvcGllZC4gSWYgb21pdHRlZCxcbiAgICAgICAgICogICAgICAgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBjb3BpZWRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RGlyZWN0b3J5TW92ZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L21vdmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwZGF0ZXMgcmVwb3NpdG9yeS1tYW5hZ2VkIGZpbGUgYWNjZXNzIGNvbnRyb2xzIGJ5IGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgZmlsZXMgaW5kaWNhdGVkIG9uIHRoYXRcbiAgICAgICAgICogcGFyYW1ldGVyIGFyZSB1cGRhdGVkLiBPdGhlcndpc2UsIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmVcbiAgICAgICAgICogdXBkYXRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RGlyZWN0b3J5VXBkYXRlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkgZGlyZWN0b3J5LCBkZWZhdWx0cyB0byByb290XG4gICAgICAgICAqICAgICAgIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZSBtYXJrdXBcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmZpbGVuYW1lPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVuYW1lcyB0byBiZSBjb3BpZWQuIElmIG9taXR0ZWQsXG4gICAgICAgICAqICAgICAgIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgY29waWVkXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXN0cmljdGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgbmV3IG5hbWUgZm9yIHRoZSBkZXN0aW5hdGlvbiBjdXN0b20gZGlyZWN0b3J5XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbGVzIGFyZSBzaGFyZWQgYW5kIHZpc2libGUgdG9cbiAgICAgICAgICogICAgICAgYXV0aGVudGljYXRlZCB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBmaWxlcyBhcmUgcHVibGlzaGVkIGFuZCB2aXNpYmxlIHRvXG4gICAgICAgICAqICAgICAgIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlVcGRhdGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS91cGRhdGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGFyY2hpdmVzIG9uZSBvciBtb3JlIHJlcG9zaXRvcnktbWFuYWdlZCBmaWxlcyBmcm9tIGEgc291cmNlIHVzZXJcbiAgICAgICAgICogZGlyZWN0b3J5ICggcm9vdCBvciBjdXN0b20gKSB0byBhbiBhcmNoaXZlIGRpcmVjdG9yeS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIHZhbHVlIG9mIHRoZSBhcmNoaXZlIHBhcmFtZXRlciBpbmRpY2F0ZXMgYW4gZXhpc3RpbmcgYXJjaGl2ZVxuICAgICAgICAgKiBkaXJlY3RvcnkgdGhlbiB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZ1xuICAgICAgICAgKiBhcmNoaXZlLiBPdGhlcndpc2UsIGEgbmV3IGFyY2hpdmUgZGlyZWN0b3J5IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBvblxuICAgICAgICAgKiBiZWhhbGYgb2YgdGhlIGNhbGxlci4gQXJjaGl2ZWQgZGlyZWN0b3JpZXMgYXV0b21hdGljYWxseSBoYXZlIGEgLmFyY2hpdmVcbiAgICAgICAgICogcG9zdGZpeCBhcHBlbmRlZCB0byB0aGVpciBuYW1lIGlmIGl0IGlzIG5vdCBzdXBwbGllZCBvbiB0aGUgYXJjaGl2ZVxuICAgICAgICAgKiBwYXJhbWV0ZXIgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIHN1Y2Nlc3NmdWxseSBhcmNoaXZlZCwgdGhlXG4gICAgICAgICAqIHNvdXJjZSBkaXJlY3RvcnkgaXMgYXV0b21hdGljYWxseSBkZWxldGVkIGZyb20gdGhlIHJlcG9zaXRvcnkuIElmIHRoZVxuICAgICAgICAgKiBzb3VyY2UgZGlyZWN0b3J5IHdhcyByb290ICwgYW4gZW1wdHkgcm9vdCBkaXJlY3RvcnkgaXMgcHJlc2VydmVkLiBJZiBhbnkgb2ZcbiAgICAgICAgICogdGhlIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBza2lwcGVkIG9yIGNhbiBub3QgYmUgYXJjaGl2ZWQgKHNlZVxuICAgICAgICAgKiBmb2xsb3dpbmcgbm90ZSksIHRob3NlIGZpbGVzIGFuZCB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgcHJlc2VydmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPkltcG9ydGFudDo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBjYWxsIHdpbGwgb25seSBhcmNoaXZlIGZpbGVzIHRoYXQgYXJlIG93bmVkIGJ5IGEgc2luZ2xlIGF1dGhvciB0byB0aGVcbiAgICAgICAgICogZGVzdGluYXRpb24gZGlyZWN0b3J5LiBJZiBhIHJlcG9zaXRvcnktbWFuYWdlZCBmaWxlIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5XG4gICAgICAgICAqIGhhcyBtdWx0aXBsZSBhdXRob3JzLCBhcyBhIHJlc3VsdCBvZiBjb2xsYWJvcmF0aW9uIHVzaW5nIHRoZVxuICAgICAgICAgKiAvci9yZXBvc2l0b3J5L2ZpbGUvZ3JhbnQgY2FsbCwgdGhlIGZpbGUgd2lsbCBub3QgYmUgYXJjaGl2ZWQgdG8gdGhlXG4gICAgICAgICAqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgYSB3YXJuaW5nIHRvIHRoYXQgYWZmZWN0IHdpbGwgYmUgaW5kaWNhdGVkIGluIHRoZVxuICAgICAgICAgKiByZXNwb25zZSBtYXJrdXAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgcmVwb3NpdG9yeURpcmVjdG9yeUFyY2hpdmVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGJlIGNvcGllZC4gSWYgb21pdHRlZCxcbiAgICAgICAgICogICAgICAgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBjb3BpZWRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJlc3RyaWN0ZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIGRlc3RpbmF0aW9uIGN1c3RvbSBkaXJlY3RvcnlcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnNoYXJlZDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZmlsZXMgYXJlIHNoYXJlZCBhbmQgdmlzaWJsZSB0b1xuICAgICAgICAgKiAgICAgICBhdXRoZW50aWNhdGVkIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wdWJsaXNoZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbGVzIGFyZSBwdWJsaXNoZWQgYW5kIHZpc2libGUgdG9cbiAgICAgICAgICogICAgICAgYXV0aGVudGljYXRlZCBhbmQgYW5vbnltb3VzIHVzZXJzXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVwb3NpdG9yeURpcmVjdG9yeUFyY2hpdmU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL3JlcG9zaXRvcnkvZGlyZWN0b3J5L2FyY2hpdmUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHVwbG9hZHMgYSBzZXQgb2YgZmlsZXMgaW4gYSB6aXAgYXJjaGl2ZSBpbnRvIGFuIGV4aXN0aW5nXG4gICAgICAgICAqIHJlcG9zaXRvcnktbWFuYWdlZCB1c2VyIGRpcmVjdG9yeSAoIHJvb3QgLCBjdXN0b20gb3IgYXJjaGl2ZWQgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RGlyZWN0b3J5VXBsb2FkXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgLi4uemlwIGFyY2hpdmUgZmlsZSBjb250ZW50Li4uXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIGEgZGVzY3JpcHRpb24gdG8gYXNzb2NpYXRlIHdpdGggdGhlIHVwbG9hZGVkIGZpbGVcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZ3M8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRhZyB3b3JkcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVwb3NpdG9yeSBmaWxlXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yZXN0cmljdGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgbmV3IG5hbWUgZm9yIHRoZSBkZXN0aW5hdGlvbiBjdXN0b20gZGlyZWN0b3J5XG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zaGFyZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGZpbGVzIGFyZSBzaGFyZWQgYW5kIHZpc2libGUgdG9cbiAgICAgICAgICogICAgICAgYXV0aGVudGljYXRlZCB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHVibGlzaGVkPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBmaWxlcyBhcmUgcHVibGlzaGVkIGFuZCB2aXNpYmxlIHRvXG4gICAgICAgICAqICAgICAgIGF1dGhlbnRpY2F0ZWQgYW5kIGFub255bW91cyB1c2Vyc1xuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+bmV3dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5cbiAgICAgICAgICogICAgICAgKG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHJlcG9zaXRvcnkgd2lsbCBjcmVhdGUgbmV3XG4gICAgICAgICAqICAgICAgIHZlcnNpb24gcmF0aGVyIHRoYW4gb3ZlcndyaXRlXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5uZXd2ZXJzaW9ubXNnPC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIG5ld3ZlcnNpb24gaXMgdHJ1ZSwgbWVzc2FnZSB0byBhc3NvY2lhdGUgd2l0aCBuZXdcbiAgICAgICAgICogICAgICAgdmVyc2lvblxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlVcGxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSAndGV4dCc7XG4gICAgICAgICAgICB2YXIgaW9Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGF0YTogY29uZmlnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5mb3JtSWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uOiBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS91cGxvYWQnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIGRvd25sb2FkcyBvbmUgb3IgbW9yZSByZXBvc2l0b3J5LW1hbmFnZWQgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeVxuICAgICAgICAgKiBpbiB0aGUgcmVwb3NpdG9yeS4gVGhlIHJlc3BvbnNlIHR5cGUgb24gdGhpcyBjYWxsIGlzIGEgemlwIGFyY2hpdmUgZmlsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9ubHkgdGhvc2UgZmlsZXMgaW5kaWNhdGVkIG9uIHRoYXRcbiAgICAgICAgICogcGFyYW1ldGVyIGFyZSBkb3dubG9hZGVkLiBPdGhlcndpc2UsIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmVcbiAgICAgICAgICogZG93bmxvYWRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCByZXBvc2l0b3J5RGlyZWN0b3J5RG93bmxvYWRcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGJlIGNvcGllZC4gSWYgb21pdHRlZCxcbiAgICAgICAgICogICAgICAgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBjb3BpZWRcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICByZXBvc2l0b3J5RGlyZWN0b3J5RG93bmxvYWQ6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHsgICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9kb3dubG9hZCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgZGVsZXRlcyBhIHJlcG9zaXRvcnktbWFuYWdlZCB1c2VyIGRpcmVjdG9yeSAoIHJvb3QgLCBjdXN0b20gb3JcbiAgICAgICAgICogYXJjaGl2ZWQgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogV2hlbiBkZWxldGluZyBhIHVzZXIgZGlyZWN0b3J5LCBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBhcmVcbiAgICAgICAgICogYXV0b21hdGljYWxseSBkZWxldGVkIGFsb25nIHdpdGggdGhlIGRpcmVjdG9yeS4gSWYgdGhlIHRhcmdldCBkaXJlY3RvcnkgaXNcbiAgICAgICAgICogcm9vdCwgYW4gZW1wdHkgcm9vdCBkaXJlY3RvcnkgaXMgcHJlc2VydmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIHJlcG9zaXRvcnlEaXJlY3RvcnlEZWxldGVcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiAgICAgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiA8ZGw+XG4gICAgICAgICAqICAgIDxkdD5kaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBkaXJlY3RvcnksIGRlZmF1bHRzIHRvIHJvb3RcbiAgICAgICAgICogICAgICAgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHJlcG9zaXRvcnlEaXJlY3RvcnlEZWxldGU6IGZ1bmN0aW9uKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlvKCcvci9yZXBvc2l0b3J5L2RpcmVjdG9yeS9kZWxldGUnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIEpvYiBBUElzXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICAvKiogIFxuICAgICAgICAgKiBUaGlzIGNhbGwgbGlzdHMgam9icyBmb3IgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBvcGVub25seSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2VlIG9ubHkgdGhvc2Ugam9icyBpbiBhbiBvcGVuXG4gICAgICAgICAqIHN0YXRlLiBUaGUgc2V0IG9mIGpvYiBvcGVuIHN0YXRlcyBhcmUgc2hvd24gaGVyZTpcbiAgICAgICAgICpcbiAgICAgICAgICogPHVsPlxuICAgICAgICAgKiAgPGxpPlNjaGVkdWxlZCA6IGpvYiBpcyBzY2hlZHVsZWQgYnV0IG5vdCB5ZXQgcXVldWVkIGZvciBydW5uaW5nLjwvbGk+XG4gICAgICAgICAqICA8bGk+UXVldWVkIDogam9iIGlzIHF1ZXVlZCBmb3IgcnVubmluZy48L2xpPlxuICAgICAgICAgKiAgPGxpPlJ1bm5pbmcgOiBqb2IgaXMgcnVubmluZy48L2xpPlxuICAgICAgICAgKiA8L3VsPlxuICAgICAgICAgKlxuICAgICAgICAgKiA8YmxvY2txdW90ZT5cbiAgICAgICAgICogICAgSW1wb3J0YW50ISBBbnkgb3BlbiBqb2IgY2FuIGJlIGNhbmNlbGxlZCB1c2luZyB0aGVcbiAgICAgICAgICogICAgPGEgaHJlZj1cIiNtZXRob2Rfam9iQ2FuY2VsXCI+am9iQ2FuY2VsPC9hPiBjYWxsLlxuICAgICAgICAgKiA8L2Jsb2NrcXVvdGU+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgam9iTGlzdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0Pm9wZW5vbmx5PC9kdD5cbiAgICAgICAgICogICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUsIG9ubHkgam9icyBpbiBhbiBvcGVuLXN0YXRlIGFyZSBsaXN0ZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZXh0ZW5kZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgSWYgdHJ1ZSwgYWRkaXRpb25hbCBkYXRhIHByb3BlcnRpZXMgZGVzY3JpYmluZyBlYWNoIGpvYlxuICAgICAgICAgKiAgICAgICBhcmUgbGlzdGVkIGluIHRoZSByZXNwb25zZSBtYXJrdXBcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBqb2JMaXN0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL2xpc3QnLCBjb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBjYWxsIHN1Ym1pdHMgYSBqb2IgZm9yIGJhY2tncm91bmQgZXhlY3V0aW9uIG9uIGJlaGFsZiBvZiB0aGUgdXNlci5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gc3VibWl0IHRoZSBleGVjdXRpb24gb2YgYW4gYXJiaXRyYXJ5IGJsb2NrIG9mIFIgY29kZSB0aGUgY2FsbGVyIG11c3RcbiAgICAgICAgICogcHJvdmlkZSBhIHZhbHVlIG9uIHRoZSBjb2RlIHBhcmFtZXRlci5cbiAgICAgICAgICpcbiAgICAgICAgICpcbiAgICAgICAgICogVG8gc3VibWl0IHRoZSBleGVjdXRpb24gb2YgYSBzaW5nbGUgcmVwb3NpdG9yeS1tYW5hZ2VkIHNjcmlwdCB0aGUgY2FsbGVyXG4gICAgICAgICAqIG11c3QgcHJvdmlkZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciByc2NyaXB0bmFtZSAsIHJzY3JpcHRhdXRob3IgYW5kXG4gICAgICAgICAqIG9wdGlvbmFsbHkgcnNjcmlwdHZlcnNpb24gLiBUbyBzdWJtaXQgdGhlIGV4ZWN1dGlvbiBvZiBhIGNoYWluIG9mXG4gICAgICAgICAqIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3RcbiAgICAgICAgICogb2YgdmFsdWVzIG9uIHRoZSByc2NyaXB0bmFtZSwsIF9yc2NyaXB0YXV0aG9yIGFuZCBvcHRpb25hbGx5IHJzY3JpcHR2ZXJzaW9uXG4gICAgICAgICAqIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIHN1Ym1pdCB0aGUgZXhlY3V0aW9uIG9mIGEgc2luZ2xlIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3RcbiAgICAgICAgICogcHJvdmlkZSBhIHZhbGlkIFVSTCBvciBmaWxlIHBhdGggdXNpbmcgdGhlIGV4dGVybmFsc291cmNlIHBhcmFtZXRlci4gVG9cbiAgICAgICAgICogc3VibWl0IHRoZSBleGVjdXRpb24gb2YgYSBjaGFpbiBvZiBleHRlcm5hbCBzY3JpcHRzIHRoZSBjYWxsZXIgbXVzdFxuICAgICAgICAgKiBwcm92aWRlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzIG9uIHRoZSBleHRlcm5hbHNvdXJjZSBwYXJhbWV0ZXIuXG4gICAgICAgICAqIE5vdGUsIHRvIHN1Ym1pdCB0aGUgZXhlY3V0aW9uIG9mIGFuIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3QgaGF2ZVxuICAgICAgICAgKiBQT1dFUl9VU0VSIHByaXZpbGVnZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGU6IEEgY2hhaW5lZCBleGVjdXRpb24gZXhlY3V0ZXMgZWFjaCBvZiB0aGUgc2NyaXB0cyBpZGVudGlmaWVkIG9uIHRoZVxuICAgICAgICAgKiBjYWxsIGluIGEgc2VxdWVudGlhbCBmYXNoaW9uIG9uIHRoZSBSIHNlc3Npb24gZm9yIHRoZSBqb2IsIHdpdGggZXhlY3V0aW9uXG4gICAgICAgICAqIG9jY3VyaW5nIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgb24gdGhlIHBhcmFtZXRlciBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBQbGVhc2Ugbm90IHRoZSBmb2xsb3dpbmcgcHJlIGFuZCBwb3N0IGV4ZWN1dGlvbiBwYXJhbWV0ZXJzOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlByZS1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZFxuICAgICAgICAgKiAgICAgICBSIG9iamVjdCB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0c1xuICAgICAgICAgKiAgICAgICBpbiB0aGUgd29ya3NwYWNlIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcHJlbG9hZGZpbGUgcGFyYW1ldGVycyBhbGxvd3MgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2Fkb2JqZWN0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGJpbmFyeSBSIG9iamVjdHMgKC5yRGF0YSkgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICogICAgICAgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBhZG9wdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBhIHByZS1leGlzdGluZ1xuICAgICAgICAgKiAgICAgICBwcm9qZWN0IHdvcmtzcGFjZSwgcHJvamVjdCB3b3JraW5nIGRpcmVjdG9yeSBhbmQvb3IgcHJvamVjdCBwYWNrYWdlXG4gICAgICAgICAqICAgICAgIGRlcGVuZGVuY2llcyBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxzdHJvbmc+UG9zdC1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWZpbGUgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXJcbiAgICAgICAgICogICAgICAgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jlb2JqZWN0IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdHMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXdvcmtzcGFjZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIGVudGlyZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2UgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZGlyZWN0b3J5IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgdGFyZ2V0XG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGZvciBzdG9yZWQgZmlsZXMgYW5kIG9iamVjdHMgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlbmV3dmVyc2lvbiBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY3JlYXRlIG5ld1xuICAgICAgICAgKiAgICAgICB2ZXJzaW9ucyBvZiBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLiBCeSBkZWZhdWx0LCBzdG9yZWQgZmlsZXMgb3ZlcndyaXRlIGFueSBwcmUtZXhpc3RpbmcgZmlsZVxuICAgICAgICAgKiAgICAgICBieSB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXB1YmxpYyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gYXNzaWduIHB1YmxpYyBhY2Nlc3NcbiAgICAgICAgICogICAgICAgdG8gZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVub3Byb2plY3QgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNraXAgdGhlXG4gICAgICAgICAqICAgICAgIHBlcnNpc3RlbmNlLXRvLXByb2plY3Qgc3RlcCBhZnRlciB0aGUgZXhlY3V0aW9uLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIGpvYlN1Ym1pdFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0Pm5hbWU8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+am9iIG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZGVzY3I8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBqb2IgZGVzY3JpcHRpb248L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y29kZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFIgY29kZSB0byBleGVjdXRlIG9uIGpvYjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnJzY3JpcHRuYW1lPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5LW1hbmFnZWQgc2NyaXB0IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yc2NyaXB0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeS1tYW5hZ2VkIGRpcmVjdG9yaWVzIGZvciBzY3JpcHRzLCBkZWZhdWx0cyB0byByb290PC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cnNjcmlwdGF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1yc2NyaXB0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnJzY3JpcHR2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcnNjcmlwdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5leHRlcm5hbHNvdXJjZTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcyBvciBmaWxlIHBhdGhzIHRvIGV4dGVybmFsIHNjcmlwdHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIFJldm9EZXBsb3lSLWVuY29kZWQgc2NyaXB0IGlucHV0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5jc3ZpbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmltaXRpdmUgbmFtZS92YWx1ZSBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5wcmVsb2FkZmlsZW5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cHJlbG9hZGZpbGVhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cHJlbG9hZGZpbGV2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcHJlbG9hZGZpbGVuYW1lPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cHJlbG9hZG9iamVjdG5hbWU8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgb2JqZWN0ICguckRhdGEpIGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnByZWxvYWRvYmplY3RhdXRob3I8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcHJlbG9hZG9iamVjdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5wcmVsb2Fkb2JqZWN0dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLW9iamVjdC1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmFkb3B0d29ya3NwYWNlPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCB3b3Jrc3BhY2UgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmFkb3B0ZGlyZWN0b3J5PC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCBkaXJlY3RvcnkgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmFkb3B0cGFja2FnZXM8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+cHJpb3JpdHk8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgc2NoZWR1bGluZyBwcmlvcml0eSBmb3IgdGhlIGpvYjogbG93IChkZWZhdWx0KSwgbWVkaXVtIG9yIGhpZ2g8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD50YWc8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIHRhZyB0aGF0IGxhYmVscyB0aGUgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+ZWNob29mZjwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPlxuICAgICAgICAgKiAgICAgICAob3B0aW9uYWwpIGlmIHRydWUgUiBjb21tYW5kcyB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIGNvbnNvbGUgb3V0cHV0XG4gICAgICAgICAqICAgICAgIHNhdmVkIG9uIHRoZSBwcm9qZWN0IGV4ZWN1dGlvbiBoaXN0b3J5IGZvciB0aGUgam9iXG4gICAgICAgICAqICAgIDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PmdyYXBoaWNzPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIFIgZ3JhcGhpY3MgZGV2aWNlIGZvciBleGVjdXRpb246IHBuZyBvciBzdmc8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5ncmFwaGljc3dpZHRoPC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIHdpZHRoIGZvciBSIGdyYXBoaWNzIGRldmljZSBpbWFnZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5ncmFwaGljc2hlaWdodDwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBoZWlnaHQgZm9yIFIgZ3JhcGhpY3MgZGV2aWNlIGltYWdlczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnN0b3JlZmlsZTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29ya2luZyBkaXJlY3RvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+c3RvcmVvYmplY3Q8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmtzcGFjZSBvYmplY3QgbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5zdG9yZXdvcmtzcGFjZTwvZHQ+XG4gICAgICAgICAqICAgICAgPGRkPihvcHRpb25hbCkgZmlsZW5hbWUgKC5yRGF0YSkgd2hlcmUgd29ya3NwYWNlIGNvbnRlbnRzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIHJlcG9zaXRvcnk8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgIDxkdD5zdG9yZW5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbnN1cmVzIGVhY2ggZmlsZSBzdG9yZWQgaW4gcmVwb3NpdG9yeSByZXN1bHRzIGluIG5ldyB2ZXJzaW9uIGJlaW5nIGNyZWF0ZWQgaWYgbmVlZGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgICA8ZHQ+c3RvcmVwdWJsaWM8L2R0PlxuICAgICAgICAgKiAgICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoZXMgZWFjaCBmaWxlIHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnN0b3Jlbm9wcm9qZWN0PC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgbm8gcHJvamVjdCBwZXJzaXN0ZW5jZSBmb2xsb3dpbmcgam9iIGV4ZWN1dGlvbjwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgam9iU3VibWl0OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL3N1Ym1pdCcsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGNhbGwgc2NoZWR1bGVzIGEgam9iIGZvciBiYWNrZ3JvdW5kIGV4ZWN1dGlvbiBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBzY2hlZHN0YXJ0IHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBzdGFydCB0aW1lIGZvciB0aGUgam9iLiBUaGlzXG4gICAgICAgICAqIHBhcmFtZXRlciB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgVVRDIGluIG1pbGxpc2Vjb25kcy4gVGhlIHNjaGVkcmVwZWF0XG4gICAgICAgICAqIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgam9iIGlzIHRvIGJlIHJlcGVhdGVkLCBhbmQgaWZcbiAgICAgICAgICogb21pdHRlZCB0aGUgam9iIGlzIGV4ZWN1dGVkIGp1c3Qgb25jZS4gVGhlIHNjaGVkaW50ZXJ2YWwgcGFyYW1ldGVyXG4gICAgICAgICAqIGluZGljYXRlcyB0aGUgaW50ZXJ2YWwsIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcywgYmV0d2VlbiByZXBlYXRcbiAgICAgICAgICogZXhlY3V0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gc2NoZWR1bGUgdGhlIGV4ZWN1dGlvbiBvZiBhbiBhcmJpdHJhcnkgYmxvY2sgb2YgUiBjb2RlIHRoZSBjYWxsZXJcbiAgICAgICAgICogbXVzdCBwcm92aWRlIGEgdmFsdWUgb24gdGhlIGNvZGUgcGFyYW1ldGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIGEgc2luZ2xlIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQgdGhlXG4gICAgICAgICAqIGNhbGxlciBtdXN0IHByb3ZpZGUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgcnNjcmlwdG5hbWUgLCByc2NyaXB0YXV0aG9yIGFuZFxuICAgICAgICAgKiBvcHRpb25hbGx5IHJzY3JpcHR2ZXJzaW9uIC4gVG8gc2NoZWR1bGUgdGhlIGV4ZWN1dGlvbiBvZiBhIGNoYWluIG9mXG4gICAgICAgICAqIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHRzIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3RcbiAgICAgICAgICogb2YgdmFsdWVzIG9uIHRoZSByc2NyaXB0bmFtZSwsIF9yc2NyaXB0YXV0aG9yIGFuZCBvcHRpb25hbGx5IHJzY3JpcHR2ZXJzaW9uXG4gICAgICAgICAqIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIHNjaGVkdWxlIHRoZSBleGVjdXRpb24gb2YgYSBzaW5nbGUgZXh0ZXJuYWwgc2NyaXB0IHRoZSBjYWxsZXIgbXVzdFxuICAgICAgICAgKiBwcm92aWRlIGEgdmFsaWQgVVJMIG9yIGZpbGUgcGF0aCB1c2luZyB0aGUgZXh0ZXJuYWxzb3VyY2UgcGFyYW1ldGVyLiBUb1xuICAgICAgICAgKiBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIGEgY2hhaW4gb2YgZXh0ZXJuYWwgc2NyaXB0cyB0aGUgY2FsbGVyIG11c3RcbiAgICAgICAgICogcHJvdmlkZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyBvbiB0aGUgZXh0ZXJuYWxzb3VyY2UgcGFyYW1ldGVyLlxuICAgICAgICAgKiBOb3RlLCB0byBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIGFuIGV4dGVybmFsIHNjcmlwdCB0aGUgY2FsbGVyIG11c3RcbiAgICAgICAgICogaGF2ZSBQT1dFUl9VU0VSIHByaXZpbGVnZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGU6IEEgY2hhaW5lZCBleGVjdXRpb24gZXhlY3V0ZXMgZWFjaCBvZiB0aGUgc2NyaXB0cyBpZGVudGlmaWVkIG9uIHRoZVxuICAgICAgICAgKiBjYWxsIGluIGEgc2VxdWVudGlhbCBmYXNoaW9uIG9uIHRoZSBSIHNlc3Npb24gZm9yIHRoZSBqb2IsIHdpdGhcbiAgICAgICAgICogZXhlY3V0aW9uIG9jY3VyaW5nIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgb24gdGhlIHBhcmFtZXRlciBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBQbGVhc2Ugbm90IHRoZSBmb2xsb3dpbmcgcHJlIGFuZCBwb3N0IGV4ZWN1dGlvbiBwYXJhbWV0ZXJzOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8c3Ryb25nPlByZS1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBpbnB1dHMgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHBhc3MgUmV2b0RlcGxveVItZW5jb2RlZFxuICAgICAgICAgKiAgICAgICBSIG9iamVjdCB2YWx1ZXMgYXMgaW5wdXRzLiBUaGVzZSBpbnB1dHMgYXJlIHR1cm5lZCBpbnRvIFIgb2JqZWN0c1xuICAgICAgICAgKiAgICAgICBpbiB0aGUgd29ya3NwYWNlIGJlZm9yZSB0aGUgZXhlY3V0aW9uIGJlZ2lucy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgcHJlbG9hZGZpbGUgcGFyYW1ldGVycyBhbGxvd3MgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkgaW50byB0aGUgd29ya2luZyBkaXJlY3RvcnkgYmVmb3JlIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBwcmVsb2Fkb2JqZWN0IHBhcmFtZXRlcnMgYWxsb3cgdGhlIGNhbGxlciB0byBsb2FkIG9uZSBvciBtb3JlXG4gICAgICAgICAqICAgICAgIGJpbmFyeSBSIG9iamVjdHMgKC5yRGF0YSkgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbnRvIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICogICAgICAgYmVmb3JlIHRoZSBleGVjdXRpb24gYmVnaW5zLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBhZG9wdCBwYXJhbWV0ZXJzIGFsbG93IHRoZSBjYWxsZXIgdG8gbG9hZCBhIHByZS1leGlzdGluZ1xuICAgICAgICAgKiAgICAgICBwcm9qZWN0IHdvcmtzcGFjZSwgcHJvamVjdCB3b3JraW5nIGRpcmVjdG9yeSBhbmQvb3IgcHJvamVjdCBwYWNrYWdlXG4gICAgICAgICAqICAgICAgIGRlcGVuZGVuY2llcyBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqIDwvb2w+XG4gICAgICAgICAqXG4gICAgICAgICAqIDxzdHJvbmc+UG9zdC1leGVjdXRpb24gcGFyYW1ldGVyczo8L3N0cm9uZz5cbiAgICAgICAgICpcbiAgICAgICAgICogPG9sPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZWZpbGUgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgICAgICogICAgICAgbGlzdCBvZiB3b3JraW5nIGRpcmVjdG9yeSBmaWxlcyB0byBiZSBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXJcbiAgICAgICAgICogICAgICAgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3Jlb2JqZWN0IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkXG4gICAgICAgICAqICAgICAgIGxpc3Qgb2Ygd29ya3NwYWNlIG9iamVjdHMgdG8gYmUgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZVxuICAgICAgICAgKiAgICAgICBleGVjdXRpb24gY29tcGxldGVzLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXdvcmtzcGFjZSBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3RvcmUgdGhlIGVudGlyZVxuICAgICAgICAgKiAgICAgICB3b3Jrc3BhY2UgaW4gdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlZGlyZWN0b3J5IHBhcmFtZXRlciBhbGxvd3MgdGhlIGNhbGxlciB0byBzcGVjaWZ5IGEgdGFyZ2V0XG4gICAgICAgICAqICAgICAgIHJlcG9zaXRvcnkgZGlyZWN0b3J5IGZvciBzdG9yZWQgZmlsZXMgYW5kIG9iamVjdHMgYWZ0ZXIgdGhlIGV4ZWN1dGlvblxuICAgICAgICAgKiAgICAgICBjb21wbGV0ZXMuXG4gICAgICAgICAqICAgIDwvbGk+XG4gICAgICAgICAqICAgIDxsaT5cbiAgICAgICAgICogICAgICAgVGhlIHN0b3JlbmV3dmVyc2lvbiBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY3JlYXRlIG5ld1xuICAgICAgICAgKiAgICAgICB2ZXJzaW9ucyBvZiBlYWNoIHN0b3JlZCBmaWxlIGluIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBleGVjdXRpb25cbiAgICAgICAgICogICAgICAgY29tcGxldGVzLiBCeSBkZWZhdWx0LCBzdG9yZWQgZmlsZXMgb3ZlcndyaXRlIGFueSBwcmUtZXhpc3RpbmcgZmlsZVxuICAgICAgICAgKiAgICAgICBieSB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiAgICA8bGk+XG4gICAgICAgICAqICAgICAgIFRoZSBzdG9yZXB1YmxpYyBwYXJhbWV0ZXIgYWxsb3dzIHRoZSBjYWxsZXIgdG8gYXNzaWduIHB1YmxpYyBhY2Nlc3NcbiAgICAgICAgICogICAgICAgdG8gZWFjaCBzdG9yZWQgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgZXhlY3V0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgICogICAgPC9saT5cbiAgICAgICAgICogICAgPGxpPlxuICAgICAgICAgKiAgICAgICBUaGUgc3RvcmVub3Byb2plY3QgcGFyYW1ldGVyIGFsbG93cyB0aGUgY2FsbGVyIHRvIHNraXAgdGhlXG4gICAgICAgICAqICAgICAgIHBlcnNpc3RlbmNlLXRvLXByb2plY3Qgc3RlcCBhZnRlciB0aGUgZXhlY3V0aW9uLlxuICAgICAgICAgKiAgICA8L2xpPlxuICAgICAgICAgKiA8L29sPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIGpvYlNjaGVkdWxlXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGUgY2FsbCBjb25maWd1cmF0aW9uLiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgICAgICogICAgICAgIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAgICogPGRsPlxuICAgICAgICAgKiAgICA8ZHQ+bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5qb2IgbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5kZXNjcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGpvYiBkZXNjcmlwdGlvbjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zY2hlZHN0YXJ0PC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHRoZSBzdGFydCB0aW1lIGZvciBqb2I8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2NoZWRyZXBlYXQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aW1lcyBqb2IgaXMgdG8gYmUgcmVwZWF0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c2NoZWRpbnRlcnZhbDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgKG1zKSBvbiB3aGljaCBqb2IgaXMgdG8gYmUgcmVwZWF0ZWQ8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y29kZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIFIgY29kZSB0byBleGVjdXRlIG9uIGpvYjwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5yc2NyaXB0bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnktbWFuYWdlZCBzY3JpcHQgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnJzY3JpcHRkaXJlY3Rvcnk8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXBvc2l0b3J5LW1hbmFnZWQgZGlyZWN0b3JpZXMgZm9yIHNjcmlwdHMsIGRlZmF1bHRzIHRvIHJvb3Q8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cnNjcmlwdGF1dGhvcjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF1dGhvcnMsIGF1dGhvci1wZXItcnNjcmlwdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cnNjcmlwdHZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2ZXJzaW9ucywgdmVyc2lvbi1wZXItcnNjcmlwdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZXh0ZXJuYWxzb3VyY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBVUkxzIG9yIGZpbGUgcGF0aHMgdG8gZXh0ZXJuYWwgc2NyaXB0czwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5pbnB1dHM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBSZXZvRGVwbG95Ui1lbmNvZGVkIHNjcmlwdCBpbnB1dHM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Y3N2aW5wdXRzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJpbWl0aXZlIG5hbWUvdmFsdWUgaW5wdXRzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxlbmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgZmlsZW5hbWVzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnByZWxvYWRmaWxlYXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1wcmVsb2FkZmlsZW5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+cHJlbG9hZGZpbGV2ZXJzaW9uPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmVyc2lvbnMsIHZlcnNpb24tcGVyLXByZWxvYWRmaWxlbmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0bmFtZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlcG9zaXRvcnkgb2JqZWN0ICguckRhdGEpIGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0YXV0aG9yPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXV0aG9ycywgYXV0aG9yLXBlci1wcmVsb2Fkb2JqZWN0bmFtZTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5wcmVsb2Fkb2JqZWN0dmVyc2lvbjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZlcnNpb25zLCB2ZXJzaW9uLXBlci1vYmplY3QtcHJlbG9hZG9iamVjdG5hbWU8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+YWRvcHR3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCB3b3Jrc3BhY2UgaXMgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5hZG9wdGRpcmVjdG9yeTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlkZW50aWZpZXMgcHJvamVjdCBmcm9tIHdoaWNoIGRpcmVjdG9yeSBpcyB0byBiZSBhZG9wdGVkPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmFkb3B0cGFja2FnZXM8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZGVudGlmaWVzIHByb2plY3QgZnJvbSB3aGljaCBwYWNrYWdlIGRlcGVuZGVuY2llcyBhcmUgdG8gYmUgYWRvcHRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgPGR0PnByaW9yaXR5PC9kdD5cbiAgICAgICAgICogICAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgdGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkgZm9yIHRoZSBqb2I6IGxvdyAoZGVmYXVsdCksIG1lZGl1bSBvciBoaWdoPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnRhZzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIHNwZWNpZmllcyBhIHRhZyB0aGF0IGxhYmVscyB0aGUgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmVjaG9vZmY8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSBSIGNvbW1hbmRzIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgY29uc29sZSBvdXRwdXRcbiAgICAgICAgICogICAgICAgc2F2ZWQgb24gdGhlIHByb2plY3QgZXhlY3V0aW9uIGhpc3RvcnkgZm9yIHRoZSBqb2JcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmNvbnNvbGVvZmY8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSBjb25zb2xlIG91dHB1dCBpcyBub3Qgc2F2ZWQgb24gdGhlIHByb2plY3RcbiAgICAgICAgICogICAgICAgZXhlY3V0aW9uIGhpc3RvcnkgZm9yIHRoZSBqb2JcbiAgICAgICAgICogICAgPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmdyYXBoaWNzPC9kdD5cbiAgICAgICAgICogICAgPGRkPihvcHRpb25hbCkgc3BlY2lmaWVzIHByZWZlcnJlZCBSIGdyYXBoaWNzIGRldmljZSBmb3IgZXhlY3V0aW9uOiBwbmcgb3Igc3ZnPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PmdyYXBoaWNzd2lkdGg8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIHdpZHRoIGZvciBSIGdyYXBoaWNzIGRldmljZSBpbWFnZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+Z3JhcGhpY3NoZWlnaHQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBzcGVjaWZpZXMgcHJlZmVycmVkIGhlaWdodCBmb3IgUiBncmFwaGljcyBkZXZpY2UgaW1hZ2VzPC9kZD5cbiAgICAgICAgICpcbiAgICAgICAgICogICAgPGR0PnN0b3JlZmlsZTwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmtpbmcgZGlyZWN0b3J5IGZpbGVuYW1lczwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZW9iamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmtzcGFjZSBvYmplY3QgbmFtZXM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+c3RvcmV3b3Jrc3BhY2U8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBmaWxlbmFtZSAoLnJEYXRhKSB3aGVyZSB3b3Jrc3BhY2UgY29udGVudHMgd2lsbCBiZSBzYXZlZCBpbiB0aGUgcmVwb3NpdG9yeTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZW5ld3ZlcnNpb248L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+KG9wdGlvbmFsKSBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5zdXJlcyBlYWNoIGZpbGUgc3RvcmVkIGluIHJlcG9zaXRvcnkgcmVzdWx0cyBpbiBuZXcgdmVyc2lvbiBiZWluZyBjcmVhdGVkIGlmIG5lZWRlZDwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZXB1YmxpYzwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoZXMgZWFjaCBmaWxlIHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeTwvZGQ+XG4gICAgICAgICAqXG4gICAgICAgICAqICAgIDxkdD5zdG9yZW5vcHJvamVjdDwvZHQ+XG4gICAgICAgICAqICAgIDxkZD4ob3B0aW9uYWwpIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBubyBwcm9qZWN0IHBlcnNpc3RlbmNlIGZvbGxvd2luZyBqb2IgZXhlY3V0aW9uPC9kZD5cbiAgICAgICAgICogPC9kbD5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBpbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBqb2JTY2hlZHVsZTogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykgeyAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL3NjaGVkdWxlJywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBxdWVyaWVzIHRoZSBqb2Igc3RhdHVzLiBUaGUgc3RhdHVzIHByb3BlcnR5IHdpbGwgaW5kaWNhdGUgb25lIG9mXG4gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICAgICAgICAgKlxuICAgICAgICAgKiBTY2hlZHVsZWQsIFF1ZXVlZCwgUnVubmluZywgQ29tcGxldGVkLCBDYW5jZWxsaW5nLCBDYW5jZWxsZWQsIEludGVycnVwdGVkLFxuICAgICAgICAgKiBBYm9ydGVkLCBGYWlsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2Qgam9iUXVlcnlcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIHRoZSBjYWxsIGNvbmZpZ3VyYXRpb24uIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgICAgKiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmpvYjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBqb2IgaWRlbnRpZmllcnM8L2RkPlxuICAgICAgICAgKlxuICAgICAgICAgKiAgICA8ZHQ+ZXh0ZW5kZWQ8L2R0PlxuICAgICAgICAgKiAgICA8ZGQ+XG4gICAgICAgICAqICAgICAgIChvcHRpb25hbCkgaWYgdHJ1ZSwgb25seSBqb2JzIGluIGFuIGV4dGVuZGVkLXN0YXRlIGFyZSBsaXN0ZWQgaW4gdGhlXG4gICAgICAgICAqICAgICAgIHJlc3BvbnNlIG1hcmt1cFxuICAgICAgICAgKiAgICA8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGpvYlF1ZXJ5OiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL3F1ZXJ5JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBjYW5jZWxzIHRoZSBzcGVjaWZpZWQgam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBPbmx5IGpvYnMgaW4gYW4gb3Blbi1zdGF0ZSBjYW4gYmUgY2FuY2VsbGVkLiBUaGUgc2V0IG9mIGpvYiBvcGVuLXN0YXRlcyBhcmVcbiAgICAgICAgICogc2hvd24gaGVyZTpcbiAgICAgICAgICpcbiAgICAgICAgICogPHVsPlxuICAgICAgICAgKiAgICA8bGk+U2NoZWR1bGVkIDogam9iIGlzIHNjaGVkdWxlZCBidXQgbm90IHlldCBxdWV1ZWQgZm9yIHJ1bm5pbmcuPC9saT5cbiAgICAgICAgICogICAgPGxpPlF1ZXVlZCA6IGpvYiBpcyBxdWV1ZWQgZm9yIHJ1bm5pbmcuPC9saT5cbiAgICAgICAgICogICAgPGxpPlJ1bm5pbmcgOiBqb2IgaXMgcnVubmluZy48L2xpPlxuICAgICAgICAgKiA8L3VsPlxuICAgICAgICAgKiBAbWV0aG9kIGpvYkNhbmNlbFxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogICAgPGR0PmpvYjwvZHQ+XG4gICAgICAgICAqICAgIDxkZD5zcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBqb2IgaWRlbnRpZmllcnM8L2RkPlxuICAgICAgICAgKiA8L2RsPlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGlvIHRyYW5zYWN0aW9uIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGpvYkNhbmNlbDogZnVuY3Rpb24oY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW8oJy9yL2pvYi9saXN0JywgY29uZmlnLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgY2FsbCBkZWxldGVzIHRoZSBzcGVjaWZpZWQgam9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBPbmx5IGpvYnMgaW4gb25lIG9mIHRoZSBjb21wbGV0ZWQtc3RhdGVzIGNhbiBiZSBkZWxldGVkLiBUaGUgc2V0IG9mIGpvYlxuICAgICAgICAgKiBjb21wZWx0ZWQtc3RhdGVzIGFyZSBzaG93biBoZXJlOlxuICAgICAgICAgKlxuICAgICAgICAgKiA8dWw+XG4gICAgICAgICAqICAgIDxsaT5Db21wbGV0ZWQgOiBqb2IgZXhlY3V0aW9uIGhhcyBydW4gdG8gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLjwvbGk+XG4gICAgICAgICAqICAgIDxsaT5JbnRlcnJ1cHRlZCA6IGpvYiBleGVjdXRpb24gaGFzIGJlZW4gaW50ZXJydXB0ZWQuPC9saT5cbiAgICAgICAgICogICAgPGxpPkNhbmNlbGxlZCA6IGpvYiBoYXMgYmVlbiBjYW5jZWxsZWQuPC9saT5cbiAgICAgICAgICogICAgPGxpPkFib3J0ZWQgOiBqb2IgZXhlY3V0aW9uIGhhcyBiZWVuIGFib3J0ZWQuPC9saT5cbiAgICAgICAgICogICAgPGxpPkZhaWxlZCA6IGpvYiBleGVjdXRpb24gaGFzIHJlc3VsdGVkIGluIGZhaWx1cmUuPC9saT5cbiAgICAgICAgICogPC91bD5cbiAgICAgICAgICpcbiAgICAgICAgICogSm9icyBpbiBhbiBvcGVuLXN0YXRlIG11c3QgZmlyc3QgcnVuIHRvIGNvbXBsZXRpb24gb3IgYmUgY2FuY2VsbGVkIGJlZm9yZVxuICAgICAgICAgKiB0aGV5IGFyZSBlbGlnaWJsZSBmb3IgZGVsZXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIDxibG9ja3F1b3RlPlxuICAgICAgICAgKiAgICBJbXBvcnRhbnQhIERlbGV0aW5nIGpvYnMgd2lsbCBub3QgZGVsZXRlIHRoZSBwcm9qZWN0cyB0aGF0IHJlc3VsdGVkIGZyb21cbiAgICAgICAgICogICAgdGhvc2Ugam9icy5cbiAgICAgICAgICogPC9ibG9ja3F1b3RlPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWV0aG9kIGpvYkRlbGV0ZVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgdGhlIGNhbGwgY29uZmlndXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICAgICAqICAgICAgICBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgICAqIDxkbD5cbiAgICAgICAgICogIDxkdD5qb2I8L2R0PlxuICAgICAgICAgKiAgPGRkPnNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGpvYiBpZGVudGlmaWVyczwvZGQ+XG4gICAgICAgICAqIDwvZGw+XG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgaW8gdHJhbnNhY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgam9iRGVsZXRlOiBmdW5jdGlvbihjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbygnL3Ivam9iL2RlbGV0ZScsIGNvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfSAvLyBEZXBsb3lSXG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGVwcmVjYXRlZDsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL3NlbGZpc2gnKS5CYXNlO1xuXG5mdW5jdGlvbiBkZWJ1Zyhtc2cpIHsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhc2UuZXh0ZW5kKHtcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmV2ZW50cyA9IHt9O1xuICAgIHRoaXMuc2NvcGUgID0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhIGxpc3RlbmVyLiAgTXVsdGlwbGUgY2FuIGJlIGFkZGVkIHBlciBuYW1lLiAgQWxpYXNlZCBhcyBgb25gLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBBIGNhbGxiYWNrXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9IGB0aGlzYCBmb3IgY2hhaW5pbmcgICAgICBcbiAgICovXG4gIG9uOiBmdW5jdGlvbihuYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5ldmVudHMgPT09IGZhbHNlKSB7IHRoaXMuZXZlbnRzW25hbWVdID0gW107IH0gICAgICAgIFxuXG4gICAgdGhpcy5ldmVudHNbbmFtZV0ucHVzaChoYW5kbGVyKTtcbiAgICBkZWJ1ZygnRW1pdHRlci5vbihcIicgKyBuYW1lICsgJ1wiKScpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGFsbCBtYXRjaGluZyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfSBgdGhpc2AgZm9yIGNoYWluaW5nICAgXG4gICAqL1xuICBlbWl0OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5ldmVudHMgPT09IGZhbHNlKSB7IHJldHVybiB0aGlzOyB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZXZlbnRzW25hbWVdLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZygnRmlyZWQgZXZlbnQ6IFwiJyArIG5hbWUgKyAnXCInKTtcbiAgICAgIHRoaXMuZXZlbnRzW25hbWVdW2ldLmFwcGx5KHRoaXMuc2NvcGUgfHwgdGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7ICAgICAgIFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBtYXRjaGluZyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfSBgdGhpc2AgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZBbGw6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGZvciAodmFyIGUgaW4gdGhpcy5ldmVudHMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzW2VdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c1tuYW1lXTsgICAgICAgIFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgYmFzZWQgb24gYW4gaW5kZXguXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBldmVudCBcbiAgICovXG4gIG9mZkF0OiBmdW5jdGlvbihuYW1lLCBpbmRleCkge1xuICAgIHZhciBhcnJheSA9IHRoaXMuZXZlbnRzW25hbWVdLFxuICAgICAgICByZXN0ICA9IGFycmF5LnNsaWNlKGluZGV4ICsgMSk7XG5cbiAgICBhcnJheS5sZW5ndGggPSBpbmRleDtcbiAgICBhcnJheS5wdXNoLmFwcGx5KGFycmF5LCByZXN0KTtcbiAgICB0aGlzLmV2ZW50c1tuYW1lXSA9IGFycmF5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgYmFzZWQgb24gdGhlIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfSBgdGhpc2AgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmY6IGZ1bmN0aW9uKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmV2ZW50cyA9PT0gZmFsc2UpIHsgcmV0dXJuIHRoaXM7IH1cblxuICAgIC8vIHJlbW92ZSBhbGwgZXZlbnRzIGhhbmRsZXJzIGJ5IHRoaXMgbmFtZVxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMub2ZmQWxsKG5hbWUpO1xuICAgIH0gZWxzZSB7IC8vIHJlbW92ZSBhbGwgZXZlbnRzIGhhbmRsZXJzID09ICdoYW5kbGVyJyBieSB0aGlzIG5hbWVcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ldmVudHNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzW25hbWVdW2ldID09IGhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLm9mZkF0KG5hbWUsIGkpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbn0pOyAiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xudmFyIExhbmcgPSByZXF1aXJlKCcuL2xhbmcnKSxcbiAgICBSVHlwZXMgPSByZXF1aXJlKCcuL3J0eXBlcycpLFxuICAgIFIgPSBSVHlwZXMucixcbiAgICBEZXBsb3lSID0gUlR5cGVzLmRlcGxveXI7XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGVzKGRhdGVzLCB0eXBlKSB7XG4gICAgdmFyIGZvcm1hdHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9ybWF0cy5wdXNoKGZvcm1hdERhdGUoZGF0ZXNbaV0sIHR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0cztcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlLCB0eXBlKSB7ICAgIFxuICAgdmFyIHllYXIgICA9IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICBtb250aCAgPSAoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgICAgZGF5ICAgID0gZGF0ZS5nZXREYXRlKCksICAgIFxuICAgICAgIGhvdXIgICA9IGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICBtaW4gICAgPSBkYXRlLmdldE1pbnV0ZXMoKSxcbiAgICAgICBzZWMgICAgPSBkYXRlLmdldFNlY29uZHMoKSxcbiAgICAgICB6b25lICAgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAgICAgZm9ybWF0ID0gJyc7XG5cbiAgICAgICBtb250aCAgPSAobW9udGggPCAxMCA/ICcwJyArIG1vbnRoIDogbW9udGgpO1xuICAgICAgIGhvdXIgICA9IChob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cik7XG4gICAgICAgbWluICAgID0gKG1pbiA8IDEwID8gJzAnICsgbWluIDogbWluKTtcbiAgICAgICBzZWMgICAgPSAoc2VjIDwgMTAgPyAnMCcgKyBzZWMgOiBzZWMpOyAgICAgICBcbiAgICAgICBmb3JtYXQgPSB5ZWFyICsgJy0nICsgbW9udGggKyAnLScgKyBkYXk7XG5cbiAgICBmdW5jdGlvbiBsZWZ0WmVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgb3V0cHV0ID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuXG4gICAgICAgIHdoaWxlIChvdXRwdXQubGVuZ3RoIDwgdGFyZ2V0TGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSAnMCcgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgKyBvdXRwdXQ7XG4gICAgfVxuICAgXG4gICAgaWYgKHR5cGUgPT09IERlcGxveVIuUlBPU0lYX0RBVEUgfHwgdHlwZSA9PT0gRGVwbG95Ui5SUE9TSVhfREFURV9WRUNUT1IpIHtcbiAgICAgICAgdmFyIHRpbWUgID0gaG91ciArICc6JyArIG1pbiArICc6JyArIHNlYyxcbiAgICAgICAgICAgIGEgPSAtem9uZSxcbiAgICAgICAgICAgIGIgPSBcIitcIjtcblxuICAgICAgICBpZiAoYSA8IDApIHtcbiAgICAgICAgICAgIGEgPSAtYTtcbiAgICAgICAgICAgIGIgPSBcIi1cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHpvbmUgPSBiICsgbGVmdFplcm9GaWxsKChhIC8gNjApLCAyKSArICcnICsgbGVmdFplcm9GaWxsKGEgJSA2MCwgMik7XG4gICAgICAgIGZvcm1hdCArPSAoJyAnICsgdGltZSArICcgJyArIHpvbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQ7XG59XG5cbmZ1bmN0aW9uIGVuY29kZUVtYmVkZGVkRGF0YWZyYW1lKG9iaiwgcmRmKSB7XG4gICAgdmFyIGRmVmFsdWUgPSBvYmoudmFsdWU7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRmVmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBkZk9iaiA9IGRmVmFsdWVbaW5kZXhdO1xuICAgICAgICBpZiAoZGZPYmoudHlwZSA9PT0gRGVwbG95Ui5SREFUQUZSQU1FKSB7XG4gICAgICAgICAgICByZGYgPSBlbmNvZGVFbWJlZGRlZERhdGFmcmFtZShkZk9iaiwgcmRmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZvcm1hdCBkYXRlc1xuICAgICAgICAgICAgaWYgKFJUeXBlcy5pc0RhdGUoZGZPYmoudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoTGFuZy5pc0FycmF5KGRmT2JqLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBkZk9iai52YWx1ZSA9IGZvcm1hdERhdGVzKGRmT2JqLnZhbHVlLCBkZk9iai50eXBlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZk9iai52YWx1ZSA9IGZvcm1hdERhdGUoZGZPYmoudmFsdWUsIGRmT2JqLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGZPYmoudHlwZSA9IFJUeXBlcy5kZXBsb3lyVG9SKGRmT2JqLnR5cGUpO1xuICAgICAgICAgICAgcmRmLnZhbHVlLnB1c2goZGZPYmopOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIHJkZjtcbn07XG5cbmZ1bmN0aW9uIGVuY29kZURhdGFmcmFtZShvYmopIHtcbiAgICB2YXIgcmRmID0ge1xuICAgICAgICAgICAgdHlwZTogUi5EQVRBRlJBTUUsXG4gICAgICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgICAgICBuYW1lOiBvYmoubmFtZVxuICAgICAgICB9LFxuICAgICAgICBkZlZhbHVlID0gb2JqLnZhbHVlO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRmVmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBkZk9iaiA9IGRmVmFsdWVbaW5kZXhdO1xuXG4gICAgICAgIGlmIChkZk9iai50eXBlID09PSBEZXBsb3lSLlJEQVRBRlJBTUUpIHtcbiAgICAgICAgICAgIHJkZiA9IGVuY29kZUVtYmVkZGVkRGF0YWZyYW1lKGRmT2JqLCByZGYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZm9ybWF0IGRhdGVzXG4gICAgICAgICAgICBpZiAoUlR5cGVzLmlzRGF0ZShkZk9iai50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmIChMYW5nLmlzQXJyYXkoZGZPYmoudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRmT2JqLnZhbHVlID0gZm9ybWF0RGF0ZXMoZGZPYmoudmFsdWUsIGRmT2JqLnR5cGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRmT2JqLnZhbHVlID0gZm9ybWF0RGF0ZShkZk9iai52YWx1ZSwgZGZPYmoudHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZk9iai50eXBlID0gUlR5cGVzLmRlcGxveXJUb1IoZGZPYmoudHlwZSk7XG4gICAgICAgICAgICByZGYudmFsdWUucHVzaChkZk9iaik7XG4gICAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gcmRmO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlTGlzdChvYmopIHtcbiAgICB2YXIgcmxpc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBSLkxJU1QsXG4gICAgICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgICAgICBuYW1lOiBvYmoubmFtZVxuICAgICAgICB9LFxuICAgICAgICBkZlZhbHVlID0gb2JqLnZhbHVlLFxuICAgICAgICByO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRmVmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBkZk9iaiA9IGRmVmFsdWVbaW5kZXhdO1xuXG4gICAgICAgIHN3aXRjaCAoZGZPYmoudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJEQVRBRlJBTUU6XG4gICAgICAgICAgICAgICAgciA9IGVuY29kZURhdGFmcmFtZShkZk9iaik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5STElTVDpcbiAgICAgICAgICAgICAgICByID0gZW5jb2RlTGlzdChkZk9iaik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5STlVNRVJJQ19NQVRSSVg6XG4gICAgICAgICAgICBjYXNlIERlcGxveVIuUklOVEVHRVJfTUFUUklYOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJCT09MRUFOX01BVFJJWDpcbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SU1RSSU5HX01BVFJJWDpcbiAgICAgICAgICAgICAgICByID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZk9iai5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBSLk1BVFJJWCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRmT2JqLnZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJEQVRFOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJQT1NJWF9EQVRFOlxuICAgICAgICAgICAgICAgIHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRmT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuREFURSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBkZk9iai5mb3JtYXQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXREYXRlKGRmT2JqLnZhbHVlLCBkZk9iai50eXBlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SRkFDVE9SOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJPUkRFUkVEOlxuICAgICAgICAgICAgICAgIHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRmT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuRkFDVE9SLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcmVkOiBkZk9iai5vcmRlcmVkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IGRmT2JqLmxhYmVscyxcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWxzOiBkZk9iai5sZXZlbHMsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkZk9iai52YWx1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SU1RSSU5HOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJCT09MRUFOOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJOVU1FUklDOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJJTlRFR0VSOlxuICAgICAgICAgICAgICAgIHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRmT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuUFJJTUlUSVZFLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGZPYmoudmFsdWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIERlcGxveVIuUk5VTUVSSUNfVkVDVE9SOlxuICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJJTlRFR0VSX1ZFQ1RPUjpcbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SQk9PTEVBTl9WRUNUT1I6XG4gICAgICAgICAgICBjYXNlIERlcGxveVIuUlNUUklOR19WRUNUT1I6XG4gICAgICAgICAgICAgICAgciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZGZPYmoubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogUi5WRUNUT1IsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkZk9iai52YWx1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SREFURV9WRUNUT1I6XG4gICAgICAgICAgICBjYXNlIERlcGxveVIuUlBPU0lYX0RBVEVfVkVDVE9SOlxuICAgICAgICAgICAgICAgIHIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGRmT2JqLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuVkVDVE9SLCAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXREYXRlcyhkZk9iai52YWx1ZSwgZGZPYmoudHlwZSksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZGZPYmouZm9ybWF0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFJEYXRhVHlwZSBmb3VuZCBmb3IgXCInICsgZGZPYmoudHlwZSArICdcIicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmxpc3QudmFsdWUucHVzaChyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJsaXN0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVucyBhIGdpdmVuIDxjb2RlPlJldm9sdXRpb24uUkRhdGE8L2NvZGU+IHR5cGUgaW50byBhIEpTT04gc3RyaW5nXG4gICAgICogcmVwcmVzZW50aW5nIHRoZVxuICAgICAqIGV4cGVjdGVkIERlcGxveVIgaW5wdXQgZm9ybWF0LlxuICAgICAqXG4gICAgICogQG1ldGhvZCBwYXJzZUlucHV0c1xuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAcGFyYW0ge0FycmF5fSByZGF0YSBBbiBBcnJheSBvZiBSRGF0YSBPYmplY3RzIHRvIGJlIGZsYXR0ZW5lZC5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBmbGF0dGVuZCBSRGF0YSBKU09OIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIERlcGxveVJcbiAgICAgKiAgICAgICAgICAgICAgICAgIGlucHV0IGZvcm1hdC5cbiAgICAgKi9cbiAgICBlbmNvZGU6IGZ1bmN0aW9uKHJkYXRhKSB7XG4gICAgICAgIHZhciByID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHJkYXRhLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIG9iaiA9IHJkYXRhW2luZGV4XTtcblxuICAgICAgICAgICAgc3dpdGNoIChvYmoudHlwZSkgeyAvLyAtLSBEZXBsb3lSIFR5cGUgLS0gLy9cblxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SREFUQUZSQU1FOlxuICAgICAgICAgICAgICAgICAgICByW29iai5uYW1lXSA9IGVuY29kZURhdGFmcmFtZShvYmopO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5STElTVDpcbiAgICAgICAgICAgICAgICAgICAgcltvYmoubmFtZV0gPSBlbmNvZGVMaXN0KG9iaik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJOVU1FUklDX01BVFJJWDpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUklOVEVHRVJfTUFUUklYOlxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SQk9PTEVBTl9NQVRSSVg6XG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJTVFJJTkdfTUFUUklYOlxuICAgICAgICAgICAgICAgICAgICByW29iai5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuTUFUUklYLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9iai52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SREFURTpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUlBPU0lYX0RBVEU6XG4gICAgICAgICAgICAgICAgICAgIHJbb2JqLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUi5EQVRFLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBvYmouZm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdERhdGUob2JqLnZhbHVlLCBvYmoudHlwZSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUkZBQ1RPUjpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUk9SREVSRUQ6ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByW29iai5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuRkFDVE9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZDogb2JqLm9yZGVyZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IG9iai5sYWJlbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM6IG9iai5sZXZlbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb2JqLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJTVFJJTkc6XG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJCT09MRUFOOlxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5STlVNRVJJQzpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUklOVEVHRVI6XG4gICAgICAgICAgICAgICAgICAgIHJbb2JqLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUi5QUklNSVRJVkUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb2JqLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJOVU1FUklDX1ZFQ1RPUjpcbiAgICAgICAgICAgICAgICBjYXNlIERlcGxveVIuUklOVEVHRVJfVkVDVE9SOlxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SQk9PTEVBTl9WRUNUT1I6XG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJTVFJJTkdfVkVDVE9SOlxuICAgICAgICAgICAgICAgICAgICByW29iai5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFIuVkVDVE9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9iai52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgRGVwbG95Ui5SREFURV9WRUNUT1I6XG4gICAgICAgICAgICAgICAgY2FzZSBEZXBsb3lSLlJQT1NJWF9EQVRFX1ZFQ1RPUjpcbiAgICAgICAgICAgICAgICAgICAgcltvYmoubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBSLlZFQ1RPUiwgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXREYXRlcyhvYmoudmFsdWUsIG9iai50eXBlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogb2JqLmZvcm1hdFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gUkRhdGFUeXBlIGZvdW5kIGZvciBcIicgKyBvYmoudHlwZSArICdcIicpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoSlNPTi5zdHJpbmdpZnkocikpO1xuICAgIH1cbn07IiwiIHZhciBvcHRpb25hbCA9IHJlcXVpcmUoJy4vb3B0aW9uYWwnKSxcbiAgICAgV1MgICAgICAgPSBvcHRpb25hbCgnd3MnKSxcbiAgICAgUXVldWUgICAgPSByZXF1aXJlKCcuL3F1ZXVlJyksICAgICBcbiAgICAgRW1pdHRlciAgPSByZXF1aXJlKCcuL2VtaXR0ZXInKSxcbiAgICAgQmFzZSAgICAgPSByZXF1aXJlKCcuL3NlbGZpc2gnKS5CYXNlLFxuICAgICBtZXJnZSAgICA9IHJlcXVpcmUoJy4vdXRpbHMnKS5tZXJnZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFdmVudFN0cmVhbWAgd2l0aCB0aGUgZ2l2ZW4gc2V0IG9mIGBvcHRpb25zYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbnZhciBFdmVudFN0cmVhbSA9IEJhc2UuZXh0ZW5kKEVtaXR0ZXIsIHsgICBcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiBpbml0aWFsaXplKGhvc3QsIG9wdGlvbnMpIHtcbiAgICBFbWl0dGVyLmluaXRpYWxpemUuY2FsbCh0aGlzLCB7fSk7XG5cbiAgICB0aGlzLmhvc3QgICAgICAgID0gaG9zdDtcbiAgICB0aGlzLm9wdGlvbnMgICAgID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLm9wdGlvbnMubG9nID0gdGhpcy5vcHRpb25zLmxvZyB8fCB0aGlzLkxPRy5lcnJvcjtcbiAgICB0aGlzLndzICAgICAgICAgID0gbnVsbDtcbiAgICB0aGlzLnEgICAgICAgICAgID0gbmV3IFF1ZXVlKCk7XG4gICAgdGhpcy5jaGFubmVsICAgICA9IHt9OyAgICAgXG4gIH0sICBcblxuICBMT0c6IHsgXG4gICAgaW5mbzogJ2luZm8nLCBcbiAgICBkZWJ1ZzogJ2RlYnVnJywgXG4gICAgZXJyb3I6ICdlcnJvcicgXG4gIH0sXG4gIFxuICBvcGVuOiBmdW5jdGlvbihvcHRpb25zKSB7ICAgIFxuICAgIHZhciBzZWxmICAgPSB0aGlzLFxuICAgICAgICB1cmkgICAgPSAodGhpcy5ob3N0IHx8ICcnKSArICcvZGVwbG95ci9yL2V2ZW50L3N0cmVhbT8nLFxuICAgICAgICBwYXJhbXMgPSBbXTtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gbWVyZ2Uob3B0aW9ucywgdGhpcy5jaGFubmVsKTsgICAgXG5cbiAgICB0aGlzLmNvb2tpZXMgPSAhdGhpcy5jb29raWVzID8gb3B0aW9ucy5oZWFkZXJzLkNvb2tpZSA6IHRoaXMuY29va2llcztcblxuICAgIC8vIC0tIGFwcGVuZCBvcHRpb24gcGFyYW1ldGVycyAtLVxuICAgIGlmIChvcHRpb25zLnByb2plY3QpIHtcbiAgICAgIHBhcmFtcy5wdXNoKCdwcm9qZWN0PScgKyBvcHRpb25zLnByb2plY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5qb2IpIHtcbiAgICAgICAgcGFyYW1zLnB1c2goJ2pvYj0nICsgb3B0aW9ucy5qb2IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1hbmFnZW1lbnQpIHtcbiAgICAgIHBhcmFtcy5wdXNoKCdtYW5hZ2VtZW50RXZlbnRPbmx5PXRydWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuaHR0cG9ubHkpIHtcbiAgICAgICAgcGFyYW1zLnB1c2goJ2h0dHBFdmVudE9ubHk9dHJ1ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmV2b29ubHkpIHtcbiAgICAgICAgICBwYXJhbXMucHVzaCgncmV2b0V2ZW50T25seT10cnVlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cmkgKz0gcGFyYW1zLmpvaW4oJyYnKS5zdWJzdHIoMCk7XG4gICAgdXJpID0gdXJpLnJlcGxhY2UoL15odHRwLywnd3MnKTtcblxuICAgIHRoaXMucS55aWVsZCh0cnVlKTtcbiAgICB0aGlzLnEuYWRkKGZ1bmN0aW9uKCkge1xuXG4gICAgICB2YXIgaGVhZGVycyA9IHRoaXMuY29va2llcyA/IHsgJ0Nvb2tpZSc6IHRoaXMuY29va2llcyB9IDoge307XG4gICAgICB0aGlzLmVtaXQoJ2VzOmNvbm5lY3RpbmcnLCB7IHVyaTogdXJpLCBoZWFkZXJzOiBoZWFkZXJzIH0pO1xuXG4gICAgICB2YXIgd3MgPSBuZXcgV1ModXJpLCAnaHR0cCcsIHsgaGVhZGVyczogaGVhZGVycyB9KTtcblxuICAgICAgd3Mub25vcGVuID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlczpvcGVuJywgbWVzc2FnZSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgX21lc3NhZ2UgPSAnJztcbiAgICAgIHdzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIHRyeSB7ICAgICAgICAgIFxuICAgICAgICAgIGlmIChtZXNzYWdlLmRhdGEuc3BsaXQoJyF8IScpWzFdKSB7XG4gICAgICAgICAgICBfbWVzc2FnZSA9IF9tZXNzYWdlICsgbWVzc2FnZS5kYXRhLnNwbGl0KCchfCEnKVsxXTtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKF9tZXNzYWdlKTtcbiAgICAgICAgICAgIF9tZXNzYWdlID0gJyc7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IG1lc3NhZ2UuZGVwbG95ci5yZXNwb25zZS5ldmVudC50eXBlO1xuICAgICAgICAgICAgc2VsZi5lbWl0KCdlczonICsgdHlwZS5yZXBsYWNlKCdFdmVudCcsICcnKSwgbWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fSBcbiAgICAgIH07XG5cbiAgICAgIHdzLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7IHNlbGYuZW1pdCgnZXM6ZXJyb3InLCBlcnIpOyB9O1xuICAgICAgd3Mub25jbG9zZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7IHNlbGYuZW1pdCgnZXM6ZGlzY29ubmVjdCcsIG1lc3NhZ2UpOyB9O1xuXG4gICAgICB0aGlzLndzID0gd3M7XG4gICAgfSwgdGhpcyk7XG5cbiAgICBpZiAob3B0aW9ucy5mb3JjZSkgeyB0aGlzLmZsdXNoKCk7IH1cblxuICAgIHJldHVybiB0aGlzOyAgICBcbiAgfSxcblxuICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMud3MpIHsgdGhpcy53cy5jbG9zZSgpOyB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBlcnJvcjogZnVuY3Rpb24oZm4pIHtcbiAgICB0aGlzLm9uKCdlczplcnJvcicsIGZuKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LCAgXG5cbiAgYWxsOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmNoYW5uZWwgPSB7IHJldm9vbmx5OiB0cnVlIH07ICAvLyByZXZvRXZlbnRPbmx5PXRydWVcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNlc3Npb246IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuY2hhbm5lbCA9IHsgaHR0cG9ubHk6IHRydWUgfTsgLy9odHRwRXZlbnRPbmx5PXRydWVcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHByb2plY3Q6IGZ1bmN0aW9uKHByb2plY3QpIHtcbiAgICB0aGlzLmNoYW5uZWwgPSB7IHByb2plY3Q6IHByb2plY3QgfTsgLy8gcHJvamVjdD0xMjM0NVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgam9iOiBmdW5jdGlvbihqb2IpIHtcbiAgICB0aGlzLmNoYW5uZWwgPSB7IGpvYjogam9iIH07IC8vam9iPTEyMzQ1XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBtYW5hZ2VtZW50OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmNoYW5uZWwgPSB7IG1hbmFnZW1lbnQ6IHRydWUgfTsgLy9tYW5hZ2VtZW50RXZlbnRPbmx5PXRydWVcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGZsdXNoOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnEueWllbGQoZmFsc2UpO1xuICAgIHRoaXMucS5mbHVzaCgpO1xuICB9LFxuXG4gIHNoYXJlOiBmdW5jdGlvbihjb29raWVzKSB7XG4gICAgdGhpcy5jb29raWVzID0gY29va2llcztcbiAgfVxuXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFN0cmVhbTtcbiIsIi8qIVxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgYnkgUmV2b2x1dGlvbiBBbmFseXRpY3MgSW5jLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIFZlcnNpb24gMi4wIG9mIHRoZVxuICogQXBhY2hlIExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRZLCBJTkNMVURJTkcgVEhPU0UgT0YgTk9OLUlORlJJTkdFTUVOVCxcbiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gUGxlYXNlIHJlZmVyIHRvIHRoZVxuICogQXBhY2hlIExpY2Vuc2UgMi4wIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApIGZvciBtb3JlIFxuICogZGV0YWlscy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBpcyBhIERlcGxveVIgcG9ydCBvZiB5dWktbGFuZy5qcyBieSBZYWhvbyFcbiAqXG4gKiBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCAoQlNEIExpY2Vuc2UpXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIFxuICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgXG4gKiBhcmUgbWV0OlxuICpcbiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IFxuICogZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIFxuICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgXG4gKiB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogTmVpdGhlciB0aGUgbmFtZSBvZiBZYWhvbyEgSW5jLiBub3IgdGhlIG5hbWVzIG9mIFlVSSdzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgXG4gKiB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFlhaG9vISBJbmMuXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIFxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgXG4gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIFxuICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgXG4gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBcbiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIFxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgIFxuICogUE9TIFNJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8qKlxuICogUHJvdmlkZXMgY29yZSBsYW5ndWFnZSB1dGlsaXRlcyBhbmQgZXh0ZW5zaW9ucyB1c2VkIHRocm91Z2hvdXQgRGVwbG95Ui5cbiAqXG4gKiBAY2xhc3MgTGFuZ1xuICogQHN0YXRpY1xuICovXG52YXIgTCA9IHt9LCBcblx0VE9TVFJJTkcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLCBcblx0VFlQRVMgPSB7XHRcblx0XHQndW5kZWZpbmVkJyA6ICd1bmRlZmluZWQnLFxuXHRcdCdudW1iZXInIDogJ251bWJlcicsXG5cdFx0J2Jvb2xlYW4nIDogJ2Jvb2xlYW4nLFxuXHRcdCdzdHJpbmcnIDogJ3N0cmluZycsXG5cdFx0J1tvYmplY3QgRnVuY3Rpb25dJyA6ICdmdW5jdGlvbicsXG5cdFx0J1tvYmplY3QgUmVnRXhwXScgOiAncmVnZXhwJyxcblx0XHQnW29iamVjdCBBcnJheV0nIDogJ2FycmF5Jyxcblx0XHQnW29iamVjdCBEYXRlXScgOiAnZGF0ZScsXG5cdFx0J1tvYmplY3QgRXJyb3JdJyA6ICdlcnJvcidcblx0fSwgdW5zYWZlTmF0aXZlcyA9IGZhbHNlO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGl0ZW0gaXMgbnVsbC5cbiAqIEBtZXRob2QgaXNOdWxsXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgbnVsbC5cbiAqL1xuTC5pc051bGwgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiBvID09PSBudWxsO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBpdGVtIGlzIHVuZGVmaW5lZC5cbiAqIEBtZXRob2QgaXNVbmRlZmluZWRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbyBpcyB1bmRlZmluZWQuXG4gKi9cbkwuaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiB0eXBlb2YgbyA9PT0gJ3VuZGVmaW5lZCc7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGl0ZW0gaXMgb2YgdHlwZSBvYmplY3RcbiAqIG9yIGZ1bmN0aW9uLiBOb3RlIHRoYXQgYXJyYXlzIGFyZSBhbHNvIG9iamVjdHMsIHNvXG4gKiA8Y29kZT5ZLkxhbmcuaXNPYmplY3QoW10pID09PSB0cnVlPC9jb2RlPi5cbiAqIEBtZXRob2QgaXNPYmplY3RcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEBwYXJhbSBmYWlsZm4ge2Jvb2xlYW59IGZhaWwgaWYgdGhlIGlucHV0IGlzIGEgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgYW4gb2JqZWN0LlxuICogQHNlZSBpc1BsYWluT2JqZWN0XG4gKi9cbkwuaXNPYmplY3QgPSBmdW5jdGlvbihvLCBmYWlsZm4pIHtcblx0dmFyIHQgPSB0eXBlb2Ygbztcblx0cmV0dXJuIChvICYmICh0ID09PSAnb2JqZWN0JyB8fCAoIWZhaWxmbiAmJiAodCA9PT0gJ2Z1bmN0aW9uJyB8fCBMLmlzRnVuY3Rpb24obykpKSkpIHx8IGZhbHNlO1xufTtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgaXRlbSBpcyBhbiBhcnJheS5cbiAqXG4gKiBSZXR1cm5zIGBmYWxzZWAgZm9yIGFycmF5LWxpa2UgY29sbGVjdGlvbnMgc3VjaCBhcyB0aGUgZnVuY3Rpb24gYGFyZ3VtZW50c2BcbiAqIGNvbGxlY3Rpb24gb3IgYEhUTUxFbGVtZW50YCBjb2xsZWN0aW9ucy5cbiAqXG4gKiBAbWV0aG9kIGlzQXJyYXlcbiAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbyBpcyBhbiBhcnJheS5cbiAqIEBzdGF0aWNcbiAqL1xuTC5pc0FycmF5ID0gKCF1bnNhZmVOYXRpdmVzICYmIEFycmF5LmlzQXJyYXkpIHx8XG5mdW5jdGlvbihvKSB7XG5cdHJldHVybiBMLnR5cGUobykgPT09ICdhcnJheSc7XG59O1xuXG5MLmlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uQShvKSB7XG5cdHJldHVybiAodHlwZW9mKG8pID09PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBpdGVtIGlzIGEgYm9vbGVhbi5cbiAqIEBtZXRob2QgaXNCb29sZWFuXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgYSBib29sZWFuLlxuICovXG5MLmlzQm9vbGVhbiA9IGZ1bmN0aW9uKG8pIHtcblx0cmV0dXJuIHR5cGVvZiBvID09PSAnYm9vbGVhbic7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHN1cHBsaWVkIGl0ZW0gaXMgYSBkYXRlIGluc3RhbmNlLlxuICogQG1ldGhvZCBpc0RhdGVcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbyBpcyBhIGRhdGUuXG4gKi9cbkwuaXNEYXRlID0gZnVuY3Rpb24obykge1xuXHRyZXR1cm4gTC50eXBlKG8pID09PSAnZGF0ZScgJiYgby50b1N0cmluZygpICE9PSAnSW52YWxpZCBEYXRlJyAmJiAhaXNOYU4obyk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGl0ZW0gaXMgYSBsZWdhbCBudW1iZXIuXG4gKiBAbWV0aG9kIGlzTnVtYmVyXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgYSBudW1iZXIuXG4gKi9cbkwuaXNOdW1iZXIgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiB0eXBlb2YgbyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUobyk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIGl0ZW0gaXMgYSBzdHJpbmcuXG4gKiBAbWV0aG9kIGlzU3RyaW5nXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG8gaXMgYSBzdHJpbmcuXG4gKi9cbkwuaXNTdHJpbmcgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiB0eXBlb2YgbyA9PT0gJ3N0cmluZyc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIHRoZSBpdGVtIHBhc3NlZCBpbi5cbiAqXG4gKiBAbWV0aG9kIHR5cGVcbiAqIEBwYXJhbSBvIHRoZSBpdGVtIHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBkZXRlY3RlZCB0eXBlLlxuICogQHN0YXRpY1xuICovXG5MLnR5cGUgPSBmdW5jdGlvbihvKSB7XG5cdHJldHVybiBUWVBFU1sgdHlwZW9mIG9dIHx8IFRZUEVTW1RPU1RSSU5HLmNhbGwobyldIHx8ICggbyA/ICdvYmplY3QnIDogJ251bGwnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTDsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cbiBcbnZhciBMb2dnZXIgPSB7fSxcbiAgICBsb2dnZXJNYXAgPSB7fSxcbiAgICBnbG9iYWxMb2dnZXI7XG5cbi8qKlxuICogVW5pdmVyc2FsIHN0ZG91dHxzdGRlcnIgcHJpbnRlclxuICovXG5mdW5jdGlvbiBsb2cobWVzc2FnZXMsIGNvbnRleHQpIHtcdFxuXHRpZiAoIWNvbnNvbGUpIHsgcmV0dXJuOyB9XG5cblx0ZnVuY3Rpb24gc2VwKGxldmVsKSB7XG5cdFx0dmFyIHNlcCA9ICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nICtcblx0XHQgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbicsXG5cdFx0ICAgIG9mZnNldCA9IDA7XG5cblx0XHRpZiAobGV2ZWwgPT09IExvZ2dlci5ERUJVRyB8fCBsZXZlbCA9PT0gTG9nZ2VyLkVSUk9SKSBvZmZzZXQgPSA4O1xuXHRcdGVsc2UgaWYgKGxldmVsID09PSBMb2dnZXIuSU5GTyB8fCBsZXZlbCA9PT0gTG9nZ2VyLldBUk4pIG9mZnNldCA9IDg7XG5cdFx0ZWxzZSBvZmZzZXQgPSA3O1xuXG5cdFx0cmV0dXJuIHsgc3RhcnQ6IHNlcC5zdWJzdHJpbmcob2Zmc2V0KSwgZW5kOiBzZXAgfTtcblx0fVxuXG5cdHZhciBoZGxyLFxuXHQgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG1lc3NhZ2VzLCAwKSxcblx0ICAgIG5hbWUgPSBjb250ZXh0Lm5hbWUsXG5cdCAgICBlcnJvciA9IGNvbnRleHQubGV2ZWwgPT09IExvZ2dlci5FUlJPUixcbiAgXHQgICAgZGVsaW0gPSBzZXAoY29udGV4dC5sZXZlbCk7XG5cbiAgXHRpZiAoY29udGV4dC5sZXZlbCA9PT0gTG9nZ2VyLldBUk4gJiYgY29uc29sZS53YXJuKSB7XG4gIFx0XHRoZGxyID0gJ3dhcm4nO1xuICBcdH0gZWxzZSBpZiAoY29udGV4dC5sZXZlbCA9PT0gTG9nZ2VyLkVSUk9SICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgXHRcdGhkbHIgPSAnZXJyb3InO1xuICBcdH0gZWxzZSBpZiAoY29udGV4dC5sZXZlbCA9PT0gTG9nZ2VyLklORk8gJiYgY29uc29sZS5pbmZvKSB7XG4gIFx0XHRoZGxyID0gJ2luZm8nO1xuICBcdH0gZWxzZSB7XG4gIFx0XHRoZGxyID0gJ2xvZyc7XG4gIFx0fVxuXG4gIFx0Ly8gLS0gY3VzdG9tIGZvcm1hdCBsb2dnaW5nIHN0YXRlbWVudCBmb3IgZGVwbG95ciByZXF1ZXN0L3Jlc3BvbnNlL2Vycm9yIC0tXG4gIFx0YXJncy51bnNoaWZ0KCdbJyArIChlcnJvciA/IExvZ2dlci5FUlJPUi5uYW1lIDogbmFtZSkgKyAnXSAnICsgZGVsaW0uc3RhcnQpO1xuICBcdGFyZ3MucHVzaChkZWxpbS5lbmQpO1xuXG4gIFx0Y29uc29sZVtoZGxyXShhcmdzWzBdLCBbYXJnc1sxXSArICcgLS0tPiAnICsgYXJnc1syXVsnY2FsbCddXSk7XG5cbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsgY29uc29sZS5sb2coYXJnc1tpXSk7IH0gIFxufVxuXG4vKipcbiAqIExvZ2dpbmcgY2F0ZWdvcnkgYnkgaWQuXG4gKi9cbmZ1bmN0aW9uIENhdGVnb3J5KGlkLCBsZXZlbCwgZm4pIHtcblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmNvbnRleHQgPSBsZXZlbCB8fCBMb2dnZXIuREVCVUc7XG59XG5cbkNhdGVnb3J5LnByb3RvdHlwZSA9IHtcdFxuXHRsb2c6IGZ1bmN0aW9uKGxldmVsLCBtc2dBcmdzKSB7XG5cdFx0aWYgKGxldmVsLnZhbHVlID49IHRoaXMuY29udGV4dC52YWx1ZSkge1x0XHRcdFxuXHRcdFx0bG9nKG1zZ0FyZ3MsIHsgXG5cdFx0XHRcdGxldmVsOiBsZXZlbCxcblx0XHRcdFx0bmFtZTogdGhpcy5jb250ZXh0Lm5hbWUsXG5cdFx0XHRcdHZhbHVlOiB0aGlzLmNvbnRleHQudmFsdWVcblx0XHRcdH0pO1x0XHRcblx0XHR9XG5cdH0sXG5cblx0ZGVidWc6IGZ1bmN0aW9uICgpIHtcdFx0XG5cdFx0dGhpcy5sb2coTG9nZ2VyLkRFQlVHLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdGVycm9yOiBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy5sb2coTG9nZ2VyLkVSUk9SLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdGluZm86IGZ1bmN0aW9uICgpIHtcdFx0XG5cdFx0dGhpcy5sb2coTG9nZ2VyLklORk8sIGFyZ3VtZW50cyk7XG5cdH0sXG5cblx0d2FybjogZnVuY3Rpb24gKCkge1xuXHRcdHRoaXMubG9nKExvZ2dlci5XQVJOLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdHNldExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuXHRcdGlmIChsZXZlbCAmJiAndmFsdWUnIGluIGxldmVsKSB7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSBsZXZlbDtcblx0XHR9XG5cdH1cbn07XG5cbkxvZ2dlci5ERUJVRyA9IHsgdmFsdWU6IDEsIG5hbWU6ICdERUJVRycgfTtcbkxvZ2dlci5JTkZPICA9IHsgdmFsdWU6IDIsIG5hbWU6ICdJTkZPJyB9O1xuTG9nZ2VyLldBUk4gID0geyB2YWx1ZTogNCwgbmFtZTogJ1dBUk4nIH07XG5Mb2dnZXIuRVJST1IgPSB7IHZhbHVlOiA4LCBuYW1lOiAnRVJST1InIH07XG5Mb2dnZXIuT0ZGICAgPSB7IHZhbHVlOiA5OSwgbmFtZTogJ09GRicgfTsgICBcdFx0XG5cbkxvZ2dlci5zZXRMZXZlbCA9IGZ1bmN0aW9uKG5ld0xldmVsKSB7XG5cdGdsb2JhbExvZ2dlci5zZXRMZXZlbChuZXdMZXZlbCk7XG59O1xuXG5Mb2dnZXIuZGVidWcgPSBmdW5jdGlvbiAoKSB7XG5cdGdsb2JhbExvZ2dlci5kZWJ1Zy5hcHBseShnbG9iYWxMb2dnZXIsIGFyZ3VtZW50cyk7XG59O1xuXG5Mb2dnZXIuaW5mbyA9IGZ1bmN0aW9uICgpIHtcblx0Z2xvYmFsTG9nZ2VyLmluZm8uYXBwbHkoZ2xvYmFsTG9nZ2VyLCBhcmd1bWVudHMpO1xufTtcblxuTG9nZ2VyLndhcm4gPSBmdW5jdGlvbiAoKSB7XG5cdGdsb2JhbExvZ2dlci53YXJuLmFwcGx5KGdsb2JhbExvZ2dlciwgYXJndW1lbnRzKTtcbn07XG5cbkxvZ2dlci5lcnJvciA9IGZ1bmN0aW9uICgpIHtcblx0Z2xvYmFsTG9nZ2VyLmVycm9yLmFwcGx5KGdsb2JhbExvZ2dlciwgYXJndW1lbnRzKTtcbn07XG5cbkxvZ2dlci5nZXQgPSBmdW5jdGlvbiAoaWQsIGxldmVsLCBmbikge1x0XG5cdHJldHVybiAobG9nZ2VyTWFwW2lkXSB8fCAoZnVuY3Rpb24oKSB7XG5cdFx0bG9nZ2VyTWFwW2lkXSA9IG5ldyBDYXRlZ29yeShpZCwgbGV2ZWwsIGZuKTtcblx0XHRyZXR1cm4gbG9nZ2VyTWFwW2lkXTtcblx0fSkoKSk7XG59O1xuXG4vLyAtLS0gc2V0dXAgdGhlIGdsb2JhbCBsb2dnZXIgLS0tXG5nbG9iYWxMb2dnZXIgPSBMb2dnZXIuZ2V0KCdnbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgXHQ9IExvZ2dlcjtcbiIsIi8qIVxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgYnkgUmV2b2x1dGlvbiBBbmFseXRpY3MgSW5jLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIFZlcnNpb24gMi4wIG9mIHRoZVxuICogQXBhY2hlIExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRZLCBJTkNMVURJTkcgVEhPU0UgT0YgTk9OLUlORlJJTkdFTUVOVCxcbiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gUGxlYXNlIHJlZmVyIHRvIHRoZVxuICogQXBhY2hlIExpY2Vuc2UgMi4wIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApIGZvciBtb3JlIFxuICogZGV0YWlscy5cbiAqL1xuIFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZShtb2R1bGUpO1xuICB9IGNhdGNoIChlKSB7fVxufTsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxuZnVuY3Rpb24gUXVldWUoKSB7XG4gIHRoaXMuZW1wdHlDYWxsYmFjayA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tzID0gW107XG4gIHRoaXMueWllbGRlZCA9IGZhbHNlO1xuICB0aGlzLnJlc3BvbnNlID0gbnVsbDtcbiAgdGhpcy5yZXNwb25zZUNoYWluID0gW107ICBcbn1cblxuUXVldWUucHJvdG90eXBlID0ge1xuXG4gIGFkZDogZnVuY3Rpb24oZm4sIGN0eCwgZGVmZXIpIHtcbiAgICAvLyBjdXJyZW50bHkgbm90IHdhaXRpbmcgYW5kIHRoZXJlIGlzIG5vIGRlZmVyIGRlbGF5IGp1c3QgbWFrZSBjYWxsXG4gICAgaWYgKCF0aGlzLnlpZWxkZWQgJiYgIWRlZmVyKSB7ICAgICAgXG4gICAgICBmbi5hcHBseShjdHggfHwgdGhpcywgW3RoaXMucmVzcG9uc2VdKTtcbiAgICB9IGVsc2UgeyAvLyBhZGQgdG8gcXVldWVcbiAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goeyBmbjogZm4sIGN0eDogY3R4IH0pO1xuICAgIH1cbiAgfSxcblxuICBzaXplOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja3MubGVuZ3RoO1xuICB9LFxuXG4gIGlzRW1wdHk6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gIH0sXG5cbiAgZW1wdHk6IGZ1bmN0aW9uKGZuLCBjdHgpIHtcbiAgICB0aGlzLmVtcHR5Q2FsbGJhY2sgPSB7IGZuOiBmbiwgY3R4OiBjdHggfTtcbiAgfSxcblxuICB5aWVsZDogZnVuY3Rpb24oeWllbGQpIHtcbiAgICB0aGlzLnlpZWxkZWQgPSB5aWVsZDtcbiAgfSxcblxuICB0YWtlOiBmdW5jdGlvbihyZXNwb25zZSwgZXJyb3IsIGFyZ3MpIHsgXG4gICAgdmFyIGNiO1xuXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICB0aGlzLnJlc3BvbnNlQ2hhaW4ucHVzaChyZXNwb25zZSk7XG4gICAgfVxuXG5cbiAgICBpZiAoIXRoaXMueWllbGRlZCAmJiB0aGlzLmNhbGxiYWNrc1swXSkge1xuICAgICAgY2IgPSB0aGlzLmNhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgY2IuZm4uYXBwbHkoY2IuY3R4IHx8IHRoaXMsIFt0aGlzLnJlc3BvbnNlQ2hhaW4sIGVycm9yLCBhcmdzXSk7XG5cbiAgICAgIC8vIG5vdGlmeSB0aGF0IHRoZSBxdWV1ZSBpcyBub3cgZW1wdHkgICBcbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrc1swXSAmJiB0aGlzLmVtcHR5Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5lbXB0eUNhbGxiYWNrLmZuLmNhbGwodGhpcy5lbXB0eUNhbGxiYWNrLmN0eCB8fCB0aGlzKTsgICAgICAgICBcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFxuICBmbHVzaDogZnVuY3Rpb24ocmVzcG9uc2UsIGVycm9yLCBhcmdzKSB7ICAgICAgICBcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgIHRoaXMucmVzcG9uc2VDaGFpbi5wdXNoKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICAvLyBwb3AgYW5kIGNhbGwgbmV4dCBpbmxpbmVcbiAgICB3aGlsZSAodGhpcy5jYWxsYmFja3NbMF0pIHtcbiAgICAgIGlmICh0aGlzLnlpZWxkZWQpIHsgYnJlYWs7IH1cbiAgICAgIHZhciBjYiA9IHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCk7XG4gICAgICBjYi5mbi5hcHBseShjYi5jdHggfHwgdGhpcywgW3RoaXMucmVzcG9uc2VDaGFpbiwgZXJyb3IsIGFyZ3NdKTtcblxuICAgICAgLy8gbm90aWZ5IHRoYXQgdGhlIHF1ZXVlIGlzIG5vdyBlbXB0eVxuICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzWzBdICYmIHRoaXMuZW1wdHlDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmVtcHR5Q2FsbGJhY2suZm4uY2FsbCh0aGlzLmVtcHR5Q2FsbGJhY2suY3R4IHx8IHRoaXMpOyAgICAgICAgIFxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBRdWV1ZTsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxudmFyIEJhc2UgICA9IHJlcXVpcmUoJy4vc2VsZmlzaCcpLkJhc2UsXG4gICAgUlR5cGVzID0gcmVxdWlyZSgnLi9ydHlwZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYXNlLmV4dGVuZChSVHlwZXMsIHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShuYW1lLCB2YWx1ZSwgb3B0aW9ucykgeyAgXHRcblx0XHR0aGlzLm5hbWUgID0gbmFtZTtcblx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0fSxcblxuXHRudW1lcmljOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gc3VwcG9ydCBgU3RyaW5nYCBudW1iZXJzIChlLmcuIFwiMS4yXCIpXG5cdFx0dGhpcy52YWx1ZSA9IHBhcnNlRmxvYXQodGhpcy52YWx1ZSk7XG5cblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoe1xuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJOVU1FUklDLFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTtcblx0fSxcdFxuXG5cdGludGVnZXI6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBzdXBwb3J0IGBTdHJpbmdgIGludGVnZXIgKGUuZy4gXCIxNVwiKVxuXHRcdHRoaXMudmFsdWUgPSBwYXJzZUludCh0aGlzLnZhbHVlLCAxMCk7XG5cblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SSU5URUdFUixcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFxuXHRcblx0bG9naWNhbDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJCT09MRUFOLCBcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFxuXHRcblx0Y2hhcmFjdGVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUlNUUklORywgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblx0XG5cdGRhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SREFURSxcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdGZvcm1hdDogJ3l5eXktTU0tZGQnLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cblx0cG9zaXhjdDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJQT1NJWF9EQVRFLCBcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdGZvcm1hdDogJ3l5eXktTU0tZGQgSEg6bW06c3MgWicsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcdFxuXHRcblx0bnVtZXJpY1ZlY3RvcjogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5STlVNRVJJQ19WRUNUT1IsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblx0XG5cdGludGVnZXJWZWN0b3I6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SSU5URUdFUl9WRUNUT1IsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cdFxuXHRsb2dpY2FsVmVjdG9yOiBmdW5jdGlvbiAoKSB7IFxuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJCT09MRUFOX1ZFQ1RPUiwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblx0XG5cdGNoYXJhY3RlclZlY3RvcjogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SU1RSSU5HX1ZFQ1RPUiwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSwgIFxuXHRcblx0ZGF0ZVZlY3RvcjogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SREFURV9WRUNUT1IsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0Zm9ybWF0OiAneXl5eS1NTS1kZCcsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcdFxuXHRcblx0cG9zaXhjdFZlY3RvcjogZnVuY3Rpb24gKCkgeyBcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SUE9TSVhfREFURV9WRUNUT1IsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0Zm9ybWF0OiAneXl5eS1NTS1kZCBISDptbTpzcyBaJyxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFxuXHRcblx0bGlzdDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJMSVNULCBcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFxuXHRcblx0ZGF0YWZyYW1lOiBmdW5jdGlvbiAoKSB7IFxuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJEQVRBRlJBTUUsIFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLCBcblx0XHRcdHZhbHVlOiB0aGlzLnZhbHVlLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cblx0ZmFjdG9yOiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIG9wdHMgPSB0aGlzLm9wdGlvbnM7XG5cblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoIHsgXG5cdFx0XHR0eXBlOiB0aGlzLmRlcGxveXIuUkZBQ1RPUiwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHRvcmRlcmVkOiBmYWxzZSxcblx0XHRcdGxldmVsczogb3B0cy5sZXZlbHMsXG5cdFx0XHRsYWJlbHM6IG9wdHMubGFiZWxzLFxuXHRcdFx0dG9TdHJpbmc6IHRoaXMudG9TdHJpbmdcblx0XHR9KTsgXG5cdH0sXG5cblx0b3JkZXJlZDogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBvcHRzID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXNzZXJ0KCB7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJPUkRFUkVELCBcblx0XHRcdG5hbWU6IHRoaXMubmFtZSwgXG5cdFx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcblx0XHRcdG9yZGVyZWQ6IHRydWUsXG5cdFx0XHRsZXZlbHM6IG9wdHMubGV2ZWxzLFxuXHRcdFx0bGFiZWxzOiBvcHRzLmxhYmVscyxcblx0XHRcdHRvU3RyaW5nOiB0aGlzLnRvU3RyaW5nXG5cdFx0fSk7IFxuXHR9LFx0XHRcblxuXHRudW1lcmljTWF0cml4OiBmdW5jdGlvbiAoKSB7IFxuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJOVU1FUklDX01BVFJJWCwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblxuXHRpbnRlZ2VyTWF0cml4OiBmdW5jdGlvbiAoKSB7IFxuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJJTlRFR0VSX01BVFJJWCwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblxuXHRsb2dpY2FsTWF0cml4OiBmdW5jdGlvbiAoKSB7IFxuXHRcdHJldHVybiB0aGlzLmFzc2VydCh7IFxuXHRcdFx0dHlwZTogdGhpcy5kZXBsb3lyLlJCT09MRUFOX01BVFJJWCwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblxuXHRjaGFyYWN0ZXJNYXRyaXg6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5hc3NlcnQoeyBcblx0XHRcdHR5cGU6IHRoaXMuZGVwbG95ci5SU1RSSU5HX01BVFJJWCwgXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsIFxuXHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHR0b1N0cmluZzogdGhpcy50b1N0cmluZ1xuXHRcdH0pOyBcblx0fSxcblxuXHR0b1N0cmluZzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG9wdHMgICA9IHRoaXMub3B0aW9ucyB8fCB7fSxcblx0XHQgICAgbGV2ZWxzID0gb3B0cy5sZXZlbHMgPyAnWyBsZXZlbHMgPSAnICsgb3B0cy5sZXZlbHMgKyAnXScgOiAnJyxcblx0XHQgICAgbGFiZWxzID0gb3B0cy5sYWJlbHMgPyAnWyBsYWJlbHMgPSAnICsgb3B0cy5sYWJlbHMgKyAnXScgOiAnJztcblxuXHRcdHJldHVybiAnWyBuYW1lID0gJyAgKyB0aGlzLm5hbWUgKyAnIF0gJyArXG5cdFx0ICAgICAgICdbIHZhbHVlID0gJyArIHRoaXMudmFsdWUgKyAnIF0gJyArXG5cdFx0ICAgICAgICdbIHR5cGUgPSAnICArIHRoaXMudHlwZSArICcgXSAnICtcblx0XHQgICAgICAgbGV2ZWxzICsgbGFiZWxzO1x0XHQgICAgICAgXG5cdH1cbn0pOyIsIi8qIVxuICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgYnkgUmV2b2x1dGlvbiBBbmFseXRpY3MgSW5jLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIFZlcnNpb24gMi4wIG9mIHRoZVxuICogQXBhY2hlIExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRZLCBJTkNMVURJTkcgVEhPU0UgT0YgTk9OLUlORlJJTkdFTUVOVCxcbiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gUGxlYXNlIHJlZmVyIHRvIHRoZVxuICogQXBhY2hlIExpY2Vuc2UgMi4wIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApIGZvciBtb3JlIFxuICogZGV0YWlscy5cbiAqL1xuXG52YXIgQmFzZSAgID0gcmVxdWlyZSgnLi9zZWxmaXNoJykuQmFzZSxcbiAgICBSVHlwZXMgPSByZXF1aXJlKCcuL3J0eXBlcycpLFxuICAgIExhbmcgICA9IHJlcXVpcmUoJy4vbGFuZycpLFxuICAgIFJJbnB1dCA9IHJlcXVpcmUoJy4vcmlucHV0Jyk7IFxuXG5mdW5jdGlvbiBjcmVhdGUodHlwZSwgbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcblx0dmFyIHJpbnB1dDtcblxuXHRpZiAoTGFuZy5pc09iamVjdChuYW1lKSkge1xuXHRcdHJpbnB1dCA9IG5hbWU7XG5cdFx0aWYgKCFyaW5wdXQudHlwZSAhPT0gdHlwZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsQXJndW1lbnRFcnJvcjonICsgXG5cdFx0XHRcdCdFeHBlY3RpbmcgXCInICsgdHlwZSArICdcIiBidXQgZm91bmQgXCInICsgcmlucHV0LnR5cGUgKyAnXCInKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdCAgICByaW5wdXQgPSBSSW5wdXQubmV3KG5hbWUsIHZhbHVlLCBvcHRpb25zKVt0eXBlXSgpO1xuXHR9IFxuXG5cdHJldHVybiByaW5wdXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQmFzZS5leHRlbmQoUlR5cGVzLCB7XHRcblx0bnVtZXJpYzogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJOVU1FUklDLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXHRcblx0aW50ZWdlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJJTlRFR0VSLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzOyBcblx0fSxcblx0XG5cdGxvZ2ljYWw6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SQk9PTEVBTiwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cdFxuXHRjaGFyYWN0ZXI6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SU1RSSU5HLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzOyBcblx0fSxcblx0XG5cdGRhdGU6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SREFURSwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cblx0cG9zaXhjdDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJQT1NJWF9EQVRFLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzOyBcblx0fSxcdFxuXHRcblx0bnVtZXJpY1ZlY3RvcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7IFxuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5STlVNRVJJQ19WRUNUT1IsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFxuXHRcblx0aW50ZWdlclZlY3RvcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJJTlRFR0VSX1ZFQ1RPUiwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cdFxuXHRsb2dpY2FsVmVjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJCT09MRUFOX1ZFQ1RPUiwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cdFxuXHRjaGFyYWN0ZXJWZWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUlNUUklOR19WRUNUT1IsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LCAgXG5cdFxuXHRkYXRlVmVjdG9yOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJEQVRFX1ZFQ1RPUiwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXHRcblx0XG5cdHBvc2l4Y3RWZWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUlBPU0lYX0RBVEVfVkVDVE9SLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzOyBcblx0fSxcblx0XG5cdGxpc3Q6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5STElTVCwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cdFxuXHRkYXRhZnJhbWU6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUkRBVEFGUkFNRSwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXHRcblxuXHRmYWN0b3I6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgbGV2ZWxzLCBsYWJlbHMpIHtcblx0XHR2YXIgb3B0cyA9IHsgbGV2ZWxzOiBsZXZlbHMsIGxhYmVsczogbGFiZWxzIH07XG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJGQUNUT1IsIG5hbWUsIHZhbHVlLCBvcHRzKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0b3JkZXJlZDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBsZXZlbHMsIGxhYmVscykge1xuXHRcdHZhciBvcHRzID0geyBsZXZlbHM6IGxldmVscywgbGFiZWxzOiBsYWJlbHMgfTtcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUk9SREVSRUQsIG5hbWUsIHZhbHVlLCBvcHRzKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXHRcdFxuXG5cdG51bWVyaWNNYXRyaXg6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyBcblx0XHR0aGlzLmlucHV0cy5wdXNoKGNyZWF0ZSh0aGlzLmRlcGxveXIuUk5VTUVSSUNfTUFUUklYLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzOyBcblx0fSxcblxuXHRpbnRlZ2VyTWF0cml4OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgXG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJJTlRFR0VSX01BVFJJWCwgbmFtZSwgdmFsdWUpKTtcblx0XHRyZXR1cm4gdGhpczsgXG5cdH0sXG5cblx0bG9naWNhbE1hdHJpeDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7IFxuXHRcdHRoaXMuaW5wdXRzLnB1c2goY3JlYXRlKHRoaXMuZGVwbG95ci5SQk9PTEVBTl9NQVRSSVgsIG5hbWUsIHZhbHVlKSk7XG5cdFx0cmV0dXJuIHRoaXM7IFxuXHR9LFxuXG5cdGNoYXJhY3Rlck1hdHJpeDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG5cdFx0dGhpcy5pbnB1dHMucHVzaChjcmVhdGUodGhpcy5kZXBsb3lyLlJTVFJJTkdfTUFUUklYLCBuYW1lLCB2YWx1ZSkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59KTsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZSBcbiAqIGRldGFpbHMuXG4gKi9cblxudmFyIEJhc2UgPSByZXF1aXJlKCcuL3NlbGZpc2gnKS5CYXNlLFxuICAgIExhbmcgPSByZXF1aXJlKCcuL2xhbmcnKSxcbiAgICBtYXAgID0ge307IC8vIGRlcGxveXItPlRvLT5SIGNhdGFsb2dcblxubW9kdWxlLmV4cG9ydHMgPSBCYXNlLmV4dGVuZCh7XG5cdHI6IHtcblx0XHRQUklNSVRJVkU6ICdwcmltaXRpdmUnLFxuXHRcdERBVEFGUkFNRTogJ2RhdGFmcmFtZScsXG5cdFx0TElTVDogJ2xpc3QnLFxuXHRcdE1BVFJJWDogJ21hdHJpeCcsXG5cdFx0REFURTogJ2RhdGUnLFxuXHRcdEZBQ1RPUjogJ2ZhY3RvcicsXG5cdFx0VkVDVE9SOiAndmVjdG9yJ1xuXHR9LFxuXG5cdGRlcGxveXI6IHtcblx0XHRSQk9PTEVBTjogJ2xvZ2ljYWwnLFxuXHRcdFJOVU1FUklDOiAnbnVtZXJpYycsXG5cdFx0UklOVEVHRVI6ICdpbnRlZ2VyJyxcblx0XHRSU1RSSU5HOiAnY2hhcmFjdGVyJyxcblx0XHRSREFURTogJ2RhdGUnLFxuXHRcdFJQT1NJWF9EQVRFOiAncG9zaXhjdCcsXG5cdFx0UkJPT0xFQU5fVkVDVE9SOiAnbG9naWNhbFZlY3RvcicsXG5cdFx0Uk5VTUVSSUNfVkVDVE9SOidudW1lcmljVmVjdG9yJyxcblx0XHRSSU5URUdFUl9WRUNUT1I6ICdpbnRlZ2VyVmVjdG9yJyxcdFxuXHRcdFJTVFJJTkdfVkVDVE9SOiAnY2hhcmFjdGVyVmVjdG9yJyxcblx0XHRSREFURV9WRUNUT1I6ICdkYXRlVmVjdG9yJyxcblx0XHRSUE9TSVhfREFURV9WRUNUT1I6ICdwb3NpeGN0VmVjdG9yJyxcblx0XHRSTElTVDogJ2xpc3QnLFxuXHRcdFJEQVRBRlJBTUU6ICdkYXRhZnJhbWUnLFxuXHRcdFJGQUNUT1I6ICdmYWN0b3InLFxuXHRcdFJPUkRFUkVEOiAnb3JkZXJlZCcsXHRcdFxuXHRcdFJCT09MRUFOX01BVFJJWDogJ2xvZ2ljYWxNYXRyaXgnLFxuXHRcdFJOVU1FUklDX01BVFJJWDogJ251bWVyaWNNYXRyaXgnLFxuXHRcdFJJTlRFR0VSX01BVFJJWDogJ2ludGVnZXJNYXRyaXgnLFx0XHRcblx0XHRSU1RSSU5HX01BVFJJWDogJ2NoYXJhY3Rlck1hdHJpeCdcblx0fSxcblxuXHRpc0RhdGU6IGZ1bmN0aW9uKHR5cGUpIHtcblx0XHRyZXR1cm4gKHR5cGUgPT09IHRoaXMuZGVwbG95ci5SREFURSB8fCBcblx0XHQgICAgICAgIHR5cGUgPT09IHRoaXMuZGVwbG95ci5SUE9TSVhfREFURSB8fCBcblx0XHQgICAgICAgIHR5cGUgPT09IHRoaXMuZGVwbG95ci5SREFURV9WRUNUT1IgfHxcblx0XHQgICAgICAgIHR5cGUgPT09IHRoaXMuZGVwbG95ci5SUE9TSVhfREFURV9WRUNUT1IgfHxcblx0XHQgICAgICAgIHR5cGUgPT09IHRoaXMuci5EQVRFKTtcblx0fSxcblxuXHRkZXBsb3lyVG9SOiBmdW5jdGlvbih0eXBlKSB7XHRcblx0XHR2YXIgZGVwbG95ciA9IHRoaXMuZGVwbG95cixcblx0XHQgICAgciAgICAgICA9IHRoaXMucjtcblxuXHRcdGlmICghbWFwW3R5cGVdKSB7IC8vIGJ1aWxkIGNhdGFsb2cgb25seSBvbmNlXHRcblx0XHRcdG1hcFtkZXBsb3lyLlJCT09MRUFOXSAgICAgICAgICAgPSByLlBSSU1JVElWRTtcblx0XHRcdG1hcFtkZXBsb3lyLlJOVU1FUklDXSAgICAgICAgICAgPSByLlBSSU1JVElWRTtcblx0XHRcdG1hcFtkZXBsb3lyLlJJTlRFR0VSXSAgICAgICAgICAgPSByLlBSSU1JVElWRTtcblx0XHRcdG1hcFtkZXBsb3lyLlJTVFJJTkddICAgICAgICAgICAgPSByLlBSSU1JVElWRTtcblx0XHRcdG1hcFtkZXBsb3lyLlJEQVRFXSAgICAgICAgICAgICAgPSByLkRBVEU7XG5cdFx0XHRtYXBbZGVwbG95ci5SUE9TSVhfREFURV0gICAgICAgID0gci5EQVRFO1xuXHRcdFx0bWFwW2RlcGxveXIuUkJPT0xFQU5fVkVDVE9SXSAgICA9IHIuVkVDVE9SO1xuXHRcdFx0bWFwW2RlcGxveXIuUk5VTUVSSUNfVkVDVE9SXSAgICA9IHIuVkVDVE9SO1xuXHRcdFx0bWFwW2RlcGxveXIuUklOVEVHRVJfVkVDVE9SXSAgICA9IHIuVkVDVE9SO1xuXHRcdFx0bWFwW2RlcGxveXIuUlNUUklOR19WRUNUT1JdICAgICA9IHIuVkVDVE9SO1xuXHRcdFx0bWFwW2RlcGxveXIuUkRBVEVfVkVDVE9SXSAgICAgICA9IHIuVkVDVE9SO1xuXHRcdFx0bWFwW2RlcGxveXIuUlBPU0lYX0RBVEVfVkVDVE9SXSA9IHIuVkVDVE9SO1xuXHRcdFx0bWFwW2RlcGxveXIuUkxJU1RdICAgICAgICAgICAgICA9IHIuTElTVDtcblx0XHRcdG1hcFtkZXBsb3lyLlJEQVRBRlJBTUVdICAgICAgICAgPSByLkRBVEFGUkFNRTtcblx0XHRcdG1hcFtkZXBsb3lyLlJGQUNUT1JdICAgICAgICAgICAgPSByLkZBQ1RPUjtcblx0XHRcdG1hcFtkZXBsb3lyLlJPUkRFUkVEXSAgICAgICAgICAgPSByLkZBQ1RPUjtcblx0XHRcdG1hcFtkZXBsb3lyLlJCT09MRUFOX01BVFJJWF0gICAgPSByLk1BVFJJWDtcblx0XHRcdG1hcFtkZXBsb3lyLlJOVU1FUklDX01BVFJJWF0gICAgPSByLk1BVFJJWDtcblx0XHRcdG1hcFtkZXBsb3lyLlJJTlRFR0VSX01BVFJJWF0gICAgPSByLk1BVFJJWDtcblx0XHRcdG1hcFtkZXBsb3lyLlJTVFJJTkdfTUFUUklYXSAgICAgPSByLk1BVFJJWDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW3R5cGVdO1x0XHRcblx0fSxcblxuXHQvKipcblx0ICogQXNzZXJ0IHRoYXQgdGhlIGByaW5wdXRgIHZhbHVlIGlzIHRoZSBjb3JyZWN0IEphdmFTY3JpcHQgRGF0YSBUeXBlLlxuXHQgKi9cblx0YXNzZXJ0OiBmdW5jdGlvbiAocmlucHV0KSB7XG5cdFx0dmFyIGRlcGxveXIgPSB0aGlzLmRlcGxveXIsXG4gICAgXHRcdE5PT1AgICAgPSBudWxsLFxuXHRcdCAgICB2YWx1ZXMgID0gcmlucHV0LnZhbHVlLFxuXHRcdCAgICBmbjtcblxuXHRcdHZhbHVlcyA9ICFMYW5nLmlzQXJyYXkodmFsdWVzKSA/IFt2YWx1ZXNdIDogdmFsdWVzO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcblxuXHRcdFx0c3dpdGNoIChyaW5wdXQudHlwZSkge1xuXHRcdFx0XHRjYXNlIGRlcGxveXIuUk5VTUVSSUMgOlxuXHRcdFx0XHRjYXNlIGRlcGxveXIuUk5VTUVSSUNfVkVDVE9SIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUklOVEVHRVIgOlxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SSU5URUdFUl9WRUNUT1IgOlxuXHRcdFx0ICAgIGZuID0gTGFuZy5pc051bWJlcjtcblx0XHRcdCAgICBicmVhaztcblxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SQk9PTEVBTiA6XG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJCT09MRUFOX1ZFQ1RPUiA6XG5cdFx0XHQgICAgZm4gPSBMYW5nLmlzQm9vbGVhbjtcblx0XHRcdCAgICBicmVhaztcblx0XHRcdCAgICBcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUlNUUklORyA6XG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJTVFJJTkdfVkVDVE9SIDpcdFxuXHRcdFx0ICAgIGZuID0gTGFuZy5pc1N0cmluZztcblx0XHRcdCAgICBicmVhaztcblxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SREFURSA6XG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJQT1NJWF9EQVRFIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUkRBVEVfVkVDVE9SIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUlBPU0lYX0RBVEVfVkVDVE9SIDpcblx0XHRcdCAgICBmbiA9IExhbmcuaXNEYXRlO1xuXHRcdFx0ICAgIGJyZWFrO1xuXG5cdFx0XHQgICAgY2FzZSBkZXBsb3lyLlJGQUNUT1IgOlxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5ST1JERVJFRCA6XHRcdFx0ICAgIFxuXHRcdFx0ICAgIGNhc2UgZGVwbG95ci5SREFUQUZSQU1FIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUklOVEVHRVJfTUFUUklYIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUkJPT0xFQU5fTUFUUklYIDpcblx0XHRcdCAgICBjYXNlIGRlcGxveXIuUlNUUklOR19NQVRSSVggOlx0ICAgIFxuXHRcdFx0ICAgIGZuID0gTk9PUDtcblx0XHRcdCAgICBicmVha1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZm4gJiYgIWZuKHZhbHVlKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1JJbnB1dEZvcm1hdEVycm9yOiAnICsgJ1wiJyArIHZhbHVlICsgXG5cdFx0XHRcdFx0J1wiIGlzIG5vdCBhIHZhbGlkIFwiJyArIHJpbnB1dC50eXBlICsgJ1wiIHR5cGUgZm9yIGlucHV0ICcgK1xuXHRcdFx0XHRcdCdcIicgKyByaW5wdXQubmFtZSArICdcIicpO1x0XHRcdFx0XHRcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmlucHV0O1xuXHR9XG59KTsiLCIvKiFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb3phbGEvc2VsZmlzaFxuICovXG5cbi8qIHZpbTpzZXQgdHM9MiBzdz0yIHN0cz0yIGV4cGFuZHRhYiAqL1xuLypqc2hpbnQgdW5kZWY6IHRydWUgZXM1OiB0cnVlIG5vZGU6IHRydWUgZGV2ZWw6IHRydWUgZXZpbDogdHJ1ZVxuICAgICAgICAgZm9yaW46IHRydWUgbGF0ZWRlZjogZmFsc2Ugc3VwZXJuZXc6IHRydWUgKi9cbi8qZ2xvYmFsIGRlZmluZTogdHJ1ZSAqL1xuXG4hKHR5cGVvZiBkZWZpbmUgIT09IFwiZnVuY3Rpb25cIiA/IGZ1bmN0aW9uKCQpeyAkKG51bGwsIHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJyA/IGV4cG9ydHMgOiB3aW5kb3cpOyB9IDogZGVmaW5lKShmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLkJhc2UgPSBPYmplY3QuZnJlZXplKE9iamVjdC5jcmVhdGUoT2JqZWN0LnByb3RvdHlwZSwge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIGB0aGlzYCBvYmplY3QgKEFuYWxvZyBvZlxuICAgKiBgbmV3IE9iamVjdCgpYCkuXG4gICAqIEBleGFtcGxlc1xuICAgKlxuICAgKiAgICB2YXIgRG9nID0gQmFzZS5leHRlbmQoe1xuICAgKiAgICAgIGJhcms6IGZ1bmN0aW9uIGJhcmsoKSB7XG4gICAqICAgICAgICByZXR1cm4gJ1J1ZmYhIFJ1ZmYhJ1xuICAgKiAgICAgIH1cbiAgICogICAgfSk7XG4gICAqICAgIHZhciBkb2cgPSBEb2cubmV3KCk7XG4gICAqL1xuICAnbmV3JzogeyB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgIHZhciBvYmplY3QgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIG9iamVjdC5pbml0aWFsaXplLmFwcGx5KG9iamVjdCwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9fSxcbiAgLyoqXG4gICAqIFdoZW4gbmV3IGluc3RhbmNlIG9mIHRoZSB0aGlzIHByb3RvdHlwZSBpcyBjcmVhdGVkIGl0J3MgYGluaXRpYWxpemVgXG4gICAqIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhbGwgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGBuZXdgLiBZb3UgY2FuXG4gICAqIG92ZXJyaWRlIGBpbml0aWFsaXplYCB0byBzZXQgdXAgYW4gaW5zdGFuY2UuXG4gICAqL1xuICBpbml0aWFsaXplOiB7IHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICB9fSxcbiAgLyoqXG4gICAqIE1lcmdlcyBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBhc3NlZCBvYmplY3RzIGludG8gYHRoaXNgIGluc3RhbmNlIChUaGlzXG4gICAqIG1ldGhvZCBjYW4gYmUgdXNlZCBvbiBpbnN0YW5jZXMgb25seSBhcyBwcm90b3R5cGUgb2JqZWN0cyBhcmUgZnJvemVuKS5cbiAgICpcbiAgICogSWYgdHdvIG9yIG1vcmUgYXJndW1lbnQgb2JqZWN0cyBoYXZlIG93biBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgbmFtZSxcbiAgICogdGhlIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4sIHdpdGggcHJlY2VkZW5jZSBmcm9tIHJpZ2h0IHRvIGxlZnQsIGltcGx5aW5nLFxuICAgKiB0aGF0IHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBvbiB0aGUgbGVmdCBhcmUgb3ZlcnJpZGRlbiBieSBhIHNhbWUgbmFtZWRcbiAgICogcHJvcGVydHkgb2YgdGhlIG9iamVjdCBvbiB0aGUgcmlnaHQuXG4gICAqXG4gICAqIEBleGFtcGxlc1xuICAgKlxuICAgKiAgICB2YXIgUGV0ID0gRG9nLmV4dGVuZCh7XG4gICAqICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShvcHRpb25zKSB7XG4gICAqICAgICAgICAvLyB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgLT4gd291bGQgaGF2ZSB0aHJvd24gKGZyb3plbiBwcm90b3R5cGUpXG4gICAqICAgICAgICB0aGlzLm1lcmdlKG9wdGlvbnMpIC8vIHdpbGwgb3ZlcnJpZGUgYWxsIHByb3BlcnRpZXMuXG4gICAqICAgICAgfSxcbiAgICogICAgICBjYWxsOiBmdW5jdGlvbihuYW1lKSB7XG4gICAqICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBuYW1lID8gdGhpcy5iYXJrKCkgOiAnJ1xuICAgKiAgICAgIH0sXG4gICAqICAgICAgbmFtZTogbnVsbFxuICAgKiAgICB9KVxuICAgKiAgICB2YXIgcGV0ID0gUGV0Lm5ldyh7IG5hbWU6ICdCZW56eScsIGJyZWVkOiAnTGFicmFkb3InIH0pXG4gICAqICAgIHBldC5jYWxsKCdCZW56eScpICAgLy8gJ1J1ZmYhIFJ1ZmYhJ1xuICAgKi9cbiAgbWVyZ2U6IHsgdmFsdWU6IGZ1bmN0aW9uIG1lcmdlKCkge1xuICAgIHZhciBkZXNjcmlwdG9yID0ge307XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhcmd1bWVudHMsIGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgZGVzY3JpcHRvcltuYW1lXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydGllcywgbmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkZXNjcmlwdG9yKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfX0sXG4gIC8qKlxuICAgKiBUYWtlcyBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50IG9iamVjdHMgYW5kIHJldHVybnMgZnJvemVuLCBjb21wb3NpdGUgb2JqZWN0XG4gICAqIHRoYXQgaW5oZXJpdHMgZnJvbSBgdGhpc2Agb2JqZWN0IGFuZCBjb21iaW5lcyBhbGwgb2YgdGhlIG93biBwcm9wZXJ0aWVzIG9mXG4gICAqIHRoZSBhcmd1bWVudCBvYmplY3RzLiAoT2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGFyZSBmcm96ZW4gYXNcbiAgICogdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0eXBlcykuXG4gICAqXG4gICAqIElmIHR3byBvciBtb3JlIGFyZ3VtZW50IG9iamVjdHMgaGF2ZSBvd24gcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIG5hbWUsXG4gICAqIHRoZSBwcm9wZXJ0eSBpcyBvdmVycmlkZGVuLCB3aXRoIHByZWNlZGVuY2UgZnJvbSByaWdodCB0byBsZWZ0LCBpbXBseWluZyxcbiAgICogdGhhdCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3Qgb24gdGhlIGxlZnQgYXJlIG92ZXJyaWRkZW4gYnkgYSBzYW1lIG5hbWVkXG4gICAqIHByb3BlcnR5IG9mIHRoZSBvYmplY3Qgb24gdGhlIHJpZ2h0LlxuICAgKiBAZXhhbXBsZXNcbiAgICpcbiAgICogICAgLy8gIyMgT2JqZWN0IGNvbXBvc2l0aW9uICMjXG4gICAqXG4gICAqICAgIHZhciBIRVggPSBCYXNlLmV4dGVuZCh7XG4gICAqICAgICAgaGV4OiBmdW5jdGlvbiBoZXgoKSB7XG4gICAqICAgICAgICByZXR1cm4gJyMnICsgdGhpcy5jb2xvcjtcbiAgICogICAgICB9XG4gICAqICAgIH0pXG4gICAqXG4gICAqICAgIHZhciBSR0IgPSBCYXNlLmV4dGVuZCh7XG4gICAqICAgICAgcmVkOiBmdW5jdGlvbiByZWQoKSB7XG4gICAqICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5jb2xvci5zdWJzdHIoMCwgMiksIDE2KTtcbiAgICogICAgICB9LFxuICAgKiAgICAgIGdyZWVuOiBmdW5jdGlvbiBncmVlbigpIHtcbiAgICogICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmNvbG9yLnN1YnN0cigyLCAyKSwgMTYpO1xuICAgKiAgICAgIH0sXG4gICAqICAgICAgYmx1ZTogZnVuY3Rpb24gYmx1ZSgpIHtcbiAgICogICAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmNvbG9yLnN1YnN0cig0LCAyKSwgMTYpO1xuICAgKiAgICAgIH1cbiAgICogICAgfSlcbiAgICpcbiAgICogICAgdmFyIENNWUsgPSBCYXNlLmV4dGVuZChSR0IsIHtcbiAgICogICAgICBibGFjazogZnVuY3Rpb24gYmxhY2soKSB7XG4gICAqICAgICAgICB2YXIgY29sb3IgPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLnJlZCgpLCB0aGlzLmdyZWVuKCkpLCB0aGlzLmJsdWUoKSk7XG4gICAqICAgICAgICByZXR1cm4gKDEgLSBjb2xvciAvIDI1NSkudG9GaXhlZCg0KTtcbiAgICogICAgICB9LFxuICAgKiAgICAgIGN5YW46IGZ1bmN0aW9uIGN5YW4oKSB7XG4gICAqICAgICAgICB2YXIgSyA9IHRoaXMuYmxhY2soKTtcbiAgICogICAgICAgIHJldHVybiAoKCgxIC0gdGhpcy5yZWQoKSAvIDI1NSkudG9GaXhlZCg0KSAtIEspIC8gKDEgLSBLKSkudG9GaXhlZCg0KTtcbiAgICogICAgICB9LFxuICAgKiAgICAgIG1hZ2VudGE6IGZ1bmN0aW9uIG1hZ2VudGEoKSB7XG4gICAqICAgICAgICB2YXIgSyA9IHRoaXMuYmxhY2soKTtcbiAgICogICAgICAgIHJldHVybiAoKCgxIC0gdGhpcy5ncmVlbigpIC8gMjU1KS50b0ZpeGVkKDQpIC0gSykgLyAoMSAtIEspKS50b0ZpeGVkKDQpO1xuICAgKiAgICAgIH0sXG4gICAqICAgICAgeWVsbG93OiBmdW5jdGlvbiB5ZWxsb3coKSB7XG4gICAqICAgICAgICB2YXIgSyA9IHRoaXMuYmxhY2soKTtcbiAgICogICAgICAgIHJldHVybiAoKCgxIC0gdGhpcy5ibHVlKCkgLyAyNTUpLnRvRml4ZWQoNCkgLSBLKSAvICgxIC0gSykpLnRvRml4ZWQoNCk7XG4gICAqICAgICAgfVxuICAgKiAgICB9KVxuICAgKlxuICAgKiAgICB2YXIgQ29sb3IgPSBCYXNlLmV4dGVuZChIRVgsIFJHQiwgQ01ZSywge1xuICAgKiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIENvbG9yKGNvbG9yKSB7XG4gICAqICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAqICAgICAgfVxuICAgKiAgICB9KTtcbiAgICpcbiAgICogICAgLy8gIyMgUHJvdG90eXBhbCBpbmhlcml0YW5jZSAjI1xuICAgKlxuICAgKiAgICB2YXIgUGl4ZWwgPSBDb2xvci5leHRlbmQoe1xuICAgKiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIFBpeGVsKHgsIHksIGhleCkge1xuICAgKiAgICAgICAgQ29sb3IuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIGhleCk7XG4gICAqICAgICAgICB0aGlzLnggPSB4O1xuICAgKiAgICAgICAgdGhpcy55ID0geTtcbiAgICogICAgICB9LFxuICAgKiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICogICAgICAgIHJldHVybiB0aGlzLnggKyAnOicgKyB0aGlzLnkgKyAnQCcgKyB0aGlzLmhleCgpO1xuICAgKiAgICAgIH1cbiAgICogICAgfSk7XG4gICAqXG4gICAqICAgIHZhciBwaXhlbCA9IFBpeGVsLm5ldygxMSwgMjMsICdDQzMzOTknKVxuICAgKiAgICBwaXhlbC50b1N0cmluZygpOyAvLyAxMToyM0AjQ0MzMzk5XG4gICAqXG4gICAqICAgIHBpeGVsLnJlZCgpOyAgICAgIC8vIDIwNFxuICAgKiAgICBwaXhlbC5ncmVlbigpOyAgICAvLyA1MVxuICAgKiAgICBwaXhlbC5ibHVlKCk7ICAgICAvLyAxNTNcbiAgICpcbiAgICogICAgcGl4ZWwuY3lhbigpOyAgICAgLy8gMC4wMDAwXG4gICAqICAgIHBpeGVsLm1hZ2VudGEoKTsgIC8vIDAuNzUwMFxuICAgKiAgICBwaXhlbC55ZWxsb3coKTsgICAvLyAwLjI1MDBcbiAgICpcbiAgICovXG4gICBleHRlbmQ6IHsgdmFsdWU6IGZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh0aGlzLm1lcmdlLmFwcGx5KE9iamVjdC5jcmVhdGUodGhpcyksIGFyZ3VtZW50cykpO1xuICB9fVxufSkpO1xuXG59KTsiLCIvKiFcbiAqIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IGJ5IFJldm9sdXRpb24gQW5hbHl0aWNzIEluYy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiBWZXJzaW9uIDIuMCBvZiB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSwgSU5DTFVESU5HIFRIT1NFIE9GIE5PTi1JTkZSSU5HRU1FTlQsXG4gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFBsZWFzZSByZWZlciB0byB0aGVcbiAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKSBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqL1xuXG52YXIgTGFuZyA9IHJlcXVpcmUoJy4vbGFuZycpO1xuXG52YXIgZ2V0ID0gZXhwb3J0cy5nZXQgPSBmdW5jdGlvbihzLCBrZXkpIHtcbiAgICBmdW5jdGlvbiB0cmF2ZXJzZShvYmosIGZuLCBwYXJlbnQpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBbaSwgb2JqW2ldLCBwYXJlbnRdKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmICEob2JqW2ldIGluc3RhbmNlb2YgQXJyYXkpKSB7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlKG9ialtpXSwgZm4sIGkpO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UHJvcGVydHkob2JqLCBwcm9wZXJ0eSkge1xuICAgICAgICB2YXIgYWNjID0ge307XG4gICAgICAgIHRyYXZlcnNlKG9iaiwgZnVuY3Rpb24oa2V5LCB2YWx1ZSwgcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBwcm9wZXJ0eSkgeyAgXG4gICAgICAgICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVtcHR5KG9iaikge1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIG9iaikgeyBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSByZXR1cm4gb2JqOyB9XG4gICAgICAgIHJldHVybiAhTGFuZy5pc09iamVjdChvYmopID8gb2JqIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZW1wdHkoZ2V0UHJvcGVydHkocywga2V5KSk7XG59O1xuXG52YXIgaW5BcnJheSA9IGV4cG9ydHMuaW5BcnJheSA9IGZ1bmN0aW9uKGhheXN0YWNrLCBuZWVkbGUsIGtleSkge1xuICAgIHZhciBpLCBtYXggPSBoYXlzdGFjay5sZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgaWYgKGhheXN0YWNrW2ldW2tleV0gPT09IG5lZWRsZSkgeyByZXR1cm4gaGF5c3RhY2tbaV07IH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChoYXlzdGFja1tpXSA9PT0gbmVlZGxlKSB7IHJldHVybiBoYXlzdGFja1tpXTsgfVxuICAgICAgICB9ICAgXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0cy5tZXJnZSA9IGZ1bmN0aW9uKHRvLCBmcm9tKSB7ICAgICAgICBcbiAgICBpZiAoIXRvIHx8IHR5cGVvZih0bykgIT09ICdvYmplY3QnKSB7IHRvID0ge307IH1cbiAgICBpZiAoIWZyb20gfHwgdHlwZW9mKGZyb20pICE9PSAnb2JqZWN0JykgeyBmcm9tID0ge307IH1cblxuICAgIGZvciAodmFyIGsgaW4gZnJvbSkgeyB0b1trXSA9IGZyb21ba107IH1cblxuICAgIHJldHVybiB0bztcbn07XG5cbmV4cG9ydHMud29ya3NwYWNlID0gZnVuY3Rpb24ob2JqLCBuYW1lKSB7XG4gICAgdmFyIHdzID0gZ2V0KG9iaiwgJ3dvcmtzcGFjZScpO1xuICAgIHJldHVybiAod3MgPyBuYW1lID8gaW5BcnJheSh3cy5vYmplY3RzLCBuYW1lLCAnbmFtZScpIDogd3Mub2JqZWN0cyB8fCB3cy5vYmplY3Q6IG51bGwpO1xufTtcblxuZXhwb3J0cy5zaWduYXR1cmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzWycwJ10sIDApLFxuICAgICAgICBsZW4gICAgPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgY3JlYXRlID0gZmFsc2UsXG4gICAgICAgIG9wdHMgICA9IHt9LFxuICAgICAgICBhcGk7XG5cbiAgICBpZiAobGVuID09PSAxICYmIExhbmcuaXNPYmplY3QoYXJnc1swXSkpIHtcbiAgICAgICAgb3B0cyA9IGFyZ3NbMF07XG4gICAgICAgIGFwaSAgPSBvcHRzLnByb2plY3QgPyAnL3IvcHJvamVjdC9leGVjdXRlL3NjcmlwdCcgOlxuICAgICAgICAgICAgJy9yL3JlcG9zaXRvcnkvc2NyaXB0L2V4ZWN1dGUnO1xuICAgIH0gZWxzZSBpZiAobGVuID09PSAxICYmIExhbmcuaXNTdHJpbmcoYXJnc1swXSkpIHtcbiAgICAgICAgYXJncyA9IGFyZ3NbMF0uc3BsaXQoJ1xcLycpO1xuICAgICAgICBhcGkgID0gJy9yL3JlcG9zaXRvcnkvc2NyaXB0L2V4ZWN1dGUnXG4gICAgICAgIG9wdHMgPSB7XG4gICAgICAgICAgICBhdXRob3I6IGFyZ3NbMV0sXG4gICAgICAgICAgICBkaXJlY3Rvcnk6IGFyZ3NbMl0sXG4gICAgICAgICAgICBmaWxlbmFtZTogYXJnc1szXVxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAobGVuID09PSAyKSB7XG4gICAgICAgIC8vIGV4OiAuc2NyaXB0KCcvdGVzdHVzZXIvcm9vdC9EZXBsb3lSIC0gSGVsbG8gV29ybGQuUicsIHByb2plY3QpXG4gICAgICAgIHZhciBwcm9qZWN0ID0gYXJnc1sxXTtcbiAgICAgICAgYXBpID0gcHJvamVjdCA/ICcvci9wcm9qZWN0L2V4ZWN1dGUvc2NyaXB0JyA6ICcvci9yZXBvc2l0b3J5L3NjcmlwdC9leGVjdXRlJztcblxuICAgICAgICBhcmdzID0gYXJnc1swXS5zcGxpdCgnXFwvJyk7XG4gICAgICAgIG9wdHMgPSB7XG4gICAgICAgICAgICBwcm9qZWN0OiBwcm9qZWN0LFxuICAgICAgICAgICAgYXV0aG9yOiBhcmdzWzFdLFxuICAgICAgICAgICAgZGlyZWN0b3J5OiBhcmdzWzJdLFxuICAgICAgICAgICAgZmlsZW5hbWU6IGFyZ3NbM11cbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGxlbiA+IDIpIHtcbiAgICAgICAgLy8gZXg6IC5zY3JpcHQoJ0RlcGxveVIgLSBIZWxsbyBXb3JsZC5SJywgJ3Rlc3R1c2VyJywgJ3Jvb3QnKVxuICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgYXV0aG9yOiBhcmdzWzJdLFxuICAgICAgICAgICAgZGlyZWN0b3J5OiBhcmdzWzFdLFxuICAgICAgICAgICAgZmlsZW5hbWU6IGFyZ3NbMF1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBpbmRpY2F0ZSBhIG5ldyBwcm9qZWN0IHNob3VsZCBiZSBjcmVhdGVkXG4gICAgaWYgKG9wdHMucHJvamVjdCAmJiBMYW5nLmlzQm9vbGVhbihvcHRzLnByb2plY3QpKSB7XG4gICAgICBkZWxldGUgb3B0c1sncHJvamVjdCddO1xuICAgICAgY3JlYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhcGk6IGFwaSxcbiAgICAgICAgb3B0czogb3B0cyxcbiAgICAgICAgY3JlYXRlOiBjcmVhdGVcbiAgICB9O1xufTsiLG51bGwsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudFF1ZXVlO1xuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICBjdXJyZW50UXVldWVbaV0oKTtcbiAgICAgICAgfVxuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG59XG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHF1ZXVlLnB1c2goZnVuKTtcbiAgICBpZiAoIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuLyoqXG4qIGF0dGVtcHQgb2YgYSBzaW1wbGUgZGVmZXIvcHJvbWlzZSBsaWJyYXJ5IGZvciBtb2JpbGUgZGV2ZWxvcG1lbnRcbiogQGF1dGhvciBKb25hdGhhbiBHb3R0aSA8IGpnb3R0aSBhdCBqZ290dGkgZG90IG5ldD5cbiogQHNpbmNlIDIwMTItMTBcbiogQHZlcnNpb24gMC42LjBcbiogQGNoYW5nZWxvZ1xuKiAgICAgICAgICAgLSAyMDEzLTEyLTA3IC0gbGFzdCBwcm9taXNlIDEuMSBzcGVjcyB0ZXN0IHBhc3NpbmdzICh0aHggdG8gd2l6YXJkd2VyZG5hKVxuICogICAgICAgICAgICAgICAgICAgICAgIC0gcmVkdWNlIHByb21pc2VzIGZvb3RwcmludCBieSB1bnNjb3BpbmcgbWV0aG9kcyB0aGF0IGNvdWxkIGJlXG4qICAgICAgICAgICAtIDIwMTMtMTAtMjMgLSBtYWtlIGl0IHdvcmtpZyBhY3Jvc3Mgbm9kZS13ZWJraXQgY29udGV4dHNcbiogICAgICAgICAgIC0gMjAxMy0wNy0wMyAtIGJ1ZyBjb3JyZWN0aW9uIGluIHByb21peGlmeSBtZXRob2QgKHRoeCB0byBhZHJpZW4gZ2licmF0IClcbiogICAgICAgICAgIC0gMjAxMy0wNi0yMiAtIGJ1ZyBjb3JyZWN0aW9uIGluIG5vZGVDYXBzdWxlIG1ldGhvZFxuKiAgICAgICAgICAgLSAyMDEzLTA2LTE3IC0gcmVtb3ZlIHVubmVjZXNzYXJ5IEFycmF5LmluZGV4T2YgbWV0aG9kIGRlcGVuZGVuY3lcbiogICAgICAgICAgIC0gMjAxMy0wNC0xOCAtIGFkZCB0cnkvY2F0Y2ggYmxvY2sgYXJvdW5kIG5vZGVDYXBzdWxlZCBtZXRob2RzXG4qICAgICAgICAgICAtIDIwMTMtMDQtMTMgLSBjaGVjayBwcm9taXNlcy9BKyBjb25mb3JtaXR5XG4qICAgICAgICAgICAgICAgICAgICAgICAgLSBtYWtlIHNvbWUgbWluaWNhdGlvbiBvcHRpbWlzYXRpb25zXG4qICAgICAgICAgICAtIDIwMTMtMDMtMjYgLSBhZGQgcmVzb2x2ZWQsIGZ1bGZpbGxlZCBhbmQgcmVqZWN0ZWQgbWV0aG9kc1xuKiAgICAgICAgICAgLSAyMDEzLTAzLTIxIC0gYnJvd3Nlci9ub2RlIGNvbXBhdGlibGVcbiogICAgICAgICAgICAgICAgICAgICAgICAtIG5ldyBtZXRob2Qgbm9kZUNhcHN1bGVcbiogICAgICAgICAgICAgICAgICAgICAgICAtIHNpbXBsZXIgcHJvbWl4aWZ5IHdpdGggZnVsbCBhcGkgc3VwcG9ydFxuKiAgICAgICAgICAgLSAyMDEzLTAxLTI1IC0gYWRkIHJldGhyb3cgbWV0aG9kXG4qICAgICAgICAgICAgICAgICAgICAgICAgLSBuZXh0VGljayBvcHRpbWlzYXRpb24gLT4gYWRkIHN1cHBvcnQgZm9yIHByb2Nlc3MubmV4dFRpY2sgKyBNZXNzYWdlQ2hhbm5lbCB3aGVyZSBhdmFpbGFibGVcbiogICAgICAgICAgIC0gMjAxMi0xMi0yOCAtIGFkZCBhcHBseSBtZXRob2QgdG8gcHJvbWlzZVxuKiAgICAgICAgICAgLSAyMDEyLTEyLTIwIC0gYWRkIGFsd2F5c0FzeW5jIHBhcmFtZXRlcnMgYW5kIHByb3BlcnR5IGZvciBkZWZhdWx0IHNldHRpbmdcbiovXG4oZnVuY3Rpb24odW5kZWYpe1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR2YXIgbmV4dFRpY2tcblx0XHQsIGlzRnVuYyA9IGZ1bmN0aW9uKGYpeyByZXR1cm4gKCB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyApOyB9XG5cdFx0LCBpc0FycmF5ID0gZnVuY3Rpb24oYSl7IHJldHVybiBBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheShhKSA6IChhIGluc3RhbmNlb2YgQXJyYXkpOyB9XG5cdFx0LCBpc09iak9yRnVuYyA9IGZ1bmN0aW9uKG8peyByZXR1cm4gISEobyAmJiAodHlwZW9mIG8pLm1hdGNoKC9mdW5jdGlvbnxvYmplY3QvKSk7IH1cblx0XHQsIGlzTm90VmFsID0gZnVuY3Rpb24odil7IHJldHVybiAodiA9PT0gZmFsc2UgfHwgdiA9PT0gdW5kZWYgfHwgdiA9PT0gbnVsbCk7IH1cblx0XHQsIHNsaWNlID0gZnVuY3Rpb24oYSwgb2Zmc2V0KXsgcmV0dXJuIFtdLnNsaWNlLmNhbGwoYSwgb2Zmc2V0KTsgfVxuXHRcdCwgdW5kZWZTdHIgPSAndW5kZWZpbmVkJ1xuXHRcdCwgdEVyciA9IHR5cGVvZiBUeXBlRXJyb3IgPT09IHVuZGVmU3RyID8gRXJyb3IgOiBUeXBlRXJyb3Jcblx0O1xuXHRpZiAoICh0eXBlb2YgcHJvY2VzcyAhPT0gdW5kZWZTdHIpICYmIHByb2Nlc3MubmV4dFRpY2sgKSB7XG5cdFx0bmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrO1xuXHR9IGVsc2UgaWYgKCB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09IHVuZGVmU3RyICkge1xuXHRcdHZhciBudGlja0NoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKSwgcXVldWUgPSBbXTtcblx0XHRudGlja0NoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oKXsgcXVldWUubGVuZ3RoICYmIChxdWV1ZS5zaGlmdCgpKSgpOyB9O1xuXHRcdG5leHRUaWNrID0gZnVuY3Rpb24oY2Ipe1xuXHRcdFx0cXVldWUucHVzaChjYik7XG5cdFx0XHRudGlja0NoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRuZXh0VGljayA9IGZ1bmN0aW9uKGNiKXsgc2V0VGltZW91dChjYiwgMCk7IH07XG5cdH1cblx0ZnVuY3Rpb24gcmV0aHJvdyhlKXsgbmV4dFRpY2soZnVuY3Rpb24oKXsgdGhyb3cgZTt9KTsgfVxuXG5cdC8qKlxuXHQgKiBAdHlwZWRlZiBkZWZlcnJlZFxuXHQgKiBAcHJvcGVydHkge3Byb21pc2V9IHByb21pc2Vcblx0ICogQG1ldGhvZCByZXNvbHZlXG5cdCAqIEBtZXRob2QgZnVsZmlsbFxuXHQgKiBAbWV0aG9kIHJlamVjdFxuXHQgKi9cblxuXHQvKipcblx0ICogQHR5cGVkZWYge2Z1bmN0aW9ufSBmdWxmaWxsZWRcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSBwcm9taXNlIHJlc29sdmVkIHZhbHVlXG5cdCAqIEByZXR1cm5zIHsqfSBuZXh0IHByb21pc2UgcmVzb2x1dGlvbiB2YWx1ZVxuXHQgKi9cblxuXHQvKipcblx0ICogQHR5cGVkZWYge2Z1bmN0aW9ufSBmYWlsZWRcblx0ICogQHBhcmFtIHsqfSByZWFzb24gcHJvbWlzZSByZWplY3Rpb24gcmVhc29uXG5cdCAqIEByZXR1cm5zIHsqfSBuZXh0IHByb21pc2UgcmVzb2x1dGlvbiB2YWx1ZSBvciByZXRocm93IHRoZSByZWFzb25cblx0ICovXG5cblx0Ly8tLSBkZWZpbmluZyB1bmVuY2xvc2VkIHByb21pc2UgbWV0aG9kcyAtLS8vXG5cdC8qKlxuXHQgKiBzYW1lIGFzIHRoZW4gd2l0aG91dCBmYWlsZWQgY2FsbGJhY2tcblx0ICogQHBhcmFtIHtmdWxmaWxsZWR9IGZ1bGZpbGxlZCBjYWxsYmFja1xuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gYSBuZXcgcHJvbWlzZVxuXHQgKi9cblx0ZnVuY3Rpb24gcHJvbWlzZV9zdWNjZXNzKGZ1bGZpbGxlZCl7IHJldHVybiB0aGlzLnRoZW4oZnVsZmlsbGVkLCB1bmRlZik7IH1cblxuXHQvKipcblx0ICogc2FtZSBhcyB0aGVuIHdpdGggb25seSBhIGZhaWxlZCBjYWxsYmFja1xuXHQgKiBAcGFyYW0ge2ZhaWxlZH0gZmFpbGVkIGNhbGxiYWNrXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfSBhIG5ldyBwcm9taXNlXG5cdCAqL1xuXHRmdW5jdGlvbiBwcm9taXNlX2Vycm9yKGZhaWxlZCl7IHJldHVybiB0aGlzLnRoZW4odW5kZWYsIGZhaWxlZCk7IH1cblxuXG5cdC8qKlxuXHQgKiBzYW1lIGFzIHRoZW4gYnV0IGZ1bGZpbGxlZCBjYWxsYmFjayB3aWxsIHJlY2VpdmUgbXVsdGlwbGUgcGFyYW1ldGVycyB3aGVuIHByb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gQXJyYXlcblx0ICogQHBhcmFtIHtmdWxmaWxsZWR9IGZ1bGZpbGxlZCBjYWxsYmFja1xuXHQgKiBAcGFyYW0ge2ZhaWxlZH0gZmFpbGVkIGNhbGxiYWNrXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfSBhIG5ldyBwcm9taXNlXG5cdCAqL1xuXHRmdW5jdGlvbiBwcm9taXNlX2FwcGx5KGZ1bGZpbGxlZCwgZmFpbGVkKXtcblx0XHRyZXR1cm4gdGhpcy50aGVuKFxuXHRcdFx0ZnVuY3Rpb24oYSl7XG5cdFx0XHRcdHJldHVybiBpc0Z1bmMoZnVsZmlsbGVkKSA/IGZ1bGZpbGxlZC5hcHBseShudWxsLCBpc0FycmF5KGEpID8gYSA6IFthXSkgOiAoZGVmZXIub25seUZ1bmNzID8gYSA6IGZ1bGZpbGxlZCk7XG5cdFx0XHR9XG5cdFx0XHQsIGZhaWxlZCB8fCB1bmRlZlxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogY2xlYW51cCBtZXRob2Qgd2hpY2ggd2lsbCBiZSBhbHdheXMgZXhlY3V0ZWQgcmVnYXJkbGVzcyBmdWxmaWxsbWVudCBvciByZWplY3Rpb25cblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gY2IgYSBjYWxsYmFjayBjYWxsZWQgcmVnYXJkbGVzcyBvZiB0aGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIG9mIHRoZSBwcm9taXNlIHdoaWNoIHdpbGwgYmUgY2FsbGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHByb21pc2UgaXMgbm90IHBlbmRpbmcgYW55bW9yZVxuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gdGhlIHNhbWUgcHJvbWlzZSB1bnRvdWNoZWRcblx0ICovXG5cdGZ1bmN0aW9uIHByb21pc2VfZW5zdXJlKGNiKXtcblx0XHRmdW5jdGlvbiBfY2IoKXsgY2IoKTsgfVxuXHRcdHRoaXMudGhlbihfY2IsIF9jYik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogdGFrZSBhIHNpbmdsZSBjYWxsYmFjayB3aGljaCB3YWl0IGZvciBhbiBlcnJvciBhcyBmaXJzdCBwYXJhbWV0ZXIuIG90aGVyIHJlc29sdXRpb24gdmFsdWVzIGFyZSBwYXNzZWQgYXMgd2l0aCB0aGUgYXBwbHkvc3ByZWFkIG1ldGhvZFxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYiBhIGNhbGxiYWNrIGNhbGxlZCByZWdhcmRsZXNzIG9mIHRoZSBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gb2YgdGhlIHByb21pc2Ugd2hpY2ggd2lsbCBiZSBjYWxsZWRcblx0ICogICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgcHJvbWlzZSBpcyBub3QgcGVuZGluZyBhbnltb3JlIHdpdGggZXJyb3IgYXMgZmlyc3QgcGFyYW1ldGVyIGlmIGFueSBhcyBpbiBub2RlIHN0eWxlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiBSZXN0IG9mIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBsaWVkIGFzIHdpdGggdGhlIGFwcGx5IG1ldGhvZC5cblx0ICogQHJldHVybnMge3Byb21pc2V9IGEgbmV3IHByb21pc2Vcblx0ICovXG5cdGZ1bmN0aW9uIHByb21pc2Vfbm9kaWZ5KGNiKXtcblx0XHRyZXR1cm4gdGhpcy50aGVuKFxuXHRcdFx0ZnVuY3Rpb24oYSl7XG5cdFx0XHRcdHJldHVybiBpc0Z1bmMoY2IpID8gY2IuYXBwbHkobnVsbCwgaXNBcnJheShhKSA/IGEuc3BsaWNlKDAsMCx1bmRlZmluZWQpICYmIGEgOiBbdW5kZWZpbmVkLGFdKSA6IChkZWZlci5vbmx5RnVuY3MgPyBhIDogY2IpO1xuXHRcdFx0fVxuXHRcdFx0LCBmdW5jdGlvbihlKXtcblx0XHRcdFx0cmV0dXJuIGNiKGUpO1xuXHRcdFx0fVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gW2ZhaWxlZF0gd2l0aG91dCBwYXJhbWV0ZXIgd2lsbCBvbmx5IHJldGhyb3cgcHJvbWlzZSByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgb2YgdGhlIHByb21pc2UgbGlicmFyeSBvbiBuZXh0IHRpY2tcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGFzc2VkIGEgZmFpbGVkIG1ldGhvZCB0aGVuIHdpbGwgY2FsbCBmYWlsZWQgb24gcmVqZWN0aW9uIGFuZCB0aHJvdyB0aGUgZXJyb3IgYWdhaW4gaWYgZmFpbGVkIGRpZG4ndFxuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gYSBuZXcgcHJvbWlzZVxuXHQgKi9cblx0ZnVuY3Rpb24gcHJvbWlzZV9yZXRocm93KGZhaWxlZCl7XG5cdFx0cmV0dXJuIHRoaXMudGhlbihcblx0XHRcdHVuZGVmXG5cdFx0XHQsIGZhaWxlZCA/IGZ1bmN0aW9uKGUpeyBmYWlsZWQoZSk7IHRocm93IGU7IH0gOiByZXRocm93XG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQqIEBwYXJhbSB7Ym9vbGVhbn0gW2Fsd2F5c0FzeW5jXSBpZiBzZXQgZm9yY2UgdGhlIGFzeW5jIHJlc29sdXRpb24gZm9yIHRoaXMgcHJvbWlzZSBpbmRlcGVuZGFudGx5IG9mIHRoZSBELmFsd2F5c0FzeW5jIG9wdGlvblxuXHQqIEByZXR1cm5zIHtkZWZlcnJlZH0gZGVmZXJlZCBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAncHJvbWlzZScgYW5kIG1ldGhvZHMgcmVqZWN0LGZ1bGZpbGwscmVzb2x2ZSAoZnVsZmlsbCBiZWluZyBhbiBhbGlhcyBmb3IgcmVzb2x2ZSlcblx0Ki9cblx0dmFyIGRlZmVyID0gZnVuY3Rpb24gKGFsd2F5c0FzeW5jKXtcblx0XHR2YXIgYWx3YXlzQXN5bmNGbiA9ICh1bmRlZiAhPT0gYWx3YXlzQXN5bmMgPyBhbHdheXNBc3luYyA6IGRlZmVyLmFsd2F5c0FzeW5jKSA/IG5leHRUaWNrIDogZnVuY3Rpb24oZm4pe2ZuKCk7fVxuXHRcdFx0LCBzdGF0dXMgPSAwIC8vIC0xIGZhaWxlZCB8IDEgZnVsZmlsbGVkXG5cdFx0XHQsIHBlbmRpbmdzID0gW11cblx0XHRcdCwgdmFsdWVcblx0XHRcdC8qKlxuXHRcdFx0ICogQHR5cGVkZWYgcHJvbWlzZVxuXHRcdFx0ICovXG5cdFx0XHQsIF9wcm9taXNlICA9IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIEBwYXJhbSB7ZnVsZmlsbGVkfGZ1bmN0aW9ufSBmdWxmaWxsZWQgY2FsbGJhY2tcblx0XHRcdFx0ICogQHBhcmFtIHtmYWlsZWR8ZnVuY3Rpb259IGZhaWxlZCBjYWxsYmFja1xuXHRcdFx0XHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gYSBuZXcgcHJvbWlzZVxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oZnVsZmlsbGVkLCBmYWlsZWQpe1xuXHRcdFx0XHRcdHZhciBkID0gZGVmZXIoKTtcblx0XHRcdFx0XHRwZW5kaW5ncy5wdXNoKFtcblx0XHRcdFx0XHRcdGZ1bmN0aW9uKHZhbHVlKXtcblx0XHRcdFx0XHRcdFx0dHJ5e1xuXHRcdFx0XHRcdFx0XHRcdGlmKCBpc05vdFZhbChmdWxmaWxsZWQpKXtcblx0XHRcdFx0XHRcdFx0XHRcdGQucmVzb2x2ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGQucmVzb2x2ZShpc0Z1bmMoZnVsZmlsbGVkKSA/IGZ1bGZpbGxlZCh2YWx1ZSkgOiAoZGVmZXIub25seUZ1bmNzID8gdmFsdWUgOiBmdWxmaWxsZWQpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1jYXRjaChlKXtcblx0XHRcdFx0XHRcdFx0XHRkLnJlamVjdChlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LCBmdW5jdGlvbihlcnIpe1xuXHRcdFx0XHRcdFx0XHRpZiAoIGlzTm90VmFsKGZhaWxlZCkgfHwgKCghaXNGdW5jKGZhaWxlZCkpICYmIGRlZmVyLm9ubHlGdW5jcykgKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZC5yZWplY3QoZXJyKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoIGZhaWxlZCApIHtcblx0XHRcdFx0XHRcdFx0XHR0cnl7IGQucmVzb2x2ZShpc0Z1bmMoZmFpbGVkKSA/IGZhaWxlZChlcnIpIDogZmFpbGVkKTsgfWNhdGNoKGUpeyBkLnJlamVjdChlKTt9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRzdGF0dXMgIT09IDAgJiYgYWx3YXlzQXN5bmNGbihleGVjQ2FsbGJhY2tzKTtcblx0XHRcdFx0XHRyZXR1cm4gZC5wcm9taXNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0LCBzdWNjZXNzOiBwcm9taXNlX3N1Y2Nlc3NcblxuXHRcdFx0XHQsIGVycm9yOiBwcm9taXNlX2Vycm9yXG5cdFx0XHRcdCwgb3RoZXJ3aXNlOiBwcm9taXNlX2Vycm9yXG5cblx0XHRcdFx0LCBhcHBseTogcHJvbWlzZV9hcHBseVxuXHRcdFx0XHQsIHNwcmVhZDogcHJvbWlzZV9hcHBseVxuXG5cdFx0XHRcdCwgZW5zdXJlOiBwcm9taXNlX2Vuc3VyZVxuXG5cdFx0XHRcdCwgbm9kaWZ5OiBwcm9taXNlX25vZGlmeVxuXG5cdFx0XHRcdCwgcmV0aHJvdzogcHJvbWlzZV9yZXRocm93XG5cblx0XHRcdFx0LCBpc1BlbmRpbmc6IGZ1bmN0aW9uKCl7IHJldHVybiAhIShzdGF0dXMgPT09IDApOyB9XG5cblx0XHRcdFx0LCBnZXRTdGF0dXM6IGZ1bmN0aW9uKCl7IHJldHVybiBzdGF0dXM7IH1cblx0XHRcdH1cblx0XHQ7XG5cdFx0X3Byb21pc2UudG9Tb3VyY2UgPSBfcHJvbWlzZS50b1N0cmluZyA9IF9wcm9taXNlLnZhbHVlT2YgPSBmdW5jdGlvbigpe3JldHVybiB2YWx1ZSA9PT0gdW5kZWYgPyB0aGlzIDogdmFsdWU7IH07XG5cblxuXHRcdGZ1bmN0aW9uIGV4ZWNDYWxsYmFja3MoKXtcblx0XHRcdGlmICggc3RhdHVzID09PSAwICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR2YXIgY2JzID0gcGVuZGluZ3MsIGkgPSAwLCBsID0gY2JzLmxlbmd0aCwgY2JJbmRleCA9IH5zdGF0dXMgPyAwIDogMSwgY2I7XG5cdFx0XHRwZW5kaW5ncyA9IFtdO1xuXHRcdFx0Zm9yKCA7IGkgPCBsOyBpKysgKXtcblx0XHRcdFx0KGNiID0gY2JzW2ldW2NiSW5kZXhdKSAmJiBjYih2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogZnVsZmlsbCBkZWZlcnJlZCB3aXRoIGdpdmVuIHZhbHVlXG5cdFx0ICogQHBhcmFtIHsqfSB2YWxcblx0XHQgKiBAcmV0dXJucyB7ZGVmZXJyZWR9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIF9yZXNvbHZlKHZhbCl7XG5cdFx0XHR2YXIgZG9uZSA9IGZhbHNlO1xuXHRcdFx0ZnVuY3Rpb24gb25jZShmKXtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKHgpe1xuXHRcdFx0XHRcdGlmIChkb25lKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRkb25lID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHJldHVybiBmKHgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGlmICggc3RhdHVzICkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciB0aGVuID0gaXNPYmpPckZ1bmModmFsKSAmJiB2YWwudGhlbjtcblx0XHRcdFx0aWYgKCBpc0Z1bmModGhlbikgKSB7IC8vIG1hbmFnaW5nIGEgcHJvbWlzZVxuXHRcdFx0XHRcdGlmKCB2YWwgPT09IF9wcm9taXNlICl7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgdEVycihcIlByb21pc2UgY2FuJ3QgcmVzb2x2ZSBpdHNlbGZcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoZW4uY2FsbCh2YWwsIG9uY2UoX3Jlc29sdmUpLCBvbmNlKF9yZWplY3QpKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvbmNlKF9yZWplY3QpKGUpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHRcdGFsd2F5c0FzeW5jRm4oZnVuY3Rpb24oKXtcblx0XHRcdFx0dmFsdWUgPSB2YWw7XG5cdFx0XHRcdHN0YXR1cyA9IDE7XG5cdFx0XHRcdGV4ZWNDYWxsYmFja3MoKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogcmVqZWN0IGRlZmVycmVkIHdpdGggZ2l2ZW4gcmVhc29uXG5cdFx0ICogQHBhcmFtIHsqfSBFcnJcblx0XHQgKiBAcmV0dXJucyB7ZGVmZXJyZWR9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIF9yZWplY3QoRXJyKXtcblx0XHRcdHN0YXR1cyB8fCBhbHdheXNBc3luY0ZuKGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHRyeXsgdGhyb3coRXJyKTsgfWNhdGNoKGUpeyB2YWx1ZSA9IGU7IH1cblx0XHRcdFx0c3RhdHVzID0gLTE7XG5cdFx0XHRcdGV4ZWNDYWxsYmFja3MoKTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdHJldHVybiAvKipAdHlwZSBkZWZlcnJlZCAqLyB7XG5cdFx0XHRwcm9taXNlOl9wcm9taXNlXG5cdFx0XHQscmVzb2x2ZTpfcmVzb2x2ZVxuXHRcdFx0LGZ1bGZpbGw6X3Jlc29sdmUgLy8gYWxpYXNcblx0XHRcdCxyZWplY3Q6X3JlamVjdFxuXHRcdH07XG5cdH07XG5cblx0ZGVmZXIuZGVmZXJyZWQgPSBkZWZlci5kZWZlciA9IGRlZmVyO1xuXHRkZWZlci5uZXh0VGljayA9IG5leHRUaWNrO1xuXHRkZWZlci5hbHdheXNBc3luYyA9IHRydWU7IC8vIHNldHRpbmcgdGhpcyB3aWxsIGNoYW5nZSBkZWZhdWx0IGJlaGF2aW91ci4gdXNlIGl0IG9ubHkgaWYgbmVjZXNzYXJ5IGFzIGFzeW5jaHJvbmljaXR5IHdpbGwgZm9yY2Ugc29tZSBkZWxheSBiZXR3ZWVuIHlvdXIgcHJvbWlzZSByZXNvbHV0aW9ucyBhbmQgaXMgbm90IGFsd2F5cyB3aGF0IHlvdSB3YW50LlxuXHQvKipcblx0KiBzZXR0aW5nIG9ubHlGdW5jcyB0byBmYWxzZSB3aWxsIGJyZWFrIHByb21pc2VzL0ErIGNvbmZvcm1pdHkgYnkgYWxsb3dpbmcgeW91IHRvIHBhc3Mgbm9uIHVuZGVmaW5lZC9udWxsIHZhbHVlcyBpbnN0ZWFkIG9mIGNhbGxiYWNrc1xuXHQqIGluc3RlYWQgb2YganVzdCBpZ25vcmluZyBhbnkgbm9uIGZ1bmN0aW9uIHBhcmFtZXRlcnMgdG8gdGhlbixzdWNjZXNzLGVycm9yLi4uIGl0IHdpbGwgYWNjZXB0IG5vbiBudWxsfHVuZGVmaW5lZCB2YWx1ZXMuXG5cdCogdGhpcyB3aWxsIGFsbG93IHlvdSBzaG9ydGN1dHMgbGlrZSBwcm9taXNlLnRoZW4oJ3ZhbCcsJ2hhbmRsZWQgZXJyb3InJylcblx0KiB0byBiZSBlcXVpdmFsZW50IG9mIHByb21pc2UudGhlbihmdW5jdGlvbigpeyByZXR1cm4gJ3ZhbCc7fSxmdW5jdGlvbigpeyByZXR1cm4gJ2hhbmRsZWQgZXJyb3InfSlcblx0Ki9cblx0ZGVmZXIub25seUZ1bmNzID0gdHJ1ZTtcblxuXHQvKipcblx0ICogcmV0dXJuIGEgZnVsZmlsbGVkIHByb21pc2Ugb2YgZ2l2ZW4gdmFsdWUgKGFsd2F5cyBhc3luYyByZXNvbHV0aW9uKVxuXHQgKiBAcGFyYW0geyp9IHZhbHVlXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfVxuXHQgKi9cblx0ZGVmZXIucmVzb2x2ZWQgPSBkZWZlci5mdWxmaWxsZWQgPSBmdW5jdGlvbih2YWx1ZSl7IHJldHVybiBkZWZlcih0cnVlKS5yZXNvbHZlKHZhbHVlKS5wcm9taXNlOyB9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm4gYSByZWplY3RlZCBwcm9taXNlIHdpdGggZ2l2ZW4gcmVhc29uIG9mIHJlamVjdGlvbiAoYWx3YXlzIGFzeW5jIHJlamVjdGlvbilcblx0ICogQHBhcmFtIHsqfSByZWFzb25cblx0ICogQHJldHVybnMge3Byb21pc2V9XG5cdCAqL1xuXHRkZWZlci5yZWplY3RlZCA9IGZ1bmN0aW9uKHJlYXNvbil7IHJldHVybiBkZWZlcih0cnVlKS5yZWplY3QocmVhc29uKS5wcm9taXNlOyB9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm4gYSBwcm9taXNlIHdpdGggbm8gcmVzb2x1dGlvbiB2YWx1ZSB3aGljaCB3aWxsIGJlIHJlc29sdmVkIGluIHRpbWUgbXMgKHVzaW5nIHNldFRpbWVvdXQpXG5cdCAqIEBwYXJhbSB7aW50fSBbdGltZV0gaW4gbXMgZGVmYXVsdCB0byAwXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfVxuXHQgKi9cblx0ZGVmZXIud2FpdCA9IGZ1bmN0aW9uKHRpbWUpe1xuXHRcdHZhciBkID0gZGVmZXIoKTtcblx0XHRzZXRUaW1lb3V0KGQucmVzb2x2ZSwgdGltZSB8fCAwKTtcblx0XHRyZXR1cm4gZC5wcm9taXNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIGZ1bmN0aW9uIGNhbGwgd2hpY2ggd2lsbCBiZSBmdWxmaWxsZWQgaW4gZGVsYXkgbXMgb3IgcmVqZWN0ZWQgaWYgZ2l2ZW4gZm4gdGhyb3cgYW4gZXJyb3Jcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gZm5cblx0ICogQHBhcmFtIHtpbnR9IFtkZWxheV0gaW4gbXMgZGVmYXVsdCB0byAwXG5cdCAqIEByZXR1cm5zIHtwcm9taXNlfVxuXHQgKi9cblx0ZGVmZXIuZGVsYXkgPSBmdW5jdGlvbihmbiwgZGVsYXkpe1xuXHRcdHZhciBkID0gZGVmZXIoKTtcblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IHRyeXsgZC5yZXNvbHZlKGZuLmFwcGx5KG51bGwpKTsgfWNhdGNoKGUpeyBkLnJlamVjdChlKTsgfSB9LCBkZWxheSB8fCAwKTtcblx0XHRyZXR1cm4gZC5wcm9taXNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBpZiBnaXZlbiB2YWx1ZSBpcyBub3QgYSBwcm9taXNlIHJldHVybiBhIGZ1bGZpbGxlZCBwcm9taXNlIHJlc29sdmVkIHRvIGdpdmVuIHZhbHVlXG5cdCAqIEBwYXJhbSB7Kn0gcHJvbWlzZSBhIHZhbHVlIG9yIGEgcHJvbWlzZVxuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX1cblx0ICovXG5cdGRlZmVyLnByb21pc2lmeSA9IGZ1bmN0aW9uKHByb21pc2Upe1xuXHRcdGlmICggcHJvbWlzZSAmJiBpc0Z1bmMocHJvbWlzZS50aGVuKSApIHsgcmV0dXJuIHByb21pc2U7fVxuXHRcdHJldHVybiBkZWZlci5yZXNvbHZlZChwcm9taXNlKTtcblx0fTtcblxuXHRmdW5jdGlvbiBtdWx0aVByb21pc2VSZXNvbHZlcihjYWxsZXJBcmd1bWVudHMsIHJldHVyblByb21pc2VzKXtcblx0XHR2YXIgcHJvbWlzZXMgPSBzbGljZShjYWxsZXJBcmd1bWVudHMpO1xuXHRcdGlmICggcHJvbWlzZXMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkocHJvbWlzZXNbMF0pICkge1xuXHRcdFx0aWYoISBwcm9taXNlc1swXS5sZW5ndGggKXtcblx0XHRcdFx0cmV0dXJuIGRlZmVyLmZ1bGZpbGxlZChbXSk7XG5cdFx0XHR9XG5cdFx0XHRwcm9taXNlcyA9IHByb21pc2VzWzBdO1xuXHRcdH1cblx0XHR2YXIgYXJncyA9IFtdXG5cdFx0XHQsIGQgPSBkZWZlcigpXG5cdFx0XHQsIGMgPSBwcm9taXNlcy5sZW5ndGhcblx0XHQ7XG5cdFx0aWYgKCAhYyApIHtcblx0XHRcdGQucmVzb2x2ZShhcmdzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJlc29sdmVyID0gZnVuY3Rpb24oaSl7XG5cdFx0XHRcdHByb21pc2VzW2ldID0gZGVmZXIucHJvbWlzaWZ5KHByb21pc2VzW2ldKTtcblx0XHRcdFx0cHJvbWlzZXNbaV0udGhlbihcblx0XHRcdFx0XHRmdW5jdGlvbih2KXtcblx0XHRcdFx0XHRcdGlmICghIChpIGluIGFyZ3MpICkgeyAvL0B0b2RvIGNoZWNrIHRoaXMgaXMgc3RpbGwgcmVxdWlyZWQgYXMgcHJvbWlzZXMgY2FuJ3QgYmUgcmVzb2x2ZSBtb3JlIHRoYW4gb25jZVxuXHRcdFx0XHRcdFx0XHRhcmdzW2ldID0gcmV0dXJuUHJvbWlzZXMgPyBwcm9taXNlc1tpXSA6IHY7XG5cdFx0XHRcdFx0XHRcdCgtLWMpIHx8IGQucmVzb2x2ZShhcmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LCBmdW5jdGlvbihlKXtcblx0XHRcdFx0XHRcdGlmKCEgKGkgaW4gYXJncykgKXtcblx0XHRcdFx0XHRcdFx0aWYoICEgcmV0dXJuUHJvbWlzZXMgKXtcblx0XHRcdFx0XHRcdFx0XHRkLnJlamVjdChlKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRhcmdzW2ldID0gcHJvbWlzZXNbaV07XG5cdFx0XHRcdFx0XHRcdFx0KC0tYykgfHwgZC5yZXNvbHZlKGFyZ3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0fTtcblx0XHRcdGZvciggdmFyIGkgPSAwLCBsID0gYzsgaSA8IGw7IGkrKyApe1xuXHRcdFx0XHRyZXNvbHZlcihpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGQucHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm4gYSBwcm9taXNlIGZvciBhbGwgZ2l2ZW4gcHJvbWlzZXMgLyB2YWx1ZXMuXG5cdCAqIHRoZSByZXR1cm5lZCBwcm9taXNlcyB3aWxsIGJlIGZ1bGZpbGxlZCB3aXRoIGEgbGlzdCBvZiByZXNvbHZlZCB2YWx1ZS5cblx0ICogaWYgYW55IGdpdmVuIHByb21pc2UgaXMgcmVqZWN0ZWQgdGhlbiBvbiB0aGUgZmlyc3QgcmVqZWN0aW9uIHRoZSByZXR1cm5lZCBwcm9taXNlZCB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWUgcmVhc29uXG5cdCAqIEBwYXJhbSB7YXJyYXl8Li4uKn0gW3Byb21pc2VdIGNhbiBiZSBhIHNpbmdsZSBhcnJheSBvZiBwcm9taXNlL3ZhbHVlcyBhcyBmaXJzdCBwYXJhbWV0ZXIgb3IgYSBsaXN0IG9mIGRpcmVjdCBwYXJhbWV0ZXJzIHByb21pc2UvdmFsdWVcblx0ICogQHJldHVybnMge3Byb21pc2V9IG9mIGEgbGlzdCBvZiBnaXZlbiBwcm9taXNlIHJlc29sdXRpb24gdmFsdWVcblx0ICovXG5cdGRlZmVyLmFsbCA9IGZ1bmN0aW9uKCl7IHJldHVybiBtdWx0aVByb21pc2VSZXNvbHZlcihhcmd1bWVudHMsZmFsc2UpOyB9O1xuXG5cdC8qKlxuXHQgKiByZXR1cm4gYW4gYWx3YXlzIGZ1bGZpbGxlZCBwcm9taXNlIG9mIGFycmF5PHByb21pc2U+IGxpc3Qgb2YgcHJvbWlzZXMvdmFsdWVzIHJlZ2FyZGxlc3MgdGhleSByZXNvbHZlIGZ1bGZpbGxlZCBvciByZWplY3RlZFxuXHQgKiBAcGFyYW0ge2FycmF5fC4uLip9IFtwcm9taXNlXSBjYW4gYmUgYSBzaW5nbGUgYXJyYXkgb2YgcHJvbWlzZS92YWx1ZXMgYXMgZmlyc3QgcGFyYW1ldGVyIG9yIGEgbGlzdCBvZiBkaXJlY3QgcGFyYW1ldGVycyBwcm9taXNlL3ZhbHVlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgKG5vbiBwcm9taXNlIHZhbHVlcyB3aWxsIGJlIHByb21pc2lmaWVkKVxuXHQgKiBAcmV0dXJucyB7cHJvbWlzZX0gb2YgdGhlIGxpc3Qgb2YgZ2l2ZW4gcHJvbWlzZXNcblx0ICovXG5cdGRlZmVyLnJlc29sdmVBbGwgPSBmdW5jdGlvbigpeyByZXR1cm4gbXVsdGlQcm9taXNlUmVzb2x2ZXIoYXJndW1lbnRzLHRydWUpOyB9O1xuXG5cdC8qKlxuXHQgKiB0cmFuc2Zvcm0gYSB0eXBpY2FsIG5vZGVqcyBhc3luYyBtZXRob2QgYXdhaXRpbmcgYSBjYWxsYmFjayBhcyBsYXN0IHBhcmFtZXRlciwgcmVjZWl2aW5nIGVycm9yIGFzIGZpcnN0IHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uIHRoYXRcblx0ICogd2lsbCByZXR1cm4gYSBwcm9taXNlIGluc3RlYWQuIHRoZSByZXR1cm5lZCBwcm9taXNlIHdpbGwgcmVzb2x2ZSB3aXRoIG5vcm1hbCBjYWxsYmFjayB2YWx1ZSBtaW51cyB0aGUgZmlyc3QgZXJyb3IgcGFyYW1ldGVyIG9uXG5cdCAqIGZ1bGZpbGwgYW5kIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGF0IGVycm9yIGFzIHJlYXNvbiBpbiBjYXNlIG9mIGVycm9yLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW3N1YmplY3RdIG9wdGlvbmFsIHN1YmplY3Qgb2YgdGhlIG1ldGhvZCB0byBlbmNhcHN1bGF0ZVxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24gdG8gZW5jYXBzdWxhdGUgaWYgdGhlIG5vcm1hbCBjYWxsYmFjayBzaG91bGQgcmVjZWl2ZSBtb3JlIHRoYW4gYSBzaW5nbGUgcGFyYW1ldGVyIChtaW51cyB0aGUgZXJyb3IpXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSB3aXRoIHRoZSBsaXN0IG9yIHBhcmFtZXRlcnMgYXMgZnVsZmlsbG1lbnQgdmFsdWUuIElmIG9ubHkgb25lIHBhcmFtZXRlciBpcyBzZW50IHRvIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayB0aGVuIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVzb2x1dGlvbiB2YWx1ZS5cblx0ICogQHJldHVybnMge0Z1bmN0aW9ufVxuXHQgKi9cblx0ZGVmZXIubm9kZUNhcHN1bGUgPSBmdW5jdGlvbihzdWJqZWN0LCBmbil7XG5cdFx0aWYgKCAhZm4gKSB7XG5cdFx0XHRmbiA9IHN1YmplY3Q7XG5cdFx0XHRzdWJqZWN0ID0gdm9pZCgwKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCl7XG5cdFx0XHR2YXIgZCA9IGRlZmVyKCksIGFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXHRcdFx0YXJncy5wdXNoKGZ1bmN0aW9uKGVyciwgcmVzKXtcblx0XHRcdFx0ZXJyID8gZC5yZWplY3QoZXJyKSA6IGQucmVzb2x2ZShhcmd1bWVudHMubGVuZ3RoID4gMiA/IHNsaWNlKGFyZ3VtZW50cywgMSkgOiByZXMpO1xuXHRcdFx0fSk7XG5cdFx0XHR0cnl7XG5cdFx0XHRcdGZuLmFwcGx5KHN1YmplY3QsIGFyZ3MpO1xuXHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRkLnJlamVjdChlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkLnByb21pc2U7XG5cdFx0fTtcblx0fTtcblxuXHR0eXBlb2Ygd2luZG93ICE9PSB1bmRlZlN0ciAmJiAod2luZG93LkQgPSBkZWZlcik7XG5cdHR5cGVvZiBtb2R1bGUgIT09IHVuZGVmU3RyICYmIG1vZHVsZS5leHBvcnRzICYmIChtb2R1bGUuZXhwb3J0cyA9IGRlZmVyKTtcblxufSkoKTtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5a0xtcHpMMnhwWWk5RUxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRU0lzSW1acGJHVWlPaUpuWlc1bGNtRjBaV1F1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5b3FYRzRxSUdGMGRHVnRjSFFnYjJZZ1lTQnphVzF3YkdVZ1pHVm1aWEl2Y0hKdmJXbHpaU0JzYVdKeVlYSjVJR1p2Y2lCdGIySnBiR1VnWkdWMlpXeHZjRzFsYm5SY2Jpb2dRR0YxZEdodmNpQktiMjVoZEdoaGJpQkhiM1IwYVNBOElHcG5iM1IwYVNCaGRDQnFaMjkwZEdrZ1pHOTBJRzVsZEQ1Y2Jpb2dRSE5wYm1ObElESXdNVEl0TVRCY2Jpb2dRSFpsY25OcGIyNGdNQzQyTGpCY2Jpb2dRR05vWVc1blpXeHZaMXh1S2lBZ0lDQWdJQ0FnSUNBZ0xTQXlNREV6TFRFeUxUQTNJQzBnYkdGemRDQndjbTl0YVhObElERXVNU0J6Y0dWamN5QjBaWE4wSUhCaGMzTnBibWR6SUNoMGFIZ2dkRzhnZDJsNllYSmtkMlZ5Wkc1aEtWeHVJQ29nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDMGdjbVZrZFdObElIQnliMjFwYzJWeklHWnZiM1J3Y21sdWRDQmllU0IxYm5OamIzQnBibWNnYldWMGFHOWtjeUIwYUdGMElHTnZkV3hrSUdKbFhHNHFJQ0FnSUNBZ0lDQWdJQ0F0SURJd01UTXRNVEF0TWpNZ0xTQnRZV3RsSUdsMElIZHZjbXRwWnlCaFkzSnZjM01nYm05a1pTMTNaV0pyYVhRZ1kyOXVkR1Y0ZEhOY2Jpb2dJQ0FnSUNBZ0lDQWdJQzBnTWpBeE15MHdOeTB3TXlBdElHSjFaeUJqYjNKeVpXTjBhVzl1SUdsdUlIQnliMjFwZUdsbWVTQnRaWFJvYjJRZ0tIUm9lQ0IwYnlCaFpISnBaVzRnWjJsaWNtRjBJQ2xjYmlvZ0lDQWdJQ0FnSUNBZ0lDMGdNakF4TXkwd05pMHlNaUF0SUdKMVp5QmpiM0p5WldOMGFXOXVJR2x1SUc1dlpHVkRZWEJ6ZFd4bElHMWxkR2h2WkZ4dUtpQWdJQ0FnSUNBZ0lDQWdMU0F5TURFekxUQTJMVEUzSUMwZ2NtVnRiM1psSUhWdWJtVmpaWE56WVhKNUlFRnljbUY1TG1sdVpHVjRUMllnYldWMGFHOWtJR1JsY0dWdVpHVnVZM2xjYmlvZ0lDQWdJQ0FnSUNBZ0lDMGdNakF4TXkwd05DMHhPQ0F0SUdGa1pDQjBjbmt2WTJGMFkyZ2dZbXh2WTJzZ1lYSnZkVzVrSUc1dlpHVkRZWEJ6ZFd4bFpDQnRaWFJvYjJSelhHNHFJQ0FnSUNBZ0lDQWdJQ0F0SURJd01UTXRNRFF0TVRNZ0xTQmphR1ZqYXlCd2NtOXRhWE5sY3k5Qkt5QmpiMjVtYjNKdGFYUjVYRzRxSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMU0J0WVd0bElITnZiV1VnYldsdWFXTmhkR2x2YmlCdmNIUnBiV2x6WVhScGIyNXpYRzRxSUNBZ0lDQWdJQ0FnSUNBdElESXdNVE10TURNdE1qWWdMU0JoWkdRZ2NtVnpiMngyWldRc0lHWjFiR1pwYkd4bFpDQmhibVFnY21WcVpXTjBaV1FnYldWMGFHOWtjMXh1S2lBZ0lDQWdJQ0FnSUNBZ0xTQXlNREV6TFRBekxUSXhJQzBnWW5KdmQzTmxjaTl1YjJSbElHTnZiWEJoZEdsaWJHVmNiaW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXRJRzVsZHlCdFpYUm9iMlFnYm05a1pVTmhjSE4xYkdWY2Jpb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdElITnBiWEJzWlhJZ2NISnZiV2w0YVdaNUlIZHBkR2dnWm5Wc2JDQmhjR2tnYzNWd2NHOXlkRnh1S2lBZ0lDQWdJQ0FnSUNBZ0xTQXlNREV6TFRBeExUSTFJQzBnWVdSa0lISmxkR2h5YjNjZ2JXVjBhRzlrWEc0cUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTFNCdVpYaDBWR2xqYXlCdmNIUnBiV2x6WVhScGIyNGdMVDRnWVdSa0lITjFjSEJ2Y25RZ1ptOXlJSEJ5YjJObGMzTXVibVY0ZEZScFkyc2dLeUJOWlhOellXZGxRMmhoYm01bGJDQjNhR1Z5WlNCaGRtRnBiR0ZpYkdWY2Jpb2dJQ0FnSUNBZ0lDQWdJQzBnTWpBeE1pMHhNaTB5T0NBdElHRmtaQ0JoY0hCc2VTQnRaWFJvYjJRZ2RHOGdjSEp2YldselpWeHVLaUFnSUNBZ0lDQWdJQ0FnTFNBeU1ERXlMVEV5TFRJd0lDMGdZV1JrSUdGc2QyRjVjMEZ6ZVc1aklIQmhjbUZ0WlhSbGNuTWdZVzVrSUhCeWIzQmxjblI1SUdadmNpQmtaV1poZFd4MElITmxkSFJwYm1kY2Jpb3ZYRzRvWm5WdVkzUnBiMjRvZFc1a1pXWXBlMXh1WEhSY0luVnpaU0J6ZEhKcFkzUmNJanRjYmx4dVhIUjJZWElnYm1WNGRGUnBZMnRjYmx4MFhIUXNJR2x6Um5WdVl5QTlJR1oxYm1OMGFXOXVLR1lwZXlCeVpYUjFjbTRnS0NCMGVYQmxiMllnWmlBOVBUMGdKMloxYm1OMGFXOXVKeUFwT3lCOVhHNWNkRngwTENCcGMwRnljbUY1SUQwZ1puVnVZM1JwYjI0b1lTbDdJSEpsZEhWeWJpQkJjbkpoZVM1cGMwRnljbUY1SUQ4Z1FYSnlZWGt1YVhOQmNuSmhlU2hoS1NBNklDaGhJR2x1YzNSaGJtTmxiMllnUVhKeVlYa3BPeUI5WEc1Y2RGeDBMQ0JwYzA5aWFrOXlSblZ1WXlBOUlHWjFibU4wYVc5dUtHOHBleUJ5WlhSMWNtNGdJU0VvYnlBbUppQW9kSGx3Wlc5bUlHOHBMbTFoZEdOb0tDOW1kVzVqZEdsdmJueHZZbXBsWTNRdktTazdJSDFjYmx4MFhIUXNJR2x6VG05MFZtRnNJRDBnWm5WdVkzUnBiMjRvZGlsN0lISmxkSFZ5YmlBb2RpQTlQVDBnWm1Gc2MyVWdmSHdnZGlBOVBUMGdkVzVrWldZZ2ZId2dkaUE5UFQwZ2JuVnNiQ2s3SUgxY2JseDBYSFFzSUhOc2FXTmxJRDBnWm5WdVkzUnBiMjRvWVN3Z2IyWm1jMlYwS1hzZ2NtVjBkWEp1SUZ0ZExuTnNhV05sTG1OaGJHd29ZU3dnYjJabWMyVjBLVHNnZlZ4dVhIUmNkQ3dnZFc1a1pXWlRkSElnUFNBbmRXNWtaV1pwYm1Wa0oxeHVYSFJjZEN3Z2RFVnljaUE5SUhSNWNHVnZaaUJVZVhCbFJYSnliM0lnUFQwOUlIVnVaR1ZtVTNSeUlEOGdSWEp5YjNJZ09pQlVlWEJsUlhKeWIzSmNibHgwTzF4dVhIUnBaaUFvSUNoMGVYQmxiMllnY0hKdlkyVnpjeUFoUFQwZ2RXNWtaV1pUZEhJcElDWW1JSEJ5YjJObGMzTXVibVY0ZEZScFkyc2dLU0I3WEc1Y2RGeDBibVY0ZEZScFkyc2dQU0J3Y205alpYTnpMbTVsZUhSVWFXTnJPMXh1WEhSOUlHVnNjMlVnYVdZZ0tDQjBlWEJsYjJZZ1RXVnpjMkZuWlVOb1lXNXVaV3dnSVQwOUlIVnVaR1ZtVTNSeUlDa2dlMXh1WEhSY2RIWmhjaUJ1ZEdsamEwTm9ZVzV1Wld3Z1BTQnVaWGNnVFdWemMyRm5aVU5vWVc1dVpXd29LU3dnY1hWbGRXVWdQU0JiWFR0Y2JseDBYSFJ1ZEdsamEwTm9ZVzV1Wld3dWNHOXlkREV1YjI1dFpYTnpZV2RsSUQwZ1puVnVZM1JwYjI0b0tYc2djWFZsZFdVdWJHVnVaM1JvSUNZbUlDaHhkV1YxWlM1emFHbG1kQ2dwS1NncE95QjlPMXh1WEhSY2RHNWxlSFJVYVdOcklEMGdablZ1WTNScGIyNG9ZMklwZTF4dVhIUmNkRngwY1hWbGRXVXVjSFZ6YUNoallpazdYRzVjZEZ4MFhIUnVkR2xqYTBOb1lXNXVaV3d1Y0c5eWRESXVjRzl6ZEUxbGMzTmhaMlVvTUNrN1hHNWNkRngwZlR0Y2JseDBmU0JsYkhObElIdGNibHgwWEhSdVpYaDBWR2xqYXlBOUlHWjFibU4wYVc5dUtHTmlLWHNnYzJWMFZHbHRaVzkxZENoallpd2dNQ2s3SUgwN1hHNWNkSDFjYmx4MFpuVnVZM1JwYjI0Z2NtVjBhSEp2ZHlobEtYc2dibVY0ZEZScFkyc29ablZ1WTNScGIyNG9LWHNnZEdoeWIzY2daVHQ5S1RzZ2ZWeHVYRzVjZEM4cUtseHVYSFFnS2lCQWRIbHdaV1JsWmlCa1pXWmxjbkpsWkZ4dVhIUWdLaUJBY0hKdmNHVnlkSGtnZTNCeWIyMXBjMlY5SUhCeWIyMXBjMlZjYmx4MElDb2dRRzFsZEdodlpDQnlaWE52YkhabFhHNWNkQ0FxSUVCdFpYUm9iMlFnWm5Wc1ptbHNiRnh1WEhRZ0tpQkFiV1YwYUc5a0lISmxhbVZqZEZ4dVhIUWdLaTljYmx4dVhIUXZLaXBjYmx4MElDb2dRSFI1Y0dWa1pXWWdlMloxYm1OMGFXOXVmU0JtZFd4bWFXeHNaV1JjYmx4MElDb2dRSEJoY21GdElIc3FmU0IyWVd4MVpTQndjbTl0YVhObElISmxjMjlzZG1Wa0lIWmhiSFZsWEc1Y2RDQXFJRUJ5WlhSMWNtNXpJSHNxZlNCdVpYaDBJSEJ5YjIxcGMyVWdjbVZ6YjJ4MWRHbHZiaUIyWVd4MVpWeHVYSFFnS2k5Y2JseHVYSFF2S2lwY2JseDBJQ29nUUhSNWNHVmtaV1lnZTJaMWJtTjBhVzl1ZlNCbVlXbHNaV1JjYmx4MElDb2dRSEJoY21GdElIc3FmU0J5WldGemIyNGdjSEp2YldselpTQnlaV3BsWTNScGIyNGdjbVZoYzI5dVhHNWNkQ0FxSUVCeVpYUjFjbTV6SUhzcWZTQnVaWGgwSUhCeWIyMXBjMlVnY21WemIyeDFkR2x2YmlCMllXeDFaU0J2Y2lCeVpYUm9jbTkzSUhSb1pTQnlaV0Z6YjI1Y2JseDBJQ292WEc1Y2JseDBMeTh0TFNCa1pXWnBibWx1WnlCMWJtVnVZMnh2YzJWa0lIQnliMjFwYzJVZ2JXVjBhRzlrY3lBdExTOHZYRzVjZEM4cUtseHVYSFFnS2lCellXMWxJR0Z6SUhSb1pXNGdkMmwwYUc5MWRDQm1ZV2xzWldRZ1kyRnNiR0poWTJ0Y2JseDBJQ29nUUhCaGNtRnRJSHRtZFd4bWFXeHNaV1I5SUdaMWJHWnBiR3hsWkNCallXeHNZbUZqYTF4dVhIUWdLaUJBY21WMGRYSnVjeUI3Y0hKdmJXbHpaWDBnWVNCdVpYY2djSEp2YldselpWeHVYSFFnS2k5Y2JseDBablZ1WTNScGIyNGdjSEp2YldselpWOXpkV05qWlhOektHWjFiR1pwYkd4bFpDbDdJSEpsZEhWeWJpQjBhR2x6TG5Sb1pXNG9ablZzWm1sc2JHVmtMQ0IxYm1SbFppazdJSDFjYmx4dVhIUXZLaXBjYmx4MElDb2djMkZ0WlNCaGN5QjBhR1Z1SUhkcGRHZ2diMjVzZVNCaElHWmhhV3hsWkNCallXeHNZbUZqYTF4dVhIUWdLaUJBY0dGeVlXMGdlMlpoYVd4bFpIMGdabUZwYkdWa0lHTmhiR3hpWVdOclhHNWNkQ0FxSUVCeVpYUjFjbTV6SUh0d2NtOXRhWE5sZlNCaElHNWxkeUJ3Y205dGFYTmxYRzVjZENBcUwxeHVYSFJtZFc1amRHbHZiaUJ3Y205dGFYTmxYMlZ5Y205eUtHWmhhV3hsWkNsN0lISmxkSFZ5YmlCMGFHbHpMblJvWlc0b2RXNWtaV1lzSUdaaGFXeGxaQ2s3SUgxY2JseHVYRzVjZEM4cUtseHVYSFFnS2lCellXMWxJR0Z6SUhSb1pXNGdZblYwSUdaMWJHWnBiR3hsWkNCallXeHNZbUZqYXlCM2FXeHNJSEpsWTJWcGRtVWdiWFZzZEdsd2JHVWdjR0Z5WVcxbGRHVnljeUIzYUdWdUlIQnliMjFwYzJVZ2FYTWdablZzWm1sc2JHVmtJSGRwZEdnZ1lXNGdRWEp5WVhsY2JseDBJQ29nUUhCaGNtRnRJSHRtZFd4bWFXeHNaV1I5SUdaMWJHWnBiR3hsWkNCallXeHNZbUZqYTF4dVhIUWdLaUJBY0dGeVlXMGdlMlpoYVd4bFpIMGdabUZwYkdWa0lHTmhiR3hpWVdOclhHNWNkQ0FxSUVCeVpYUjFjbTV6SUh0d2NtOXRhWE5sZlNCaElHNWxkeUJ3Y205dGFYTmxYRzVjZENBcUwxeHVYSFJtZFc1amRHbHZiaUJ3Y205dGFYTmxYMkZ3Y0d4NUtHWjFiR1pwYkd4bFpDd2dabUZwYkdWa0tYdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NTBhR1Z1S0Z4dVhIUmNkRngwWm5WdVkzUnBiMjRvWVNsN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCcGMwWjFibU1vWm5Wc1ptbHNiR1ZrS1NBL0lHWjFiR1pwYkd4bFpDNWhjSEJzZVNodWRXeHNMQ0JwYzBGeWNtRjVLR0VwSUQ4Z1lTQTZJRnRoWFNrZ09pQW9aR1ZtWlhJdWIyNXNlVVoxYm1OeklEOGdZU0E2SUdaMWJHWnBiR3hsWkNrN1hHNWNkRngwWEhSOVhHNWNkRngwWEhRc0lHWmhhV3hsWkNCOGZDQjFibVJsWmx4dVhIUmNkQ2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1kyeGxZVzUxY0NCdFpYUm9iMlFnZDJocFkyZ2dkMmxzYkNCaVpTQmhiSGRoZVhNZ1pYaGxZM1YwWldRZ2NtVm5ZWEprYkdWemN5Qm1kV3htYVd4c2JXVnVkQ0J2Y2lCeVpXcGxZM1JwYjI1Y2JseDBJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnWTJJZ1lTQmpZV3hzWW1GamF5QmpZV3hzWldRZ2NtVm5ZWEprYkdWemN5QnZaaUIwYUdVZ1puVnNabWxzYkcxbGJuUWdiM0lnY21WcVpXTjBhVzl1SUc5bUlIUm9aU0J3Y205dGFYTmxJSGRvYVdOb0lIZHBiR3dnWW1VZ1kyRnNiR1ZrWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhkb1pXNGdkR2hsSUhCeWIyMXBjMlVnYVhNZ2JtOTBJSEJsYm1ScGJtY2dZVzU1Ylc5eVpWeHVYSFFnS2lCQWNtVjBkWEp1Y3lCN2NISnZiV2x6WlgwZ2RHaGxJSE5oYldVZ2NISnZiV2x6WlNCMWJuUnZkV05vWldSY2JseDBJQ292WEc1Y2RHWjFibU4wYVc5dUlIQnliMjFwYzJWZlpXNXpkWEpsS0dOaUtYdGNibHgwWEhSbWRXNWpkR2x2YmlCZlkySW9LWHNnWTJJb0tUc2dmVnh1WEhSY2RIUm9hWE11ZEdobGJpaGZZMklzSUY5allpazdYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTTdYRzVjZEgxY2JseHVYSFF2S2lwY2JseDBJQ29nZEdGclpTQmhJSE5wYm1kc1pTQmpZV3hzWW1GamF5QjNhR2xqYUNCM1lXbDBJR1p2Y2lCaGJpQmxjbkp2Y2lCaGN5Qm1hWEp6ZENCd1lYSmhiV1YwWlhJdUlHOTBhR1Z5SUhKbGMyOXNkWFJwYjI0Z2RtRnNkV1Z6SUdGeVpTQndZWE56WldRZ1lYTWdkMmwwYUNCMGFHVWdZWEJ3YkhrdmMzQnlaV0ZrSUcxbGRHaHZaRnh1WEhRZ0tpQkFjR0Z5WVcwZ2UyWjFibU4wYVc5dWZTQmpZaUJoSUdOaGJHeGlZV05ySUdOaGJHeGxaQ0J5WldkaGNtUnNaWE56SUc5bUlIUm9aU0JtZFd4bWFXeHNiV1Z1ZENCdmNpQnlaV3BsWTNScGIyNGdiMllnZEdobElIQnliMjFwYzJVZ2QyaHBZMmdnZDJsc2JDQmlaU0JqWVd4c1pXUmNibHgwSUNvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkMmhsYmlCMGFHVWdjSEp2YldselpTQnBjeUJ1YjNRZ2NHVnVaR2x1WnlCaGJubHRiM0psSUhkcGRHZ2daWEp5YjNJZ1lYTWdabWx5YzNRZ2NHRnlZVzFsZEdWeUlHbG1JR0Z1ZVNCaGN5QnBiaUJ1YjJSbElITjBlV3hsWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOaGJHeGlZV05yTGlCU1pYTjBJRzltSUhCaGNtRnRaWFJsY25NZ2QybHNiQ0JpWlNCaGNIQnNhV1ZrSUdGeklIZHBkR2dnZEdobElHRndjR3g1SUcxbGRHaHZaQzVjYmx4MElDb2dRSEpsZEhWeWJuTWdlM0J5YjIxcGMyVjlJR0VnYm1WM0lIQnliMjFwYzJWY2JseDBJQ292WEc1Y2RHWjFibU4wYVc5dUlIQnliMjFwYzJWZmJtOWthV1o1S0dOaUtYdGNibHgwWEhSeVpYUjFjbTRnZEdocGN5NTBhR1Z1S0Z4dVhIUmNkRngwWm5WdVkzUnBiMjRvWVNsN1hHNWNkRngwWEhSY2RISmxkSFZ5YmlCcGMwWjFibU1vWTJJcElEOGdZMkl1WVhCd2JIa29iblZzYkN3Z2FYTkJjbkpoZVNoaEtTQS9JR0V1YzNCc2FXTmxLREFzTUN4MWJtUmxabWx1WldRcElDWW1JR0VnT2lCYmRXNWtaV1pwYm1Wa0xHRmRLU0E2SUNoa1pXWmxjaTV2Ym14NVJuVnVZM01nUHlCaElEb2dZMklwTzF4dVhIUmNkRngwZlZ4dVhIUmNkRngwTENCbWRXNWpkR2x2YmlobEtYdGNibHgwWEhSY2RGeDBjbVYwZFhKdUlHTmlLR1VwTzF4dVhIUmNkRngwZlZ4dVhIUmNkQ2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNwY2JseDBJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnVzJaaGFXeGxaRjBnZDJsMGFHOTFkQ0J3WVhKaGJXVjBaWElnZDJsc2JDQnZibXg1SUhKbGRHaHliM2NnY0hKdmJXbHpaU0J5WldwbFkzUnBiMjRnY21WaGMyOXVJRzkxZEhOcFpHVWdiMllnZEdobElIQnliMjFwYzJVZ2JHbGljbUZ5ZVNCdmJpQnVaWGgwSUhScFkydGNibHgwSUNvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdjR0Z6YzJWa0lHRWdabUZwYkdWa0lHMWxkR2h2WkNCMGFHVnVJSGRwYkd3Z1kyRnNiQ0JtWVdsc1pXUWdiMjRnY21WcVpXTjBhVzl1SUdGdVpDQjBhSEp2ZHlCMGFHVWdaWEp5YjNJZ1lXZGhhVzRnYVdZZ1ptRnBiR1ZrSUdScFpHNG5kRnh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdjSEp2YldselpYMGdZU0J1WlhjZ2NISnZiV2x6WlZ4dVhIUWdLaTljYmx4MFpuVnVZM1JwYjI0Z2NISnZiV2x6WlY5eVpYUm9jbTkzS0daaGFXeGxaQ2w3WEc1Y2RGeDBjbVYwZFhKdUlIUm9hWE11ZEdobGJpaGNibHgwWEhSY2RIVnVaR1ZtWEc1Y2RGeDBYSFFzSUdaaGFXeGxaQ0EvSUdaMWJtTjBhVzl1S0dVcGV5Qm1ZV2xzWldRb1pTazdJSFJvY205M0lHVTdJSDBnT2lCeVpYUm9jbTkzWEc1Y2RGeDBLVHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFxSUVCd1lYSmhiU0I3WW05dmJHVmhibjBnVzJGc2QyRjVjMEZ6ZVc1alhTQnBaaUJ6WlhRZ1ptOXlZMlVnZEdobElHRnplVzVqSUhKbGMyOXNkWFJwYjI0Z1ptOXlJSFJvYVhNZ2NISnZiV2x6WlNCcGJtUmxjR1Z1WkdGdWRHeDVJRzltSUhSb1pTQkVMbUZzZDJGNWMwRnplVzVqSUc5d2RHbHZibHh1WEhRcUlFQnlaWFIxY201eklIdGtaV1psY25KbFpIMGdaR1ZtWlhKbFpDQnZZbXBsWTNRZ2QybDBhQ0J3Y205d1pYSjBlU0FuY0hKdmJXbHpaU2NnWVc1a0lHMWxkR2h2WkhNZ2NtVnFaV04wTEdaMWJHWnBiR3dzY21WemIyeDJaU0FvWm5Wc1ptbHNiQ0JpWldsdVp5QmhiaUJoYkdsaGN5Qm1iM0lnY21WemIyeDJaU2xjYmx4MEtpOWNibHgwZG1GeUlHUmxabVZ5SUQwZ1puVnVZM1JwYjI0Z0tHRnNkMkY1YzBGemVXNWpLWHRjYmx4MFhIUjJZWElnWVd4M1lYbHpRWE41Ym1OR2JpQTlJQ2gxYm1SbFppQWhQVDBnWVd4M1lYbHpRWE41Ym1NZ1B5QmhiSGRoZVhOQmMzbHVZeUE2SUdSbFptVnlMbUZzZDJGNWMwRnplVzVqS1NBL0lHNWxlSFJVYVdOcklEb2dablZ1WTNScGIyNG9abTRwZTJadUtDazdmVnh1WEhSY2RGeDBMQ0J6ZEdGMGRYTWdQU0F3SUM4dklDMHhJR1poYVd4bFpDQjhJREVnWm5Wc1ptbHNiR1ZrWEc1Y2RGeDBYSFFzSUhCbGJtUnBibWR6SUQwZ1cxMWNibHgwWEhSY2RDd2dkbUZzZFdWY2JseDBYSFJjZEM4cUtseHVYSFJjZEZ4MElDb2dRSFI1Y0dWa1pXWWdjSEp2YldselpWeHVYSFJjZEZ4MElDb3ZYRzVjZEZ4MFhIUXNJRjl3Y205dGFYTmxJQ0E5SUh0Y2JseDBYSFJjZEZ4MEx5b3FYRzVjZEZ4MFhIUmNkQ0FxSUVCd1lYSmhiU0I3Wm5Wc1ptbHNiR1ZrZkdaMWJtTjBhVzl1ZlNCbWRXeG1hV3hzWldRZ1kyRnNiR0poWTJ0Y2JseDBYSFJjZEZ4MElDb2dRSEJoY21GdElIdG1ZV2xzWldSOFpuVnVZM1JwYjI1OUlHWmhhV3hsWkNCallXeHNZbUZqYTF4dVhIUmNkRngwWEhRZ0tpQkFjbVYwZFhKdWN5QjdjSEp2YldselpYMGdZU0J1WlhjZ2NISnZiV2x6WlZ4dVhIUmNkRngwWEhRZ0tpOWNibHgwWEhSY2RGeDBkR2hsYmpvZ1puVnVZM1JwYjI0b1puVnNabWxzYkdWa0xDQm1ZV2xzWldRcGUxeHVYSFJjZEZ4MFhIUmNkSFpoY2lCa0lEMGdaR1ZtWlhJb0tUdGNibHgwWEhSY2RGeDBYSFJ3Wlc1a2FXNW5jeTV3ZFhOb0tGdGNibHgwWEhSY2RGeDBYSFJjZEdaMWJtTjBhVzl1S0haaGJIVmxLWHRjYmx4MFhIUmNkRngwWEhSY2RGeDBkSEo1ZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJjZEdsbUtDQnBjMDV2ZEZaaGJDaG1kV3htYVd4c1pXUXBLWHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEdRdWNtVnpiMngyWlNoMllXeDFaU2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkRngwZlNCbGJITmxJSHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEdRdWNtVnpiMngyWlNocGMwWjFibU1vWm5Wc1ptbHNiR1ZrS1NBL0lHWjFiR1pwYkd4bFpDaDJZV3gxWlNrZ09pQW9aR1ZtWlhJdWIyNXNlVVoxYm1OeklEOGdkbUZzZFdVZ09pQm1kV3htYVd4c1pXUXBLVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSDFqWVhSamFDaGxLWHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJrTG5KbGFtVmpkQ2hsS1R0Y2JseDBYSFJjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MExDQm1kVzVqZEdsdmJpaGxjbklwZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJwWmlBb0lHbHpUbTkwVm1Gc0tHWmhhV3hsWkNrZ2ZId2dLQ2doYVhOR2RXNWpLR1poYVd4bFpDa3BJQ1ltSUdSbFptVnlMbTl1YkhsR2RXNWpjeWtnS1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFpDNXlaV3BsWTNRb1pYSnlLVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFJjZEZ4MFhIUnBaaUFvSUdaaGFXeGxaQ0FwSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSMGNubDdJR1F1Y21WemIyeDJaU2hwYzBaMWJtTW9abUZwYkdWa0tTQS9JR1poYVd4bFpDaGxjbklwSURvZ1ptRnBiR1ZrS1RzZ2ZXTmhkR05vS0dVcGV5QmtMbkpsYW1WamRDaGxLVHQ5WEc1Y2RGeDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBYSFJkS1R0Y2JseDBYSFJjZEZ4MFhIUnpkR0YwZFhNZ0lUMDlJREFnSmlZZ1lXeDNZWGx6UVhONWJtTkdiaWhsZUdWalEyRnNiR0poWTJ0ektUdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdaQzV3Y205dGFYTmxPMXh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MExDQnpkV05qWlhOek9pQndjbTl0YVhObFgzTjFZMk5sYzNOY2JseHVYSFJjZEZ4MFhIUXNJR1Z5Y205eU9pQndjbTl0YVhObFgyVnljbTl5WEc1Y2RGeDBYSFJjZEN3Z2IzUm9aWEozYVhObE9pQndjbTl0YVhObFgyVnljbTl5WEc1Y2JseDBYSFJjZEZ4MExDQmhjSEJzZVRvZ2NISnZiV2x6WlY5aGNIQnNlVnh1WEhSY2RGeDBYSFFzSUhOd2NtVmhaRG9nY0hKdmJXbHpaVjloY0hCc2VWeHVYRzVjZEZ4MFhIUmNkQ3dnWlc1emRYSmxPaUJ3Y205dGFYTmxYMlZ1YzNWeVpWeHVYRzVjZEZ4MFhIUmNkQ3dnYm05a2FXWjVPaUJ3Y205dGFYTmxYMjV2WkdsbWVWeHVYRzVjZEZ4MFhIUmNkQ3dnY21WMGFISnZkem9nY0hKdmJXbHpaVjl5WlhSb2NtOTNYRzVjYmx4MFhIUmNkRngwTENCcGMxQmxibVJwYm1jNklHWjFibU4wYVc5dUtDbDdJSEpsZEhWeWJpQWhJU2h6ZEdGMGRYTWdQVDA5SURBcE95QjlYRzVjYmx4MFhIUmNkRngwTENCblpYUlRkR0YwZFhNNklHWjFibU4wYVc5dUtDbDdJSEpsZEhWeWJpQnpkR0YwZFhNN0lIMWNibHgwWEhSY2RIMWNibHgwWEhRN1hHNWNkRngwWDNCeWIyMXBjMlV1ZEc5VGIzVnlZMlVnUFNCZmNISnZiV2x6WlM1MGIxTjBjbWx1WnlBOUlGOXdjbTl0YVhObExuWmhiSFZsVDJZZ1BTQm1kVzVqZEdsdmJpZ3BlM0psZEhWeWJpQjJZV3gxWlNBOVBUMGdkVzVrWldZZ1B5QjBhR2x6SURvZ2RtRnNkV1U3SUgwN1hHNWNibHh1WEhSY2RHWjFibU4wYVc5dUlHVjRaV05EWVd4c1ltRmphM01vS1h0Y2JseDBYSFJjZEdsbUlDZ2djM1JoZEhWeklEMDlQU0F3SUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200N1hHNWNkRngwWEhSOVhHNWNkRngwWEhSMllYSWdZMkp6SUQwZ2NHVnVaR2x1WjNNc0lHa2dQU0F3TENCc0lEMGdZMkp6TG14bGJtZDBhQ3dnWTJKSmJtUmxlQ0E5SUg1emRHRjBkWE1nUHlBd0lEb2dNU3dnWTJJN1hHNWNkRngwWEhSd1pXNWthVzVuY3lBOUlGdGRPMXh1WEhSY2RGeDBabTl5S0NBN0lHa2dQQ0JzT3lCcEt5c2dLWHRjYmx4MFhIUmNkRngwS0dOaUlEMGdZMkp6VzJsZFcyTmlTVzVrWlhoZEtTQW1KaUJqWWloMllXeDFaU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nWm5Wc1ptbHNiQ0JrWldabGNuSmxaQ0IzYVhSb0lHZHBkbVZ1SUhaaGJIVmxYRzVjZEZ4MElDb2dRSEJoY21GdElIc3FmU0IyWVd4Y2JseDBYSFFnS2lCQWNtVjBkWEp1Y3lCN1pHVm1aWEp5WldSOUlIUm9hWE1nWm05eUlHMWxkR2h2WkNCamFHRnBibWx1WjF4dVhIUmNkQ0FxTDF4dVhIUmNkR1oxYm1OMGFXOXVJRjl5WlhOdmJIWmxLSFpoYkNsN1hHNWNkRngwWEhSMllYSWdaRzl1WlNBOUlHWmhiSE5sTzF4dVhIUmNkRngwWm5WdVkzUnBiMjRnYjI1alpTaG1LWHRjYmx4MFhIUmNkRngwY21WMGRYSnVJR1oxYm1OMGFXOXVLSGdwZTF4dVhIUmNkRngwWEhSY2RHbG1JQ2hrYjI1bEtTQjdYRzVjZEZ4MFhIUmNkRngwWEhSeVpYUjFjbTRnZFc1a1pXWnBibVZrTzF4dVhIUmNkRngwWEhSY2RIMGdaV3h6WlNCN1hHNWNkRngwWEhSY2RGeDBYSFJrYjI1bElEMGdkSEoxWlR0Y2JseDBYSFJjZEZ4MFhIUmNkSEpsZEhWeWJpQm1LSGdwTzF4dVhIUmNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBmVHRjYmx4MFhIUmNkSDFjYmx4MFhIUmNkR2xtSUNnZ2MzUmhkSFZ6SUNrZ2UxeHVYSFJjZEZ4MFhIUnlaWFIxY200Z2RHaHBjenRjYmx4MFhIUmNkSDFjYmx4MFhIUmNkSFJ5ZVNCN1hHNWNkRngwWEhSY2RIWmhjaUIwYUdWdUlEMGdhWE5QWW1wUGNrWjFibU1vZG1Gc0tTQW1KaUIyWVd3dWRHaGxianRjYmx4MFhIUmNkRngwYVdZZ0tDQnBjMFoxYm1Nb2RHaGxiaWtnS1NCN0lDOHZJRzFoYm1GbmFXNW5JR0VnY0hKdmJXbHpaVnh1WEhSY2RGeDBYSFJjZEdsbUtDQjJZV3dnUFQwOUlGOXdjbTl0YVhObElDbDdYRzVjZEZ4MFhIUmNkRngwWEhSMGFISnZkeUJ1WlhjZ2RFVnljaWhjSWxCeWIyMXBjMlVnWTJGdUozUWdjbVZ6YjJ4MlpTQnBkSE5sYkdaY0lpazdYRzVjZEZ4MFhIUmNkRngwZlZ4dVhIUmNkRngwWEhSY2RIUm9aVzR1WTJGc2JDaDJZV3dzSUc5dVkyVW9YM0psYzI5c2RtVXBMQ0J2Ym1ObEtGOXlaV3BsWTNRcEtUdGNibHgwWEhSY2RGeDBYSFJ5WlhSMWNtNGdkR2hwY3p0Y2JseDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MGZTQmpZWFJqYUNBb1pTa2dlMXh1WEhSY2RGeDBYSFJ2Ym1ObEtGOXlaV3BsWTNRcEtHVXBPMXh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdkR2hwY3p0Y2JseDBYSFJjZEgxY2JseDBYSFJjZEdGc2QyRjVjMEZ6ZVc1alJtNG9ablZ1WTNScGIyNG9LWHRjYmx4MFhIUmNkRngwZG1Gc2RXVWdQU0IyWVd3N1hHNWNkRngwWEhSY2RITjBZWFIxY3lBOUlERTdYRzVjZEZ4MFhIUmNkR1Y0WldORFlXeHNZbUZqYTNNb0tUdGNibHgwWEhSY2RIMHBPMXh1WEhSY2RGeDBjbVYwZFhKdUlIUm9hWE03WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeW9xWEc1Y2RGeDBJQ29nY21WcVpXTjBJR1JsWm1WeWNtVmtJSGRwZEdnZ1oybDJaVzRnY21WaGMyOXVYRzVjZEZ4MElDb2dRSEJoY21GdElIc3FmU0JGY25KY2JseDBYSFFnS2lCQWNtVjBkWEp1Y3lCN1pHVm1aWEp5WldSOUlIUm9hWE1nWm05eUlHMWxkR2h2WkNCamFHRnBibWx1WjF4dVhIUmNkQ0FxTDF4dVhIUmNkR1oxYm1OMGFXOXVJRjl5WldwbFkzUW9SWEp5S1h0Y2JseDBYSFJjZEhOMFlYUjFjeUI4ZkNCaGJIZGhlWE5CYzNsdVkwWnVLR1oxYm1OMGFXOXVLQ2w3WEc1Y2RGeDBYSFJjZEhSeWVYc2dkR2h5YjNjb1JYSnlLVHNnZldOaGRHTm9LR1VwZXlCMllXeDFaU0E5SUdVN0lIMWNibHgwWEhSY2RGeDBjM1JoZEhWeklEMGdMVEU3WEc1Y2RGeDBYSFJjZEdWNFpXTkRZV3hzWW1GamEzTW9LVHRjYmx4MFhIUmNkSDBwTzF4dVhIUmNkRngwY21WMGRYSnVJSFJvYVhNN1hHNWNkRngwZlZ4dVhIUmNkSEpsZEhWeWJpQXZLaXBBZEhsd1pTQmtaV1psY25KbFpDQXFMeUI3WEc1Y2RGeDBYSFJ3Y205dGFYTmxPbDl3Y205dGFYTmxYRzVjZEZ4MFhIUXNjbVZ6YjJ4MlpUcGZjbVZ6YjJ4MlpWeHVYSFJjZEZ4MExHWjFiR1pwYkd3NlgzSmxjMjlzZG1VZ0x5OGdZV3hwWVhOY2JseDBYSFJjZEN4eVpXcGxZM1E2WDNKbGFtVmpkRnh1WEhSY2RIMDdYRzVjZEgwN1hHNWNibHgwWkdWbVpYSXVaR1ZtWlhKeVpXUWdQU0JrWldabGNpNWtaV1psY2lBOUlHUmxabVZ5TzF4dVhIUmtaV1psY2k1dVpYaDBWR2xqYXlBOUlHNWxlSFJVYVdOck8xeHVYSFJrWldabGNpNWhiSGRoZVhOQmMzbHVZeUE5SUhSeWRXVTdJQzh2SUhObGRIUnBibWNnZEdocGN5QjNhV3hzSUdOb1lXNW5aU0JrWldaaGRXeDBJR0psYUdGMmFXOTFjaTRnZFhObElHbDBJRzl1YkhrZ2FXWWdibVZqWlhOellYSjVJR0Z6SUdGemVXNWphSEp2Ym1samFYUjVJSGRwYkd3Z1ptOXlZMlVnYzI5dFpTQmtaV3hoZVNCaVpYUjNaV1Z1SUhsdmRYSWdjSEp2YldselpTQnlaWE52YkhWMGFXOXVjeUJoYm1RZ2FYTWdibTkwSUdGc2QyRjVjeUIzYUdGMElIbHZkU0IzWVc1MExseHVYSFF2S2lwY2JseDBLaUJ6WlhSMGFXNW5JRzl1YkhsR2RXNWpjeUIwYnlCbVlXeHpaU0IzYVd4c0lHSnlaV0ZySUhCeWIyMXBjMlZ6TDBFcklHTnZibVp2Y20xcGRIa2dZbmtnWVd4c2IzZHBibWNnZVc5MUlIUnZJSEJoYzNNZ2JtOXVJSFZ1WkdWbWFXNWxaQzl1ZFd4c0lIWmhiSFZsY3lCcGJuTjBaV0ZrSUc5bUlHTmhiR3hpWVdOcmMxeHVYSFFxSUdsdWMzUmxZV1FnYjJZZ2FuVnpkQ0JwWjI1dmNtbHVaeUJoYm5rZ2JtOXVJR1oxYm1OMGFXOXVJSEJoY21GdFpYUmxjbk1nZEc4Z2RHaGxiaXh6ZFdOalpYTnpMR1Z5Y205eUxpNHVJR2wwSUhkcGJHd2dZV05qWlhCMElHNXZiaUJ1ZFd4c2ZIVnVaR1ZtYVc1bFpDQjJZV3gxWlhNdVhHNWNkQ29nZEdocGN5QjNhV3hzSUdGc2JHOTNJSGx2ZFNCemFHOXlkR04xZEhNZ2JHbHJaU0J3Y205dGFYTmxMblJvWlc0b0ozWmhiQ2NzSjJoaGJtUnNaV1FnWlhKeWIzSW5KeWxjYmx4MEtpQjBieUJpWlNCbGNYVnBkbUZzWlc1MElHOW1JSEJ5YjIxcGMyVXVkR2hsYmlobWRXNWpkR2x2YmlncGV5QnlaWFIxY200Z0ozWmhiQ2M3ZlN4bWRXNWpkR2x2YmlncGV5QnlaWFIxY200Z0oyaGhibVJzWldRZ1pYSnliM0luZlNsY2JseDBLaTljYmx4MFpHVm1aWEl1YjI1c2VVWjFibU56SUQwZ2RISjFaVHRjYmx4dVhIUXZLaXBjYmx4MElDb2djbVYwZFhKdUlHRWdablZzWm1sc2JHVmtJSEJ5YjIxcGMyVWdiMllnWjJsMlpXNGdkbUZzZFdVZ0tHRnNkMkY1Y3lCaGMzbHVZeUJ5WlhOdmJIVjBhVzl1S1Z4dVhIUWdLaUJBY0dGeVlXMGdleXA5SUhaaGJIVmxYRzVjZENBcUlFQnlaWFIxY201eklIdHdjbTl0YVhObGZWeHVYSFFnS2k5Y2JseDBaR1ZtWlhJdWNtVnpiMngyWldRZ1BTQmtaV1psY2k1bWRXeG1hV3hzWldRZ1BTQm1kVzVqZEdsdmJpaDJZV3gxWlNsN0lISmxkSFZ5YmlCa1pXWmxjaWgwY25WbEtTNXlaWE52YkhabEtIWmhiSFZsS1M1d2NtOXRhWE5sT3lCOU8xeHVYRzVjZEM4cUtseHVYSFFnS2lCeVpYUjFjbTRnWVNCeVpXcGxZM1JsWkNCd2NtOXRhWE5sSUhkcGRHZ2daMmwyWlc0Z2NtVmhjMjl1SUc5bUlISmxhbVZqZEdsdmJpQW9ZV3gzWVhseklHRnplVzVqSUhKbGFtVmpkR2x2YmlsY2JseDBJQ29nUUhCaGNtRnRJSHNxZlNCeVpXRnpiMjVjYmx4MElDb2dRSEpsZEhWeWJuTWdlM0J5YjIxcGMyVjlYRzVjZENBcUwxeHVYSFJrWldabGNpNXlaV3BsWTNSbFpDQTlJR1oxYm1OMGFXOXVLSEpsWVhOdmJpbDdJSEpsZEhWeWJpQmtaV1psY2loMGNuVmxLUzV5WldwbFkzUW9jbVZoYzI5dUtTNXdjbTl0YVhObE95QjlPMXh1WEc1Y2RDOHFLbHh1WEhRZ0tpQnlaWFIxY200Z1lTQndjbTl0YVhObElIZHBkR2dnYm04Z2NtVnpiMngxZEdsdmJpQjJZV3gxWlNCM2FHbGphQ0IzYVd4c0lHSmxJSEpsYzI5c2RtVmtJR2x1SUhScGJXVWdiWE1nS0hWemFXNW5JSE5sZEZScGJXVnZkWFFwWEc1Y2RDQXFJRUJ3WVhKaGJTQjdhVzUwZlNCYmRHbHRaVjBnYVc0Z2JYTWdaR1ZtWVhWc2RDQjBieUF3WEc1Y2RDQXFJRUJ5WlhSMWNtNXpJSHR3Y205dGFYTmxmVnh1WEhRZ0tpOWNibHgwWkdWbVpYSXVkMkZwZENBOUlHWjFibU4wYVc5dUtIUnBiV1VwZTF4dVhIUmNkSFpoY2lCa0lEMGdaR1ZtWlhJb0tUdGNibHgwWEhSelpYUlVhVzFsYjNWMEtHUXVjbVZ6YjJ4MlpTd2dkR2x0WlNCOGZDQXdLVHRjYmx4MFhIUnlaWFIxY200Z1pDNXdjbTl0YVhObE8xeHVYSFI5TzF4dVhHNWNkQzhxS2x4dVhIUWdLaUJ5WlhSMWNtNGdZU0J3Y205dGFYTmxJR1p2Y2lCMGFHVWdjbVYwZFhKdUlIWmhiSFZsSUc5bUlHWjFibU4wYVc5dUlHTmhiR3dnZDJocFkyZ2dkMmxzYkNCaVpTQm1kV3htYVd4c1pXUWdhVzRnWkdWc1lYa2diWE1nYjNJZ2NtVnFaV04wWldRZ2FXWWdaMmwyWlc0Z1ptNGdkR2h5YjNjZ1lXNGdaWEp5YjNKY2JseDBJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnWm01Y2JseDBJQ29nUUhCaGNtRnRJSHRwYm5SOUlGdGtaV3hoZVYwZ2FXNGdiWE1nWkdWbVlYVnNkQ0IwYnlBd1hHNWNkQ0FxSUVCeVpYUjFjbTV6SUh0d2NtOXRhWE5sZlZ4dVhIUWdLaTljYmx4MFpHVm1aWEl1WkdWc1lYa2dQU0JtZFc1amRHbHZiaWhtYml3Z1pHVnNZWGtwZTF4dVhIUmNkSFpoY2lCa0lEMGdaR1ZtWlhJb0tUdGNibHgwWEhSelpYUlVhVzFsYjNWMEtHWjFibU4wYVc5dUtDbDdJSFJ5ZVhzZ1pDNXlaWE52YkhabEtHWnVMbUZ3Y0d4NUtHNTFiR3dwS1RzZ2ZXTmhkR05vS0dVcGV5QmtMbkpsYW1WamRDaGxLVHNnZlNCOUxDQmtaV3hoZVNCOGZDQXdLVHRjYmx4MFhIUnlaWFIxY200Z1pDNXdjbTl0YVhObE8xeHVYSFI5TzF4dVhHNWNkQzhxS2x4dVhIUWdLaUJwWmlCbmFYWmxiaUIyWVd4MVpTQnBjeUJ1YjNRZ1lTQndjbTl0YVhObElISmxkSFZ5YmlCaElHWjFiR1pwYkd4bFpDQndjbTl0YVhObElISmxjMjlzZG1Wa0lIUnZJR2RwZG1WdUlIWmhiSFZsWEc1Y2RDQXFJRUJ3WVhKaGJTQjdLbjBnY0hKdmJXbHpaU0JoSUhaaGJIVmxJRzl5SUdFZ2NISnZiV2x6WlZ4dVhIUWdLaUJBY21WMGRYSnVjeUI3Y0hKdmJXbHpaWDFjYmx4MElDb3ZYRzVjZEdSbFptVnlMbkJ5YjIxcGMybG1lU0E5SUdaMWJtTjBhVzl1S0hCeWIyMXBjMlVwZTF4dVhIUmNkR2xtSUNnZ2NISnZiV2x6WlNBbUppQnBjMFoxYm1Nb2NISnZiV2x6WlM1MGFHVnVLU0FwSUhzZ2NtVjBkWEp1SUhCeWIyMXBjMlU3ZlZ4dVhIUmNkSEpsZEhWeWJpQmtaV1psY2k1eVpYTnZiSFpsWkNod2NtOXRhWE5sS1R0Y2JseDBmVHRjYmx4dVhIUm1kVzVqZEdsdmJpQnRkV3gwYVZCeWIyMXBjMlZTWlhOdmJIWmxjaWhqWVd4c1pYSkJjbWQxYldWdWRITXNJSEpsZEhWeWJsQnliMjFwYzJWektYdGNibHgwWEhSMllYSWdjSEp2YldselpYTWdQU0J6YkdsalpTaGpZV3hzWlhKQmNtZDFiV1Z1ZEhNcE8xeHVYSFJjZEdsbUlDZ2djSEp2YldselpYTXViR1Z1WjNSb0lEMDlQU0F4SUNZbUlHbHpRWEp5WVhrb2NISnZiV2x6WlhOYk1GMHBJQ2tnZTF4dVhIUmNkRngwYVdZb0lTQndjbTl0YVhObGMxc3dYUzVzWlc1bmRHZ2dLWHRjYmx4MFhIUmNkRngwY21WMGRYSnVJR1JsWm1WeUxtWjFiR1pwYkd4bFpDaGJYU2s3WEc1Y2RGeDBYSFI5WEc1Y2RGeDBYSFJ3Y205dGFYTmxjeUE5SUhCeWIyMXBjMlZ6V3pCZE8xeHVYSFJjZEgxY2JseDBYSFIyWVhJZ1lYSm5jeUE5SUZ0ZFhHNWNkRngwWEhRc0lHUWdQU0JrWldabGNpZ3BYRzVjZEZ4MFhIUXNJR01nUFNCd2NtOXRhWE5sY3k1c1pXNW5kR2hjYmx4MFhIUTdYRzVjZEZ4MGFXWWdLQ0FoWXlBcElIdGNibHgwWEhSY2RHUXVjbVZ6YjJ4MlpTaGhjbWR6S1R0Y2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBkbUZ5SUhKbGMyOXNkbVZ5SUQwZ1puVnVZM1JwYjI0b2FTbDdYRzVjZEZ4MFhIUmNkSEJ5YjIxcGMyVnpXMmxkSUQwZ1pHVm1aWEl1Y0hKdmJXbHphV1o1S0hCeWIyMXBjMlZ6VzJsZEtUdGNibHgwWEhSY2RGeDBjSEp2YldselpYTmJhVjB1ZEdobGJpaGNibHgwWEhSY2RGeDBYSFJtZFc1amRHbHZiaWgyS1h0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtSUNnaElDaHBJR2x1SUdGeVozTXBJQ2tnZXlBdkwwQjBiMlJ2SUdOb1pXTnJJSFJvYVhNZ2FYTWdjM1JwYkd3Z2NtVnhkV2x5WldRZ1lYTWdjSEp2YldselpYTWdZMkZ1SjNRZ1ltVWdjbVZ6YjJ4MlpTQnRiM0psSUhSb1lXNGdiMjVqWlZ4dVhIUmNkRngwWEhSY2RGeDBYSFJoY21kelcybGRJRDBnY21WMGRYSnVVSEp2YldselpYTWdQeUJ3Y205dGFYTmxjMXRwWFNBNklIWTdYRzVjZEZ4MFhIUmNkRngwWEhSY2RDZ3RMV01wSUh4OElHUXVjbVZ6YjJ4MlpTaGhjbWR6S1R0Y2JseDBYSFJjZEZ4MFhIUmNkSDFjYmx4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBMQ0JtZFc1amRHbHZiaWhsS1h0Y2JseDBYSFJjZEZ4MFhIUmNkR2xtS0NFZ0tHa2dhVzRnWVhKbmN5a2dLWHRjYmx4MFhIUmNkRngwWEhSY2RGeDBhV1lvSUNFZ2NtVjBkWEp1VUhKdmJXbHpaWE1nS1h0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSa0xuSmxhbVZqZENobEtUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSaGNtZHpXMmxkSUQwZ2NISnZiV2x6WlhOYmFWMDdYRzVjZEZ4MFhIUmNkRngwWEhSY2RGeDBLQzB0WXlrZ2ZId2daQzV5WlhOdmJIWmxLR0Z5WjNNcE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSOVhHNWNkRngwWEhSY2RGeDBYSFI5WEc1Y2RGeDBYSFJjZEZ4MGZWeHVYSFJjZEZ4MFhIUXBPMXh1WEhSY2RGeDBmVHRjYmx4MFhIUmNkR1p2Y2lnZ2RtRnlJR2tnUFNBd0xDQnNJRDBnWXpzZ2FTQThJR3c3SUdrckt5QXBlMXh1WEhSY2RGeDBYSFJ5WlhOdmJIWmxjaWhwS1R0Y2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RGeDBjbVYwZFhKdUlHUXVjSEp2YldselpUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJ5WlhSMWNtNGdZU0J3Y205dGFYTmxJR1p2Y2lCaGJHd2daMmwyWlc0Z2NISnZiV2x6WlhNZ0x5QjJZV3gxWlhNdVhHNWNkQ0FxSUhSb1pTQnlaWFIxY201bFpDQndjbTl0YVhObGN5QjNhV3hzSUdKbElHWjFiR1pwYkd4bFpDQjNhWFJvSUdFZ2JHbHpkQ0J2WmlCeVpYTnZiSFpsWkNCMllXeDFaUzVjYmx4MElDb2dhV1lnWVc1NUlHZHBkbVZ1SUhCeWIyMXBjMlVnYVhNZ2NtVnFaV04wWldRZ2RHaGxiaUJ2YmlCMGFHVWdabWx5YzNRZ2NtVnFaV04wYVc5dUlIUm9aU0J5WlhSMWNtNWxaQ0J3Y205dGFYTmxaQ0IzYVd4c0lHSmxJSEpsYW1WamRHVmtJSGRwZEdnZ2RHaGxJSE5oYldVZ2NtVmhjMjl1WEc1Y2RDQXFJRUJ3WVhKaGJTQjdZWEp5WVhsOExpNHVLbjBnVzNCeWIyMXBjMlZkSUdOaGJpQmlaU0JoSUhOcGJtZHNaU0JoY25KaGVTQnZaaUJ3Y205dGFYTmxMM1poYkhWbGN5QmhjeUJtYVhKemRDQndZWEpoYldWMFpYSWdiM0lnWVNCc2FYTjBJRzltSUdScGNtVmpkQ0J3WVhKaGJXVjBaWEp6SUhCeWIyMXBjMlV2ZG1Gc2RXVmNibHgwSUNvZ1FISmxkSFZ5Ym5NZ2UzQnliMjFwYzJWOUlHOW1JR0VnYkdsemRDQnZaaUJuYVhabGJpQndjbTl0YVhObElISmxjMjlzZFhScGIyNGdkbUZzZFdWY2JseDBJQ292WEc1Y2RHUmxabVZ5TG1Gc2JDQTlJR1oxYm1OMGFXOXVLQ2w3SUhKbGRIVnliaUJ0ZFd4MGFWQnliMjFwYzJWU1pYTnZiSFpsY2loaGNtZDFiV1Z1ZEhNc1ptRnNjMlVwT3lCOU8xeHVYRzVjZEM4cUtseHVYSFFnS2lCeVpYUjFjbTRnWVc0Z1lXeDNZWGx6SUdaMWJHWnBiR3hsWkNCd2NtOXRhWE5sSUc5bUlHRnljbUY1UEhCeWIyMXBjMlUrSUd4cGMzUWdiMllnY0hKdmJXbHpaWE12ZG1Gc2RXVnpJSEpsWjJGeVpHeGxjM01nZEdobGVTQnlaWE52YkhabElHWjFiR1pwYkd4bFpDQnZjaUJ5WldwbFkzUmxaRnh1WEhRZ0tpQkFjR0Z5WVcwZ2UyRnljbUY1ZkM0dUxpcDlJRnR3Y205dGFYTmxYU0JqWVc0Z1ltVWdZU0J6YVc1bmJHVWdZWEp5WVhrZ2IyWWdjSEp2YldselpTOTJZV3gxWlhNZ1lYTWdabWx5YzNRZ2NHRnlZVzFsZEdWeUlHOXlJR0VnYkdsemRDQnZaaUJrYVhKbFkzUWdjR0Z5WVcxbGRHVnljeUJ3Y205dGFYTmxMM1poYkhWbFhHNWNkQ0FxSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0tHNXZiaUJ3Y205dGFYTmxJSFpoYkhWbGN5QjNhV3hzSUdKbElIQnliMjFwYzJsbWFXVmtLVnh1WEhRZ0tpQkFjbVYwZFhKdWN5QjdjSEp2YldselpYMGdiMllnZEdobElHeHBjM1FnYjJZZ1oybDJaVzRnY0hKdmJXbHpaWE5jYmx4MElDb3ZYRzVjZEdSbFptVnlMbkpsYzI5c2RtVkJiR3dnUFNCbWRXNWpkR2x2YmlncGV5QnlaWFIxY200Z2JYVnNkR2xRY205dGFYTmxVbVZ6YjJ4MlpYSW9ZWEpuZFcxbGJuUnpMSFJ5ZFdVcE95QjlPMXh1WEc1Y2RDOHFLbHh1WEhRZ0tpQjBjbUZ1YzJadmNtMGdZU0IwZVhCcFkyRnNJRzV2WkdWcWN5QmhjM2x1WXlCdFpYUm9iMlFnWVhkaGFYUnBibWNnWVNCallXeHNZbUZqYXlCaGN5QnNZWE4wSUhCaGNtRnRaWFJsY2l3Z2NtVmpaV2wyYVc1bklHVnljbTl5SUdGeklHWnBjbk4wSUhCaGNtRnRaWFJsY2lCMGJ5QmhJR1oxYm1OMGFXOXVJSFJvWVhSY2JseDBJQ29nZDJsc2JDQnlaWFIxY200Z1lTQndjbTl0YVhObElHbHVjM1JsWVdRdUlIUm9aU0J5WlhSMWNtNWxaQ0J3Y205dGFYTmxJSGRwYkd3Z2NtVnpiMngyWlNCM2FYUm9JRzV2Y20xaGJDQmpZV3hzWW1GamF5QjJZV3gxWlNCdGFXNTFjeUIwYUdVZ1ptbHljM1FnWlhKeWIzSWdjR0Z5WVcxbGRHVnlJRzl1WEc1Y2RDQXFJR1oxYkdacGJHd2dZVzVrSUhkcGJHd2dZbVVnY21WcVpXTjBaV1FnZDJsMGFDQjBhR0YwSUdWeWNtOXlJR0Z6SUhKbFlYTnZiaUJwYmlCallYTmxJRzltSUdWeWNtOXlMbHh1WEhRZ0tpQkFjR0Z5WVcwZ2UyOWlhbVZqZEgwZ1czTjFZbXBsWTNSZElHOXdkR2x2Ym1Gc0lITjFZbXBsWTNRZ2IyWWdkR2hsSUcxbGRHaHZaQ0IwYnlCbGJtTmhjSE4xYkdGMFpWeHVYSFFnS2lCQWNHRnlZVzBnZTJaMWJtTjBhVzl1ZlNCbWJpQjBhR1VnWm5WdVkzUnBiMjRnZEc4Z1pXNWpZWEJ6ZFd4aGRHVWdhV1lnZEdobElHNXZjbTFoYkNCallXeHNZbUZqYXlCemFHOTFiR1FnY21WalpXbDJaU0J0YjNKbElIUm9ZVzRnWVNCemFXNW5iR1VnY0dGeVlXMWxkR1Z5SUNodGFXNTFjeUIwYUdVZ1pYSnliM0lwWEc1Y2RDQXFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb1pTQndjbTl0YVhObElIZHBiR3dnY21WemIyeDJaU0IzYVhSb0lIUm9aU0JzYVhOMElHOXlJSEJoY21GdFpYUmxjbk1nWVhNZ1puVnNabWxzYkcxbGJuUWdkbUZzZFdVdUlFbG1JRzl1YkhrZ2IyNWxJSEJoY21GdFpYUmxjaUJwY3lCelpXNTBJSFJ2SUhSb1pWeHVYSFFnS2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZV3hzWW1GamF5QjBhR1Z1SUdsMElIZHBiR3dnWW1VZ2RYTmxaQ0JoY3lCMGFHVWdjbVZ6YjJ4MWRHbHZiaUIyWVd4MVpTNWNibHgwSUNvZ1FISmxkSFZ5Ym5NZ2UwWjFibU4wYVc5dWZWeHVYSFFnS2k5Y2JseDBaR1ZtWlhJdWJtOWtaVU5oY0hOMWJHVWdQU0JtZFc1amRHbHZiaWh6ZFdKcVpXTjBMQ0JtYmlsN1hHNWNkRngwYVdZZ0tDQWhabTRnS1NCN1hHNWNkRngwWEhSbWJpQTlJSE4xWW1wbFkzUTdYRzVjZEZ4MFhIUnpkV0pxWldOMElEMGdkbTlwWkNnd0tUdGNibHgwWEhSOVhHNWNkRngwY21WMGRYSnVJR1oxYm1OMGFXOXVLQ2w3WEc1Y2RGeDBYSFIyWVhJZ1pDQTlJR1JsWm1WeUtDa3NJR0Z5WjNNZ1BTQnpiR2xqWlNoaGNtZDFiV1Z1ZEhNcE8xeHVYSFJjZEZ4MFlYSm5jeTV3ZFhOb0tHWjFibU4wYVc5dUtHVnljaXdnY21WektYdGNibHgwWEhSY2RGeDBaWEp5SUQ4Z1pDNXlaV3BsWTNRb1pYSnlLU0E2SUdRdWNtVnpiMngyWlNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0Z01pQS9JSE5zYVdObEtHRnlaM1Z0Wlc1MGN5d2dNU2tnT2lCeVpYTXBPMXh1WEhSY2RGeDBmU2s3WEc1Y2RGeDBYSFIwY25sN1hHNWNkRngwWEhSY2RHWnVMbUZ3Y0d4NUtITjFZbXBsWTNRc0lHRnlaM01wTzF4dVhIUmNkRngwZldOaGRHTm9LR1VwZTF4dVhIUmNkRngwWEhSa0xuSmxhbVZqZENobEtUdGNibHgwWEhSY2RIMWNibHgwWEhSY2RISmxkSFZ5YmlCa0xuQnliMjFwYzJVN1hHNWNkRngwZlR0Y2JseDBmVHRjYmx4dVhIUjBlWEJsYjJZZ2QybHVaRzkzSUNFOVBTQjFibVJsWmxOMGNpQW1KaUFvZDJsdVpHOTNMa1FnUFNCa1pXWmxjaWs3WEc1Y2RIUjVjR1Z2WmlCdGIyUjFiR1VnSVQwOUlIVnVaR1ZtVTNSeUlDWW1JRzF2WkhWc1pTNWxlSEJ2Y25SeklDWW1JQ2h0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR1JsWm1WeUtUdGNibHh1ZlNrb0tUdGNiaUpkZlE9PSIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2VtaXR0ZXInKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCdyZWR1Y2UnKTtcblxuLyoqXG4gKiBSb290IHJlZmVyZW5jZSBmb3IgaWZyYW1lcy5cbiAqL1xuXG52YXIgcm9vdCA9ICd1bmRlZmluZWQnID09IHR5cGVvZiB3aW5kb3dcbiAgPyB0aGlzXG4gIDogd2luZG93O1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gbm9vcCgpe307XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBob3N0IG9iamVjdCxcbiAqIHdlIGRvbid0IHdhbnQgdG8gc2VyaWFsaXplIHRoZXNlIDopXG4gKlxuICogVE9ETzogZnV0dXJlIHByb29mLCBtb3ZlIHRvIGNvbXBvZW50IGxhbmRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNIb3N0KG9iaikge1xuICB2YXIgc3RyID0ge30udG9TdHJpbmcuY2FsbChvYmopO1xuXG4gIHN3aXRjaCAoc3RyKSB7XG4gICAgY2FzZSAnW29iamVjdCBGaWxlXSc6XG4gICAgY2FzZSAnW29iamVjdCBCbG9iXSc6XG4gICAgY2FzZSAnW29iamVjdCBGb3JtRGF0YV0nOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZSBYSFIuXG4gKi9cblxuZnVuY3Rpb24gZ2V0WEhSKCkge1xuICBpZiAocm9vdC5YTUxIdHRwUmVxdWVzdFxuICAgICYmICgnZmlsZTonICE9IHJvb3QubG9jYXRpb24ucHJvdG9jb2wgfHwgIXJvb3QuQWN0aXZlWE9iamVjdCkpIHtcbiAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICB9IGVsc2Uge1xuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAuNi4wJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjMuMCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoKGUpIHt9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYWRkZWQgdG8gc3VwcG9ydCBJRS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxudmFyIHRyaW0gPSAnJy50cmltXG4gID8gZnVuY3Rpb24ocykgeyByZXR1cm4gcy50cmltKCk7IH1cbiAgOiBmdW5jdGlvbihzKSB7IHJldHVybiBzLnJlcGxhY2UoLyheXFxzKnxcXHMqJCkvZywgJycpOyB9O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogPT09IE9iamVjdChvYmopO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gYG9iamAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplKG9iaikge1xuICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHZhciBwYWlycyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG51bGwgIT0gb2JqW2tleV0pIHtcbiAgICAgIHBhaXJzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhaXJzLmpvaW4oJyYnKTtcbn1cblxuLyoqXG4gKiBFeHBvc2Ugc2VyaWFsaXphdGlvbiBtZXRob2QuXG4gKi9cblxuIHJlcXVlc3Quc2VyaWFsaXplT2JqZWN0ID0gc2VyaWFsaXplO1xuXG4gLyoqXG4gICogUGFyc2UgdGhlIGdpdmVuIHgtd3d3LWZvcm0tdXJsZW5jb2RlZCBgc3RyYC5cbiAgKlxuICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICogQGFwaSBwcml2YXRlXG4gICovXG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHN0cikge1xuICB2YXIgb2JqID0ge307XG4gIHZhciBwYWlycyA9IHN0ci5zcGxpdCgnJicpO1xuICB2YXIgcGFydHM7XG4gIHZhciBwYWlyO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHBhaXIgPSBwYWlyc1tpXTtcbiAgICBwYXJ0cyA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMV0pO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBFeHBvc2UgcGFyc2VyLlxuICovXG5cbnJlcXVlc3QucGFyc2VTdHJpbmcgPSBwYXJzZVN0cmluZztcblxuLyoqXG4gKiBEZWZhdWx0IE1JTUUgdHlwZSBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICovXG5cbnJlcXVlc3QudHlwZXMgPSB7XG4gIGh0bWw6ICd0ZXh0L2h0bWwnLFxuICBqc29uOiAnYXBwbGljYXRpb24vanNvbicsXG4gIHhtbDogJ2FwcGxpY2F0aW9uL3htbCcsXG4gIHVybGVuY29kZWQ6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybS1kYXRhJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ob2JqKXtcbiAqICAgICAgIHJldHVybiAnZ2VuZXJhdGVkIHhtbCBoZXJlJztcbiAqICAgICB9O1xuICpcbiAqL1xuXG4gcmVxdWVzdC5zZXJpYWxpemUgPSB7XG4gICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogc2VyaWFsaXplLFxuICAgJ2FwcGxpY2F0aW9uL2pzb24nOiBKU09OLnN0cmluZ2lmeVxuIH07XG5cbiAvKipcbiAgKiBEZWZhdWx0IHBhcnNlcnMuXG4gICpcbiAgKiAgICAgc3VwZXJhZ2VudC5wYXJzZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihzdHIpe1xuICAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAgKiAgICAgfTtcbiAgKlxuICAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cikge1xuICB2YXIgbGluZXMgPSBzdHIuc3BsaXQoL1xccj9cXG4vKTtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICB2YXIgaW5kZXg7XG4gIHZhciBsaW5lO1xuICB2YXIgZmllbGQ7XG4gIHZhciB2YWw7XG5cbiAgbGluZXMucG9wKCk7IC8vIHRyYWlsaW5nIENSTEZcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsaW5lID0gbGluZXNbaV07XG4gICAgaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBmaWVsZCA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdHJpbShsaW5lLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIGZpZWxkc1tmaWVsZF0gPSB2YWw7XG4gIH1cblxuICByZXR1cm4gZmllbGRzO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgbWltZSB0eXBlIGZvciB0aGUgZ2l2ZW4gYHN0cmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHlwZShzdHIpe1xuICByZXR1cm4gc3RyLnNwbGl0KC8gKjsgKi8pLnNoaWZ0KCk7XG59O1xuXG4vKipcbiAqIFJldHVybiBoZWFkZXIgZmllbGQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJhbXMoc3RyKXtcbiAgcmV0dXJuIHJlZHVjZShzdHIuc3BsaXQoLyAqOyAqLyksIGZ1bmN0aW9uKG9iaiwgc3RyKXtcbiAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoLyAqPSAqLylcbiAgICAgICwga2V5ID0gcGFydHMuc2hpZnQoKVxuICAgICAgLCB2YWwgPSBwYXJ0cy5zaGlmdCgpO1xuXG4gICAgaWYgKGtleSAmJiB2YWwpIG9ialtrZXldID0gdmFsO1xuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVzcG9uc2VgIHdpdGggdGhlIGdpdmVuIGB4aHJgLlxuICpcbiAqICAtIHNldCBmbGFncyAoLm9rLCAuZXJyb3IsIGV0YylcbiAqICAtIHBhcnNlIGhlYWRlclxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICBBbGlhc2luZyBgc3VwZXJhZ2VudGAgYXMgYHJlcXVlc3RgIGlzIG5pY2U6XG4gKlxuICogICAgICByZXF1ZXN0ID0gc3VwZXJhZ2VudDtcbiAqXG4gKiAgV2UgY2FuIHVzZSB0aGUgcHJvbWlzZS1saWtlIEFQSSwgb3IgcGFzcyBjYWxsYmFja3M6XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnLycpLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICogICAgICByZXF1ZXN0LmdldCgnLycsIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIFNlbmRpbmcgZGF0YSBjYW4gYmUgY2hhaW5lZDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgT3IgcGFzc2VkIHRvIGAuc2VuZCgpYDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5wb3N0KClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiBPciBmdXJ0aGVyIHJlZHVjZWQgdG8gYSBzaW5nbGUgY2FsbCBmb3Igc2ltcGxlIGNhc2VzOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIEBwYXJhbSB7WE1MSFRUUFJlcXVlc3R9IHhoclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFJlc3BvbnNlKHJlcSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5yZXEgPSByZXE7XG4gIHRoaXMueGhyID0gdGhpcy5yZXEueGhyO1xuICB0aGlzLnRleHQgPSB0aGlzLnJlcS5tZXRob2QgIT0nSEVBRCcgXG4gICAgID8gdGhpcy54aHIucmVzcG9uc2VUZXh0IFxuICAgICA6IG51bGw7XG4gIHRoaXMuc2V0U3RhdHVzUHJvcGVydGllcyh0aGlzLnhoci5zdGF0dXMpO1xuICB0aGlzLmhlYWRlciA9IHRoaXMuaGVhZGVycyA9IHBhcnNlSGVhZGVyKHRoaXMueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTtcbiAgLy8gZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIHNvbWV0aW1lcyBmYWxzZWx5IHJldHVybnMgXCJcIiBmb3IgQ09SUyByZXF1ZXN0cywgYnV0XG4gIC8vIGdldFJlc3BvbnNlSGVhZGVyIHN0aWxsIHdvcmtzLiBzbyB3ZSBnZXQgY29udGVudC10eXBlIGV2ZW4gaWYgZ2V0dGluZ1xuICAvLyBvdGhlciBoZWFkZXJzIGZhaWxzLlxuICB0aGlzLmhlYWRlclsnY29udGVudC10eXBlJ10gPSB0aGlzLnhoci5nZXRSZXNwb25zZUhlYWRlcignY29udGVudC10eXBlJyk7XG4gIHRoaXMuc2V0SGVhZGVyUHJvcGVydGllcyh0aGlzLmhlYWRlcik7XG4gIHRoaXMuYm9keSA9IHRoaXMucmVxLm1ldGhvZCAhPSAnSEVBRCdcbiAgICA/IHRoaXMucGFyc2VCb2R5KHRoaXMudGV4dClcbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgYGZpZWxkYCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgcmV0dXJuIHRoaXMuaGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xufTtcblxuLyoqXG4gKiBTZXQgaGVhZGVyIHJlbGF0ZWQgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gYC50eXBlYCB0aGUgY29udGVudCB0eXBlIHdpdGhvdXQgcGFyYW1zXG4gKlxuICogQSByZXNwb25zZSBvZiBcIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiXG4gKiB3aWxsIHByb3ZpZGUgeW91IHdpdGggYSBgLnR5cGVgIG9mIFwidGV4dC9wbGFpblwiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS5zZXRIZWFkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24oaGVhZGVyKXtcbiAgLy8gY29udGVudC10eXBlXG4gIHZhciBjdCA9IHRoaXMuaGVhZGVyWydjb250ZW50LXR5cGUnXSB8fCAnJztcbiAgdGhpcy50eXBlID0gdHlwZShjdCk7XG5cbiAgLy8gcGFyYW1zXG4gIHZhciBvYmogPSBwYXJhbXMoY3QpO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB0aGlzW2tleV0gPSBvYmpba2V5XTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGJvZHkgYHN0cmAuXG4gKlxuICogVXNlZCBmb3IgYXV0by1wYXJzaW5nIG9mIGJvZGllcy4gUGFyc2Vyc1xuICogYXJlIGRlZmluZWQgb24gdGhlIGBzdXBlcmFnZW50LnBhcnNlYCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUucGFyc2VCb2R5ID0gZnVuY3Rpb24oc3RyKXtcbiAgdmFyIHBhcnNlID0gcmVxdWVzdC5wYXJzZVt0aGlzLnR5cGVdO1xuICByZXR1cm4gcGFyc2UgJiYgc3RyICYmIHN0ci5sZW5ndGhcbiAgICA/IHBhcnNlKHN0cilcbiAgICA6IG51bGw7XG59O1xuXG4vKipcbiAqIFNldCBmbGFncyBzdWNoIGFzIGAub2tgIGJhc2VkIG9uIGBzdGF0dXNgLlxuICpcbiAqIEZvciBleGFtcGxlIGEgMnh4IHJlc3BvbnNlIHdpbGwgZ2l2ZSB5b3UgYSBgLm9rYCBvZiBfX3RydWVfX1xuICogd2hlcmVhcyA1eHggd2lsbCBiZSBfX2ZhbHNlX18gYW5kIGAuZXJyb3JgIHdpbGwgYmUgX190cnVlX18uIFRoZVxuICogYC5jbGllbnRFcnJvcmAgYW5kIGAuc2VydmVyRXJyb3JgIGFyZSBhbHNvIGF2YWlsYWJsZSB0byBiZSBtb3JlXG4gKiBzcGVjaWZpYywgYW5kIGAuc3RhdHVzVHlwZWAgaXMgdGhlIGNsYXNzIG9mIGVycm9yIHJhbmdpbmcgZnJvbSAxLi41XG4gKiBzb21ldGltZXMgdXNlZnVsIGZvciBtYXBwaW5nIHJlc3BvbmQgY29sb3JzIGV0Yy5cbiAqXG4gKiBcInN1Z2FyXCIgcHJvcGVydGllcyBhcmUgYWxzbyBkZWZpbmVkIGZvciBjb21tb24gY2FzZXMuIEN1cnJlbnRseSBwcm92aWRpbmc6XG4gKlxuICogICAtIC5ub0NvbnRlbnRcbiAqICAgLSAuYmFkUmVxdWVzdFxuICogICAtIC51bmF1dGhvcml6ZWRcbiAqICAgLSAubm90QWNjZXB0YWJsZVxuICogICAtIC5ub3RGb3VuZFxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGF0dXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS5zZXRTdGF0dXNQcm9wZXJ0aWVzID0gZnVuY3Rpb24oc3RhdHVzKXtcbiAgdmFyIHR5cGUgPSBzdGF0dXMgLyAxMDAgfCAwO1xuXG4gIC8vIHN0YXR1cyAvIGNsYXNzXG4gIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICB0aGlzLnN0YXR1c1R5cGUgPSB0eXBlO1xuXG4gIC8vIGJhc2ljc1xuICB0aGlzLmluZm8gPSAxID09IHR5cGU7XG4gIHRoaXMub2sgPSAyID09IHR5cGU7XG4gIHRoaXMuY2xpZW50RXJyb3IgPSA0ID09IHR5cGU7XG4gIHRoaXMuc2VydmVyRXJyb3IgPSA1ID09IHR5cGU7XG4gIHRoaXMuZXJyb3IgPSAoNCA9PSB0eXBlIHx8IDUgPT0gdHlwZSlcbiAgICA/IHRoaXMudG9FcnJvcigpXG4gICAgOiBmYWxzZTtcblxuICAvLyBzdWdhclxuICB0aGlzLmFjY2VwdGVkID0gMjAyID09IHN0YXR1cztcbiAgdGhpcy5ub0NvbnRlbnQgPSAyMDQgPT0gc3RhdHVzIHx8IDEyMjMgPT0gc3RhdHVzO1xuICB0aGlzLmJhZFJlcXVlc3QgPSA0MDAgPT0gc3RhdHVzO1xuICB0aGlzLnVuYXV0aG9yaXplZCA9IDQwMSA9PSBzdGF0dXM7XG4gIHRoaXMubm90QWNjZXB0YWJsZSA9IDQwNiA9PSBzdGF0dXM7XG4gIHRoaXMubm90Rm91bmQgPSA0MDQgPT0gc3RhdHVzO1xuICB0aGlzLmZvcmJpZGRlbiA9IDQwMyA9PSBzdGF0dXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBgRXJyb3JgIHJlcHJlc2VudGF0aXZlIG9mIHRoaXMgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybiB7RXJyb3J9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS50b0Vycm9yID0gZnVuY3Rpb24oKXtcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgbWV0aG9kID0gcmVxLm1ldGhvZDtcbiAgdmFyIHVybCA9IHJlcS51cmw7XG5cbiAgdmFyIG1zZyA9ICdjYW5ub3QgJyArIG1ldGhvZCArICcgJyArIHVybCArICcgKCcgKyB0aGlzLnN0YXR1cyArICcpJztcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVyci5tZXRob2QgPSBtZXRob2Q7XG4gIGVyci51cmwgPSB1cmw7XG5cbiAgcmV0dXJuIGVycjtcbn07XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZWAuXG4gKi9cblxucmVxdWVzdC5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlcXVlc3RgIHdpdGggdGhlIGdpdmVuIGBtZXRob2RgIGFuZCBgdXJsYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJlcXVlc3QobWV0aG9kLCB1cmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBFbWl0dGVyLmNhbGwodGhpcyk7XG4gIHRoaXMuX3F1ZXJ5ID0gdGhpcy5fcXVlcnkgfHwgW107XG4gIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5oZWFkZXIgPSB7fTtcbiAgdGhpcy5faGVhZGVyID0ge307XG4gIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCl7XG4gICAgdmFyIGVyciA9IG51bGw7XG4gICAgdmFyIHJlcyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgcmVzID0gbmV3IFJlc3BvbnNlKHNlbGYpOyBcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGVyciA9IG5ldyBFcnJvcignUGFyc2VyIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgcmVzcG9uc2UnKTtcbiAgICAgIGVyci5wYXJzZSA9IHRydWU7XG4gICAgICBlcnIub3JpZ2luYWwgPSBlO1xuICAgIH1cblxuICAgIHNlbGYuY2FsbGJhY2soZXJyLCByZXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBNaXhpbiBgRW1pdHRlcmAuXG4gKi9cblxuRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogQWxsb3cgZm9yIGV4dGVuc2lvblxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uKGZuKSB7XG4gIGZuKHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBTZXQgdGltZW91dCB0byBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbihtcyl7XG4gIHRoaXMuX3RpbWVvdXQgPSBtcztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENsZWFyIHByZXZpb3VzIHRpbWVvdXQuXG4gKlxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuX3RpbWVvdXQgPSAwO1xuICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWJvcnQgdGhlIHJlcXVlc3QsIGFuZCBjbGVhciBwb3RlbnRpYWwgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hYm9ydCA9IGZ1bmN0aW9uKCl7XG4gIGlmICh0aGlzLmFib3J0ZWQpIHJldHVybjtcbiAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgdGhpcy54aHIuYWJvcnQoKTtcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgdGhpcy5lbWl0KCdhYm9ydCcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciBgZmllbGRgIHRvIGB2YWxgLCBvciBtdWx0aXBsZSBmaWVsZHMgd2l0aCBvbmUgb2JqZWN0LlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKVxuICogICAgICAgIC5zZXQoJ1gtQVBJLUtleScsICdmb29iYXInKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxLmdldCgnLycpXG4gKiAgICAgICAgLnNldCh7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnWC1BUEktS2V5JzogJ2Zvb2JhcicgfSlcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGZpZWxkXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oZmllbGQsIHZhbCl7XG4gIGlmIChpc09iamVjdChmaWVsZCkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXSA9IHZhbDtcbiAgdGhpcy5oZWFkZXJbZmllbGRdID0gdmFsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGhlYWRlciBgZmllbGRgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAudW5zZXQoJ1VzZXItQWdlbnQnKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICBkZWxldGUgdGhpcy5faGVhZGVyW2ZpZWxkLnRvTG93ZXJDYXNlKCldO1xuICBkZWxldGUgdGhpcy5oZWFkZXJbZmllbGRdO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgaGVhZGVyIGBmaWVsZGAgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIgPSBmdW5jdGlvbihmaWVsZCl7XG4gIHJldHVybiB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07XG59O1xuXG4vKipcbiAqIFNldCBDb250ZW50LVR5cGUgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCd4bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBY2NlcHQgdG8gYHR5cGVgLCBtYXBwaW5nIHZhbHVlcyBmcm9tIGByZXF1ZXN0LnR5cGVzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKHR5cGUpe1xuICB0aGlzLnNldCgnQWNjZXB0JywgcmVxdWVzdC50eXBlc1t0eXBlXSB8fCB0eXBlKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBBdXRob3JpemF0aW9uIGZpZWxkIHZhbHVlIHdpdGggYHVzZXJgIGFuZCBgcGFzc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXV0aCA9IGZ1bmN0aW9uKHVzZXIsIHBhc3Mpe1xuICB2YXIgc3RyID0gYnRvYSh1c2VyICsgJzonICsgcGFzcyk7XG4gIHRoaXMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBzdHIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuKiBBZGQgcXVlcnktc3RyaW5nIGB2YWxgLlxuKlxuKiBFeGFtcGxlczpcbipcbiogICByZXF1ZXN0LmdldCgnL3Nob2VzJylcbiogICAgIC5xdWVyeSgnc2l6ZT0xMCcpXG4qICAgICAucXVlcnkoeyBjb2xvcjogJ2JsdWUnIH0pXG4qXG4qIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gdmFsXG4qIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuKiBAYXBpIHB1YmxpY1xuKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbih2YWwpe1xuICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHZhbCkgdmFsID0gc2VyaWFsaXplKHZhbCk7XG4gIGlmICh2YWwpIHRoaXMuX3F1ZXJ5LnB1c2godmFsKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdyaXRlIHRoZSBmaWVsZCBgbmFtZWAgYW5kIGB2YWxgIGZvciBcIm11bHRpcGFydC9mb3JtLWRhdGFcIlxuICogcmVxdWVzdCBib2RpZXMuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICAuZmllbGQoJ2ZvbycsICdiYXInKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xCbG9ifEZpbGV9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmZpZWxkID0gZnVuY3Rpb24obmFtZSwgdmFsKXtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkgdGhpcy5fZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgdGhpcy5fZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBRdWV1ZSB0aGUgZ2l2ZW4gYGZpbGVgIGFzIGFuIGF0dGFjaG1lbnQgdG8gdGhlIHNwZWNpZmllZCBgZmllbGRgLFxuICogd2l0aCBvcHRpb25hbCBgZmlsZW5hbWVgLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAqICAgLmF0dGFjaChuZXcgQmxvYihbJzxhIGlkPVwiYVwiPjxiIGlkPVwiYlwiPmhleSE8L2I+PC9hPiddLCB7IHR5cGU6IFwidGV4dC9odG1sXCJ9KSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7QmxvYnxGaWxlfSBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hdHRhY2ggPSBmdW5jdGlvbihmaWVsZCwgZmlsZSwgZmlsZW5hbWUpe1xuICBpZiAoIXRoaXMuX2Zvcm1EYXRhKSB0aGlzLl9mb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICB0aGlzLl9mb3JtRGF0YS5hcHBlbmQoZmllbGQsIGZpbGUsIGZpbGVuYW1lKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNlbmQgYGRhdGFgLCBkZWZhdWx0aW5nIHRoZSBgLnR5cGUoKWAgdG8gXCJqc29uXCIgd2hlblxuICogYW4gb2JqZWN0IGlzIGdpdmVuLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgIC8vIHF1ZXJ5c3RyaW5nXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3NlYXJjaCcpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gbXVsdGlwbGUgZGF0YSBcIndyaXRlc1wiXG4gKiAgICAgICByZXF1ZXN0LmdldCgnL3NlYXJjaCcpXG4gKiAgICAgICAgIC5zZW5kKHsgc2VhcmNoOiAncXVlcnknIH0pXG4gKiAgICAgICAgIC5zZW5kKHsgcmFuZ2U6ICcxLi41JyB9KVxuICogICAgICAgICAuc2VuZCh7IG9yZGVyOiAnZGVzYycgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBtYW51YWwganNvblxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdqc29uJylcbiAqICAgICAgICAgLnNlbmQoJ3tcIm5hbWVcIjpcInRqXCJ9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8ganNvblxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIG1hbnVhbCB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnZm9ybScpXG4gKiAgICAgICAgIC5zZW5kKCduYW1lPXRqJylcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBhdXRvIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gZGVmYXVsdHMgdG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gICogICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAgKiAgICAgICAgLnNlbmQoJ25hbWU9dG9iaScpXG4gICogICAgICAgIC5zZW5kKCdzcGVjaWVzPWZlcnJldCcpXG4gICogICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBkYXRhXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uKGRhdGEpe1xuICB2YXIgb2JqID0gaXNPYmplY3QoZGF0YSk7XG4gIHZhciB0eXBlID0gdGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIC8vIG1lcmdlXG4gIGlmIChvYmogJiYgaXNPYmplY3QodGhpcy5fZGF0YSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgdGhpcy5fZGF0YVtrZXldID0gZGF0YVtrZXldO1xuICAgIH1cbiAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZGF0YSkge1xuICAgIGlmICghdHlwZSkgdGhpcy50eXBlKCdmb3JtJyk7XG4gICAgdHlwZSA9IHRoaXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKTtcbiAgICBpZiAoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgPT0gdHlwZSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGFcbiAgICAgICAgPyB0aGlzLl9kYXRhICsgJyYnICsgZGF0YVxuICAgICAgICA6IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGEgPSAodGhpcy5fZGF0YSB8fCAnJykgKyBkYXRhO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGlmICghb2JqKSByZXR1cm4gdGhpcztcbiAgaWYgKCF0eXBlKSB0aGlzLnR5cGUoJ2pzb24nKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCBgZXJyYCBhbmQgYHJlc2BcbiAqIGFuZCBoYW5kbGUgYXJpdHkgY2hlY2suXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhbGxiYWNrID0gZnVuY3Rpb24oZXJyLCByZXMpe1xuICB2YXIgZm4gPSB0aGlzLl9jYWxsYmFjaztcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgaWYgKDIgPT0gZm4ubGVuZ3RoKSByZXR1cm4gZm4oZXJyLCByZXMpO1xuICBpZiAoZXJyKSByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIGZuKHJlcyk7XG59O1xuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aXRoIHgtZG9tYWluIGVycm9yLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNyb3NzRG9tYWluRXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgZXJyID0gbmV3IEVycm9yKCdPcmlnaW4gaXMgbm90IGFsbG93ZWQgYnkgQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJyk7XG4gIGVyci5jcm9zc0RvbWFpbiA9IHRydWU7XG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggdGltZW91dCBlcnJvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50aW1lb3V0RXJyb3IgPSBmdW5jdGlvbigpe1xuICB2YXIgdGltZW91dCA9IHRoaXMuX3RpbWVvdXQ7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ3RpbWVvdXQgb2YgJyArIHRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnKTtcbiAgZXJyLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB0aGlzLmNhbGxiYWNrKGVycik7XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0cmFuc21pc3Npb24gb2YgY29va2llcyB3aXRoIHgtZG9tYWluIHJlcXVlc3RzLlxuICpcbiAqIE5vdGUgdGhhdCBmb3IgdGhpcyB0byB3b3JrIHRoZSBvcmlnaW4gbXVzdCBub3QgYmVcbiAqIHVzaW5nIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIgd2l0aCBhIHdpbGRjYXJkLFxuICogYW5kIGFsc28gbXVzdCBzZXQgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiXG4gKiB0byBcInRydWVcIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLndpdGhDcmVkZW50aWFscyA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBJbml0aWF0ZSByZXF1ZXN0LCBpbnZva2luZyBjYWxsYmFjayBgZm4ocmVzKWBcbiAqIHdpdGggYW4gaW5zdGFuY2VvZiBgUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oZm4pe1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB4aHIgPSB0aGlzLnhociA9IGdldFhIUigpO1xuICB2YXIgcXVlcnkgPSB0aGlzLl9xdWVyeS5qb2luKCcmJyk7XG4gIHZhciB0aW1lb3V0ID0gdGhpcy5fdGltZW91dDtcbiAgdmFyIGRhdGEgPSB0aGlzLl9mb3JtRGF0YSB8fCB0aGlzLl9kYXRhO1xuXG4gIC8vIHN0b3JlIGNhbGxiYWNrXG4gIHRoaXMuX2NhbGxiYWNrID0gZm4gfHwgbm9vcDtcblxuICAvLyBzdGF0ZSBjaGFuZ2VcbiAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7XG4gICAgaWYgKDQgIT0geGhyLnJlYWR5U3RhdGUpIHJldHVybjtcbiAgICBpZiAoMCA9PSB4aHIuc3RhdHVzKSB7XG4gICAgICBpZiAoc2VsZi5hYm9ydGVkKSByZXR1cm4gc2VsZi50aW1lb3V0RXJyb3IoKTtcbiAgICAgIHJldHVybiBzZWxmLmNyb3NzRG9tYWluRXJyb3IoKTtcbiAgICB9XG4gICAgc2VsZi5lbWl0KCdlbmQnKTtcbiAgfTtcblxuICAvLyBwcm9ncmVzc1xuICBpZiAoeGhyLnVwbG9hZCkge1xuICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGZ1bmN0aW9uKGUpe1xuICAgICAgZS5wZXJjZW50ID0gZS5sb2FkZWQgLyBlLnRvdGFsICogMTAwO1xuICAgICAgc2VsZi5lbWl0KCdwcm9ncmVzcycsIGUpO1xuICAgIH07XG4gIH1cblxuICAvLyB0aW1lb3V0XG4gIGlmICh0aW1lb3V0ICYmICF0aGlzLl90aW1lcikge1xuICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgc2VsZi5hYm9ydCgpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9XG5cbiAgLy8gcXVlcnlzdHJpbmdcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgcXVlcnkgPSByZXF1ZXN0LnNlcmlhbGl6ZU9iamVjdChxdWVyeSk7XG4gICAgdGhpcy51cmwgKz0gfnRoaXMudXJsLmluZGV4T2YoJz8nKVxuICAgICAgPyAnJicgKyBxdWVyeVxuICAgICAgOiAnPycgKyBxdWVyeTtcbiAgfVxuXG4gIC8vIGluaXRpYXRlIHJlcXVlc3RcbiAgeGhyLm9wZW4odGhpcy5tZXRob2QsIHRoaXMudXJsLCB0cnVlKTtcblxuICAvLyBDT1JTXG4gIGlmICh0aGlzLl93aXRoQ3JlZGVudGlhbHMpIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuXG4gIC8vIGJvZHlcbiAgaWYgKCdHRVQnICE9IHRoaXMubWV0aG9kICYmICdIRUFEJyAhPSB0aGlzLm1ldGhvZCAmJiAnc3RyaW5nJyAhPSB0eXBlb2YgZGF0YSAmJiAhaXNIb3N0KGRhdGEpKSB7XG4gICAgLy8gc2VyaWFsaXplIHN0dWZmXG4gICAgdmFyIHNlcmlhbGl6ZSA9IHJlcXVlc3Quc2VyaWFsaXplW3RoaXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKV07XG4gICAgaWYgKHNlcmlhbGl6ZSkgZGF0YSA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgfVxuXG4gIC8vIHNldCBoZWFkZXIgZmllbGRzXG4gIGZvciAodmFyIGZpZWxkIGluIHRoaXMuaGVhZGVyKSB7XG4gICAgaWYgKG51bGwgPT0gdGhpcy5oZWFkZXJbZmllbGRdKSBjb250aW51ZTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihmaWVsZCwgdGhpcy5oZWFkZXJbZmllbGRdKTtcbiAgfVxuXG4gIC8vIHNlbmQgc3R1ZmZcbiAgdGhpcy5lbWl0KCdyZXF1ZXN0JywgdGhpcyk7XG4gIHhoci5zZW5kKGRhdGEpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0YC5cbiAqL1xuXG5yZXF1ZXN0LlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIElzc3VlIGEgcmVxdWVzdDpcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICByZXF1ZXN0KCdHRVQnLCAnL3VzZXJzJykuZW5kKGNhbGxiYWNrKVxuICogICAgcmVxdWVzdCgnL3VzZXJzJykuZW5kKGNhbGxiYWNrKVxuICogICAgcmVxdWVzdCgnL3VzZXJzJywgY2FsbGJhY2spXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHVybCBvciBjYWxsYmFja1xuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmVxdWVzdChtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdXJsKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KCdHRVQnLCBtZXRob2QpLmVuZCh1cmwpO1xuICB9XG5cbiAgLy8gdXJsIGZpcnN0XG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IFJlcXVlc3QoJ0dFVCcsIG1ldGhvZCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlcXVlc3QobWV0aG9kLCB1cmwpO1xufVxuXG4vKipcbiAqIEdFVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfEZ1bmN0aW9ufSBkYXRhIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5nZXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnF1ZXJ5KGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBIRUFEIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IGRhdGEgb3IgZm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LmhlYWQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0hFQUQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgZm4gPSBkYXRhLCBkYXRhID0gbnVsbDtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBERUxFVEUgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QuZGVsID0gZnVuY3Rpb24odXJsLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdERUxFVEUnLCB1cmwpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBQQVRDSCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR9IGRhdGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBhdGNoID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQQVRDSCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIFBPU1QgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBkYXRhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wb3N0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIGZuID0gZGF0YSwgZGF0YSA9IG51bGw7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogUFVUIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gZGF0YSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucHV0ID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQVVQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgZm4gPSBkYXRhLCBkYXRhID0gbnVsbDtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYHJlcXVlc3RgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdDtcbiIsIlxuLyoqXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFbWl0dGVyYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufTtcblxuLyoqXG4gKiBNaXhpbiB0aGUgZW1pdHRlciBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpIHtcbiAgICBvYmpba2V5XSA9IEVtaXR0ZXIucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBMaXN0ZW4gb24gdGhlIGdpdmVuIGBldmVudGAgd2l0aCBgZm5gLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9uID1cbkVtaXR0ZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gICh0aGlzLl9jYWxsYmFja3NbZXZlbnRdID0gdGhpcy5fY2FsbGJhY2tzW2V2ZW50XSB8fCBbXSlcbiAgICAucHVzaChmbik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGBldmVudGAgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgYSBzaW5nbGVcbiAqIHRpbWUgdGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuXG4gIGZ1bmN0aW9uIG9uKCkge1xuICAgIHNlbGYub2ZmKGV2ZW50LCBvbik7XG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uLmZuID0gZm47XG4gIHRoaXMub24oZXZlbnQsIG9uKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGBldmVudGAgb3IgYWxsXG4gKiByZWdpc3RlcmVkIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vZmYgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG5cbiAgLy8gYWxsXG4gIGlmICgwID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNwZWNpZmljIGV2ZW50XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbZXZlbnRdO1xuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XG5cbiAgLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tldmVudF07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxuICB2YXIgY2I7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2IgPSBjYWxsYmFja3NbaV07XG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcbiAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1tldmVudF07XG5cbiAgaWYgKGNhbGxiYWNrcykge1xuICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBjYWxsYmFja3NbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbZXZlbnRdIHx8IFtdO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGVtaXR0ZXIgaGFzIGBldmVudGAgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xufTtcbiIsIlxuLyoqXG4gKiBSZWR1Y2UgYGFycmAgd2l0aCBgZm5gLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7TWl4ZWR9IGluaXRpYWxcbiAqXG4gKiBUT0RPOiBjb21iYXRpYmxlIGVycm9yIGhhbmRsaW5nP1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYXJyLCBmbiwgaW5pdGlhbCl7ICBcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICB2YXIgY3VyciA9IGFyZ3VtZW50cy5sZW5ndGggPT0gM1xuICAgID8gaW5pdGlhbFxuICAgIDogYXJyW2lkeCsrXTtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgY3VyciA9IGZuLmNhbGwobnVsbCwgY3VyciwgYXJyW2lkeF0sICsraWR4LCBhcnIpO1xuICB9XG4gIFxuICByZXR1cm4gY3Vycjtcbn07IiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIm5hbWVcIjogXCJkZXBsb3lyXCIsXG4gIFwidmVyc2lvblwiOiBcIjcuNC4xXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJTaW1wbGlmaWVkIEphdmFTY3JpcHQgY2xpZW50IGxpYnJhcnkgZm9yIG1ha2luZyByZXF1ZXN0cyB0byBEZXBsb3lSLlwiLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImRlcGxveXJcIixcbiAgICBcImRlcGxveXIuaW9cIixcbiAgICBcImFqYXhcIixcbiAgICBcIlJcIixcbiAgICBcImFwaVwiLFxuICAgIFwic2ltcGxlXCJcbiAgXSxcbiAgXCJhdXRob3JcIjogXCJEZXBsb3lSIC0gUmV2b2x1dGlvbiBBbmFseXRpY3MgSW5jLlwiLFxuICBcImNvbnRyaWJ1dG9yc1wiOiBbXG4gICAgXCJTZWFuIFdlbGxzXCJcbiAgXSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdDovL2dpdGh1Yi5jb20vZGVwbG95ci9qcy1jbGllbnQtbGlicmFyeS5naXRcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cDovL2RlcGxveXIucmV2b2x1dGlvbmFuYWx5dGljcy5jb20vZG9jdW1lbnRzL2Rldi9jbGllbnQtanNkb2NcIixcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInN0YXJ0XCI6IFwiZ3VscCBzdGFydFwiLFxuICAgIFwiYnVpbGRcIjogXCJndWxwXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYnJvd3NlcmlmeVwiOiBcIl45LjAuM1wiLFxuICAgIFwiZ3VscFwiOiBcIl4zLjguMTFcIixcbiAgICBcImd1bHAtY29ubmVjdFwiOiBcIl4yLjIuMFwiLFxuICAgIFwiZ3VscC1oZWFkZXJcIjogXCJeMS4yLjJcIixcbiAgICBcImd1bHAtanNoaW50XCI6IFwiXjEuOS4yXCIsXG4gICAgXCJndWxwLWxpdmVyZWxvYWRcIjogXCJeMy44LjBcIixcbiAgICBcImd1bHAtcGx1bWJlclwiOiBcIl4wLjYuNlwiLFxuICAgIFwiZ3VscC1yZW5hbWVcIjogXCJeMS4yLjJcIiwgICAgXG4gICAgXCJndWxwLXVnbGlmeVwiOiBcIl4xLjIuMFwiLFxuICAgIFwiZ3VscC11dGlsXCI6IFwiXjMuMC40XCIsXG4gICAgXCJ0YXBlXCI6IFwiXjMuNS4wXCIsXG4gICAgXCJ2aW55bC1zb3VyY2Utc3RyZWFtXCI6IFwiXjEuMC4wXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiZC5qc1wiOiBcIl4wLjYuMFwiLCAgICBcbiAgICBcInN1cGVyYWdlbnRcIjogXCJeMC4yMS4wXCIsXG4gICAgXCJ3c1wiOiBcIl4wLjQuMzJcIlxuICB9LFxuICBcIm1haW5cIjogXCJkZXBsb3lyLmpzXCIsXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0gMC4xMC4wXCJcbiAgfSxcbiAgXCJsaWNlbnNlXCI6IFwiQXBhY2hlIDIuMCBMaWNlbnNlXCIsXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZGVwbG95ci9qcy1jbGllbnQtbGlicmFyeS9pc3N1ZXNcIlxuICB9LFxuICBcImRpcmVjdG9yaWVzXCI6IHtcbiAgICBcImV4YW1wbGVcIjogXCJleGFtcGxlc1wiLFxuICAgIFwidGVzdFwiOiBcInRlc3RcIlxuICB9XG59XG4iXX0= diff --git a/browser/deployr.min.js b/browser/deployr.min.js index 1a50bb2..9f03786 100644 --- a/browser/deployr.min.js +++ b/browser/deployr.min.js @@ -144,4 +144,4 @@ * Date: 2015-07-27 */ !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.deployr=t()}}(function(){var t;return function e(t,r,o){function i(s,a){if(!r[s]){if(!t[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=r[s]={exports:{}};t[s][0].call(l.exports,function(e){var r=t[s][1][e];return i(r?r:e)},l,l.exports,e,t,r,o)}return r[s].exports}for(var n="function"==typeof require&&require,s=0;s3&&(o=o.slice(1)),E["new"]("/r/repository/shell/execute",r).data({author:o[0],directory:o[1],filename:o[2],args:e})},code:function(t,e){var r={cookies:this.cookies,queue:this.q,deferred:this.deferred},o="/r/project/execute/code";return e?E["new"](o,r).data({code:t,project:e}):E["new"]("/r/project/create",r).end(function(t){return{project:t.get("project").project}}).io(o).data({code:t})},release:function(t,e){function r(t){t===c&&(e?(i.resolve(!0),o.destroy()):E["new"]("/r/user/logout").share(u).error(function(){i.reject(!1)}).end(function(){i.resolve(!0)}).ensure(function(){o.destroy()}))}t=p.isArray(t)?t:[t];var o=this,i=s(),n=!t||!t[0],a=0,c=n?a:t.length-1,u=this.getCookies();return n?r(a):t.forEach(function(t){E["new"]("/r/project/close").data({project:t}).share(u).end().ensure(function(){r(a),a++})}),i.promise},routputs:function(t){return t&&(this.outputs=this.outputs.concat(t)),this},routput:function(t){return t&&this.routputs([t]),this},rinputs:function(t){return t&&(this.inputs=this.inputs.concat(t)),this},rinput:function(t){return t&&this.inputs.push(t),this},destroy:function(){try{this.emit("destroy"),this.offAll();for(var t in this)this.hasOwnProperty(t)&&(this[t]=null,delete this[t])}catch(e){}},_clear:function(){this.params={},this.inputs=[],this.outputs=[],this.rstream=!1,this.delayed=!1,this.api=null,this.file=null,this.entities=null,this.ioFilter=null},_prepRequest:function(t,e){var r=this.req,o=this.file;if(this.api.upload?i||this.req.type("multipart/form-data"):r.type("form"),r.on("error",function(t){t=t||{code:"UNKNOWN CODE",text:"UNKNOWN ERROR"},this._handleError({status:t.code||"UNKNOWN CODE",text:t})}.bind(this)),this.share(e?e.__cookies__:null),e&&this.data(e),this.inputs.length>0&&this.data({inputs:y.encode(this.inputs)}),this.outputs.length>0&&this.data({robjects:this.outputs.join()}),this.cookies&&this.cookies.forEach(function(t){r.set("Cookie",t)}),this.api.upload){for(var n in this.params)r.field(n,this.params[n]||this.params[n]===!1?this.params[n]+"":"");r.attach("file",this.rstream?a.createReadStream(o):o)}else r["GET"===this.api.method?"query":"send"](this.params)},_handleError:function(t){var e=t.status,r=t.body&&t.body.deployr?t.body:t,i=200!==e||r.deployr&&!r.deployr.response.success;return i&&(r={get:function(t){return l.get(this.deployr.response,t)},deployr:{response:{success:!1,call:this.api.call,errorCode:r.deployr?r.deployr.response.errorCode:e,error:r.deployr?r.deployr.response.error:r.text}}},h.error("error()",this.api,r,t),this.logger.error("error()",this.api,r,t),this.globalEvts&&o(this.api.call,r),this.emit("error",r),this.emit("deployr-io:"+r.deployr.response.errorCode,r),this.deferred.reject(r)),i}});i&&(window.Revolution=window.Revolution||t("./lib/deprecated")),e.exports={DeployR:E,apis:function(t){return t?Object.keys(c):c},configure:function(t){t=t||{};for(var e in t)j.set(e,t[e]);return j.sticky||j.set("cookies",null),h.setLevel(j.logging?h.DEBUG:h.OFF),this},io:function(t){return E["new"](t)},auth:function(t,e){var r={username:t,password:e};return E["new"]("/r/user/login").data(r).end()},script:function(){var t=l.signature(arguments),e=t.opts,r=t.api;return t.create?E["new"]("/r/project/create").end(function(t){return{project:t.get("project").project}}).io(r).data(e):E["new"](r).data(e)},pipeline:function(t){function e(){i.add(function(){t.shift().drain().then(function(t){n.push(t),a.push(c),i.isEmpty()&&(r.configure(u),o.resolve({results:n,errors:a})),i.take()},function(t){n.push(c),a.push(t),i.isEmpty()&&0===n.length&&(r.configure(u),o.reject(a)),i.take()})},null,!0)}var r=this,o=s(),i=new f,n=[],a=[],c=null,u={sticky:j.sticky,cookies:j.cookies};t=t.slice(0),r.configure({sticky:!0});for(var l=0;l=0;o.lengthi?"0"+i:i,s=10>s?"0"+s:s,a=10>a?"0"+a:a,c=10>c?"0"+c:c,l=o+"-"+i+"-"+n,e===p.RPOSIX_DATE||e===p.RPOSIX_DATE_VECTOR){var h=s+":"+a+":"+c,f=-u,d="+";0>f&&(f=-f,d="-"),u=d+r(f/60,2)+""+r(f%60,2),l+=" "+h+" "+u}return l}function n(t,e){for(var r=t.value,s=0;s "+i[2].call]);for(var u=2;u=this.context.value&&o(e,{level:t,name:this.context.name,value:this.context.value})},debug:function(){this.log(s.DEBUG,arguments)},error:function(){this.log(s.ERROR,arguments)},info:function(){this.log(s.INFO,arguments)},warn:function(){this.log(s.WARN,arguments)},setLevel:function(t){t&&"value"in t&&(this.context=t)}},s.DEBUG={value:1,name:"DEBUG"},s.INFO={value:2,name:"INFO"},s.WARN={value:4,name:"WARN"},s.ERROR={value:8,name:"ERROR"},s.OFF={value:99,name:"OFF"},s.setLevel=function(t){n.setLevel(t)},s.debug=function(){n.debug.apply(n,arguments)},s.info=function(){n.info.apply(n,arguments)},s.warn=function(){n.warn.apply(n,arguments)},s.error=function(){n.error.apply(n,arguments)},s.get=function(t,e,r){return a[t]||function(){return a[t]=new i(t,e,r),a[t]}()},n=s.get("global"),e.exports=s},{}],9:[function(t,e,r){e.exports=function(e){try{return t(e)}catch(r){}}},{}],10:[function(t,e,r){function o(){this.emptyCallback=null,this.callbacks=[],this.yielded=!1,this.response=null,this.responseChain=[]}o.prototype={add:function(t,e,r){this.yielded||r?this.callbacks.push({fn:t,ctx:e}):t.apply(e||this,[this.response])},size:function(){return this.callbacks.length},isEmpty:function(){return 0===this.callbacks.length},empty:function(t,e){this.emptyCallback={fn:t,ctx:e}},"yield":function(t){this.yielded=t},take:function(t,e,r){var o;t&&(this.response=t,this.responseChain.push(t)),!this.yielded&&this.callbacks[0]&&(o=this.callbacks.shift(),o.fn.apply(o.ctx||this,[this.responseChain,e,r]),this.callbacks[0]&&this.emptyCallback&&this.emptyCallback.fn.call(this.emptyCallback.ctx||this))},flush:function(t,e,r){for(t&&(this.response=t,this.responseChain.push(t));this.callbacks[0]&&!this.yielded;){var o=this.callbacks.shift();o.fn.apply(o.ctx||this,[this.responseChain,e,r]),this.callbacks[0]&&this.emptyCallback&&this.emptyCallback.fn.call(this.emptyCallback.ctx||this)}}},e.exports=o},{}],11:[function(t,e,r){var o=t("./selfish").Base,i=t("./rtypes");e.exports=o.extend(i,{initialize:function(t,e,r){this.name=t,this.value=e,this.options=r||{}},numeric:function(){return this.assert({type:this.deployr.RNUMERIC,name:this.name,value:this.value,toString:this.toString})},integer:function(){return this.assert({type:this.deployr.RINTEGER,name:this.name,value:this.value,toString:this.toString})},logical:function(){return this.assert({type:this.deployr.RBOOLEAN,name:this.name,value:this.value,toString:this.toString})},character:function(){return this.assert({type:this.deployr.RSTRING,name:this.name,value:this.value,toString:this.toString})},date:function(){return this.assert({type:this.deployr.RDATE,name:this.name,value:this.value,format:"yyyy-MM-dd",toString:this.toString})},posixct:function(){return this.assert({type:this.deployr.RPOSIX_DATE,name:this.name,value:this.value,format:"yyyy-MM-dd HH:mm:ss Z",toString:this.toString})},numericVector:function(){return this.assert({type:this.deployr.RNUMERIC_VECTOR,name:this.name,value:this.value,toString:this.toString})},integerVector:function(){return this.assert({type:this.deployr.RINTEGER_VECTOR,name:this.name,value:this.value,toString:this.toString})},logicalVector:function(){return this.assert({type:this.deployr.RBOOLEAN_VECTOR,name:this.name,value:this.value,toString:this.toString})},characterVector:function(){return this.assert({type:this.deployr.RSTRING_VECTOR,name:this.name,value:this.value,toString:this.toString})},dateVector:function(){return this.assert({type:this.deployr.RDATE_VECTOR,name:this.name,value:this.value,format:"yyyy-MM-dd",toString:this.toString})},posixctVector:function(){return this.assert({type:this.deployr.RPOSIX_DATE_VECTOR,name:this.name,value:this.value,format:"yyyy-MM-dd HH:mm:ss Z",toString:this.toString})},list:function(){return this.assert({type:this.deployr.RLIST,name:this.name,value:this.value,toString:this.toString})},dataframe:function(){return this.assert({type:this.deployr.RDATAFRAME,name:this.name,value:this.value,toString:this.toString})},factor:function(){var t=this.options;return this.assert({type:this.deployr.RFACTOR,name:this.name,value:this.value,ordered:!1,levels:t.levels,labels:t.labels,toString:this.toString})},ordered:function(){var t=this.options;return this.assert({type:this.deployr.RORDERED,name:this.name,value:this.value,ordered:!0,levels:t.levels,labels:t.labels,toString:this.toString})},numericMatrix:function(){return this.assert({type:this.deployr.RNUMERIC_MATRIX,name:this.name,value:this.value,toString:this.toString})},integerMatrix:function(){return this.assert({type:this.deployr.RINTEGER_MATRIX,name:this.name,value:this.value,toString:this.toString})},logicalMatrix:function(){return this.assert({type:this.deployr.RBOOLEAN_MATRIX,name:this.name,value:this.value,toString:this.toString})},characterMatrix:function(){return this.assert({type:this.deployr.RSTRING_MATRIX,name:this.name,value:this.value,toString:this.toString})},toString:function(){var t=this.options||{},e=t.levels?"[ levels = "+t.levels+"]":"",r=t.labels?"[ labels = "+t.labels+"]":"";return"[ name = "+this.name+" ] [ value = "+this.value+" ] [ type = "+this.type+" ] "+e+r}})},{"./rtypes":13,"./selfish":14}],12:[function(t,e,r){function o(t,e,r,o){var i;if(s.isObject(e)){if(i=e,!i.type!==t)throw new Error('IllegalArgumentError:Expecting "'+t+'" but found "'+i.type+'"')}else i=a["new"](e,r,o)[t]();return i}var i=t("./selfish").Base,n=t("./rtypes"),s=t("./lang"),a=t("./rinput");e.exports=i.extend(n,{numeric:function(t,e){return this.inputs.push(o(this.deployr.RNUMERIC,t,e)),this},integer:function(t,e){return this.inputs.push(o(this.deployr.RINTEGER,t,e)),this},logical:function(t,e){return this.inputs.push(o(this.deployr.RBOOLEAN,t,e)),this},character:function(t,e){return this.inputs.push(o(this.deployr.RSTRING,t,e)),this},date:function(t,e){return this.inputs.push(o(this.deployr.RDATE,t,e)),this},posixct:function(t,e){return this.inputs.push(o(this.deployr.RPOSIX_DATE,t,e)),this},numericVector:function(t,e){return this.inputs.push(o(this.deployr.RNUMERIC_VECTOR,t,e)),this},integerVector:function(t,e){return this.inputs.push(o(this.deployr.RINTEGER_VECTOR,t,e)),this},logicalVector:function(t,e){return this.inputs.push(o(this.deployr.RBOOLEAN_VECTOR,t,e)),this},characterVector:function(t,e){return this.inputs.push(o(this.deployr.RSTRING_VECTOR,t,e)),this},dateVector:function(t,e){return this.inputs.push(o(this.deployr.RDATE_VECTOR,t,e)),this},posixctVector:function(t,e){return this.inputs.push(o(this.deployr.RPOSIX_DATE_VECTOR,t,e)),this},list:function(t,e){return this.inputs.push(o(this.deployr.RLIST,t,e)),this},dataframe:function(t,e){return this.inputs.push(o(this.deployr.RDATAFRAME,t,e)),this},factor:function(t,e,r,i){var n={levels:r,labels:i};return this.inputs.push(o(this.deployr.RFACTOR,t,e,n)),this},ordered:function(t,e,r,i){var n={levels:r,labels:i};return this.inputs.push(o(this.deployr.RORDERED,t,e,n)),this},numericMatrix:function(t,e){return this.inputs.push(o(this.deployr.RNUMERIC_MATRIX,t,e)),this},integerMatrix:function(t,e){return this.inputs.push(o(this.deployr.RINTEGER_MATRIX,t,e)),this},logicalMatrix:function(t,e){return this.inputs.push(o(this.deployr.RBOOLEAN_MATRIX,t,e)),this},characterMatrix:function(t,e){return this.inputs.push(o(this.deployr.RSTRING_MATRIX,t,e)),this}})},{"./lang":7,"./rinput":11,"./rtypes":13,"./selfish":14}],13:[function(t,e,r){var o=t("./selfish").Base,i=t("./lang"),n={};e.exports=o.extend({r:{PRIMITIVE:"primitive",DATAFRAME:"dataframe",LIST:"list",MATRIX:"matrix",DATE:"date",FACTOR:"factor",VECTOR:"vector"},deployr:{RBOOLEAN:"logical",RNUMERIC:"numeric",RINTEGER:"integer",RSTRING:"character",RDATE:"date",RPOSIX_DATE:"posixct",RBOOLEAN_VECTOR:"logicalVector",RNUMERIC_VECTOR:"numericVector",RINTEGER_VECTOR:"integerVector",RSTRING_VECTOR:"characterVector",RDATE_VECTOR:"dateVector",RPOSIX_DATE_VECTOR:"posixctVector",RLIST:"list",RDATAFRAME:"dataframe",RFACTOR:"factor",RORDERED:"ordered",RBOOLEAN_MATRIX:"logicalMatrix",RNUMERIC_MATRIX:"numericMatrix",RINTEGER_MATRIX:"integerMatrix",RSTRING_MATRIX:"characterMatrix"},isDate:function(t){return t===this.deployr.RDATE||t===this.deployr.RPOSIX_DATE||t===this.deployr.RDATE_VECTOR||t===this.deployr.RPOSIX_DATE_VECTOR||t===this.r.DATE},deployrToR:function(t){var e=this.deployr,r=this.r;return n[t]||(n[e.RBOOLEAN]=r.PRIMITIVE,n[e.RNUMERIC]=r.PRIMITIVE,n[e.RINTEGER]=r.PRIMITIVE,n[e.RSTRING]=r.PRIMITIVE,n[e.RDATE]=r.DATE,n[e.RPOSIX_DATE]=r.DATE,n[e.RBOOLEAN_VECTOR]=r.VECTOR,n[e.RNUMERIC_VECTOR]=r.VECTOR,n[e.RINTEGER_VECTOR]=r.VECTOR,n[e.RSTRING_VECTOR]=r.VECTOR,n[e.RDATE_VECTOR]=r.VECTOR,n[e.RPOSIX_DATE_VECTOR]=r.VECTOR,n[e.RLIST]=r.LIST,n[e.RDATAFRAME]=r.DATAFRAME,n[e.RFACTOR]=r.FACTOR,n[e.RORDERED]=r.FACTOR,n[e.RBOOLEAN_MATRIX]=r.MATRIX,n[e.RNUMERIC_MATRIX]=r.MATRIX,n[e.RINTEGER_MATRIX]=r.MATRIX,n[e.RSTRING_MATRIX]=r.MATRIX),n[t]},assert:function(t){var e,r=this.deployr,o=null,n=t.value;n=i.isArray(n)?n:[n];for(var s=0;so;o++)if(r){if(t[o][r]===e)return t[o]}else if(t[o]===e)return t[o];return null};r.merge=function(t,e){t&&"object"==typeof t||(t={}),e&&"object"==typeof e||(e={});for(var r in e)t[r]=e[r];return t},r.workspace=function(t,e){var r=i(t,"workspace");return r?e?n(r.objects,e,"name"):r.objects||r.object:null},r.signature=function(){var t,e=Array.prototype.slice.call(arguments[0],0),r=e.length,i=!1,n={};if(1===r&&o.isObject(e[0]))n=e[0],t=n.project?"/r/project/execute/script":"/r/repository/script/execute";else if(1===r&&o.isString(e[0]))e=e[0].split("/"),t="/r/repository/script/execute",n={author:e[1],directory:e[2],filename:e[3]};else if(2===r){var s=e[1];t=s?"/r/project/execute/script":"/r/repository/script/execute",e=e[0].split("/"),n={project:s,author:e[1],directory:e[2],filename:e[3]}}else r>2&&(n={author:e[2],directory:e[1],filename:e[0]});return n.project&&o.isBoolean(n.project)&&(delete n.project,i=!0),{api:t,opts:n,create:i}}},{"./lang":7}],16:[function(t,e,r){},{}],17:[function(t,e,r){function o(){if(!a){a=!0;for(var t,e=s.length;e;){t=s,s=[];for(var r=-1;++ra;a++)s(a);else i.resolve(o);return i.promise}var p,h=function(t){return"function"==typeof t},f=function(t){return Array.isArray?Array.isArray(t):t instanceof Array},d=function(t){return!(!t||!(typeof t).match(/function|object/))},y=function(t){return t===!1||t===r||null===t},m=function(t,e){return[].slice.call(t,e)},v="undefined",R=typeof TypeError===v?Error:TypeError;if(typeof t!==v&&t.nextTick)p=t.nextTick;else if(typeof MessageChannel!==v){var g=new MessageChannel,j=[];g.port1.onmessage=function(){j.length&&j.shift()()},p=function(t){j.push(t),g.port2.postMessage(0)}}else p=function(t){setTimeout(t,0)};var T=function(t){function e(){if(0!==v){var t,e=g,r=0,o=e.length,i=~v?0:1;for(g=[];o>r;r++)(t=e[r][i])&&t(f)}}function o(t){function r(t){return function(e){return i?void 0:(i=!0,t(e))}}var i=!1;if(v)return this;try{var n=d(t)&&t.then;if(h(n)){if(t===j)throw new R("Promise can't resolve itself");return n.call(t,r(o),r(l)),this}}catch(s){return r(l)(s),this}return m(function(){f=t,v=1,e()}),this}function l(t){return v||m(function(){try{throw t}catch(r){f=r}v=-1,e()}),this}var f,m=(r!==t?t:T.alwaysAsync)?p:function(t){t()},v=0,g=[],j={then:function(t,r){var o=T();return g.push([function(e){try{o.resolve(y(t)?e:h(t)?t(e):T.onlyFuncs?e:t)}catch(r){o.reject(r)}},function(t){if((y(r)||!h(r)&&T.onlyFuncs)&&o.reject(t),r)try{o.resolve(h(r)?r(t):r)}catch(e){o.reject(e)}}]),0!==v&&m(e),o.promise},success:i,error:n,otherwise:n,apply:s,spread:s,ensure:a,nodify:c,rethrow:u,isPending:function(){return!(0!==v)},getStatus:function(){return v}};return j.toSource=j.toString=j.valueOf=function(){return f===r?this:f},{promise:j,resolve:o,fulfill:o,reject:l}};T.deferred=T.defer=T,T.nextTick=p,T.alwaysAsync=!0,T.onlyFuncs=!0,T.resolved=T.fulfilled=function(t){return T(!0).resolve(t).promise},T.rejected=function(t){return T(!0).reject(t).promise},T.wait=function(t){var e=T();return setTimeout(e.resolve,t||0),e.promise},T.delay=function(t,e){var r=T();return setTimeout(function(){try{r.resolve(t.apply(null))}catch(e){r.reject(e)}},e||0),r.promise},T.promisify=function(t){return t&&h(t.then)?t:T.resolved(t)},T.all=function(){return l(arguments,!1)},T.resolveAll=function(){return l(arguments,!0)},T.nodeCapsule=function(t,e){return e||(e=t,t=void 0),function(){var r=T(),o=m(arguments);o.push(function(t,e){t?r.reject(t):r.resolve(arguments.length>2?m(arguments,1):e)});try{e.apply(t,o)}catch(i){r.reject(i)}return r.promise}},typeof window!==v&&(window.D=T),typeof e!==v&&e.exports&&(e.exports=T)}()}).call(this,t("_process"))},{_process:17}],19:[function(t,e,r){function o(){}function i(t){var e={}.toString.call(t);switch(e){case"[object File]":case"[object Blob]":case"[object FormData]":return!0;default:return!1}}function n(){if(v.XMLHttpRequest&&("file:"!=v.location.protocol||!v.ActiveXObject))return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(t){}return!1}function s(t){return t===Object(t)}function a(t){if(!s(t))return t;var e=[];for(var r in t)null!=t[r]&&e.push(encodeURIComponent(r)+"="+encodeURIComponent(t[r]));return e.join("&")}function c(t){for(var e,r,o={},i=t.split("&"),n=0,s=i.length;s>n;++n)r=i[n],e=r.split("="),o[decodeURIComponent(e[0])]=decodeURIComponent(e[1]);return o}function u(t){var e,r,o,i,n=t.split(/\r?\n/),s={};n.pop();for(var a=0,c=n.length;c>a;++a)r=n[a],e=r.indexOf(":"),o=r.slice(0,e).toLowerCase(),i=R(r.slice(e+1)),s[o]=i;return s}function l(t){return t.split(/ *; */).shift()}function p(t){return m(t.split(/ *; */),function(t,e){var r=e.split(/ *= */),o=r.shift(),i=r.shift();return o&&i&&(t[o]=i),t},{})}function h(t,e){e=e||{},this.req=t,this.xhr=this.req.xhr,this.text="HEAD"!=this.req.method?this.xhr.responseText:null,this.setStatusProperties(this.xhr.status),this.header=this.headers=u(this.xhr.getAllResponseHeaders()),this.header["content-type"]=this.xhr.getResponseHeader("content-type"),this.setHeaderProperties(this.header),this.body="HEAD"!=this.req.method?this.parseBody(this.text):null}function f(t,e){var r=this;y.call(this),this._query=this._query||[],this.method=t,this.url=e,this.header={},this._header={},this.on("end",function(){var t=null,e=null;try{e=new h(r)}catch(o){t=new Error("Parser is unable to parse the response"),t.parse=!0,t.original=o}r.callback(t,e)})}function d(t,e){return"function"==typeof e?new f("GET",t).end(e):1==arguments.length?new f("GET",t):new f(t,e)}var y=t("emitter"),m=t("reduce"),v="undefined"==typeof window?this:window,R="".trim?function(t){return t.trim()}:function(t){return t.replace(/(^\s*|\s*$)/g,"")};d.serializeObject=a,d.parseString=c,d.types={html:"text/html",json:"application/json",xml:"application/xml",urlencoded:"application/x-www-form-urlencoded",form:"application/x-www-form-urlencoded","form-data":"application/x-www-form-urlencoded"},d.serialize={"application/x-www-form-urlencoded":a,"application/json":JSON.stringify},d.parse={"application/x-www-form-urlencoded":c,"application/json":JSON.parse},h.prototype.get=function(t){return this.header[t.toLowerCase()]},h.prototype.setHeaderProperties=function(t){var e=this.header["content-type"]||"";this.type=l(e);var r=p(e);for(var o in r)this[o]=r[o]},h.prototype.parseBody=function(t){var e=d.parse[this.type];return e&&t&&t.length?e(t):null},h.prototype.setStatusProperties=function(t){var e=t/100|0;this.status=t,this.statusType=e,this.info=1==e,this.ok=2==e,this.clientError=4==e,this.serverError=5==e,this.error=4==e||5==e?this.toError():!1,this.accepted=202==t,this.noContent=204==t||1223==t,this.badRequest=400==t,this.unauthorized=401==t,this.notAcceptable=406==t,this.notFound=404==t,this.forbidden=403==t},h.prototype.toError=function(){var t=this.req,e=t.method,r=t.url,o="cannot "+e+" "+r+" ("+this.status+")",i=new Error(o);return i.status=this.status,i.method=e,i.url=r,i},d.Response=h,y(f.prototype),f.prototype.use=function(t){return t(this),this},f.prototype.timeout=function(t){return this._timeout=t,this},f.prototype.clearTimeout=function(){return this._timeout=0,clearTimeout(this._timer),this},f.prototype.abort=function(){return this.aborted?void 0:(this.aborted=!0,this.xhr.abort(),this.clearTimeout(),this.emit("abort"),this)},f.prototype.set=function(t,e){if(s(t)){for(var r in t)this.set(r,t[r]);return this}return this._header[t.toLowerCase()]=e,this.header[t]=e,this},f.prototype.unset=function(t){return delete this._header[t.toLowerCase()],delete this.header[t],this},f.prototype.getHeader=function(t){return this._header[t.toLowerCase()]},f.prototype.type=function(t){return this.set("Content-Type",d.types[t]||t),this},f.prototype.accept=function(t){return this.set("Accept",d.types[t]||t),this},f.prototype.auth=function(t,e){var r=btoa(t+":"+e);return this.set("Authorization","Basic "+r),this},f.prototype.query=function(t){return"string"!=typeof t&&(t=a(t)),t&&this._query.push(t),this},f.prototype.field=function(t,e){return this._formData||(this._formData=new FormData),this._formData.append(t,e),this},f.prototype.attach=function(t,e,r){return this._formData||(this._formData=new FormData),this._formData.append(t,e,r),this},f.prototype.send=function(t){var e=s(t),r=this.getHeader("Content-Type");if(e&&s(this._data))for(var o in t)this._data[o]=t[o];else"string"==typeof t?(r||this.type("form"),r=this.getHeader("Content-Type"),this._data="application/x-www-form-urlencoded"==r?this._data?this._data+"&"+t:t:(this._data||"")+t):this._data=t;return e?(r||this.type("json"),this):this},f.prototype.callback=function(t,e){var r=this._callback;return this.clearTimeout(),2==r.length?r(t,e):t?this.emit("error",t):void r(e)},f.prototype.crossDomainError=function(){var t=new Error("Origin is not allowed by Access-Control-Allow-Origin");t.crossDomain=!0,this.callback(t)},f.prototype.timeoutError=function(){var t=this._timeout,e=new Error("timeout of "+t+"ms exceeded");e.timeout=t,this.callback(e)},f.prototype.withCredentials=function(){return this._withCredentials=!0,this},f.prototype.end=function(t){var e=this,r=this.xhr=n(),s=this._query.join("&"),a=this._timeout,c=this._formData||this._data;if(this._callback=t||o,r.onreadystatechange=function(){return 4==r.readyState?0==r.status?e.aborted?e.timeoutError():e.crossDomainError():void e.emit("end"):void 0},r.upload&&(r.upload.onprogress=function(t){t.percent=t.loaded/t.total*100,e.emit("progress",t)}),a&&!this._timer&&(this._timer=setTimeout(function(){e.abort()},a)),s&&(s=d.serializeObject(s),this.url+=~this.url.indexOf("?")?"&"+s:"?"+s),r.open(this.method,this.url,!0),this._withCredentials&&(r.withCredentials=!0),"GET"!=this.method&&"HEAD"!=this.method&&"string"!=typeof c&&!i(c)){var u=d.serialize[this.getHeader("Content-Type")];u&&(c=u(c))}for(var l in this.header)null!=this.header[l]&&r.setRequestHeader(l,this.header[l]);return this.emit("request",this),r.send(c),this},d.Request=f,d.get=function(t,e,r){var o=d("GET",t);return"function"==typeof e&&(r=e,e=null),e&&o.query(e),r&&o.end(r),o},d.head=function(t,e,r){var o=d("HEAD",t);return"function"==typeof e&&(r=e,e=null),e&&o.send(e),r&&o.end(r),o},d.del=function(t,e){var r=d("DELETE",t);return e&&r.end(e),r},d.patch=function(t,e,r){var o=d("PATCH",t);return"function"==typeof e&&(r=e,e=null),e&&o.send(e),r&&o.end(r),o},d.post=function(t,e,r){var o=d("POST",t);return"function"==typeof e&&(r=e,e=null),e&&o.send(e),r&&o.end(r),o},d.put=function(t,e,r){var o=d("PUT",t);return"function"==typeof e&&(r=e,e=null),e&&o.send(e),r&&o.end(r),o},e.exports=d},{emitter:20,reduce:21}],20:[function(t,e,r){function o(t){return t?i(t):void 0}function i(t){for(var e in o.prototype)t[e]=o.prototype[e];return t}e.exports=o,o.prototype.on=o.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},o.prototype.once=function(t,e){function r(){o.off(t,r),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},r.fn=e,this.on(t,r),this},o.prototype.off=o.prototype.removeListener=o.prototype.removeAllListeners=o.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var r=this._callbacks[t];if(!r)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,i=0;io;++o)r[o].apply(this,e)}return this},o.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},o.prototype.hasListeners=function(t){return!!this.listeners(t).length}},{}],21:[function(t,e,r){e.exports=function(t,e,r){for(var o=0,i=t.length,n=3==arguments.length?r:t[o++];i>o;)n=e.call(null,n,t[o],++o,t);return n}},{}],22:[function(t,e,r){e.exports={name:"deployr",version:"7.4.1",description:"Simplified JavaScript client library for making requests to DeployR.",keywords:["deployr","deployr.io","ajax","R","api","simple"],author:"DeployR - Revolution Analytics Inc.",contributors:["Sean Wells"],repository:{type:"git",url:"git://github.com/deployr/js-client-library.git"},homepage:"http://deployr.revolutionanalytics.com/documents/dev/client-jsdoc",scripts:{start:"gulp start",build:"gulp"},devDependencies:{browserify:"^9.0.3",gulp:"^3.8.11","gulp-connect":"^2.2.0","gulp-header":"^1.2.2","gulp-jshint":"^1.9.2","gulp-livereload":"^3.8.0","gulp-plumber":"^0.6.6","gulp-rename":"^1.2.2","gulp-uglify":"^1.2.0","gulp-util":"^3.0.4",tape:"^3.5.0","vinyl-source-stream":"^1.0.0"},dependencies:{"d.js":"^0.6.0",superagent:"^0.21.0",ws:"^0.4.32"},main:"deployr.js",engines:{node:">= 0.10.0"},license:"Apache 2.0 License",bugs:{url:"https://github.com/deployr/js-client-library/issues"},directories:{example:"examples",test:"test"}}},{}]},{},[1])(1)}); \ No newline at end of file +value:i(u.value,u.type)};break;case p.RFACTOR:case p.RORDERED:e={name:u.name,type:l.FACTOR,ordered:u.ordered,labels:u.labels,levels:u.levels,value:u.value};break;case p.RSTRING:case p.RBOOLEAN:case p.RNUMERIC:case p.RINTEGER:e={name:u.name,type:l.PRIMITIVE,value:u.value};break;case p.RNUMERIC_VECTOR:case p.RINTEGER_VECTOR:case p.RBOOLEAN_VECTOR:case p.RSTRING_VECTOR:e={name:u.name,type:l.VECTOR,value:u.value};break;case p.RDATE_VECTOR:case p.RPOSIX_DATE_VECTOR:e={name:u.name,type:l.VECTOR,value:o(u.value,u.type),format:u.format};break;default:throw new Error('No RDataType found for "'+u.type+'"')}r.value.push(e)}return r}var c=t("./lang"),u=t("./rtypes"),l=u.r,p=u.deployr;e.exports={encode:function(t){for(var e={},r=0;r "+i[2].call]);for(var u=2;u=this.context.value&&o(e,{level:t,name:this.context.name,value:this.context.value})},debug:function(){this.log(s.DEBUG,arguments)},error:function(){this.log(s.ERROR,arguments)},info:function(){this.log(s.INFO,arguments)},warn:function(){this.log(s.WARN,arguments)},setLevel:function(t){t&&"value"in t&&(this.context=t)}},s.DEBUG={value:1,name:"DEBUG"},s.INFO={value:2,name:"INFO"},s.WARN={value:4,name:"WARN"},s.ERROR={value:8,name:"ERROR"},s.OFF={value:99,name:"OFF"},s.setLevel=function(t){n.setLevel(t)},s.debug=function(){n.debug.apply(n,arguments)},s.info=function(){n.info.apply(n,arguments)},s.warn=function(){n.warn.apply(n,arguments)},s.error=function(){n.error.apply(n,arguments)},s.get=function(t,e,r){return a[t]||function(){return a[t]=new i(t,e,r),a[t]}()},n=s.get("global"),e.exports=s},{}],9:[function(t,e,r){e.exports=function(e){try{return t(e)}catch(r){}}},{}],10:[function(t,e,r){function o(){this.emptyCallback=null,this.callbacks=[],this.yielded=!1,this.response=null,this.responseChain=[]}o.prototype={add:function(t,e,r){this.yielded||r?this.callbacks.push({fn:t,ctx:e}):t.apply(e||this,[this.response])},size:function(){return this.callbacks.length},isEmpty:function(){return 0===this.callbacks.length},empty:function(t,e){this.emptyCallback={fn:t,ctx:e}},"yield":function(t){this.yielded=t},take:function(t,e,r){var o;t&&(this.response=t,this.responseChain.push(t)),!this.yielded&&this.callbacks[0]&&(o=this.callbacks.shift(),o.fn.apply(o.ctx||this,[this.responseChain,e,r]),this.callbacks[0]&&this.emptyCallback&&this.emptyCallback.fn.call(this.emptyCallback.ctx||this))},flush:function(t,e,r){for(t&&(this.response=t,this.responseChain.push(t));this.callbacks[0]&&!this.yielded;){var o=this.callbacks.shift();o.fn.apply(o.ctx||this,[this.responseChain,e,r]),this.callbacks[0]&&this.emptyCallback&&this.emptyCallback.fn.call(this.emptyCallback.ctx||this)}}},e.exports=o},{}],11:[function(t,e,r){var o=t("./selfish").Base,i=t("./rtypes");e.exports=o.extend(i,{initialize:function(t,e,r){this.name=t,this.value=e,this.options=r||{}},numeric:function(){return this.value=parseFloat(this.value),this.assert({type:this.deployr.RNUMERIC,name:this.name,value:this.value,toString:this.toString})},integer:function(){return this.value=parseInt(this.value,10),this.assert({type:this.deployr.RINTEGER,name:this.name,value:this.value,toString:this.toString})},logical:function(){return this.assert({type:this.deployr.RBOOLEAN,name:this.name,value:this.value,toString:this.toString})},character:function(){return this.assert({type:this.deployr.RSTRING,name:this.name,value:this.value,toString:this.toString})},date:function(){return this.assert({type:this.deployr.RDATE,name:this.name,value:this.value,format:"yyyy-MM-dd",toString:this.toString})},posixct:function(){return this.assert({type:this.deployr.RPOSIX_DATE,name:this.name,value:this.value,format:"yyyy-MM-dd HH:mm:ss Z",toString:this.toString})},numericVector:function(){return this.assert({type:this.deployr.RNUMERIC_VECTOR,name:this.name,value:this.value,toString:this.toString})},integerVector:function(){return this.assert({type:this.deployr.RINTEGER_VECTOR,name:this.name,value:this.value,toString:this.toString})},logicalVector:function(){return this.assert({type:this.deployr.RBOOLEAN_VECTOR,name:this.name,value:this.value,toString:this.toString})},characterVector:function(){return this.assert({type:this.deployr.RSTRING_VECTOR,name:this.name,value:this.value,toString:this.toString})},dateVector:function(){return this.assert({type:this.deployr.RDATE_VECTOR,name:this.name,value:this.value,format:"yyyy-MM-dd",toString:this.toString})},posixctVector:function(){return this.assert({type:this.deployr.RPOSIX_DATE_VECTOR,name:this.name,value:this.value,format:"yyyy-MM-dd HH:mm:ss Z",toString:this.toString})},list:function(){return this.assert({type:this.deployr.RLIST,name:this.name,value:this.value,toString:this.toString})},dataframe:function(){return this.assert({type:this.deployr.RDATAFRAME,name:this.name,value:this.value,toString:this.toString})},factor:function(){var t=this.options;return this.assert({type:this.deployr.RFACTOR,name:this.name,value:this.value,ordered:!1,levels:t.levels,labels:t.labels,toString:this.toString})},ordered:function(){var t=this.options;return this.assert({type:this.deployr.RORDERED,name:this.name,value:this.value,ordered:!0,levels:t.levels,labels:t.labels,toString:this.toString})},numericMatrix:function(){return this.assert({type:this.deployr.RNUMERIC_MATRIX,name:this.name,value:this.value,toString:this.toString})},integerMatrix:function(){return this.assert({type:this.deployr.RINTEGER_MATRIX,name:this.name,value:this.value,toString:this.toString})},logicalMatrix:function(){return this.assert({type:this.deployr.RBOOLEAN_MATRIX,name:this.name,value:this.value,toString:this.toString})},characterMatrix:function(){return this.assert({type:this.deployr.RSTRING_MATRIX,name:this.name,value:this.value,toString:this.toString})},toString:function(){var t=this.options||{},e=t.levels?"[ levels = "+t.levels+"]":"",r=t.labels?"[ labels = "+t.labels+"]":"";return"[ name = "+this.name+" ] [ value = "+this.value+" ] [ type = "+this.type+" ] "+e+r}})},{"./rtypes":13,"./selfish":14}],12:[function(t,e,r){function o(t,e,r,o){var i;if(s.isObject(e)){if(i=e,!i.type!==t)throw new Error('IllegalArgumentError:Expecting "'+t+'" but found "'+i.type+'"')}else i=a["new"](e,r,o)[t]();return i}var i=t("./selfish").Base,n=t("./rtypes"),s=t("./lang"),a=t("./rinput");e.exports=i.extend(n,{numeric:function(t,e){return this.inputs.push(o(this.deployr.RNUMERIC,t,e)),this},integer:function(t,e){return this.inputs.push(o(this.deployr.RINTEGER,t,e)),this},logical:function(t,e){return this.inputs.push(o(this.deployr.RBOOLEAN,t,e)),this},character:function(t,e){return this.inputs.push(o(this.deployr.RSTRING,t,e)),this},date:function(t,e){return this.inputs.push(o(this.deployr.RDATE,t,e)),this},posixct:function(t,e){return this.inputs.push(o(this.deployr.RPOSIX_DATE,t,e)),this},numericVector:function(t,e){return this.inputs.push(o(this.deployr.RNUMERIC_VECTOR,t,e)),this},integerVector:function(t,e){return this.inputs.push(o(this.deployr.RINTEGER_VECTOR,t,e)),this},logicalVector:function(t,e){return this.inputs.push(o(this.deployr.RBOOLEAN_VECTOR,t,e)),this},characterVector:function(t,e){return this.inputs.push(o(this.deployr.RSTRING_VECTOR,t,e)),this},dateVector:function(t,e){return this.inputs.push(o(this.deployr.RDATE_VECTOR,t,e)),this},posixctVector:function(t,e){return this.inputs.push(o(this.deployr.RPOSIX_DATE_VECTOR,t,e)),this},list:function(t,e){return this.inputs.push(o(this.deployr.RLIST,t,e)),this},dataframe:function(t,e){return this.inputs.push(o(this.deployr.RDATAFRAME,t,e)),this},factor:function(t,e,r,i){var n={levels:r,labels:i};return this.inputs.push(o(this.deployr.RFACTOR,t,e,n)),this},ordered:function(t,e,r,i){var n={levels:r,labels:i};return this.inputs.push(o(this.deployr.RORDERED,t,e,n)),this},numericMatrix:function(t,e){return this.inputs.push(o(this.deployr.RNUMERIC_MATRIX,t,e)),this},integerMatrix:function(t,e){return this.inputs.push(o(this.deployr.RINTEGER_MATRIX,t,e)),this},logicalMatrix:function(t,e){return this.inputs.push(o(this.deployr.RBOOLEAN_MATRIX,t,e)),this},characterMatrix:function(t,e){return this.inputs.push(o(this.deployr.RSTRING_MATRIX,t,e)),this}})},{"./lang":7,"./rinput":11,"./rtypes":13,"./selfish":14}],13:[function(t,e,r){var o=t("./selfish").Base,i=t("./lang"),n={};e.exports=o.extend({r:{PRIMITIVE:"primitive",DATAFRAME:"dataframe",LIST:"list",MATRIX:"matrix",DATE:"date",FACTOR:"factor",VECTOR:"vector"},deployr:{RBOOLEAN:"logical",RNUMERIC:"numeric",RINTEGER:"integer",RSTRING:"character",RDATE:"date",RPOSIX_DATE:"posixct",RBOOLEAN_VECTOR:"logicalVector",RNUMERIC_VECTOR:"numericVector",RINTEGER_VECTOR:"integerVector",RSTRING_VECTOR:"characterVector",RDATE_VECTOR:"dateVector",RPOSIX_DATE_VECTOR:"posixctVector",RLIST:"list",RDATAFRAME:"dataframe",RFACTOR:"factor",RORDERED:"ordered",RBOOLEAN_MATRIX:"logicalMatrix",RNUMERIC_MATRIX:"numericMatrix",RINTEGER_MATRIX:"integerMatrix",RSTRING_MATRIX:"characterMatrix"},isDate:function(t){return t===this.deployr.RDATE||t===this.deployr.RPOSIX_DATE||t===this.deployr.RDATE_VECTOR||t===this.deployr.RPOSIX_DATE_VECTOR||t===this.r.DATE},deployrToR:function(t){var e=this.deployr,r=this.r;return n[t]||(n[e.RBOOLEAN]=r.PRIMITIVE,n[e.RNUMERIC]=r.PRIMITIVE,n[e.RINTEGER]=r.PRIMITIVE,n[e.RSTRING]=r.PRIMITIVE,n[e.RDATE]=r.DATE,n[e.RPOSIX_DATE]=r.DATE,n[e.RBOOLEAN_VECTOR]=r.VECTOR,n[e.RNUMERIC_VECTOR]=r.VECTOR,n[e.RINTEGER_VECTOR]=r.VECTOR,n[e.RSTRING_VECTOR]=r.VECTOR,n[e.RDATE_VECTOR]=r.VECTOR,n[e.RPOSIX_DATE_VECTOR]=r.VECTOR,n[e.RLIST]=r.LIST,n[e.RDATAFRAME]=r.DATAFRAME,n[e.RFACTOR]=r.FACTOR,n[e.RORDERED]=r.FACTOR,n[e.RBOOLEAN_MATRIX]=r.MATRIX,n[e.RNUMERIC_MATRIX]=r.MATRIX,n[e.RINTEGER_MATRIX]=r.MATRIX,n[e.RSTRING_MATRIX]=r.MATRIX),n[t]},assert:function(t){var e,r=this.deployr,o=null,n=t.value;n=i.isArray(n)?n:[n];for(var s=0;so;o++)if(r){if(t[o][r]===e)return t[o]}else if(t[o]===e)return t[o];return null};r.merge=function(t,e){t&&"object"==typeof t||(t={}),e&&"object"==typeof e||(e={});for(var r in e)t[r]=e[r];return t},r.workspace=function(t,e){var r=i(t,"workspace");return r?e?n(r.objects,e,"name"):r.objects||r.object:null},r.signature=function(){var t,e=Array.prototype.slice.call(arguments[0],0),r=e.length,i=!1,n={};if(1===r&&o.isObject(e[0]))n=e[0],t=n.project?"/r/project/execute/script":"/r/repository/script/execute";else if(1===r&&o.isString(e[0]))e=e[0].split("/"),t="/r/repository/script/execute",n={author:e[1],directory:e[2],filename:e[3]};else if(2===r){var s=e[1];t=s?"/r/project/execute/script":"/r/repository/script/execute",e=e[0].split("/"),n={project:s,author:e[1],directory:e[2],filename:e[3]}}else r>2&&(n={author:e[2],directory:e[1],filename:e[0]});return n.project&&o.isBoolean(n.project)&&(delete n.project,i=!0),{api:t,opts:n,create:i}}},{"./lang":7}],16:[function(t,e,r){},{}],17:[function(t,e,r){function o(){if(!a){a=!0;for(var t,e=s.length;e;){t=s,s=[];for(var r=-1;++ra;a++)s(a);else i.resolve(o);return i.promise}var p,h=function(t){return"function"==typeof t},f=function(t){return Array.isArray?Array.isArray(t):t instanceof Array},d=function(t){return!(!t||!(typeof t).match(/function|object/))},y=function(t){return t===!1||t===r||null===t},m=function(t,e){return[].slice.call(t,e)},v="undefined",R=typeof TypeError===v?Error:TypeError;if(typeof t!==v&&t.nextTick)p=t.nextTick;else if(typeof MessageChannel!==v){var g=new MessageChannel,j=[];g.port1.onmessage=function(){j.length&&j.shift()()},p=function(t){j.push(t),g.port2.postMessage(0)}}else p=function(t){setTimeout(t,0)};var T=function(t){function e(){if(0!==v){var t,e=g,r=0,o=e.length,i=~v?0:1;for(g=[];o>r;r++)(t=e[r][i])&&t(f)}}function o(t){function r(t){return function(e){return i?void 0:(i=!0,t(e))}}var i=!1;if(v)return this;try{var n=d(t)&&t.then;if(h(n)){if(t===j)throw new R("Promise can't resolve itself");return n.call(t,r(o),r(l)),this}}catch(s){return r(l)(s),this}return m(function(){f=t,v=1,e()}),this}function l(t){return v||m(function(){try{throw t}catch(r){f=r}v=-1,e()}),this}var f,m=(r!==t?t:T.alwaysAsync)?p:function(t){t()},v=0,g=[],j={then:function(t,r){var o=T();return g.push([function(e){try{o.resolve(y(t)?e:h(t)?t(e):T.onlyFuncs?e:t)}catch(r){o.reject(r)}},function(t){if((y(r)||!h(r)&&T.onlyFuncs)&&o.reject(t),r)try{o.resolve(h(r)?r(t):r)}catch(e){o.reject(e)}}]),0!==v&&m(e),o.promise},success:i,error:n,otherwise:n,apply:s,spread:s,ensure:a,nodify:c,rethrow:u,isPending:function(){return!(0!==v)},getStatus:function(){return v}};return j.toSource=j.toString=j.valueOf=function(){return f===r?this:f},{promise:j,resolve:o,fulfill:o,reject:l}};T.deferred=T.defer=T,T.nextTick=p,T.alwaysAsync=!0,T.onlyFuncs=!0,T.resolved=T.fulfilled=function(t){return T(!0).resolve(t).promise},T.rejected=function(t){return T(!0).reject(t).promise},T.wait=function(t){var e=T();return setTimeout(e.resolve,t||0),e.promise},T.delay=function(t,e){var r=T();return setTimeout(function(){try{r.resolve(t.apply(null))}catch(e){r.reject(e)}},e||0),r.promise},T.promisify=function(t){return t&&h(t.then)?t:T.resolved(t)},T.all=function(){return l(arguments,!1)},T.resolveAll=function(){return l(arguments,!0)},T.nodeCapsule=function(t,e){return e||(e=t,t=void 0),function(){var r=T(),o=m(arguments);o.push(function(t,e){t?r.reject(t):r.resolve(arguments.length>2?m(arguments,1):e)});try{e.apply(t,o)}catch(i){r.reject(i)}return r.promise}},typeof window!==v&&(window.D=T),typeof e!==v&&e.exports&&(e.exports=T)}()}).call(this,t("_process"))},{_process:17}],19:[function(t,e,r){function o(){}function i(t){var e={}.toString.call(t);switch(e){case"[object File]":case"[object Blob]":case"[object FormData]":return!0;default:return!1}}function n(){if(v.XMLHttpRequest&&("file:"!=v.location.protocol||!v.ActiveXObject))return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(t){}return!1}function s(t){return t===Object(t)}function a(t){if(!s(t))return t;var e=[];for(var r in t)null!=t[r]&&e.push(encodeURIComponent(r)+"="+encodeURIComponent(t[r]));return e.join("&")}function c(t){for(var e,r,o={},i=t.split("&"),n=0,s=i.length;s>n;++n)r=i[n],e=r.split("="),o[decodeURIComponent(e[0])]=decodeURIComponent(e[1]);return o}function u(t){var e,r,o,i,n=t.split(/\r?\n/),s={};n.pop();for(var a=0,c=n.length;c>a;++a)r=n[a],e=r.indexOf(":"),o=r.slice(0,e).toLowerCase(),i=R(r.slice(e+1)),s[o]=i;return s}function l(t){return t.split(/ *; */).shift()}function p(t){return m(t.split(/ *; */),function(t,e){var r=e.split(/ *= */),o=r.shift(),i=r.shift();return o&&i&&(t[o]=i),t},{})}function h(t,e){e=e||{},this.req=t,this.xhr=this.req.xhr,this.text="HEAD"!=this.req.method?this.xhr.responseText:null,this.setStatusProperties(this.xhr.status),this.header=this.headers=u(this.xhr.getAllResponseHeaders()),this.header["content-type"]=this.xhr.getResponseHeader("content-type"),this.setHeaderProperties(this.header),this.body="HEAD"!=this.req.method?this.parseBody(this.text):null}function f(t,e){var r=this;y.call(this),this._query=this._query||[],this.method=t,this.url=e,this.header={},this._header={},this.on("end",function(){var t=null,e=null;try{e=new h(r)}catch(o){t=new Error("Parser is unable to parse the response"),t.parse=!0,t.original=o}r.callback(t,e)})}function d(t,e){return"function"==typeof e?new f("GET",t).end(e):1==arguments.length?new f("GET",t):new f(t,e)}var y=t("emitter"),m=t("reduce"),v="undefined"==typeof window?this:window,R="".trim?function(t){return t.trim()}:function(t){return t.replace(/(^\s*|\s*$)/g,"")};d.serializeObject=a,d.parseString=c,d.types={html:"text/html",json:"application/json",xml:"application/xml",urlencoded:"application/x-www-form-urlencoded",form:"application/x-www-form-urlencoded","form-data":"application/x-www-form-urlencoded"},d.serialize={"application/x-www-form-urlencoded":a,"application/json":JSON.stringify},d.parse={"application/x-www-form-urlencoded":c,"application/json":JSON.parse},h.prototype.get=function(t){return this.header[t.toLowerCase()]},h.prototype.setHeaderProperties=function(t){var e=this.header["content-type"]||"";this.type=l(e);var r=p(e);for(var o in r)this[o]=r[o]},h.prototype.parseBody=function(t){var e=d.parse[this.type];return e&&t&&t.length?e(t):null},h.prototype.setStatusProperties=function(t){var e=t/100|0;this.status=t,this.statusType=e,this.info=1==e,this.ok=2==e,this.clientError=4==e,this.serverError=5==e,this.error=4==e||5==e?this.toError():!1,this.accepted=202==t,this.noContent=204==t||1223==t,this.badRequest=400==t,this.unauthorized=401==t,this.notAcceptable=406==t,this.notFound=404==t,this.forbidden=403==t},h.prototype.toError=function(){var t=this.req,e=t.method,r=t.url,o="cannot "+e+" "+r+" ("+this.status+")",i=new Error(o);return i.status=this.status,i.method=e,i.url=r,i},d.Response=h,y(f.prototype),f.prototype.use=function(t){return t(this),this},f.prototype.timeout=function(t){return this._timeout=t,this},f.prototype.clearTimeout=function(){return this._timeout=0,clearTimeout(this._timer),this},f.prototype.abort=function(){return this.aborted?void 0:(this.aborted=!0,this.xhr.abort(),this.clearTimeout(),this.emit("abort"),this)},f.prototype.set=function(t,e){if(s(t)){for(var r in t)this.set(r,t[r]);return this}return this._header[t.toLowerCase()]=e,this.header[t]=e,this},f.prototype.unset=function(t){return delete this._header[t.toLowerCase()],delete this.header[t],this},f.prototype.getHeader=function(t){return this._header[t.toLowerCase()]},f.prototype.type=function(t){return this.set("Content-Type",d.types[t]||t),this},f.prototype.accept=function(t){return this.set("Accept",d.types[t]||t),this},f.prototype.auth=function(t,e){var r=btoa(t+":"+e);return this.set("Authorization","Basic "+r),this},f.prototype.query=function(t){return"string"!=typeof t&&(t=a(t)),t&&this._query.push(t),this},f.prototype.field=function(t,e){return this._formData||(this._formData=new FormData),this._formData.append(t,e),this},f.prototype.attach=function(t,e,r){return this._formData||(this._formData=new FormData),this._formData.append(t,e,r),this},f.prototype.send=function(t){var e=s(t),r=this.getHeader("Content-Type");if(e&&s(this._data))for(var o in t)this._data[o]=t[o];else"string"==typeof t?(r||this.type("form"),r=this.getHeader("Content-Type"),this._data="application/x-www-form-urlencoded"==r?this._data?this._data+"&"+t:t:(this._data||"")+t):this._data=t;return e?(r||this.type("json"),this):this},f.prototype.callback=function(t,e){var r=this._callback;return this.clearTimeout(),2==r.length?r(t,e):t?this.emit("error",t):void r(e)},f.prototype.crossDomainError=function(){var t=new Error("Origin is not allowed by Access-Control-Allow-Origin");t.crossDomain=!0,this.callback(t)},f.prototype.timeoutError=function(){var t=this._timeout,e=new Error("timeout of "+t+"ms exceeded");e.timeout=t,this.callback(e)},f.prototype.withCredentials=function(){return this._withCredentials=!0,this},f.prototype.end=function(t){var e=this,r=this.xhr=n(),s=this._query.join("&"),a=this._timeout,c=this._formData||this._data;if(this._callback=t||o,r.onreadystatechange=function(){return 4==r.readyState?0==r.status?e.aborted?e.timeoutError():e.crossDomainError():void e.emit("end"):void 0},r.upload&&(r.upload.onprogress=function(t){t.percent=t.loaded/t.total*100,e.emit("progress",t)}),a&&!this._timer&&(this._timer=setTimeout(function(){e.abort()},a)),s&&(s=d.serializeObject(s),this.url+=~this.url.indexOf("?")?"&"+s:"?"+s),r.open(this.method,this.url,!0),this._withCredentials&&(r.withCredentials=!0),"GET"!=this.method&&"HEAD"!=this.method&&"string"!=typeof c&&!i(c)){var u=d.serialize[this.getHeader("Content-Type")];u&&(c=u(c))}for(var l in this.header)null!=this.header[l]&&r.setRequestHeader(l,this.header[l]);return this.emit("request",this),r.send(c),this},d.Request=f,d.get=function(t,e,r){var o=d("GET",t);return"function"==typeof e&&(r=e,e=null),e&&o.query(e),r&&o.end(r),o},d.head=function(t,e,r){var o=d("HEAD",t);return"function"==typeof e&&(r=e,e=null),e&&o.send(e),r&&o.end(r),o},d.del=function(t,e){var r=d("DELETE",t);return e&&r.end(e),r},d.patch=function(t,e,r){var o=d("PATCH",t);return"function"==typeof e&&(r=e,e=null),e&&o.send(e),r&&o.end(r),o},d.post=function(t,e,r){var o=d("POST",t);return"function"==typeof e&&(r=e,e=null),e&&o.send(e),r&&o.end(r),o},d.put=function(t,e,r){var o=d("PUT",t);return"function"==typeof e&&(r=e,e=null),e&&o.send(e),r&&o.end(r),o},e.exports=d},{emitter:20,reduce:21}],20:[function(t,e,r){function o(t){return t?i(t):void 0}function i(t){for(var e in o.prototype)t[e]=o.prototype[e];return t}e.exports=o,o.prototype.on=o.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},o.prototype.once=function(t,e){function r(){o.off(t,r),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},r.fn=e,this.on(t,r),this},o.prototype.off=o.prototype.removeListener=o.prototype.removeAllListeners=o.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var r=this._callbacks[t];if(!r)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,i=0;io;++o)r[o].apply(this,e)}return this},o.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},o.prototype.hasListeners=function(t){return!!this.listeners(t).length}},{}],21:[function(t,e,r){e.exports=function(t,e,r){for(var o=0,i=t.length,n=3==arguments.length?r:t[o++];i>o;)n=e.call(null,n,t[o],++o,t);return n}},{}],22:[function(t,e,r){e.exports={name:"deployr",version:"7.4.1",description:"Simplified JavaScript client library for making requests to DeployR.",keywords:["deployr","deployr.io","ajax","R","api","simple"],author:"DeployR - Revolution Analytics Inc.",contributors:["Sean Wells"],repository:{type:"git",url:"git://github.com/deployr/js-client-library.git"},homepage:"http://deployr.revolutionanalytics.com/documents/dev/client-jsdoc",scripts:{start:"gulp start",build:"gulp"},devDependencies:{browserify:"^9.0.3",gulp:"^3.8.11","gulp-connect":"^2.2.0","gulp-header":"^1.2.2","gulp-jshint":"^1.9.2","gulp-livereload":"^3.8.0","gulp-plumber":"^0.6.6","gulp-rename":"^1.2.2","gulp-uglify":"^1.2.0","gulp-util":"^3.0.4",tape:"^3.5.0","vinyl-source-stream":"^1.0.0"},dependencies:{"d.js":"^0.6.0",superagent:"^0.21.0",ws:"^0.4.32"},main:"deployr.js",engines:{node:">= 0.10.0"},license:"Apache 2.0 License",bugs:{url:"https://github.com/deployr/js-client-library/issues"},directories:{example:"examples",test:"test"}}},{}]},{},[1])(1)}); \ No newline at end of file