@rongcloud/plugin-call 5.2.3-enterprise-alpha.1 → 5.2.3-enterprise-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +25 -21
- package/dist/index.umd.js +25 -21
- package/package.json +3 -3
package/dist/index.umd.js
CHANGED
|
@@ -558,13 +558,14 @@ var __publicField = (obj, key, value) => {
|
|
|
558
558
|
this._userTimers[userId] = new Timer$1(() => {
|
|
559
559
|
const reason = userId === currentUserId ? RCCallEndReason.NO_RESPONSE : RCCallEndReason.REMOTE_NO_RESPONSE;
|
|
560
560
|
if (userId === currentUserId) {
|
|
561
|
-
this._hungupHandle(reason);
|
|
561
|
+
this._hungupHandle(reason, false);
|
|
562
562
|
} else {
|
|
563
563
|
this._userInfo[userId] && (this._userInfo[userId].state = RCCallUserState.NONE);
|
|
564
564
|
this._notifyUserStateChange(this._userInfo[userId]);
|
|
565
565
|
this._watchers.onHungup(this._userInfo[userId], reason);
|
|
566
566
|
delete this._userInfo[userId];
|
|
567
567
|
}
|
|
568
|
+
this._clearTimerById(userId);
|
|
568
569
|
}, this._getTimeout(sentTime));
|
|
569
570
|
}
|
|
570
571
|
});
|
|
@@ -650,6 +651,7 @@ var __publicField = (obj, key, value) => {
|
|
|
650
651
|
if (Object.keys(this._userInfo).length < 2 || userId === currentUserId) {
|
|
651
652
|
this._notifyStateChange(RCCallSessionState.END, reason);
|
|
652
653
|
}
|
|
654
|
+
this._clearTimerById(userId);
|
|
653
655
|
}, this._getTimeout(sentTime));
|
|
654
656
|
}
|
|
655
657
|
});
|
|
@@ -835,24 +837,26 @@ var __publicField = (obj, key, value) => {
|
|
|
835
837
|
}
|
|
836
838
|
return { code };
|
|
837
839
|
}
|
|
838
|
-
async _hungupHandle(reason) {
|
|
840
|
+
async _hungupHandle(reason, isSendHangupMessage = true) {
|
|
839
841
|
const currentUserId = this._context.getCurrentId();
|
|
840
842
|
let code = RCCallErrorCode.SUCCESS;
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
843
|
+
if (isSendHangupMessage) {
|
|
844
|
+
const hangupParams = {
|
|
845
|
+
channelId: this._channelId,
|
|
846
|
+
conversationType: this._conversationType,
|
|
847
|
+
targetId: this._targetId,
|
|
848
|
+
callId: this._callId,
|
|
849
|
+
reason,
|
|
850
|
+
userIds: this.getRemoteUserIds(),
|
|
851
|
+
pushTitle: this._hungupPushTitle,
|
|
852
|
+
pushContent: this._hungupPushContent
|
|
853
|
+
};
|
|
854
|
+
if (reason === RCCallEndReason.OTHER_CLIENT_JOINED_CALL) {
|
|
855
|
+
this._callMsgHandler.sendHungup(hangupParams);
|
|
856
|
+
} else {
|
|
857
|
+
const { code: msgCode } = await this._callMsgHandler.sendHungup(hangupParams);
|
|
858
|
+
code = msgCode;
|
|
859
|
+
}
|
|
856
860
|
}
|
|
857
861
|
this._endTimestamp = Date.now();
|
|
858
862
|
for (const userId in this._userInfo) {
|
|
@@ -1746,7 +1750,7 @@ var __publicField = (obj, key, value) => {
|
|
|
1746
1750
|
this._logger = _logger;
|
|
1747
1751
|
this._watchers = _watchers;
|
|
1748
1752
|
this._options = _options;
|
|
1749
|
-
this._logger.warn("_", `RCCallEngine Version: ${"5.2.3-enterprise-alpha.
|
|
1753
|
+
this._logger.warn("_", `RCCallEngine Version: ${"5.2.3-enterprise-alpha.2"} CommitId: ${"9d316e702fd0cdadbcb098b6c8cd656946a5bbef"}`);
|
|
1750
1754
|
getCallDeviceId(_runtime);
|
|
1751
1755
|
this._callMsgHandler = new CallMessageHandler(this._context, this._runtime, this._logger, this._options.offlineMsgItv, this._getStateMachine.bind(this));
|
|
1752
1756
|
this._callMsgHandler.registerEventListener({
|
|
@@ -3550,7 +3554,7 @@ var __publicField = (obj, key, value) => {
|
|
|
3550
3554
|
this._hungupPushConfig = hungupPushConfig;
|
|
3551
3555
|
}
|
|
3552
3556
|
}
|
|
3553
|
-
engine.VersionManage.add("plugin-call", "5.2.3-enterprise-alpha.
|
|
3557
|
+
engine.VersionManage.add("plugin-call", "5.2.3-enterprise-alpha.2");
|
|
3554
3558
|
const installer = {
|
|
3555
3559
|
tag: "RCCall",
|
|
3556
3560
|
verify(runtime) {
|
|
@@ -3569,7 +3573,7 @@ var __publicField = (obj, key, value) => {
|
|
|
3569
3573
|
if (typeof options.logLevel !== "undefined") {
|
|
3570
3574
|
logger.warn("_", "The 'logLevel' parameter is deprecated, please use 'logOutputLevel' instead.");
|
|
3571
3575
|
}
|
|
3572
|
-
logger.warn("_", `RCCall Version: ${"5.2.3-enterprise-alpha.
|
|
3576
|
+
logger.warn("_", `RCCall Version: ${"5.2.3-enterprise-alpha.2"}, Commit: ${"9d316e702fd0cdadbcb098b6c8cd656946a5bbef"}`);
|
|
3573
3577
|
return new RCCallClient(context, runtime, logger, options);
|
|
3574
3578
|
}
|
|
3575
3579
|
};
|
|
@@ -3584,4 +3588,4 @@ var __publicField = (obj, key, value) => {
|
|
|
3584
3588
|
exports2.installer = installer;
|
|
3585
3589
|
Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
|
|
3586
3590
|
});
|
|
3587
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9lbmdpbmUvaGVscGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTXNnQ2FsbFN0YXR1cy50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbENvZGUudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24udHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL1RpbWVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvU3RhdGVNYWNoaW5lLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTWVtYmVyTW9kaWZ5VHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1BsYXRmb3JtLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvT2ZmbGluZVJlY29yZGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvTWVzc2FnZUhhbmRsZXIudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxMYW5nLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2VuLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL3poLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vZW5naW5lL2luZGV4LnRzIiwiLi4vLi4vLi4vc3JjL2VudW1zLnRzIiwiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vLi4vc3JjL2V2ZW50RW1pdHRlci50cyIsIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2hlbHBlci50cyIsIi4uLy4uLy4uL3NyYy90aW1lci50cyIsIi4uLy4uLy4uL3NyYy9SQ0NhbGxTZXNzaW9uLnRzIiwiLi4vLi4vLi4vc3JjL1JDQ2FsbENsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElSdW50aW1lIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcblxuLyoqXG4gKiDnlJ/miJDpmo/mnLogaWQg5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJhbmRvbUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICBsZXQgdXVpZCA9IGdldFVVSUQyMigpO1xuICB1dWlkID0gdXVpZC5yZXBsYWNlKC9cXC8vZywgJzAnKTtcbiAgY29uc3QgaW5mbyA9IFt1dWlkLCBEYXRlLm5vdygpLCByYW5kb21dO1xuICByZXR1cm4gaW5mby5qb2luKCdfJyk7XG59O1xuXG5leHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCB0aW1lckludGVydmFsID0gKGZ1bjogRnVuY3Rpb24sIGl0djogbnVtYmVyKTogbnVtYmVyID0+IHNldEludGVydmFsKGZ1biwgaXR2KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogY2FsbCBkZXZpY2VJZCDlrZjlgqjlnKggc2Vzc2lvblN0b3JhZ2Ug5LitXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDYWxsRGV2aWNlSWQgPSAocnVudGltZTogSVJ1bnRpbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gJ1JDQ2FsbERldmljZUlkJztcbiAgbGV0IHV1aWQgPSBydW50aW1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgaWYgKCF1dWlkKSB7XG4gICAgdXVpZCA9IGdldFVVSUQyMigpO1xuICAgIHJ1bnRpbWUuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHV1aWQpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsIi8qKlxuICog5rOo6YeKXG4gKiBUT0RPXG4gKi9cbmV4cG9ydCBlbnVtIE1zZ0NhbGxTdGF0dXMge1xuICBPVVRHT0lORyA9IDEsIC8vIHdhaXRpbmdcbiAgSU5DT01JTkcsIC8vIHdhaXRpbmdcbiAgUklOR0lORywgLy8gd2FpdGluZ1xuICBDT05ORUNURUQsIC8vIGtlZXBpbmdcbiAgSURMRSwgLy8gZW5kXG4gIEFDQ0VQVEVEIC8vIHdhaXRpbmdcbn1cbiIsIi8qKlxuICog6ZSZ6K+v56CB77yM5LiO56e75Yqo56uv5a+56b2QXG4gKiBAZGVzY3JpcHRpb25cbiAqIDEuIGA1MTAwMCAtIDUxOTk5YCDkuLogQW5kcm9pZCDkuJPnlKjmrrVcbiAqIDIuIGA1MjAwMCAtIDUyOTk5YCDkuLogaU9TIOS4k+eUqOautVxuICogMy4gYDUzMDAwIC0gNTMxOTlgIOS4uiBXZWIgUlRDIOS4k+eUqOautVxuICogNC4gYDUzMjAwIC0gNTM0OTlgIOS4uiBXZWIgQ2FsbExpYiDkuJPnlKjmrrVcbiAqICogIGA1MzIwMCAtIDUzMjk5YCDkuLogV2ViIENhbGxFbmdpbmUg5LiT55So56uvXG4gKiAqICBgNTMzMDAgLSA1MzQ5OWAg5Li6IFdlYiBDYWxsIOS4k+eUqOerr1xuICogNS4gYDUzNTAwIC0gNTM5OTlgIOS4uiBXZWIg5L+d55WZ5q61XG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbEVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1MgPSAxMDAwMCxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahOeKtuaAgeaculxuICAgKi9cbiAgU1RBVEVfTUFDSElORV9FWElUID0gNTMyMDAsXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGv5aSx6LSlXG4gICAqL1xuICBTRU5EX01TR19FUlJPUiA9IDUzMjAxLFxuICAvKipcbiAgICog6KKr5a+55pa55Yqg5YWl6buR5ZCN5Y2VXG4gICAqL1xuICBSRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPSA1MzIwMixcbiAgLyoqXG4gICAqIOW9k+WJjeeUqOaIt+S4jeWGjee+pOe7hOS4rVxuICAgKi9cbiAgTk9UX0lOX0dST1VQID0gNTMyMDMsXG5cbiAgLyoqXG4gICAqIENhbGwg55u45YWzXG4gICAqL1xuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgPSA1MzMwMSxcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgPSA1MzMwMixcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDMsXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUk9SID0gNTMzMDQsXG5cbiAgLyoqXG4gICAqIOWPkeW4g+mfs+mikeWksei0pVxuICAgKi9cbiAgQVVESU9fUFVCTElTSF9FUlJPUiA9IDUzMzA1LFxuXG4gIC8qKlxuICAgKiDlj5HluIPop4bpopHlpLHotKVcbiAgICovXG4gIFZJREVPX1BVQkxJU0hfRVJST1IgPSA1MzMwNixcblxuICAvKipcbiAgICog5Y+R5biD6Z+z6KeG6aKR5aSx6LSlXG4gICAqL1xuICBBVURJT19BTkRfVklERU9fUFVCTElTSF9FUlJPUiA9IDUzMzA3LFxuXG4gIC8qKlxuICAgKiDmn6Xor6LmiL/pl7TnlKjmiLfkv6Hmga/lpLHotKVcbiAgICovXG4gIFFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgPSA1MzMwOCxcblxuICAvKipcbiAgICog56aB55So5ZCv55So6KeG6aKR5pe277yM5oi/6Ze05YaF57y65bCR6KeG6aKR5rWBXG4gICAqL1xuICBNSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDksXG5cbiAgLyoqXG4gICAqIOWPlua2iOWPkeW4g+inhumikeWksei0pVxuICAgKi9cbiAgVU5QVUJMSVNIX1ZJREVPX0VSUk9SID0gNTMzMTAsXG5cbiAgLyoqXG4gICAqIOS8muivneS4jeaYr+e+pOe7hFxuICAgKi9cbiAgQ09OVkVSU0FUSU9OX05PVF9HUk9VUF9FUlJPUiA9IDUzMzExLFxuXG4gIC8qKlxuICAqIOS4jeWcqHJvb23kuK3npoHnlKjpn7Pop4bpopFcbiAgKi9cbiAgTk9UX0lOX1JPT01fRVJST1IgPSA1MzMxMlxuXG59XG4iLCIvKipcbiAqIOaMguaWreWOn+WboFxuICogQGRlc2NyaXB0aW9uXG4gKiDmoLnmja7ljp/mnIkgSGFuZ3VwUmVhc29uIOiuvuiuoe+8jOW3seaWueWOn+WboOS4juWvueaWueWOn+WboOacieebuOW3riAxMCDnmoTlt67ot50uXG4gKiDnjrDmnInmnKzlnLDljp/lm6Dlj5blgLzojIPlm7Q6IDEgfiAxMCwg6L+c56uv5Y6f5Zug5Y+W5YC86IyD5Zu0OiAxMSB+IDIwLlxuICog5Li65L6/5LqOIEhhbmd1cFJlYXNvbiDmianlsZXvvIzkv53nlZkgMTAwIOS7peWGheeahOWPluWAvC5cbiAqIOmcgOimgeWGjeasoeaJqeWxleaXtu+8jOW3seaWueWOn+WboOS9v+eUqDogMjEgfiAzMCwg5a+55bqU5a+55pa55Y6f5Zug5L2/55SoOiAzMSB+IDQwLFxuICog5Lul5q2k57G75o6o77yMXG4gKiDlt7Hmlrnljp/lm6Dkvb/nlKg6IDQxIH4gNTAsIOWvueaWueWOn+WboOS9v+eUqDogNTEgfiA2MCxcbiAqIOW3seaWueWOn+WboOS9v+eUqDogNjEgfiA3MCwg5a+55pa55Y6f5Zug5L2/55SoOiA3MSB+IDgwLFxuICog5bex5pa55Y6f5Zug5L2/55SoOiA3MSB+IDkwLCDlr7nmlrnljp/lm6Dkvb/nlKg6IDkxIH4gMTAwLlxuICpcbiAqIOWQhOW5s+WPsOeLrOacieWtl+auteiMg+WbtFxuICogQW5kcm9pZCAyMDEgfiAyOTlcbiAqIGlPUyAgICAgMzAxIH4gMzk5XG4gKiBXZWIgICAgIDQwMSB+IDQ5OVxuICog6K+m57uG5paH5qGj77yaaHR0cHM6Ly9naXRib29rLnJvbmdjbG91ZC5uZXQvcnRjLWRvY3MvIy9ydGMtY2xpZW50L2lvcy9hbmFseXNpcy9jYWxsbGliL0hhbmd1cFJlYXNvblxuICovXG5leHBvcnQgZW51bSBSQ0NhbGxFbmRSZWFzb24ge1xuICAvKipcbiAgICog5bex5pa55Y+W5raI5bey5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBDQU5DRUwgPSAxLFxuICAvKipcbiAgICog5bex5pa55ouS57ud5pS25Yiw55qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRUpFQ1QgPSAyLFxuICAvKipcbiAgICog5bex5pa55oyC5patXG4gICAqL1xuICBIQU5HVVAgPSAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KMXG4gICAqL1xuICBCVVNZX0xJTkUgPSA0LFxuICAvKipcbiAgICog5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBOT19SRVNQT05TRSA9IDUsXG4gIC8qKlxuICAgKiDlt7HmlrnkuI3mlK/mjIHlvZPliY3pn7Pop4bpopHlvJXmk45cbiAgICovXG4gIEVOR0lORV9VTlNVUFBPUlRFRCA9IDYsXG4gIC8qKlxuICAgKiDlt7HmlrnnvZHnu5zplJnor69cbiAgICovXG4gIE5FVFdPUktfRVJST1IgPSA3LFxuICAvKipcbiAgICog5bex5pa55pGE5YOP5aS06LWE5rqQ6I635Y+W5aSx6LSl77yM5Y+v6IO95piv5p2D6ZmQ5Y6f5ZugXG4gICAqL1xuICBHRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SID0gOCxcbiAgLyoqXG4gICAqIOW3seaWuei1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUFVCTElTSF9FUlJPUiA9IDksXG4gIC8qKlxuICAgKiDlt7HmlrnorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlJPUiA9IDEwLFxuICAvKipcbiAgICog5a+55pa55Y+W5raI5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRU1PVEVfQ0FOQ0VMID0gMTEsXG4gIC8qKlxuICAgKiDlr7nmlrnmi5Lnu53mlLbliLDnmoTpgJror53or7fmsYJcbiAgICovXG4gIFJFTU9URV9SRUpFQ1QgPSAxMixcbiAgLyoqXG4gICAqIOmAmuivnei/h+eoi+S4reWvueaWueaMguaWrVxuICAgKi9cbiAgUkVNT1RFX0hBTkdVUCA9IDEzLFxuICAvKipcbiAgICog5a+55pa55b+Z56KMXG4gICAqL1xuICBSRU1PVEVfQlVTWV9MSU5FID0gMTQsXG4gIC8qKlxuICAgKiDlr7nmlrnmnKrmjqXlkKxcbiAgICovXG4gIFJFTU9URV9OT19SRVNQT05TRSA9IDE1LFxuICAvKipcbiAgICog5a+55pa55byV5pOO5LiN5pSv5oyBXG4gICAqL1xuICBSRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVEID0gMTYsXG4gIC8qKlxuICAgKiDlr7nmlrnnvZHnu5zplJnor69cbiAgICovXG4gIFJFTU9URV9ORVRXT1JLX0VSUk9SID0gMTcsXG4gIC8qKlxuICAgKiDlr7nmlrnmkYTlg4/lpLTotYTmupDojrflj5blpLHotKXvvIzlj6/og73mmK/mnYPpmZDljp/lm6BcbiAgICovXG4gIFJFTU9URV9HRVRfTUVESUFfUkVTT1VSQ0VfRVJST1IgPSAxOCxcbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxOSxcbiAgLyoqXG4gICAqIOi/nOerr+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDIwLFxuICAvKipcbiAgICog5bex5pa55YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwgPSAyMSxcbiAgLyoqXG4gICAqIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX0NBTEwgPSAyMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDIzLFxuICAvKipcbiAgICog5bex5pa55o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIEFDQ0VQVF9TWVNURU1fQ0FMTCA9IDI0LFxuICAvKipcbiAgICog6L+c56uv5YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMID0gMzEsXG4gIC8qKlxuICAgKiDov5znq6/lhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfSU5fQ0FMTCA9IDMyLFxuICAvKipcbiAgICog6L+c56uv6KKr56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDMzLFxuICAvKipcbiAgICog6L+c56uv5o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIFJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwgPSAzNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aOpeWQrFxuICAgKi9cbiAgQUNDRVBUX0JZX09USEVSX0NMSUVOVCA9IDEwMSxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aMguaWrVxuICAgKi9cbiAgSEFOR1VQX0JZX09USEVSX0NMSUVOVCA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+WvueaWueWKoOWFpem7keWQjeWNlVxuICAgKi9cbiAgQURERURfVE9fQkxBQ0tMSVNUID0gMTAzLFxuICAvKipcbiAgICog6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAqL1xuICBTRVJWSUNFX05PVF9PUEVORUQgPSAxMDRcbn1cblxuLyoqXG4gKiDlt7Hmlrnljp/lm6DovazkuLrlr7nmlrnljp/lm6BcbiAqL1xuZXhwb3J0IGNvbnN0IENhbGxSZW1vdGVFbmRSZWFzb246IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRW5kUmVhc29uIH0gPSB7XG4gIFtSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVKRUNUXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9SRUpFQ1QsXG4gIFtSQ0NhbGxFbmRSZWFzb24uSEFOR1VQXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gIFtSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9CVVNZX0xJTkUsXG4gIFtSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0VdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkVOR0lORV9VTlNVUFBPUlRFRF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVELFxuICBbUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUl06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfR0VUX01FRElBX1JFU09VUkNFX0VSUk9SLFxuICBbUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX1BVQkxJU0hfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9TVUJTQ1JJQkVfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTExdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9JTl9DQUxMLFxuICBbUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVJdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFXTogUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbE1lc3NhZ2VUeXBlIHtcbiAgLyoqXG4gICAqIOmCgOivt+a2iOaBr1xuICAgKi9cbiAgVkNJbnZpdGUgPSAnUkM6VkNJbnZpdGUnLFxuICAvKipcbiAgICog5ZON6ZOD5raI5oGvXG4gICAqL1xuICBWQ1JpbmdpbmcgPSAnUkM6VkNSaW5naW5nJyxcbiAgLyoqXG4gICAqIOaOpeWQrOa2iOaBr1xuICAgKi9cbiAgVkNBY2NlcHQgPSAnUkM6VkNBY2NlcHQnLFxuICAvKipcbiAgICog5oyC5pat5raI5oGvXG4gICAqL1xuICBWQ0hhbmd1cCA9ICdSQzpWQ0hhbmd1cCcsXG4gIC8qKlxuICAgKiDnvqTlkbzkuK0g5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBWQ01vZGlmeU1lbSA9ICdSQzpWQ01vZGlmeU1lbScsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovkv67mlLnmtojmga9cbiAgICovXG4gIFZDTW9kaWZ5TWVkaWEgPSAnUkM6VkNNb2RpZnlNZWRpYScsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAvKipcbiAgICog562J5b6F5bu656uL6L+e5o6lXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog5Lya6K+d57u05oyB5LitXG4gICAqL1xuICBLRUVQSU5HLFxuICAvKipcbiAgICog5Lya6K+d5bey57uT5p2fXG4gICAqL1xuICBFTkRcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiDnlKjmiLfkuI3lrZjlnKjkuo7pgJror53kuK1cbiAgICovXG4gIE5PTkUgPSAwLFxuICAvKipcbiAgICog562J5b6F5o6l5ZCsXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBLRUVQSU5HLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDcm9zc0NhbGxUeXBlIHtcbiAgLyohXG4gIOWQjEFwcOmAmuivnVxuICAqL1xuICBSQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwgPSAwLFxuICAvKiFcbiAg6LeoQXBw6YCa6K+dXG4gICovXG4gIFJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA9IDdcbn1cbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgTXNnQ2FsbFN0YXR1cyB9IGZyb20gJy4vZW51bXMvTXNnQ2FsbFN0YXR1cyc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7XG4gIElFeGlzdGVkVXNlclBvZmlsZXMsIElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsIElSaW5naW5nTXNnQ29udGVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVVzZXJEYXRhLCBJVXNlclByb2ZpbGUsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi9UaW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxTdGF0ZU1hY2hpbmUge1xuICAvKipcbiAgICog5oi/6Ze054q25oCBXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uU3RhdGU6IFJDQ2FsbFNlc3Npb25TdGF0ZSB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOeUqOaIt+eKtuaAgeWPiuS/oeaBr1xuICAgKi9cbiAgcHJpdmF0ZSBfdXNlckluZm86IHsgW3VzZXJJZDogc3RyaW5nXTogSVVzZXJEYXRhIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDnlKjmiLforqHml7blmajmmKDlsIRcbiAgICovXG4gIHByaXZhdGUgX3VzZXJUaW1lcnM6IHsgW3VzZXJJZDogc3RyaW5nXTogVGltZXIgfSA9IHt9XG5cbiAgLyoqXG4gICAqIOebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfd2F0Y2hlcnMhOiBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzXG5cbiAgLyoqXG4gICAqIOWRvOWPq+i2heaXtuaXtumXtCAo5Y2V5L2N77ya5q+r56eSKVxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFRpbWVvdXQ6IG51bWJlciA9IDYwICogMTAwMFxuXG4gIC8qKlxuICAgKiDpgJror53lu7rnq4vlvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+aXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24gfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDkuLvlj6sgSURcbiAgICog5Y+R6LW36YKA6K+35Li65b2T5YmN55So5oi3IElEXG4gICAqIOaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWRcbiAgICog5pS25Yiw5Lq65ZGY5Y+Y5pu06YKA6K+35Li65raI5oGv5L2T5LitIGNhbGxlcklkXG4gICAqL1xuICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5b2T5qyh6YCa6K+d6YKA6K+36ICFIElEXG4gICAqIOWPkei1t+mCgOivt+S4uuW9k+WJjeeUqOaItyBJROOAgeaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWTjgIHmlLbliLDkurrlkZjlj5jmm7TpgoDor7fkuLrmtojmga/kvZPkuK0gc2VuZGVyVXNlcklkXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOaYr+WQpuaYr+i3qCBhcHBrZXlcbiAgICovXG4gIHByaXZhdGUgX2lzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hUaXRsZTogc3RyaW5nID0gJydcblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29udGVudDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsTXNnSGFuZGxlcjogQ2FsbE1lc3NhZ2VIYW5kbGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5uZWxJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvblJpbmdpbmcnLCB0aGlzLl9vblJpbmdpbmcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkFjY2VwdCcsIHRoaXMuX29uQWNjZXB0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkLCAnb25NZWRpYU1vZGlmeScsIHRoaXMuX29uTWVkaWFNb2RpZnkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkh1bmd1cCcsIHRoaXMuX29uSHVuZ3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluagoeato+WQjui2heaXtuaXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VGltZW91dChzZW50VGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICBpZiAoZGVsYXlUaW1lIDwgMCkge1xuICAgICAgZGVsYXlUaW1lID0gNTAwOyAvLyDlgYforr7lu7bov5/ml7bpl7TkuLogNTAwIG1zXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9jYWxsVGltZW91dCAtIGRlbGF5VGltZTtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBfZ2V0VGltZW91dCAtPiB0aW1lb3V0OiAke3RpbWVvdXR9YCk7XG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVyQnlJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBiZWZvcmUgX2NsZWFyVGltZXJCeUlkICAtPiB1c2VySWQ6ICR7dXNlcklkfSB1c2VyVGltZXJzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3VzZXJUaW1lcnMpfWApO1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXS5zdG9wKCk7XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdO1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWZ0ZXIgX2NsZWFyVGltZXJCeUlkIC0+IHVzZXJUaW1lcnM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fdXNlclRpbWVycyl9YCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlTdGF0ZUNoYW5nZShzdGF0ZTogUkNDYWxsU2Vzc2lvblN0YXRlLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlTdGF0ZUNoYW5nZSAtPiBpbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIHN0YXRlLCByZWFzb24sXG4gICAgfSl9YCk7XG5cbiAgICB0aGlzLl9lbmRSZWFzb24gPSByZWFzb24gfHwgbnVsbDtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl93YXRjaGVycz8ub25TdGF0ZUNoYW5nZSh7IHN0YXRlLCByZWFzb24gfSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgLy8g5b2T54q25oCB5py657uT5p2f5pe277yM6ZyA5ZyoIENhbGxFbmdpbmUg5riF6ZmkXG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnb25TdGF0ZU1hY2hpbmVDbG9zZScsIHRoaXMuX2NhbGxJZCk7XG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci51bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlcjogSVVzZXJEYXRhLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlVc2VyU3RhdGVDaGFuZ2UgLT4gaW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VyLCByZWFzb24sXG4gICAgfSl9YCk7XG4gICAgdGhpcy5fd2F0Y2hlcnM/Lm9uVXNlclN0YXRlQ2hhbmdlKHsgdXNlciwgcmVhc29uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3RoZXJDbGllbnRIYW5kbGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCByZWFzb246IGh1bmd1cFJlYXNvbiB9LCBtZXNzYWdlVHlwZSB9ID0gbWVzc2FnZTtcbiAgICB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdID0ge1xuICAgICAgdXNlcklkOiBzZW5kZXJVc2VySWQsXG4gICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICBpc1JlbW90ZTogZmFsc2UsXG4gICAgfTtcbiAgICAvLyDlpJrnq6/mjqXlkKzjgIHlpJrnq6/mi5Lnu53vvIzmuIXpmaTmlLbliLDpgoDor7flkI7otbfnmoTorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICAvLyDlhbbku5bnq6/mjqXlkKxcbiAgICBsZXQgZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9CWV9PVEhFUl9DTElFTlQ7XG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSkge1xuICAgICAgICBlbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEw7XG4gICAgICB9IGVsc2UgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFKSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5OT19SRVNQT05TRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVBfQllfT1RIRVJfQ0xJRU5UO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDmt7vliqDnlKjmiLfnroDopoHkv6Hmga9cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBlbmRSZWFzb24pO1xuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5Lit77yM5LiU5LiN5piv5b2T5YmN5bey5o6l6YCa55So5oi36K6+5aSH77yIZGV2aWNlSWTvvInlj5HmnaXnmoTmtojmga9cbiAgKi9cbiAgcHJpdmF0ZSBfaXNSZW1vdGVJbnZhbGlkTXNnKHJlbW90ZVVzZXJJZDogc3RyaW5nLCBtc2dEZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdLmRldmljZUlkIHx8ICFtc2dEZXZpY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcgJiYgdGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5kZXZpY2VJZCAhPT0gbXNnRGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vblJpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiBzdWlkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCB9IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBvblJpbmdpbmcgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICByZXR1cm47IC8vIOWkmuerr+WkhOeQhlxuICAgIH1cbiAgICB0aGlzLl93YXRjaGVycy5vblJpbmdpbmcoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudDogeyB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQ6IHNlbmRlckRldmljZUlkIH0sIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBzZW5kZXJEZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25BY2NlcHQgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHRoaXMuX290aGVyQ2xpZW50SGFuZGxlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOe+pOe7hOmAmuivneaXtu+8miBB44CBQiDpgJror50gQemCgOivt0MsIEPlkIzmhI/mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahOiuoeaXtuWZqO+8jOaJgOS7pei/memHjOWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoc2VuZGVyVXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBjb25zdCBpZHMgPSAodGhpcy5fY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSA/IFtjdXJyZW50VXNlcklkLCBzZW5kZXJVc2VySWRdIDogW3NlbmRlclVzZXJJZF07XG4gICAgaWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgaXNDdXJyZW50VXNlcklkID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLktFRVBJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGRldmljZUlkOiBpc0N1cnJlbnRVc2VySWQgPyBnZXRDYWxsRGV2aWNlSWQodGhpcy5fcnVudGltZSkgOiBzZW5kZXJEZXZpY2VJZCxcbiAgICAgIH07XG4gICAgICBpZiAoIWlzQ3VycmVudFVzZXJJZCkge1xuICAgICAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldENhbGxlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICB9XG4gICAgLy8g5oqb5Ye6b25BY2NlcHTml7bnirbmgIHlt7Lnu4/lsLHnu6pcbiAgICB0aGlzLl93YXRjaGVycy5vbkFjY2VwdCh7IHVzZXJJZDogc2VuZGVyVXNlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgbWVkaWFUeXBlLCB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICBpZiAodGhpcy5faXNSZW1vdGVJbnZhbGlkTXNnKHNlbmRlclVzZXJJZCwgZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gX29uTWVkaWFNb2RpZnkgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOabtOaWsCBtZWRpYVR5cGVcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fd2F0Y2hlcnMub25NZWRpYU1vZGlmeSh7XG4gICAgICBzZW5kZXI6IHsgdXNlcklkOiBzZW5kZXJVc2VySWQsIC4uLjxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCBzZW5kZXJVc2VySWQgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gc3VpZC5zcGxpdCgnXycpWzFdIDogc3VpZDtcbiAgICBjb25zdCB7IHJlYXNvbiwgdXNlcjogdXNlclByb2ZpbGUsIGRldmljZUlkIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25IdW5ndXAgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhiDmipvlh7rlpJrnq6/lt7LlpITnkIYgcmVhc29uXG4gICAgICB0aGlzLl9vdGhlckNsaWVudEhhbmRsZShtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAvLyDlpoLmnpzlt7HmlrnmiL/pl7TnirbmgIHlt7Lnu5PmnZ/vvIzlho3mlLbliLAgaHVuZ3VwIOa2iOaBr+S4jeWGjeWkhOeQhlxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gSW52YWxpZCBoYW5nIHVwIG1lc3NhZ2UsIGN1cnJlbnQgcm9vbSBzdGF0dXMgaGFzIGVuZGVkIC0+IHNlc3Npb25TdGF0ZTogJHt0aGlzLl9zZXNzaW9uU3RhdGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOS/ruaUueWGheWtmOaAgeaVsOaNruW5tumAmuefpVxuICAgICAgdGhpcy5fdXNlckluZm9bc2VuZGVyVXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCA8SVVzZXJQcm9maWxlPnVzZXJQcm9maWxlKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF07XG4gICAgfVxuXG4gICAgLy8gdGltZXIg5riF6ZmkXG4gICAgaWYgKENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXSA9PT0gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwpIHtcbiAgICAgIC8vIOi/nOerr+WPlua2iOmAmuivne+8jOayoeaciei/nOerr+eUqOaIt++8jOa4hemZpOW3seerr+eahOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoIDwgMSAmJiB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SW52aXRlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIC8vIOi/nOerr+aLkue7neOAgeW/meeijOOAgeacquaOpeWQrOetie+8jOmAmui/h+iHquW3seaYr+WQpuaYr+S4u+WPq+adpeWIpOaWreimgea4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqCDmiJYg5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChzZW5kZXJVc2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPCAxICYmIHRoaXMuX2NsZWFyVGltZXJCeUlkKGN1cnJlbnRVc2VySWQpO1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgIGNvbnN0IGlzTGVzc1RoYW5Ud28gPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMjtcbiAgICAvLyDnvqTlkbzkuK3pgoDor7fogIXmjILmlq3vvIjpnZ7lkbzlj6vlj5HotbfogIXvvInkuJTmiL/pl7TkuK3ooqvpgoDor7fogIXpg73mnKrmjqXlkKzvvIzpgJrnn6XmiL/pl7TnirbmgIHnu5PmnZ9cbiAgICBjb25zdCBpc0ludml0ZVVzZXIgPSB0aGlzLl9pbnZpdGVySWQgPT09IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCBpc05vT25lQW5zd2VyZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3VzZXJJbmZvKS5ldmVyeSgodXNlcikgPT4gdXNlci5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgIGlmIChpc0xlc3NUaGFuVHdvIHx8IChpc0ludml0ZVVzZXIgJiYgaXNOb09uZUFuc3dlcmVkKSkge1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7ogb25IdW5ndXAg5pe254q25oCB5bey57uP5bCx57uqXG4gICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9LCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tuebkeWQrFxuICAgKiBAcGFyYW1zIHdhdGNoZXJzXG4gICAqL1xuICByZWdpc3RlckV2ZW50TGlzdGVuZXIod2F0Y2hlcnM6IElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMpIHtcbiAgICB0aGlzLl93YXRjaGVycyA9IHdhdGNoZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBpbnZpdGUg5raI5oGv5pe254q25oCB5py65pu05paw77yIQ2FsbEVuZ2luZSDlhoXpg6josIPnlKjvvIlcbiAgICogQHBhcmFtIG1lc3NhZ2Ug5o6l5pS25raI5oGvXG4gICAqL1xuICBfX29uSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCwgc2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlVXNlcklkczogaW5pZHMsIHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCwgcm9vbVR5cGUsXG4gICAgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgLy8g5aSE55CG6LeoIGFwcGtleSDpgoDor7cgc2VuZGVyVXNlcklkIOW4puaciSBhcHBrZXkg5LiO5pys5ZywIGN1cnJlbnRVc2VySWQg5Yy56YWN6Zeu6aKYXG4gICAgLy8g5ZCM5pe26K6w5b2V5pys5Zyw5piv5ZCm5Li66LeoIGFwcGtleSDnirbmgIFcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlID09PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuY3Jvc3NBcHBrZXkodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZGVyVXNlcklkID0gc3VpZDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5q2j5Zyo6YCa6K+d5Lit77yM6L+c56uv5aSa56uv5Y+R55qE5raI5oGv55u05o6l6L+H5rukXG4gICAgaWYgKHRoaXMuX2lzUmVtb3RlSW52YWxpZE1zZyhzZW5kZXJVc2VySWQsIGRldmljZUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIF9fb25JbnZpdGUgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCB1c2VySWRMaXN0ID0gW3N1aWQsIC4uLmluaWRzXTtcbiAgICAvLyDmlLbliLDpgoDor7flkI7vvIzlhoXpg6jlm57lupTlk43pk4Pmtojmga8sIHVzZXJJZHMg5Lyg6Zmk6Ieq5bex55qE5omA5pyJ5Lq6XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB1c2VySWRzOiB1c2VySWRMaXN0LmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gaWQuc3BsaXQoJ18nKVsxXSAhPT0gY3VycmVudFVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludml0ZVVzZXJJZHMgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gW2luaWRzWzBdLnNwbGl0KCdfJylbMV1dIDogaW5pZHM7XG5cbiAgICAvLyDlkIzmraXmnKzlnLDnlKjmiLfliJfooajpnIDopoHkvb/nlKjmi4bliIblkI7nmoQgVXNlcklkIOS/neivgeacrOWcsOWFtuS7luaWueazleWMuemFjSB1c2VyaWRcbiAgICBjb25zdCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBhbGxVc2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiB1c2VySWQgPT09IHNlbmRlclVzZXJJZCxcbiAgICAgICAgaXNSZW1vdGU6IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCxcbiAgICAgIH07XG4gICAgICBpZiAodXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGv5Y+KIGRldmljZUlkXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOe7meaJgOacieiiq+mCgOivt+S6uuWQr+WKqOaOpeWQrOiuoeaXtuWZqFxuICAgICAgaWYgKHVzZXJJZCAhPT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkID8gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7IC8vIOe+pOiBiuS4reW3seaWuei2heaXtumcgOWPkemAgeaMguaWrVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHsgLy8g5YW25LuW5Lq65ZGY6LaF5pe25Y+q6YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+mXtOeKtuaAgemAmuefpVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5XQUlUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgbWVtYmVyTW9kaWZ5IOa2iOaBr+aXtueKtuaAgeacuuabtOaWsO+8iENhbGxFbmdpbmUg5YaF6YOo6LCD55So77yJXG4gICAqIEBwYXJhbSBtZXNzYWdlIOaOpeaUtua2iOaBr1xuICAgKi9cbiAgX19vbk1lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQsIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXI6IHVzZXJQcm9maWxlLCBleGlzdGVkVXNlclBvZmlsZXMsIGNhbGxlciwgZGV2aWNlSWQsIGludml0ZVVzZXJJZHMsIG1lZGlhVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICAvLyB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdICYmICF0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLmRldmljZUlkICYmICFkZXZpY2VJZCAmJlxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfX29uTWVtYmVyTW9kaWZ5IC0+IG5vdCB0aGUgcmVtb3RlIGRldmljZSB0aGF0IGlzIGN1cnJlbnRseSB0YWxraW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgIC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsZXJJZCA9IGNhbGxlcjtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgaW52aXRlVXNlcklkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLnB1c2goeyB1c2VySWQ6IGlkLCBtZWRpYVR5cGUsIGNhbGxTdGF0dXM6IE1zZ0NhbGxTdGF0dXMuSU5DT01JTkcgfSk7XG4gICAgfSk7XG4gICAgLy8g5bex5pa554q25oCB5Li6IE5PTkUgKOacquWtmOWcqOW3seaWueeUqOaIt+S/oeaBrykg6K+05piO6Ieq5bex5Li66KKr6YKA6K+36ICFLCDpnIDlj5HpgIEgcmluZ2luZ1xuICAgIGNvbnN0IGlzTmV3SW52aXRlZFVzZXIgPSBpbnZpdGVVc2VySWRzLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc05ld0ludml0ZWRVc2VyKSB7XG4gICAgICBjb25zdCBuZWVkUmluZ2luZ1VzZXJJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgICAgaWYgKHVzZXJJbmZvLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIG5lZWRSaW5naW5nVXNlcklkcy5wdXNoKHVzZXJJbmZvLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgdXNlcklkczogbmVlZFJpbmdpbmdVc2VySWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOiiq+mCgOivt+iAhemAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlt7LlnKjpgJror53mtYHnqIvkuK3nlKjmiLfvvIzmipvlh7rkurrlkZjlj5jmm7Tnm5HlkKxcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uTWVtYmVyTW9kaWZ5KHtcbiAgICAgICAgc2VuZGVyOiB7IHVzZXJJZDogc2VuZGVyVXNlcklkLCAuLi51c2VyUHJvZmlsZSB9LFxuICAgICAgICBpbnZpdGVkVXNlcnM6IGludml0ZVVzZXJJZHMubWFwKChpZCkgPT4gKHsgdXNlcklkOiBpZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmm7TmlrDlhajph4/nlKjmiLfnirbmgIFcbiAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsU3RhdHVzIH0gPSB1c2VySW5mbztcbiAgICAgIC8vIOS6uuWRmOS4uue7k+adn+eKtuaAgeaXtu+8jOS4jeWGjeabtOaWsFxuICAgICAgaWYgKGNhbGxTdGF0dXMgPT09IE1zZ0NhbGxTdGF0dXMuSURMRSkgcmV0dXJuO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogY2FsbFN0YXR1cyAhPT0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQgPyBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyA6IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HLFxuICAgICAgICBpc0NhbGxlcjogc2VuZGVyVXNlcklkID09PSB1c2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBjdXJyZW50VXNlcklkICE9PSB1c2VySWQsXG4gICAgICB9O1xuICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGvIOWPiiBkZXZpY2VJZFxuICAgICAgaWYgKHVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgLy8g6Zmk5LqGIGNhbGxNc2dTdGF0dXMuY29ubmVjdGVkICzlhbbku5bkurrpg73otbforqHml7blmahcblxuICAgICAgaWYgKGNhbGxTdGF0dXMgIT09IE1zZ0NhbGxTdGF0dXMuQ09OTkVDVEVEICYmICF0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS7hee7meiiq+mCgOivt+aIkOWRmOWQr+WKqOWumuaXtuWZqFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCFpbnZpdGVVc2VySWRzLmluY2x1ZGVzKHVzZXJJZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgPyBSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2FsbCBvbmh1bmd1cCBlcnJvciAtPiAke2Vycm9yPy5zdGFja31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKog5oiWIOacquaOpeWQrOeahOaYr+iHquW3se+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9nZXRUaW1lb3V0KHNlbnRUaW1lKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5bey5pyJIHNlc3Npb24g77yM5LiN5YWB6K645YaN5o6l5ZCs5paw5Lya6K+d5oOF5Ya1XG4gICAqL1xuICBfX2hhbmRsZUludml0ZUluU2Vzc2lvbigpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdTdGF0ZU1hY2hpbmUgLT4gX19oYW5kbGVJbnZpdGVJblNlc3Npb24nKTtcbiAgICAvLyDkv67mlLnmiYDmnInnlKjmiLfnirbmgIHlubbmipvlh7rvvIzmuIXnqbrorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOWwhuW3suWtmOWcqOeahOiuoeaXtuWZqOmDvea4heaOiVxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgLy8g55u05o6l57uI5q2i5b2T5YmNIHNlc3Npb24g54q25oCBXG4gICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSk7XG4gICAgLy8g5Y+R6YCB5oyC5pat5raI5oGv77yM5bm25pC65bimIOW3seaWueW/meeijCDljp/lm6BcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Li75Yqo5ZG85Y+rIChDYWxsRW5naW5lIOWGhemDqOiwg+eUqClcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIF9fY2FsbCh1c2VySWRzOiBzdHJpbmdbXSwgZXh0cmE6IHN0cmluZyA9ICcnLCBwdXNoVGl0bGU6IHN0cmluZyA9ICcnLCBwdXNoQ29udGVudDogc3RyaW5nID0gJycsIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBpbnZpdGUgLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlj5HpgIHpgoDor7fmtojmga9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY2FsbGVySWQgPSB0aGlzLl9pbnZpdGVySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEludml0ZSh7XG4gICAgICByb29tVHlwZTogaXNDcm9zc0FwcGtleSA/IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwgOiBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVOb3JtYWxDYWxsLFxuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBleHRyYSxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzOiB1c2VySWRzLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPSBpc0Nyb3NzQXBwa2V5O1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcblxuICAgICAgLyoqXG4gICAgICAgKiDot6ggYXBwa2V5IOS7heWtmOWcqOWNleiBiu+8jOWvueerryB1c2VySWQg6ZyA5Y+W5LiL5YiS57q/5ZCO6Z2i55qE6YOo5YiGXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlkcyA9IGlzQ3Jvc3NBcHBrZXkgPyBbY3VycmVudFVzZXJJZCwgLi4uW3VzZXJJZHNbMF0uc3BsaXQoJ18nKVsxXV1dIDogW2N1cnJlbnRVc2VySWQsIC4uLnVzZXJJZHNdO1xuXG4gICAgICAvLyDpgY3ljobmm7TmlrDmiL/pl7TmiYDmnInkurrlkZjnirbmgIHjgIHlubbnu5nooqvlj6vlkK/liqjorqHml7blmahcbiAgICAgIGlkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgaXNDYWxsZXIgPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyxcbiAgICAgICAgICBpc0NhbGxlcixcbiAgICAgICAgICBpc1JlbW90ZTogIWlzQ2FsbGVyLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuXG4gICAgICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICBpZiAoIWlzQ2FsbGVyKSB7XG4gICAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuWkhOeQhueKtuaAgeOAgeW5tumAmuefpSBjYWxsIOWxglxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgICAgLy8g5oi/6Ze05Lq65ZGY5L+h5oGv5bCR5LqO5Lik5Liq77yM6YCa55+l5oi/6Ze054q25oCBXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDov5znq6/kurrlkZjlpKfkuo4gMSDkuJTlt7HmlrnkuI3kuLrmraPlnKjpgJror53ml7bvvIzlj5HpgIEgaHVuZ3VwLCDlkYror4nov5znq6/oh6rlt7HpgIDlh7rpgJror51cbiAgICAgICAgICAgIGNvbnN0IGlzTmVlZFNlbmRIdW5ndXAgPSB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPT09IDAgJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORyk7XG4gICAgICAgICAgICBpZiAoaXNOZWVkU2VuZEh1bmd1cCkge1xuICAgICAgICAgICAgICB0aGlzLl9odW5ndXBIYW5kbGUoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuV0FJVElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVuZENvZGUgPSBjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUID8gUkNDYWxsRW5kUmVhc29uLkFEREVEX1RPX0JMQUNLTElTVCA6IFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SO1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgZW5kQ29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBhY2NlcHQnKTtcblxuICAgIC8vIOWPkemAgeaOpeWQrOa2iOaBr1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEFjY2VwdCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG5cbiAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0pO1xuICAgICAgLy8g5L+u5pS55bm26YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvOWPq+S4ree7p+e7remCgOivt1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fnlKjmiLcgSUQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAodGhpcy5fY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkNPTlZFUlNBVElPTl9OT1RfR1JPVVBfRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gaW52aXRlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbyk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJQb2ZpbGVzOiBJRXhpc3RlZFVzZXJQb2ZpbGVzW10gPSBleGlzdGVkVXNlcklkcy5tYXAoKHVzZXJJZCkgPT4ge1xuICAgICAgbGV0IGNhbGxTdGF0dXMgPSBNc2dDYWxsU3RhdHVzLkNPTk5FQ1RFRDtcbiAgICAgIC8vIOWMheWQq+iiq+mCgOivt+iAhe+8jOaIluiAheeUqOaIt+eKtuaAgeS4uiB3YXRpbmcg5pe277yM54q25oCB5Li6IOWTjemTg1xuICAgICAgaWYgKHVzZXJJZHMuaW5jbHVkZXModXNlcklkKSB8fCB0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID09PSBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORykge1xuICAgICAgICBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5SSU5HSU5HO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgY2FsbFN0YXR1cyxcbiAgICAgICAgbWVkaWFJZDogdXNlcklkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhID0gb3B0aW9ucy5leHRyYSB8fCAnJztcbiAgICBjb25zdCBwdXNoVGl0bGUgPSBvcHRpb25zLnB1c2hUaXRsZSB8fCAnJztcbiAgICBjb25zdCBwdXNoQ29udGVudCA9IG9wdGlvbnMucHVzaENvbnRlbnQgfHwgJyc7XG5cbiAgICAvLyDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZW1lYmVyTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgLy8g6Zmk6Ieq5bex77yM5YW25LuW5omA5pyJ5Lq65Z2H6ZyA5pS25YiwIG1vZGlmeSDmtojmga/vvIzku6XmraTmm7TmlrDnirbmgIFcbiAgICAgIGludml0ZVVzZXJJZHM6IHVzZXJJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IGN1cnJlbnRVc2VySWQpLFxuICAgICAgY2FsbGVySWQ6IHRoaXMuZ2V0Q2FsbGVySWQoKSxcbiAgICAgIGV4aXN0ZWRVc2VyUG9maWxlcyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogWy4uLmV4aXN0ZWRVc2VySWRzLCAuLi51c2VySWRzXS5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgLy8g5L+u5pS56KKr6YKA6K+35Lq654q25oCB77yM5bm26YCa55+lXG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgICAgaXNDYWxsZXI6IGZhbHNlLFxuICAgICAgICAgIGlzUmVtb3RlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAvLyDlkK/liqjlkbzlj6vorqHml7blmahcbiAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAvLyDlkbzlj6votoXml7blpITnkIbnirbmgIHjgIHlubbpgJrnn6UgY2FsbCDlsYJcbiAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuacquaOpeaKm+WHum9uSHVuZ3VwXG4gICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKrvvIzpgJrnn6XmiL/pl7TnirbmgIFcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc3RhdGU6IFJDQ2FsbFVzZXJTdGF0ZS5OT05FLFxuICAgICAgICAgIGlzQ2FsbGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1JlbW90ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG5cbiAgICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIGVuZFJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9odW5ndXBIYW5kbGUocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlj5HpgIHmjILmlq3nsbvlnovmtojmga9cbiAgICBsZXQgY29kZSA9IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTO1xuXG4gICAgY29uc3QgaGFuZ3VwUGFyYW1zID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICAgIHB1c2hUaXRsZTogdGhpcy5faHVuZ3VwUHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQ6IHRoaXMuX2h1bmd1cFB1c2hDb250ZW50LFxuICAgIH07XG5cbiAgICBpZiAocmVhc29uID09PSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKSB7XG4gICAgICAvLyDlt7Hnq6/ooqvlpJrnq6/liqDlhaUgUlRDIOaIv+mXtOaMpOaOieWQju+8jOS4jeWGjeetieWPkeaMguaWrea2iOaBr+eahOe7k+aenO+8jOmYsuatoui1sCB1c2VyTGVhdmUg5a+86Ie05oyC5pat5Y6f5Zug5LiN5YeG56GuXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgY29kZTogbXNnQ29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cChoYW5ndXBQYXJhbXMpO1xuICAgICAgY29kZSA9IG1zZ0NvZGU7XG4gICAgfVxuXG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAvLyDmm7TmlrDpgJror53kurrlkZjnirbmgIHjgIHpgJror53nu5PmnZ/ml7bpl7Qg5bm26YCa55+lXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOa4heepuuWGheWtmOaAgeaVsOaNru+8jOW5tumAmuefpVxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgcmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqL1xuICBhc3luYyBodW5ndXAocHVzaFRpdGxlOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIGh1bmd1cCcpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOm7mOiupOaMguaWrSByZWFzb24g5Li66YCa6K+d6L+H56iL5Lit77yM5bex5pa55q2j5bi45Y+W5raI6YCa6K+dXG4gICAgbGV0IHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgLyoqXG4gICAgICog6Iul6LaF5pe26K6h5pe25Zmo5a2Y5ZyoLCDlt7HmlrnkuLogY2FsbGVyIOWOn+WboOS4uuW3seaWueWPlua2iOmAmuivnSxcbiAgICAgKiDlt7HmlrnkuLogY2FsbGVlIOS4lOacqui/m+WFpemAmuivneS4re+8jOWOn+WboOS4uuW3seaWueaLkue7nemAmuivnVxuICAgICAqL1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VyVGltZXJzKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uaXNDYWxsZXIpIHtcbiAgICAgICAgcmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkNBTkNFTDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uc3RhdGUgPT09IFJDQ2FsbFVzZXJTdGF0ZS5XQUlUSU5HKSB7XG4gICAgICAgIHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5SRUpFQ1Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5riF6Zmk5omA5pyJ6LaF5pe26K6h5pe25ZmoXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlclRpbWVycykge1xuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2h1bmd1cEhhbmRsZShyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIOS/ruaUuemAmuivneWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIFJDQ2FsbE1lZGlhVHlwZS5BVURJTyDmlLnkuLrpn7PpopHpgJror50gfCBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8g5pS55Li66Z+z6KeG6aKR6YCa6K+dXG4gICAqL1xuICBhc3luYyBjaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2hhbmdlTWVkaWFUeXBlIC0+IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kTWVkaWFNb2RpZnkoe1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICB9KTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+WKoOWFpemAmuivneihpeWBv+acuuWItu+8iHJ0YyB1c2VySm9pbiDkuovku7bop6blj5HvvIlcbiAgICog5Li75Y+r5ZG85Y+r5ZCO77yM5pyq5pS25Yiw6KKr5Y+rIGFjY2VwdCDmtojmga/vvIzkvYbmlLbliLDkuoYgdXNlckpvaW4g5ZCM5qC36KGl5YG/5pu05paw55So5oi344CB5oi/6Ze054q25oCB44CB5ZG85Y+r6K6h5pe25ZmoXG4gICAqL1xuICB1c2VySm9pbih1c2VySWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSB1c2VySm9pbiAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIC8vIOW7tui/nyAzMDBtcyDpmLLmraIgdXNlckppb24g5ZKMIGFjY2VwdCDmtojmga/pg73mnInnmoTmg4XlhrXkuIvvvIwgdXNlckpvaW4g5q+UIGFjY2VwdCDlhYjliLBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgLy8g5pu05paw5Lq65ZGY54q25oCBICgvLyDnvqTnu4TpgJror53ml7bvvJogQeWQkULjgIFD5Y+R6LW36YCa6K+dIELlhYjmjqXlkKzvvIxD5ZCO5o6l5ZCs77yM6L+Z5pe2QuayoeaciUPnmoR1c2VySWTlr7nlupTnmoRfdXNlckluZm/vvIzmiYDku6Xov5nph4zliKTmlq3kuIDkuIspXG4gICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICB1c2VySW5mby5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh1c2VySW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5pu05paw5oi/6Ze054q25oCBXG4gICAgICAgIGlmICh0aGlzLl9zZXNzaW9uU3RhdGUgIT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKSB7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWBnOatouW5tua4hemZpOWRvOWPq+iuoeaXtuWZqFxuICAgICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgICAgfSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKjmiLfnprvlvIDpgJror53ooaXlgb/mnLrliLbvvIhydGMgdXNlckxlYXZl44CBa2lja09mZiDkuovku7bop6blj5HvvIlcbiAgICog6YCa6K+d5Lit6L+c56uv55So5oi35oyC5pat77yM5oyC5pat5raI5oGv5pyq5Yiw77yM5L2G5piv55uR5ZCs5YiwIHJ0YyB1c2VyTGVhdmUg5ZCM5qC36KGl5YG/5pu05paw55So5oi344CB5oi/6Ze054q25oCBXG4gICAqL1xuICB1c2VyTGVhdmUodXNlcklkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gdXNlckxlYXZlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5bu26L+fIDMwMG1zIOmYsuatoiB1c2VyTGVhdmUg5ZKMIGh1bmd1cCDmtojmga/pg73mnInnmoTmg4XlhrXkuIvvvIx1c2VyTGVhdmUg5q+UIGh1bmd1cCDlhYjliLBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgLy8g5pu05paw5Lq65ZGY54q25oCBXG4gICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLk5PTkUpIHtcbiAgICAgICAgICB1c2VySW5mby5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh1c2VySW5mbywgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHVzZXJJbmZvLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Li75Y+r5pa5576k6IGK6YKA6K+36KKr5Y+r5pa55ZCO56a757q/77yM5Li75Y+r5pa55q2k5pe25Li6562J5b6F54q25oCB5ZCO5LiN5YaN5LiK57q/77yM6KKr5Y+r5pa55o6l5ZCs5ZCO5oyC5pat6Iez5Ymp5L2Z5LiA5Lq65pe2562J5b6F5LiA5YiG6ZKf5ZCO5oyC5patXG4gICAgICAgIGNvbnN0IHJlbW90ZVVzZXJzVGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW90ZVVzZXJzID0gdGhpcy5nZXRSZW1vdGVVc2VycygpO1xuICAgICAgICAgIC8vIOi/nOerr+WPquacieS4gOS4queUqOaIt+S4lOaYr+etieW+heeKtuaAge+8jOetieW+heS4gOWIhumSn+WQjuaMguaWrVxuICAgICAgICAgIGlmIChyZW1vdGVVc2Vycy5sZW5ndGggPT09IDEgJiYgcmVtb3RlVXNlcnNbMF0uc3RhdGUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2h1bmd1cEhhbmRsZShSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgNjAwMDApO1xuICAgICAgICAvLyDmm7TmlrDmiL/pl7TnirbmgIFcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyICYmIHRoaXMuX3Nlc3Npb25TdGF0ZSAhPT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIHRoaXMuX2VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwg5bGC5bex5pa55byC5bi45aSx6LSl5ZCO6LCD55So55qE5pa55rOVXG4gICAqIOinpuWPkeaXtuacuu+8mumfs+inhumikeacjeWKoeW8guW4uOOAgeiOt+WPlui1hOa6kOWksei0peOAgeWKoOWFpSBSVEMg5oi/6Ze05aSx6LSl44CB5Y+R5biDfOiuoumYheWksei0pVxuICAgKi9cbiAgY2xvc2UocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9odW5ndXBIYW5kbGUocmVhc29uKTtcbiAgfVxuXG4gIHNldEh1bmd1cFB1c2hDb25maWcocHVzaENvbmZpZzogc3RyaW5nID0gJycsIHB1c2hDb250ZW50OiBzdHJpbmcgPSAnJykge1xuICAgIHRoaXMuX2h1bmd1cFB1c2hUaXRsZSA9IHB1c2hDb25maWc7XG4gICAgdGhpcy5faHVuZ3VwUHVzaENvbnRlbnQgPSBwdXNoQ29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIGdldENhbGxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsSWQ7XG4gIH1cblxuICAvKipcbiAgICog5aSa57uE57uHIElEXG4gICAqL1xuICBnZXRDaGFubmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBnZXRUYXJnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YXJnZXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkvJror53nsbvlnotcbiAgICovXG4gIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnZlcnNhdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6L+c56uv5oiQ5ZGYIElEIOWIl+ihqFxuICAgKi9cbiAgZ2V0UmVtb3RlVXNlcklkcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYWxsVXNlcklkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKTtcbiAgICBjb25zdCByZW1vdGVVc2VySWRzID0gYWxsVXNlcklkcy5maWx0ZXIoKGlkKSA9PiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpICE9PSBpZCk7XG4gICAgcmV0dXJuIHJlbW90ZVVzZXJJZHM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6L+c56uv5oiQ5ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICBnZXRSZW1vdGVVc2VycygpOiBJVXNlckRhdGFbXSB7XG4gICAgY29uc3QgcmVtb3RlVXNlcjogSVVzZXJEYXRhW10gPSBbXTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBmb3IgKGNvbnN0IHVpZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgY29uc3QgeyB1c2VySWQgfSA9IHRoaXMuX3VzZXJJbmZvW3VpZF07XG4gICAgICBpZiAodXNlcklkICE9PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHJlbW90ZVVzZXIucHVzaCh0aGlzLl91c2VySW5mb1t1aWRdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlbW90ZVVzZXI7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5oi/6Ze054q25oCBXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uU3RhdGUgPT09IG51bGwgPyBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EIDogdGhpcy5fc2Vzc2lvblN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS6uuWRmOeKtuaAgVxuICAgKi9cbiAgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckluZm9bdXNlcklkXT8uc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lya6K+d5Y+R6LW36ICFIElkXG4gICAqL1xuICBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsZXJJZCE7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5qyh5Lya6K+d6YKA6K+36ICFIElkXG4gICAqL1xuICBnZXRJbnZpdGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faW52aXRlcklkITtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3pgJror53lqpLkvZPnsbvlnotcbiAgICovXG4gIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5ZCO5Y+v6LCD55SoXG4gICAqL1xuICBnZXRTdW1tYXJ5KCk6IElFbmRTdW1tYXJ5IHtcbiAgICAvLyDpgJror53ml7bpl7TorqHnrpdcbiAgICBjb25zdCBiZWdpblRpbWVzdGFtcCA9IHRoaXMuX2JlZ2luVGltZXN0YW1wO1xuICAgIGNvbnN0IGVuZFRpbWVzdGFtcCA9IHRoaXMuX2VuZFRpbWVzdGFtcDtcbiAgICBsZXQgZHVyYXRpb24gPSAwO1xuICAgIGlmIChlbmRUaW1lc3RhbXAgPiBiZWdpblRpbWVzdGFtcCAmJiBiZWdpblRpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgZHVyYXRpb24gPSBlbmRUaW1lc3RhbXAgLSBiZWdpblRpbWVzdGFtcDtcbiAgICB9XG5cbiAgICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBiZWdpblRpbWVzdGFtcCxcbiAgICAgIGVuZFRpbWVzdGFtcCxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgZW5kUmVhc29uOiB0aGlzLl9lbmRSZWFzb24hLFxuICAgIH07XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gZ2V0U3VtbWFyeSAtPiBzdW1tYXJ5OiAke0pTT04uc3RyaW5naWZ5KHN1bW1hcnkpfWApO1xuICAgIHJldHVybiBzdW1tYXJ5O1xuICB9XG59XG4iLCIvKipcbiAqIOmAmuivneWqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxNZWRpYVR5cGUge1xuICAvKipcbiAgICog6Z+z6aKR6YCa6K+dXG4gICAqL1xuICBBVURJTyA9IDEsXG4gIC8qKlxuICAgKiDop4bpopHpgJror51cbiAgICovXG4gIEFVRElPX1ZJREVPXG59XG4iLCJleHBvcnQgZW51bSBNZW1iZXJNb2RpZnlUeXBlIHtcbiAgQUREID0gMSxcbiAgUkVNT1ZFXG59XG4iLCIvKipcbiAqIOW5s+WPsFxuICovXG5leHBvcnQgZW51bSBQbGF0Zm9ybSB7XG4gIFdFQiA9ICdXZWInLFxuICBJT1MgPSAnaU9TJyxcbiAgQU5EUk9JRCA9ICdBbmRyb2lkJ1xufVxuIiwiaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHlwZSwgSUxvZ2dlciwgSVJlY2VpdmVkTWVzc2FnZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lZGlhTW9kaWZ5TXNnQ29udGVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPZmZsaW5lUmVjb3JkIHtcbiAgY2hhbm5lbElkOiBzdHJpbmcsXG4gIGNvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gIHRhcmdldElkOiBzdHJpbmcsXG4gIG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLFxuICBjYWxsSWQ6IHN0cmluZyxcbiAgaW52aXRlcklkOiBzdHJpbmcsXG4gIGVuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uLFxuICBiZWdpblRpbWVzdGFtcDogbnVtYmVyLFxuICBlbmRUaW1lc3RhbXA6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlclxufVxuXG4vKipcbiAqIOemu+e6v+mAmuivneiusOW9leWZqFxuICovXG5leHBvcnQgY2xhc3MgT2ZmbGluZVJlY29yZGVyIHtcbiAgcHJpdmF0ZSBfbWVzc2FnZXM6IElSZWNlaXZlZE1lc3NhZ2VbXSB8IFtdID0gW11cblxuICBwcml2YXRlIF9jaGFubmVsSWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9jb252ZXJzYXRpb25UeXBlITogQ29udmVyc2F0aW9uVHlwZVxuXG4gIHByaXZhdGUgX3RhcmdldElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfbWVkaWFUeXBlITogUkNDYWxsTWVkaWFUeXBlXG5cbiAgcHJpdmF0ZSBfY2FsbElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfY2FsbGVySWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9pbnZpdGVySWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9lbmRSZWFzb24hOiBSQ0NhbGxFbmRSZWFzb25cblxuICBwcml2YXRlIF9iZWdpblRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX2VuZFRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uUmVjb3JkOiAocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkgPT4gdm9pZCxcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOe7k+adn1xuICAgKiDljp/lm6DmoLnmja7lt7HmlrnmmK/lkKbkuLrkuLvlj6vvvIzkuLvlj6vkuLrov5znq6/mnKrmjqXlkKwg6KKr5Y+r6KKr5bex56uv5pyq5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9kb0ludml0ZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZGVyVXNlcklkLCBjb250ZW50LFxuICAgIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgY2FsbElkLCBtZWRpYVR5cGUgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgdGhpcy5fY2hhbm5lbElkID0gY2hhbm5lbElkITtcbiAgICB0aGlzLl9jb252ZXJzYXRpb25UeXBlID0gY29udmVyc2F0aW9uVHlwZTtcbiAgICB0aGlzLl90YXJnZXRJZCA9IHRhcmdldElkO1xuICAgIHRoaXMuX2NhbGxJZCA9IGNhbGxJZDtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgY29uc3QgaXNDYWxsZXIgPSBzZW5kZXJVc2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgdGhpcy5faW52aXRlcklkID0gc2VuZGVyVXNlcklkO1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IGlzQ2FsbGVyID8gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSA6IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0U7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGludml0ZSB8IG1lbWJlck1vZGlmeSDnu5PmnZ9cbiAgICog5Y6f5Zug5qC55o2u5bex5pa55piv5ZCm5Li65Li75Y+r77yM5Li75Y+r5Li66L+c56uv5pyq5o6l5ZCsIOiiq+WPq+iiq+W3seerr+acquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9NZW1iZXJNb2RpZnkobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2RvSW52aXRlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg6K6h566X55qE56a757q/6K6w5b2VXG4gICAqL1xuICBwcml2YXRlIF9kb1JpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBhY2NlcHQg6K+05piO6YCa6K+d5bey5bu656uLXG4gICAqIOWOn+WboOm7mOiupOW3seaWueato+W4uOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfZG9BY2NlcHQobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBtZXNzYWdlLnNlbnRUaW1lO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBodW5ndXAg6K+05piO5Li65q2j5bi45oyC5patXG4gICAqIOWOn+WboOWPlua2iOaBr+S9k+mHjOaMguaWreWOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9IdW5ndXAobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY29udGVudCwgc2VudFRpbWUsIHNlbmRlclVzZXJJZCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IHJlYXNvbiB9ID0gY29udGVudCBhcyBJSHVuZ3VwTXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBpc1NlbGZTZW5kID0gc2VuZGVyVXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IGlzU2VsZlNlbmQgPyByZWFzb24gOiBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl07XG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gc2VudFRpbWU7XG5cbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj6rkv67mlLnpgJror53nsbvlnotcbiAgICovXG4gIHByaXZhdGUgX2RvTWVkaWFNb2RpZnkobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSB9ID0gY29udGVudCBhcyBJTWVkaWFNb2RpZnlNc2dDb250ZW50O1xuICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbkdlblJlY29yZCgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsZXQgZHVyYXRpb24gPSAwO1xuICAgICAgY29uc3QgaXNOZWVkRHVyYXRpb25SZWFzb24gPSBbXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVAsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9KT0lORURfQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfS0lDS0VEX0JZX1NFUlZFUixcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwsXG4gICAgICBdLmluY2x1ZGVzKHRoaXMuX2VuZFJlYXNvbik7XG4gICAgICBpZiAoaXNOZWVkRHVyYXRpb25SZWFzb24pIHtcbiAgICAgICAgZHVyYXRpb24gPSB0aGlzLl9lbmRUaW1lc3RhbXAgLSB0aGlzLl9iZWdpblRpbWVzdGFtcDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29uUmVjb3JkKHtcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICAgIGludml0ZXJJZDogdGhpcy5faW52aXRlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgZW5kUmVhc29uOiB0aGlzLl9lbmRSZWFzb24sXG4gICAgICAgIGJlZ2luVGltZXN0YW1wOiB0aGlzLl9iZWdpblRpbWVzdGFtcCxcbiAgICAgICAgZW5kVGltZXN0YW1wOiB0aGlzLl9lbmRUaW1lc3RhbXAsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZWN2T2ZmbGluZU1zZ3MobWVzc2FnZXM6IElSZWNlaXZlZE1lc3NhZ2VbXSkge1xuICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgZG8ge1xuICAgICAgY29uc3QgbXNnID0gdGhpcy5fbWVzc2FnZXMuc2hpZnQoKSE7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VUeXBlLCBjb250ZW50OiB7IGNhbGxJZCB9IH0gPSBtc2c7XG4gICAgICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGU6XG4gICAgICAgICAgdGhpcy5fZG9JbnZpdGUobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1Jpbmdpbmc6XG4gICAgICAgICAgdGhpcy5fZG9SaW5naW5nKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQ6XG4gICAgICAgICAgdGhpcy5fZG9BY2NlcHQobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbTpcbiAgICAgICAgICB0aGlzLl9kb01lbWJlck1vZGlmeShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWE6XG4gICAgICAgICAgdGhpcy5fZG9NZWRpYU1vZGlmeShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwOlxuICAgICAgICAgIHRoaXMuX2RvSHVuZ3VwKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtPZmZsaW5lUmVjb3JkZXJdIG9uUmVjdk9mZmxpbmVNc2dzIC0+IHVuZXhwZWN0ZWQgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtc2cpfWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRoaXMuX21lc3NhZ2VzLmxlbmd0aCA+IDApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgSUxvZ2dlciwgSVB1c2hDb25maWcsIElSZWNlaXZlZE1lc3NhZ2UsIElSdW50aW1lLCBJU2VuZE1zZ09wdGlvbnMsIFJUQ1BsdWdpbkNvbnRleHQsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IE1lbWJlck1vZGlmeVR5cGUgfSBmcm9tICcuL2VudW1zL01lbWJlck1vZGlmeVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJVXNlclByb2ZpbGUgfSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0TXNnQ29udGVudCwgSUFjY2VwdE1zZ09wdGlvbnMsIElDYWxsTXNnT3B0aW9uLCBJSHVuZ3VwTXNnQ29udGVudCwgSUh1bmd1cE1zZ09wdGlvbnMsXG4gIElJbnZpdGVNc2dDb250ZW50LCBJSW52aXRlTXNnT3B0aW9ucywgSU1lZGlhTW9kaWZ5TXNnQ29udGVudCwgSU1lZGlhTW9kaWZ5TXNnT3B0aW9ucywgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsXG4gIElNZW1iZXJNb2RpZnlNc2dPcHRpb25zLCBJTXNnTGlzdGVuZXIsIElSaW5naW5nTXNnQ29udGVudCwgSVJpbmdpbmdNc2dPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnLi9lbnVtcy9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgSU9mZmxpbmVSZWNvcmQsIE9mZmxpbmVSZWNvcmRlciB9IGZyb20gJy4vT2ZmbGluZVJlY29yZGVyJztcbmltcG9ydCB7IFJDQ2FsbFN0YXRlTWFjaGluZSB9IGZyb20gJy4uJztcblxuY29uc3QgY2FsbE1zZ1R5cGVzID0gWydSQzpWQ0FjY2VwdCcsICdSQzpWQ1JpbmdpbmcnLCAnUkM6VkNTdW1tYXJ5JywgJ1JDOlZDSGFuZ3VwJywgJ1JDOlZDSW52aXRlJywgJ1JDOlZDTW9kaWZ5TWVkaWEnLCAnUkM6VkNNb2RpZnlNZW0nXTtcblxudHlwZSBNc2dMaXN0ZW5lcktleXMgPSBrZXlvZiBJTXNnTGlzdGVuZXJcblxuaW50ZXJmYWNlIElNc2dCdWZmZXJJdGVtIHtcbiAgbWFya1RpbWU6IG51bWJlcixcbiAgbXNnOiBJUmVjZWl2ZWRNZXNzYWdlXG59XG5cbmNvbnN0IEVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZTogeyBba2V5OiBudW1iZXJdOiBSQ0NhbGxFcnJvckNvZGUgfSA9IHtcbiAgW0Vycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1RdOiBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNULFxuICBbRXJyb3JDb2RlLk5PVF9JTl9HUk9VUF06IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fR1JPVVAsXG59O1xuXG4vKipcbiAqIOa2iOaBr+aOpeaUtuWkhOeQhjog5Zyo57q/5raI5oGv44CB56a757q/5raI5oGvXG4gKiDlj5HpgIHmtojmga/lpITnkIY6IOWPkemAgeS4jeWQjOexu+Wei+a2iOaBr+WwgeijhVxuICovXG5leHBvcnQgY2xhc3MgQ2FsbE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBfd2F0Y2hlcnM6IElNc2dMaXN0ZW5lciA9IHt9XG5cbiAgcHJpdmF0ZSBfdXNlckluZm86IElVc2VyUHJvZmlsZSA9IHt9XG5cbiAgcHJpdmF0ZSBfbXNnQnVmZmVyTGlzdDogSU1zZ0J1ZmZlckl0ZW1bXSA9IFtdXG5cbiAgcHJpdmF0ZSBfaGFkSGFuZGxlTXNnVGltZXI6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX29mZmxpbmVSZWNvcmRlciE6IE9mZmxpbmVSZWNvcmRlclxuXG4gIHByaXZhdGUgX2RldmljZUlkOiBzdHJpbmcgPSAnJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOemu+e6v+a2iOaBr+WkhOeQhuaXtumXtOmXtOmalFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29mZmxpbmVNc2dJdHY6IG51bWJlciA9IDYwICogMTAwMCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nZXRTdGF0ZU1hY2hpbmU6IChjYWxsSWQ6IHN0cmluZykgPT4gUkNDYWxsU3RhdGVNYWNoaW5lIHwgbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBkZXZpY2VJZFxuICAgIHRoaXMuX2RldmljZUlkID0gZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDlpITnkIbmtojmga/mlLblj5FcbiAgICB0aGlzLl9jb250ZXh0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgIC8vIOWkhOeQhuemu+e6v+a2iOaBr+iusOW9lVxuICAgIHRoaXMuX29mZmxpbmVSZWNvcmRlciA9IG5ldyBPZmZsaW5lUmVjb3JkZXIodGhpcy5fY29udGV4dCwgdGhpcy5fbG9nZ2VyLCAocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gb2ZmbGluZVJlY29yZGVyIC0+ICR7SlNPTi5zdHJpbmdpZnkocmVjb3JkKX1gKTtcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZCAmJiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQocmVjb3JkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTWVzc2FnZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgaXNDYWxsTXNnID0gY2FsbE1zZ1R5cGVzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpO1xuICAgIGlmIChpc0NhbGxNc2cpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBfb25NZXNzYWdlIC0+IGNhbGwgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgIC8vIOmAmui/h+mBjeWOhiBidWZmZXJMaXN0IOafpeaJvuimgeaPkuWFpeeahOiKgueCuVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFya1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB7IHNlbnRUaW1lOiBjdXJyZW50TXNnU2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgICAgIGxldCBpbnNlcnRJbmRleCA9IDA7XG4gICAgICAgIC8vIOmcgOmBjeWOhuaVsOe7hOWFqOmDqOmhue+8jOaVheS9v+eUqCBmb3JFYWNoLCBmaW5kSW5kZXgg5om+5Yiw56ys5LiA5Liq56ym5ZCI5p2h5Lu255qE5bCx5Lya57uI5q2iXG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3QuZm9yRWFjaCgoeyBtc2c6IHsgc2VudFRpbWUgfSB9LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50TXNnU2VudFRpbWUgPj0gc2VudFRpbWUpIHtcbiAgICAgICAgICAgIC8vIGluc2VydEluZGV4IOmcgOS4uuW9k+WJjeespuWQiOadoeS7tuWFg+e0oOeahOWQjuS4gOS9je+8jOaVhSArMVxuICAgICAgICAgICAgaW5zZXJ0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHtcbiAgICAgICAgICBtYXJrVGltZSxcbiAgICAgICAgICBtc2c6IG1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBvbk1lc3NhZ2UgLT4gbXNnQnVmZmVyTGlzdDogJHt0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzcGxpY2UgYnVmZmVyIG1zZyBlcnJvciAtPiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIOWQr+WKqOa2iOaBr+WkhOeQhlxuICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjnur/mtojmga/mipvnu5nnirbmgIHmnLrlpITnkIZcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdk9ubGluZUNhbGxNc2cobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYG9uTWVzc2FnZSAtPiBfb25SZWN2T25saW5lQ2FsbE1zZzogJHttZXNzYWdlLm1lc3NhZ2VUeXBlfWApO1xuICAgIGNvbnN0IHsgY29udGVudDogeyBjYWxsSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDlnKjnur/mtojmga/nm7TmjqXmipvlh7pcbiAgICBzd2l0Y2ggKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGU6XG4gICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlICYmIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vblJpbmdpbmdgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0OlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbkFjY2VwdGAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW06XG4gICAgICAgIC8vIOaUtuWIsOS6uuWRmOWPmOabtOaKm+WHuiBvbkludml0ZSDnlJ/miJDnirbmgIHmnLrlrp7kvotcbiAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUgJiYgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbk1lZGlhTW9kaWZ5YCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cDpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25IdW5ndXBgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBvblJlY3ZPbmxpbmVDYWxsTXNnIC0+IHVuZXhwZWN0ZWQgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOa2iOaBryBidWZmZXIg5YiX6KGo5aSE55CG6YC76L6RXG4gICAqIDHjgIHmr48gMjBtcyDmo4Dmn6XkuIDmrKEgYnVmZmVyIGxpc3RcbiAgICogMuOAgeWPluWHuuW3sue7j+W7tui/nyAyMDAg55qE5raI5oGv5YiX6KGo6L+b6KGM5raI6LS5IHwg5peg5bu26L+fIDIwMG1zIOWGhea2iOaBr+ebtOaOpemAkuW9klxuICAgKiAz44CB5raI6LS55YiG5Li6IOemu+e6v+a2iOaBr+a2iOi0uemAu+i+keOAgeWcqOe6v+a2iOaBr+a2iOi0uemAu+i+ke+8jOa2iOi0ueWQjumAkuW9klxuICAqL1xuICBwcml2YXRlIF9oYW5kbGVCdWZmZXJNc2dzKCkge1xuICAgIC8vIOa2iOaBryBidWZmZXIg5YiX6KGo6ZW/5bqm5Li6IDAg5pe25Yqg6ZSBXG4gICAgaWYgKHRoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RoID09PSAwIHx8IHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdfaGFuZGxlQnVmZmVyTXNncyByZXR1cm4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g6ZyA6KaB5Yqg6ZSB77yM5pS25Yiw5aSa5qyh5raI5oGv5ZCO77yM5Y+v6IO95Lya6LW35aSa5LiqIHRpbWVyXG4gICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8g5Y+W5Ye65aSn5LqOIDIwMCBtcyDmtojmga/liJfooahcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbHRlcigoaXRlbSkgPT4gY3VycmVudFRpbWUgLSBpdGVtLm1hcmtUaW1lID49IDIwMCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gaGFuZGxlQnVmZmVyTXNncyAtPiBsaXN0cyBvdmVyIDIwMG1zIDogJHtKU09OLnN0cmluZ2lmeShidWZmZXJzLm1hcCgoeyBtc2c6IHsgbWVzc2FnZVVJZCwgaXNPZmZMaW5lTWVzc2FnZSwgY29udGVudDogeyBjYWxsSWQgfSB9IH0pID0+ICh7IG1lc3NhZ2VVSWQsIGlzT2ZmTGluZU1lc3NhZ2UsIGNhbGxJZCB9KSkpfWApO1xuICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIOayoeacieW7tui/nyAyMDBtcyDnmoTmtojmga/vvIzmtojotLnpgLvovpHop6PplIHlubbpgJLlvZLmiafooYxcbiAgICAgICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChidWZmZXJzWzBdLm1zZy5pc09mZkxpbmVNZXNzYWdlKSB7XG4gICAgICAgIC8vIOW9k+esrOS4gOadoea2iOaBr+S4uuemu+e6v+a2iOaBr+aXtu+8jOebtOaOpeS7jiBidWZmZXIg5Lit5Y+W5Ye65omA5pyJ56a757q/5raI5oGv77yM6L+b6KGM5raI5oGvXG4gICAgICAgIGxldCBvZmZsaW5lQnVmZmVycyA9IHRoaXMuX21zZ0J1ZmZlckxpc3QuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm1zZy5pc09mZkxpbmVNZXNzYWdlKTtcblxuICAgICAgICAvLyDnprvnur/mtojmga/lpITnkIbpgLvovpFcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvblR5cGUsIG1lc3NhZ2VUeXBlLCBzZW50VGltZSwgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IGNhbGxJZDogaW52aXRlQ2FsbElkLCBpbnZpdGVVc2VySWRzIH0sXG4gICAgICAgICAgfSA9IG9mZmxpbmVCdWZmZXJzWzBdLm1zZztcblxuICAgICAgICAgIGNvbnN0IGlzSW52aXRlTXNnVHlwZSA9IFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW1dLmluY2x1ZGVzKG1lc3NhZ2VUeXBlIGFzIFJDQ2FsbE1lc3NhZ2VUeXBlKTtcblxuICAgICAgICAgIC8vIOiuoeeul+W9k+WJjeaXtumXtOS4jua2iOaBr+WPkemAgeaXtumXtOW3rlxuICAgICAgICAgIGNvbnN0IGRlbGF5VGltZSA9IHRoaXMuX2NvbnRleHQuZ2V0U2VydmVyVGltZSgpIC0gc2VudFRpbWU7XG4gICAgICAgICAgY29uc3QgaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgPSBkZWxheVRpbWUgPCB0aGlzLl9vZmZsaW5lTXNnSXR2O1xuXG4gICAgICAgICAgaWYgKCFpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0dikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgb2ZmbGluZSBtc2cgZGVsYXlUaW1lOiAke2RlbGF5VGltZX1tc2ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0ludml0ZU1zZ1R5cGUpIHsgLy8g5Y+W5Ye655qE56ys5LiA5p2h5raI5oGv5Li6IGludml0ZSB8IG1lbU1vZGlmeVxuICAgICAgICAgICAgLy8g5Y+W5Ye655u45ZCMIENhbGxJZCDmtojmga/liJfooahcbiAgICAgICAgICAgIGNvbnN0IHRhc2tNc2dMaXN0OiBJUmVjZWl2ZWRNZXNzYWdlW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2ZmbGluZUJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG9mZmxpbmVCdWZmZXJzW2ldLm1zZztcbiAgICAgICAgICAgICAgY29uc3QgeyBjb250ZW50OiB7IGNhbGxJZDogb3RoZXJDYWxsSWQgfSB9ID0gaXRlbTtcbiAgICAgICAgICAgICAgaWYgKGludml0ZUNhbGxJZCA9PT0gb3RoZXJDYWxsSWQpIHtcbiAgICAgICAgICAgICAgICB0YXNrTXNnTGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGB0YXNrTXNnTGlzdCBsZW5ndGg6ICR7dGFza01zZ0xpc3QubGVuZ3RofWApO1xuXG4gICAgICAgICAgICBpZiAodGFza01zZ0xpc3QubGVuZ3RoID4gMCkgeyAvLyDpmLLmraIgdGFza01zZ0xpc3Qg5Li6IDBcbiAgICAgICAgICAgICAgLy8g5om+5Ye6IG1zZ0J1ZmZlckxpc3Qg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgICAgICAgIGNvbnN0IGRlbEluZGV4ID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubXNnLm1lc3NhZ2VVSWQgPT09IHRhc2tNc2dMaXN0W3Rhc2tNc2dMaXN0Lmxlbmd0aCAtIDFdLm1lc3NhZ2VVSWQpO1xuICAgICAgICAgICAgICAvLyDliKDpmaTmtojotLnov4cgbXNnQnVmZmVyTGlzdCDnmoTmtojmga9cbiAgICAgICAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdCA9IHRoaXMuX21zZ0J1ZmZlckxpc3Quc2xpY2UoZGVsSW5kZXggKyAxKTtcblxuICAgICAgICAgICAgICAvLyDmib7lh7ogb2ZmbGluZU1zZ3Mg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgICAgICAgIGNvbnN0IGRlbE9mZmxpbmVJbmRleCA9IG9mZmxpbmVCdWZmZXJzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5tc2cubWVzc2FnZVVJZCA9PT0gdGFza01zZ0xpc3RbdGFza01zZ0xpc3QubGVuZ3RoIC0gMV0ubWVzc2FnZVVJZCk7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpOa2iOi0uei/hyBvZmZsaW5lQnVmZmVycyDnmoTmtojmga9cbiAgICAgICAgICAgICAgb2ZmbGluZUJ1ZmZlcnMgPSBvZmZsaW5lQnVmZmVycy5zbGljZShkZWxPZmZsaW5lSW5kZXggKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog5Y2V6IGK5pyq57uT5p2f6YCa6K+d5Yik5patXG4gICAgICAgICAgICAgKiDlpoLmnpzmtojmga/lnKggNjBzIOWGhe+8jOWIpOaWreaYr+WQpuacquaIkOWvue+8iOWPquaciSBpbnZpdGUg5oiW5Y+q5pyJIGludml0ZSDmiJYgcmluZ2luZyDmiJDlr7nmipvnu5kg56a757q/6K6w5b2V5Zmo77yM5pyq5oiQ5a+55oqb57uZ54q25oCB5py6XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVW5maW5pc2hlZFByaXZhdGVDYWxsOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuUFJJVkFURSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCBpc09ubHlJbnZpdGUgPSB0YXNrTXNnTGlzdC5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICAgIGNvbnN0IGhhc0ludml0ZUFuZFJpbmdpbmcgPSB0YXNrTXNnTGlzdC5ldmVyeSgoaXRlbSkgPT4gW1JDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1JpbmdpbmddLmluY2x1ZGVzKGl0ZW0ubWVzc2FnZVR5cGUgYXMgUkNDYWxsTWVzc2FnZVR5cGUpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzT25seUludml0ZSB8fCBoYXNJbnZpdGVBbmRSaW5naW5nO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog576k6IGK5pyq57uT5p2f6YCa6K+d5Yik5patXG4gICAgICAgICAgICAgKiDpgJrov4cgbGlzdCDkuK0gaW52aXRlIOWSjCBtZW1iZXJNb2RpZnkg5raI5oGv5Lit5Y+W5Ye65omA5pyJ5Y+C5LiO6YCa6K+d55qEIHVzZXJJZFxuICAgICAgICAgICAgICog6YGN5Y6GIGxpc3Qg5om+5Ye65omA5pyJIGhhbmd1cCDnmoQgc2VuZFVzZXJJZFxuICAgICAgICAgICAgICogICAgIOaAu+S6uuaVsCAtIOaMguaWreS6uuaVsCA+IDEgIOS4lOWJqeS9meS6uuaVsOWMheWQq+iHquW3se+8jOiupOS4uumAmuivneacquaMguaWrei/m+eKtuaAgeaculxuICAgICAgICAgICAgICogICAgIOaAu+S6uuaVsCAtIOaMguaWreS6uuaVsCA8PSAxIOmAmuivneaMguaWre+8jOi/m+emu+e6v+a2iOaBr+WkhOeQhuWZqFxuICAgICAgICAgICAgICogICAgIOS4u+WPq+ebtOaOpeaMguaWreS4lOWFtuS7luS6uuacquaOpeWQrOebtOaOpei/m+emu+e6v+WkhOeQhuWZqFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBpc1VuZmluaXNoZWRHcnBDYWxsOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgbGV0IGlzVW5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgbm9PbmVBY2NlcHQgPSB0cnVlO1xuICAgICAgICAgICAgICBsZXQgYWxsVXNlcklkcyA9IFtzZW5kZXJVc2VySWQsIC4uLmludml0ZVVzZXJJZHNdO1xuICAgICAgICAgICAgICBsZXQgaXNDYWxsZXJIdW5ndXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrTXNnTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiB0YXNrTXNnU2VuZGVyVXNlcklkLCBtZXNzYWdlVHlwZSB9ID0gdGFza01zZ0xpc3RbaV07XG4gICAgICAgICAgICAgICAgLy8g5Y+q6KaB6Ieq5bex5oyC5pat55u05o6l6Lez5Ye65b6q546v77yM6L+b56a757q/5raI5oGvXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCAmJiB0YXNrTXNnU2VuZGVyVXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5om+5Ye65omA5pyJ5oyC5pat55qE5Lq65ZGY77yM5Lul5Y+K6YCa6K+d5Y+R6LW36ICF5piv5ZCm5oyC5patXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgICAgICAgICAgICAgaXNDYWxsZXJIdW5ndXAgPSBzZW5kZXJVc2VySWQgPT09IHRhc2tNc2dTZW5kZXJVc2VySWQ7XG4gICAgICAgICAgICAgICAgICBhbGxVc2VySWRzID0gYWxsVXNlcklkcy5maWx0ZXIoKGlkKSA9PiB0YXNrTXNnU2VuZGVyVXNlcklkICE9PSBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOWIpOaWreaYr+WQpuaXoOS6uuaOpeWQrFxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQpIHtcbiAgICAgICAgICAgICAgICAgIG5vT25lQWNjZXB0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIOS4jeaYr+S4u+WPq+aMguaWreS4lOaXoOS6uuaOpeWQrO+8jOS4lOWJqeS9meS6uuaVsOWkp+S6jiAxXG4gICAgICAgICAgICAgIGlmICghKG5vT25lQWNjZXB0ICYmIGlzQ2FsbGVySHVuZ3VwKSAmJiBhbGxVc2VySWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpc1VuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBpc1VuZmluaXNoZWQ7XG4gICAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgJiYgKGlzVW5maW5pc2hlZFByaXZhdGVDYWxsIHx8IGlzVW5maW5pc2hlZEdycENhbGwpKSB7XG4gICAgICAgICAgICAgIHRhc2tNc2dMaXN0LmZvckVhY2godGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZywgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZsaW5lUmVjb3JkZXIub25SZWN2T2ZmbGluZU1zZ3ModGFza01zZ0xpc3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgJiYgdGhpcy5fZ2V0U3RhdGVNYWNoaW5lKGludml0ZUNhbGxJZCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZyhvZmZsaW5lQnVmZmVyc1swXS5tc2cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIHVuZXhjZXB0ZWQgb2ZmbGluZSBtc2cgLT4gJHtKU09OLnN0cmluZ2lmeShvZmZsaW5lQnVmZmVyc1swXS5tc2cpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmbGluZUJ1ZmZlcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG9mZmxpbmVCdWZmZXJzLmxlbmd0aCA+IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Zyo57q/5raI5oGv5aSE55CG6YC76L6RXG4gICAgICAgIGJ1ZmZlcnMuZm9yRWFjaCgoeyBtc2cgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuX29uUmVjdk9ubGluZUNhbGxNc2cobXNnISk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyDmib7lh7ogbXNnQnVmZmVyTGlzdCDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgY29uc3QgZGVsQ291bnQgPSBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+H55qE5raI5oGvXG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc3BsaWNlKDAsIGRlbENvdW50KTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYHRpbWVyIG9ubGluZSBtc2cgaGFuZGxlIC0+IGRlbENvdW50OiAke2RlbENvdW50fSBtc2dCdWZmZXJMaXN0OiAke3RoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RofWApO1xuICAgICAgfVxuICAgICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICB9LCAyMCk7XG4gIH1cblxuICByZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElNc2dMaXN0ZW5lcikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fd2F0Y2hlcnMsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQoY2FsbElkOiBzdHJpbmcsIGZ1bmNOYW1lOiBNc2dMaXN0ZW5lcktleXMsIGV2ZW50OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSBjYWxsSWQgKyBmdW5jTmFtZTtcbiAgICBzdXBlci5vbihldmVudFR5cGUsIGV2ZW50KTtcbiAgfVxuXG4gIHVucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudChjYWxsSWQ6IHN0cmluZykge1xuICAgIFsnb25SaW5naW5nJywgJ29uQWNjZXB0JywgJ29uSHVuZ3VwJywgJ29uTWVkaWFNb2RpZnknXS5mb3JFYWNoKChmdW5jTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRUeXBlID0gY2FsbElkICsgZnVuY05hbWU7XG4gICAgICBzdXBlci5yZW1vdmVBbGwoZXZlbnRUeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX3VzZXJJbmZvID0gdXNlckluZm87XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCBIElNIOa2iOaBr1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZENhbGxNZXNzYWdlKG9wdGlvbnM6IElDYWxsTXNnT3B0aW9uKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgbWVzc2FnZT86IElSZWNlaXZlZE1lc3NhZ2UgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIC0+IG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YCk7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgcHVzaFRpdGxlLCBwdXNoRGF0YSwgcHVzaENvbnRlbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2VuZE9wdHM6IElTZW5kTXNnT3B0aW9ucyA9IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIG1lc3NhZ2VUeXBlLFxuICAgICAgY29udGVudCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdCxcbiAgICB9O1xuXG4gICAgaWYgKFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSkpIHtcbiAgICAgIGNvbnN0IHB1c2hDb25pZmc6IElQdXNoQ29uZmlnID0ge1xuICAgICAgICBwdXNoVGl0bGU6IHB1c2hUaXRsZSB8fCAnJyxcbiAgICAgICAgcHVzaENvbnRlbnQ6IHB1c2hDb250ZW50IHx8ICcnLFxuICAgICAgICBwdXNoRGF0YTogcHVzaERhdGEgfHwgJycsXG4gICAgICAgIGFuZHJvaWRDb25maWc6IHtcbiAgICAgICAgICBjYXRlZ29yeUhXOiAnVk9JUCcsXG4gICAgICAgICAgY2F0ZWdvcnlWaXZvOiAnSU0nLFxuICAgICAgICB9LFxuICAgICAgICBpT1NDb25maWc6IHtcbiAgICAgICAgICBhcG5zQ29sbGFwc2VJZDogY29udGVudC5jYWxsSWQsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVQdXNoVGl0bGU6IGZhbHNlLFxuICAgICAgICBmb3JjZVNob3dEZXRhaWxDb250ZW50OiBmYWxzZSxcbiAgICAgICAgdGVtcGxhdGVJZDogJycsXG4gICAgICB9O1xuICAgICAgc2VuZE9wdHMucHVzaENvbmZpZyA9IHB1c2hDb25pZmc7XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5zZW5kTWVzc2FnZShjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZE9wdHMpO1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgZXJyb3IgLT4gY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogRW5naW5lRXJyb3JDb2RlVG9DYWxsRXJyb3JDb2RlW2NvZGVdIHx8IFJDQ2FsbEVycm9yQ29kZS5TRU5EX01TR19FUlJPUixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBtZXNzYWdlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB6YKA6K+35raI5oGvXG4gICAqL1xuICBhc3luYyBzZW5kSW52aXRlKG9wdGlvbnM6IElJbnZpdGVNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm9vbVR5cGUsIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCBpbnZpdGVVc2VySWRzLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIHNlbmRJbnZpdGUnLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgdGhpcy5fd2F0Y2hlcnMuc2VuZEFjY2VwdCAmJiB0aGlzLl93YXRjaGVycy5zZW5kQWNjZXB0KHsgY2FsbElkIH0pO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElJbnZpdGVNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJvb21UeXBlLFxuICAgICAgZXh0cmEsXG4gICAgICBlbmdpbmVUeXBlOiA0LFxuICAgICAgY2hhbm5lbEluZm86IHsgSWQ6IGNhbGxJZCwgS2V5OiAnJyB9LFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkcyxcbiAgICAgIG9ic2VydmVyVXNlcklkczogW10sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCA/IGludml0ZVVzZXJJZHMgOiBbdGFyZ2V0SWRdLFxuICAgICAgcHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQsXG4gICAgICBwdXNoRGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHVzZXJJZExpc3Q6IGludml0ZVVzZXJJZHMsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeS6uuWRmOWPmOabtOa2iOaBr1xuICAgKi9cbiAgYXN5bmMgc2VuZE1lbWViZXJNb2RpZnkob3B0aW9uczogSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgaW52aXRlVXNlcklkcywgY2FsbGVySWQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLCAvLyBUT0RPIOS4jiBJTSDkuIDoh7RcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5naW5lVHlwZTogNCxcbiAgICAgIGNoYW5uZWxJbmZvOiB7IElkOiBjYWxsSWQsIEtleTogJycgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZHMsXG4gICAgICBvYnNlcnZlclVzZXJJZHM6IFtdLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgICBjYWxsZXI6IGNhbGxlcklkLFxuICAgICAgbW9kaWZ5TWVtVHlwZTogTWVtYmVyTW9kaWZ5VHlwZS5BREQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3QsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIHB1c2hEYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgdXNlcklkTGlzdDogaW52aXRlVXNlcklkcyxcbiAgICAgICAgY2FsbElkLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5ZON6ZOD5raI5oGvXG4gICAqL1xuICBzZW5kUmluZ2luZyhvcHRpb25zOiBJUmluZ2luZ01zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSVJpbmdpbmdNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlkIzmhI/mjqXlkKzmtojmga9cbiAgICovXG4gIHNlbmRBY2NlcHQob3B0aW9uczogSUFjY2VwdE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJQWNjZXB0TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHmjILmlq3mtojmga9cbiAgICovXG4gIHNlbmRIdW5ndXAob3B0aW9uczogSUh1bmd1cE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHJlYXNvbiwgdXNlcklkcywgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJSHVuZ3VwTXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgcHVzaERhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2FsbElkLCByZWFzb24sXG4gICAgICB9KSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlqpLkvZPlj5jmm7Tmtojmga9cbiAgICovXG4gIHNlbmRNZWRpYU1vZGlmeShvcHRpb25zOiBJTWVkaWFNb2RpZnlNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lZGlhTW9kaWZ5TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxMYW5ndWFnZSB7XG4gIFpIID0gJ3poJyxcbiAgRU4gPSAnZW4nXG59XG4iLCJleHBvcnQgY29uc3QgRU4gPSB7XG4gIFB1c2hUaXRsZToge1xuICAgIEFVRElPOiAnWW91IGhhdmUgYSB2b2ljZSBjYWxsJyxcbiAgICBWSURFTzogJ1lvdSBoYXZlIGEgdmlkZW8gY2FsbCcsXG4gIH0sXG59O1xuIiwiZXhwb3J0IGNvbnN0IFpIID0ge1xuICBQdXNoVGl0bGU6IHtcbiAgICBBVURJTzogJ+aCqOacieS4gOadoemfs+mikemAmuivnScsXG4gICAgVklERU86ICfmgqjmnInkuIDmnaHop4bpopHpgJror50nLFxuICB9LFxufTtcbiIsImltcG9ydCB7IFJDQ2FsbExhbmd1YWdlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBFTiB9IGZyb20gJy4vZW4nO1xuaW1wb3J0IHsgWkggfSBmcm9tICcuL3poJztcblxuLyoqXG4gKiBDYWxsRW5naW5lIOWFqOWxgOivreiogOiuvue9ru+8jOW9k+WJjeS7heaUr+aMgeS4reOAgeiLseaWh1xuICovXG5leHBvcnQgY2xhc3MgTG9jYWwge1xuICBzdGF0aWMgX2xhbmc6IFJDQ2FsbExhbmd1YWdlID0gUkNDYWxsTGFuZ3VhZ2UuWkhcblxuICBzdGF0aWMgc2V0KGxhbmc6IFJDQ2FsbExhbmd1YWdlKSB7XG4gICAgdGhpcy5fbGFuZyA9IGxhbmc7XG4gIH1cblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIGlmICh0aGlzLl9sYW5nID09PSBSQ0NhbGxMYW5ndWFnZS5FTikge1xuICAgICAgcmV0dXJuIEVOO1xuICAgIH1cbiAgICByZXR1cm4gWkg7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBDb252ZXJzYXRpb25UeXBlLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsU3RhdGVNYWNoaW5lIH0gZnJvbSAnLi9jb3JlL1N0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSU1lZGlhTW9kaWZ5SW5mbywgSU1lbWJlck1vZGlmeUluZm8sIElTZW5kZXJJbmZvLCBJU3RhdGVDaGFuZ2VJbmZvLCBJVXNlclByb2ZpbGUsIElVc2VyU3RhdGVDaGFuZ2VJbmZvLCBJVXNlckRhdGEsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7IFJDQ2FsbEVycm9yQ29kZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxVc2VyU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvblN0YXRlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxFbmRSZWFzb24gfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsRW5kUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbE1lZGlhVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgQ2FsbE1lc3NhZ2VIYW5kbGVyIH0gZnJvbSAnLi9jb3JlL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IGV2ZW50RW1pdHRlciwgZ2VuZXJhdGVSYW5kb21JZCwgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBJQ2FsbEVuZ2luZU9wdGlvbnMsIElDYWxsRW5naW5lV2F0Y2hlcnMgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJSW52aXRlTXNnQ29udGVudCB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQgeyBMb2NhbCB9IGZyb20gJy4vY29yZS9sb2NhbGUnO1xuaW1wb3J0IHsgSU9mZmxpbmVSZWNvcmQgfSBmcm9tICcuL2NvcmUvT2ZmbGluZVJlY29yZGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0Nyb3NzQ2FsbFR5cGUnO1xuXG5jbGFzcyBSQ0NhbGxFbmdpbmUge1xuICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IHsgW2NhbGxJZDogc3RyaW5nXTogUkNDYWxsU3RhdGVNYWNoaW5lIH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxNc2dIYW5kbGVyOiBDYWxsTWVzc2FnZUhhbmRsZXJcblxuICAvKipcbiAgICog5Yid5aeL5YyWXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBlbmdpbmUgUGxndWluQ29udGV4dCDlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIC8qKlxuICAgICAqIOi/kOihjOaXtuebuOWFs1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSDml6Xlv5fmqKHlnZflrp7kvovvvIznlLEgQ2FsbExpYiDlsYLliJ3lp4vljJZcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOebkeWQrOaWueazlVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3dhdGNoZXJzOiBJQ2FsbEVuZ2luZVdhdGNoZXJzLFxuICAgIC8qKlxuICAgICAqIOWFtuS7lumFjee9rumhuVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IElDYWxsRW5naW5lT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIFZlcnNpb246ICR7X19WRVJTSU9OX199IENvbW1pdElkOiAke19fQ09NTUlUX0lEX199YCk7XG4gICAgLy8g6K6+572uIERldmljZUlkXG4gICAgZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDnm5HlkKwgSU0g5raI5oGvXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIgPSBuZXcgQ2FsbE1lc3NhZ2VIYW5kbGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwgdGhpcy5fb3B0aW9ucy5vZmZsaW5lTXNnSXR2LCB0aGlzLl9nZXRTdGF0ZU1hY2hpbmUuYmluZCh0aGlzKSk7XG4gICAgLy8g5rOo5YaM5raI5oGv5qih5Z2X55uR5ZCsXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJFdmVudExpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgc2VuZEFjY2VwdDogdGhpcy5faGFuZGxlU2VuZEFjY2VwdC5iaW5kKHRoaXMpLFxuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQsXG4gICAgfSk7XG4gICAgLy8g55uR5ZCs54q25oCB5py65YWz6ZetXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdvblN0YXRlTWFjaGluZUNsb3NlJywgKGNhbGxJZDogc3RyaW5nKSA9PiB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgfSk7XG4gICAgLy8g6K6+572u6K+t6KiAXG4gICAgTG9jYWwuc2V0KF9vcHRpb25zLmxhbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25JbnZpdGUobXNnOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIHNlbmRlclVzZXJJZDogc3VpZCwgcHVzaENvbmZpZyxcbiAgICB9ID0gbXNnO1xuICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYFJDQ2FsbEVuZ2luZSBfb25JbnZpdGU6dGFyZ2V0SWQgJHt0YXJnZXRJZH0gc2VuZGVyVXNlcklkOiAke3N1aWR9YCk7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWFUeXBlLCBjYWxsSWQsIGV4dHJhLCByb29tVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJSW52aXRlTXNnQ29udGVudDtcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlICE9PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBzZW5kZXJVc2VySWQgPSBzdWlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBjb25zdCBjcnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpID09PSBzZW5kZXJVc2VySWQpIHsgLy8g5aSa56uv5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog576k6IGK6YCa6K+d5pyJ5YW25LuW56uv5aSE55CG5pe277yM5LiN5YaN5aSE55CG5q2k6YCa6K+d5Lit55qE6YKA6K+35raI5oGvXG4gICAgICog5p2h5Lu2MTog5q2k5Lq65bey6KKr6YKA6K+36YCa6K+dXG4gICAgICog5p2h5Lu2Mjog5pys56uv5peg5q2k6YCa6K+d55qE54q25oCB5py6XG4gICAgICovXG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgY29uc3QgaXNLZWVwaW5nID0gY29udGVudC5leGlzdGVkVXNlclBvZmlsZXMuc29tZSgoaXRlbTogeyB1c2VySWQ6IHN0cmluZyB9KSA9PiAoaXRlbS51c2VySWQgPT09IGNydFVzZXJJZCkpO1xuICAgICAgaWYgKGlzS2VlcGluZyAmJiAhdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlTWFjaGluZSA9IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdO1xuICAgIGlmICghc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICAgIGNoYW5uZWxJZCEsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgICk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsRW5naW5lXSBSQ0NhbGxTdGF0ZU1hY2hpbmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgLT4gY2FsbElkOiAke2NhbGxJZH1gKTtcblxuICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSkge1xuICAgICAgICAvLyDnirbmgIHmnLrlhoXpg6jlpITnkIYgaW52aXRlIOa2iOaBr1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uSW52aXRlKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uTWVtYmVyTW9kaWZ5KG1zZyk7XG4gICAgICB9XG4gICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSh0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSwgZXh0cmEpO1xuXG4gICAgICBjb25zdCBoYXNPdGhlclN0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkuZmlsdGVyKChvdGhlckNhbGxJZCkgPT4gY2FsbElkICE9PSBvdGhlckNhbGxJZCkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChoYXNPdGhlclN0YXRlTWFjaGluZSAmJiAhKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwgfHwgZmFsc2UpKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9faGFuZGxlSW52aXRlSW5TZXNzaW9uKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0pIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5YWB6K645o6l5ZCs5paw55qE6YCa6K+d5pe277yM5o6l5ZCs5a6M5paw55qE6YCa6K+d5ZCO77yM5oyC5pat5YW25LuW6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVTZW5kQWNjZXB0KGluZm86IHsgY2FsbElkOiBzdHJpbmcgfSkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dBY2NlcHROZXdDYWxsKSB7XG4gICAgICBjb25zdCB7IGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc3RhdGVNYWNoaW5lKSB7XG4gICAgICAgIGlmIChjYWxsSWQgIT09IGlkKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXS5odW5ndXAoKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlueKtuaAgeaculxuICAqL1xuICBwcml2YXRlIF9nZXRTdGF0ZU1hY2hpbmUoY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM55So5oi35L+h5oGvLCDlj5HpgIEgY2FsbCDmtojmga/ml7bnlKjmiLfkv6Hmga/mkLrluKZcbiAgICovXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSByZWdpc3RlclVzZXJJbmZvIC0+IHVzZXJJbmZvOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJbmZvKX1gKTtcblxuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyVXNlckluZm8odXNlckluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvFxuICAgKiBAcGFyYW0gY2hhbm5lbElkIOe7hOe7hyBJRFxuICAgKiBAcGFyYW0gdGFyZ2V0SWQgIOWvueaWuSBJRFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIGNhbGwoXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IG51bWJlcixcbiAgICBleHRyYTogc3RyaW5nID0gJycsXG4gICAgcHVzaFRpdGxlOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29udGVudDogc3RyaW5nID0gJycsXG4gICAgaXNDcm9zc0FwcGtleSA9IGZhbHNlLFxuICApOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzdGF0ZU1hY2hpbmU/OiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSBjYWxsIC0+IGFyZ3M6ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9KX1gKTtcbiAgICBjb25zdCBjYWxsSWQgPSBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgY29uc3QgaGFzU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNTdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVEFURV9NQUNISU5FX0VYSVQgfTtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0gPSBuZXcgUkNDYWxsU3RhdGVNYWNoaW5lKFxuICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIENvbnZlcnNhdGlvblR5cGUuUFJJVkFURSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgY2FsbElkLFxuICAgICk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX2NhbGwoW3RhcmdldElkXSwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsIGlzQ3Jvc3NBcHBrZXkpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsXG4gICAgICAgIHN0YXRlTWFjaGluZTogdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog576k5ZG8XG4gICAqIEBwYXJhbSBjaGFubmVsSWQg57uE57uHIElEXG4gICAqIEBwYXJhbSB0YXJnZXRJZCAg576k57uEIElEXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+S6uuWRmOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIGNhbGxJbkdyb3VwKFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgbWVkaWFUeXBlOiBudW1iZXIsXG4gICAgdXNlcklkczogc3RyaW5nW10sXG4gICAgZXh0cmE6IHN0cmluZyA9ICcnLFxuICAgIHB1c2hUaXRsZTogc3RyaW5nID0gJycsXG4gICAgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnLFxuICApOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzdGF0ZU1hY2hpbmU/OiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSBjYWxsSW5Hcm91cCAtPiBhcmdzOiAke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5HUk9VUCxcbiAgICAgIHRhcmdldElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgY2FsbElkLFxuICAgICk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX2NhbGwodXNlcklkcywgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsXG4gICAgICAgIHN0YXRlTWFjaGluZTogdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6ZSA5q+B5b2T5YmN55qE54q25oCB5py6XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsRW5naW5lXSBkZXN0cm95Jyk7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lID0ge307XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUkNDYWxsRW5naW5lLFxuICBSQ0NhbGxTdGF0ZU1hY2hpbmUsIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbEVuZFJlYXNvbixcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxMYW5ndWFnZSxcbn07XG5cbmV4cG9ydCB0eXBlIHtcbiAgSUNhbGxTdGF0ZU1hY2hpbmVXYXRjaGVycywgSUVuZFN1bW1hcnksXG4gIElDYWxsRW5naW5lV2F0Y2hlcnMsXG4gIElVc2VyU3RhdGVDaGFuZ2VJbmZvLFxuICBJU3RhdGVDaGFuZ2VJbmZvLFxuICBJU2VuZGVySW5mbyxcbiAgSU1lbWJlck1vZGlmeUluZm8sXG4gIElNZWRpYU1vZGlmeUluZm8sXG4gIElJbnZpdGVkVXNlcnMsXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJQcm9maWxlLFxuICBJT2ZmbGluZVJlY29yZCxcbiAgSUludml0ZU9wdGlvbnMsXG59O1xuIiwiLyoqXG4gKiDkuqfnlJ9zZXNzaW9u55qE5Zy65pmvXG4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y2VUeXBlcyB7XG4gIC8qKlxuICAgKiDkuLvlj6tcbiAgICovXG4gIENBTExFUiA9IDEsXG5cbiAgLyoqXG4gICAqIOiiq+WPq1xuICAgKi9cbiAgQ0FMTEVFID0gMlxufVxuIiwiY2xhc3MgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsaXN0OiB7W3Byb3BOYW1lOiBzdHJpbmddOiBhbnlbXX0gPSB7fVxuXG4gIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBmdW46KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICAodGhpcy5saXN0W2V2ZW50XSB8fCAodGhpcy5saXN0W2V2ZW50XSA9IFtdKSkucHVzaChmdW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuOihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgY29uc3Qgb24gPSAoZGF0YT86YW55KSA9PiB7XG4gICAgICB0aGlzLm9mZihldmVudCwgb24pO1xuICAgICAgZnVuLmNhbGwodGhpcywgZGF0YSk7XG4gICAgfTtcbiAgICBvbi5mdW4gPSBmdW47XG4gICAgdGhpcy5vbihldmVudCwgb24pO1xuICB9XG5cbiAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBmdW4/OihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgY29uc3QgZnVucyA9IHRoaXMubGlzdFtldmVudF07XG4gICAgaWYgKCFmdW5zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZnVuKSB7XG4gICAgICAvLyDlpoLmnpzmsqHmnInkvKAgZm4g55qE6K+d77yM5bCx5Lya5bCGIGV2ZW50IOWAvOWvueW6lOe8k+WtmOWIl+ihqOS4reeahCBmdW4g6YO95riF56m6XG4gICAgICBmdW5zICYmIChmdW5zLmxlbmd0aCA9IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDoi6XmnIkgZnVu77yM6YGN5Y6G57yT5a2Y5YiX6KGo77yM55yL55yL5Lyg5YWl55qEIGZuIOS4juWTquS4quWHveaVsOebuOWQjO+8jOWmguaenOebuOWQjOWwseebtOaOpeS7jue8k+WtmOWIl+ihqOS4reWIoOaOieWNs+WPr1xuICAgICAgbGV0IGNiO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIHsgbGVuZ3RoIH0gPSBmdW5zOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2IgPSBmdW5zW2ldO1xuICAgICAgICBpZiAoY2IgPT09IGZ1biB8fCBjYi5mdW4gPT09IGZ1bikge1xuICAgICAgICAgIGZ1bnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgZGF0YT86YW55KSB7XG4gICAgLy8g56ys5LiA5Liq5Y+C5pWw5piv5a+55bqU55qEIGV2ZW50IOWAvO+8jOebtOaOpeeUqOaVsOe7hOeahCBzaGlmdCDmlrnms5Xlj5blh7pcbiAgICBjb25zdCBmdW5zID0gWy4uLnRoaXMubGlzdFtldmVudF1dO1xuXG4gICAgLy8g5aaC5p6c57yT5a2Y5YiX6KGo6YeM5rKh5pyJIGZ1biDlsLHov5Tlm54gZmFsc2VcbiAgICBpZiAoIWZ1bnMgfHwgZnVucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8g6YGN5Y6GIGV2ZW50IOWAvOWvueW6lOeahOe8k+WtmOWIl+ihqO+8jOS+neasoeaJp+ihjCBmblxuICAgIGZ1bnMuZm9yRWFjaCgoZnVuKSA9PiB7XG4gICAgICBmdW4uY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXZlbnRFbWl0dGVyLFxufTtcbiIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgRXZlbnRFbWl0dGVyKCk7XG4iLCJpbXBvcnQgeyBSVENKb2luVHlwZSwgTG9nTCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZXNvbHV0aW9uIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHtcbiAgSVNlc3Npb25MaXN0ZW5lciwgSVJDQ2FsbEluaXRPcHRpb25zLCBJVmFsaWRhdGlvblJlc3VsdCwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmZ1bmN0aW9uIGlzTGFuZ3VhZ2UodmFsOiBzdHJpbmcpIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IE9iamVjdC52YWx1ZXMoUkNDYWxsTGFuZ3VhZ2UpO1xuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmZ1bmN0aW9uIGlzSm9pblR5cGUodmFsOiBudW1iZXIpIHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhSVENKb2luVHlwZSkgYXMgbnVtYmVyW107XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModmFsKTtcbn1cblxuZnVuY3Rpb24gaXNMb2dMZXZlbCh2YWw6IG51bWJlcikge1xuICByZXR1cm4gW0xvZ0wuREVCVUcsIExvZ0wuSU5GTywgTG9nTC5XQVJOLCBMb2dMLkVSUk9SXS5pbmNsdWRlcyh2YWwpO1xufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgPSAob3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG4gIGNvbnN0IGtleU5hbWVzOiBzdHJpbmdbXSA9IFsncnRjQ2xpZW50JywgJ29uU2Vzc2lvbicsICdvblNlc3Npb25DbG9zZSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAvLyDmoKHpqozloavpobnmmK/lkKbpg73ljIXlkKvvvIzlpoLmnpzlk6rkuKrkuI3ljIXlkKvlsLHmlLbpm4botbfmnaVcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8g5aaC5p6c57y65bCR5b+F5aGr55qE55uR5ZCs5Ye95pWw5oiW5a+56LGhXG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5ydGNDbGllbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5vblNlc3Npb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25cXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25DbG9zZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqGaXNBbGxvd1N1YnNjcmliZVJldHJ5IOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5ICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc0FsbG93U3Vic2NyaWJlUmV0cnlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd1B1Ymxpc2hSZXRyeVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JUQ0pvaW5UeXBl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5qb2luVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzSm9pblR5cGUob3B0aW9ucy5qb2luVHlwZSEpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnam9pblR5cGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JDQ2FsbExhbmd1YWdl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sYW5nICE9PSAndW5kZWZpbmVkJyAmJiAhaXNMYW5ndWFnZShvcHRpb25zLmxhbmchKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xhbmdcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwgIT09ICd1bmRlZmluZWQnICYmICFpc0xvZ0xldmVsKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwhKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ091dHB1dExldmVsXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiDmoKHpqoxyZWdpc3RlclNlc3Npb25MaXN0ZW5lcuWPguaVsFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnbGlzdGVuZXIgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cbiAgY29uc3Qga2V5TmFtZXM6IHN0cmluZ1tdID0gWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25UcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25SaW5naW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25SaW5naW5nXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkFjY2VwdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uQWNjZXB0XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkh1bmd1cCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uSHVuZ3VwXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vblRyYWNrUmVhZHkgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvblRyYWNrUmVhZHlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVRhcmdldElkID0gKHRhcmdldElkOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0YXJnZXRJZCAmJiB0eXBlb2YgdGFyZ2V0SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndGFyZ2V0SWRcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFUeXBlID0gKG1lZGlhVHlwZTogbnVtYmVyKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gfHwgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdtZWRpYVR5cGVcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnUkNDYWxsTWVkaWFUeXBlXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUV4dHJhID0gKGV4dHJhOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgZXh0cmEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZXh0cmFcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaFRpdGxlID0gKHB1c2hUaXRsZTogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIHB1c2hUaXRsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoVGl0bGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbnRlbnQgPSAocHVzaENvbnRlbnQ6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwdXNoQ29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoQ29udGVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb25maWcgPSAocHVzaENvbmZpZzogSVB1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJyB9ID0gcHVzaENvbmZpZztcbiAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFtdO1xuICBjb25jbHVzaW9uLnB1c2godmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlKSk7XG4gIGNvbmNsdXNpb24ucHVzaCh2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50KSk7XG4gIHJldHVybiBjb25jbHVzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVXNlcklkcyA9ICh1c2VySWRzOiBzdHJpbmdbXSk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJJZHMpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMuZXZlcnkoKHN0cikgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuXG5mdW5jdGlvbiBpc1JDRnJhbWVSYXRlKHZhbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFycnMgPSBbJ0ZQU18xMCcsICdGUFNfMTUnLCAnRlBTXzI0JywgJ0ZQU18zMCddO1xuICByZXR1cm4gYXJycy5pbmNsdWRlcyh2YWwpO1xufVxuXG5jb25zdCBpc1ZhbGlkUmVzb2x1dGlvbiA9IChyZXNvbHV0aW9uPzogUkNSZXNvbHV0aW9uKTogYm9vbGVhbiA9PiAhIVJDUmVzb2x1dGlvbltyZXNvbHV0aW9uIV07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMgPSAoY29uc3RyYWludHM6IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5taWNwaG9uZUlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5zYW1wbGVSYXRlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ251bWJlclxcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICAvLyBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3VzZXInICYmIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAnZW52aXJvbm1lbnQnKSB7XG4gIC8vICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSAgXFwndXNlclxcJyBvciBcXCdlbnZpcm9ubWVudFxcJycgfVxuICAvLyB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzUkNGcmFtZVJhdGUoY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2ZyYW1lUmF0ZVxcJyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAndW5kZWZpbmVkJyAmJiAhaXNWYWxpZFJlc29sdXRpb24oY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbikpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdyZXNvbHV0aW9uXFwnIHZhbHVlIGlzIG91dCBvZiByYW5nZScgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgKCFjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgfHwgIWNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24pKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncmVzb2x1dGlvblxcJyBhbmQgXFwncmVzb2x1dGlvblxcJyBpcyByZXF1aXJlZCcgfTtcbiAgfVxuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIFRpbWVyIHtcbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgc3RvcCgpOiB7XG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgZW5kVGltZTogbnVtYmVyLFxuICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICB9IHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG5cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZHVyYXRpb24gPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUgPT09IDApIHtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgICBlbmRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnZlcnNhdGlvblR5cGUsIElMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJTWVkaWFNb2RpZnlJbmZvLFxuICBJTWVtYmVyTW9kaWZ5SW5mbyxcbiAgSVNlbmRlckluZm8sXG4gIElTdGF0ZUNoYW5nZUluZm8sXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJTdGF0ZUNoYW5nZUluZm8sXG4gIElJbnZpdGVPcHRpb25zLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbFN0YXRlTWFjaGluZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIFJDS2lja1JlYXNvbixcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZUF1ZGlvVHJhY2ssXG4gIFJDUmVtb3RlVHJhY2ssXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNSVENQaW5nUmVzdWx0LFxuICBSQ1JUQ1Jvb20sXG4gIElNaWNwaG9uZUF1ZGlvUHJvZmlsZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHsgUHJvZHVjZVR5cGVzIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmltcG9ydCB7XG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLFxuICBJTXV0ZVVzZXIsXG4gIElSQ0NhbGxTZXNzaW9uT3B0aW9ucyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVMaXN0ZW5lciwgdmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCB2YWxpZGF0ZVVzZXJJZHMsIHZhbGlkYXRlRXh0cmEsIHZhbGlkYXRlUHVzaFRpdGxlLCB2YWxpZGF0ZVB1c2hDb250ZW50LFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tICcuL3RpbWVyJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFNlc3Npb24ge1xuICAvKipcbiAgICogUlRD5oi/6Ze05a6e5L6LXG4gICAqL1xuICBwcml2YXRlIF9yb29tITogUkNSVENSb29tXG5cbiAgLyoqXG4gICAqIOeUqOaIt+S8oOi/m+adpeeahCDlr7lzZXNzaW9u55qE55uR5ZCsICjopoHlnKhSQ0NhbGxDbGllbnTnmoRfb25JbnZpdGXph4zliKTmlq3vvIzopoHmsYLmiafooYzlroxvblNlc3Npb27lv4Xpobvms6jlhoxzZXNzaW9u55qE55uR5ZCs77yM5omA5Lul6L+Z6YeM5pivcHVibGljKVxuICAgKi9cbiAgcHVibGljIF9saXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJUQ+iuoumYheOAgeWPkeW4g+mHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfUkVUUllDT1VOVDogbnVtYmVyID0gMlxuXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7Tlrprml7blmahcbiAgICovXG5cbiAgcHJpdmF0ZSBqb2luUm9vbVRpbWVyOiBhbnkgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoXG5cbiAgICAvKipcbiAgICAgKiDnirbmgIHmnLrlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSxcblxuICAgIC8qKlxuICAgICAqIHJ0Y+WunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnQsXG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG5cbiAgICAvKipcbiAgICAgKiBzZXNzaW9u55qE5YW25a6D6YCJ6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbFNlc3Npb25PcHRpb25zID0ge30sXG5cbiAgKSB7XG4gICAgLy8g55uR5ZCs54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOaIt+eKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtIGluZm9cbiAgICAgICAqL1xuICAgICAgb25Vc2VyU3RhdGVDaGFuZ2U6ICh7IHVzZXIsIHJlYXNvbiB9OiBJVXNlclN0YXRlQ2hhbmdlSW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJTdGF0ZUNoYW5nZV0gdXNlcklkLT4ke3VzZXI/LnVzZXJJZH0gc3RhdGUtPiR7dXNlcj8uc3RhdGV9IHJlYXNvbi0+JHtyZWFzb259YCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtXG4gICAgICAgKi9cbiAgICAgIG9uU3RhdGVDaGFuZ2U6IGFzeW5jIChpbmZvOiBJU3RhdGVDaGFuZ2VJbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHJlYXNvbiB9ID0gaW5mbztcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gOiBzdGF0ZS0+JHtzdGF0ZX0gcmVhc29uLT4ke3JlYXNvbn1gKTtcblxuICAgICAgICAvLyDlpoLmnpzlnKjpgJror53kuK3vvIzlsLHliqDmiL/pl7RcbiAgICAgICAgaWYgKHN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIGNvbnN0IHJvb21JZDogc3RyaW5nID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIHJvb21JZDogJHtyb29tSWR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fam9pblJvb20ocm9vbUlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIGpvaW5Sb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAg5Lul5LiL5LiJ5p2h5Y+q6KaB5ruh6Laz5LiA5p2h77yM54q25oCB5Lya5Y+Y5oiQUkNDYWxsU2Vzc2lvblN0YXRlLkVORFxuICAgICAgICAgICAqICAx44CB5pys56uv55So5oi36Ieq5bex5Li75Yqo5oyC5patXG4gICAgICAgICAgICogIDLjgIHmnI3liqHnq6/miormnKznq6/nlKjmiLfouKLlh7pSVEPmiL/pl7RcbiAgICAgICAgICAgKiAgM+OAgeaIv+mXtOmHjOWwj+S6jjLkuKrkurpcbiAgICAgICAgICAgKi9cbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIC8vIOi/mOacquWKoOWFpeaIv+mXtOWwseaMguaWrVxuICAgICAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g6ZSA5q+B5pys5Zyw5rWB77yM5YWz6Zet5pGE5YOP5aS0XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KCk7XG4gICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gbG9jYWxUcmFja3MgZGVzdHJveWVkJyk7XG4gICAgICAgICAgdGhpcy5fbGVhdmVSb29tKCk7XG4gICAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw5ZON6ZODXG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBvblJpbmdpbmc6IChzZW5kZXI6IElTZW5kZXJJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uUmluZ2luZ11zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l55So5oi35ZON6ZODXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUmluZ2luZyhzZW5kZXIsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblJpbmdpbmddIG1ldGhvZCBleGNlcHRpb24gLT4gb25SaW5naW5nJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICAgKiDlvZPov5znq6/nlKjmiLflkIzmhI/mjqXlkKxcbiAgICAgICAgICovXG4gICAgICBvbkFjY2VwdDogKHNlbmRlcjogSVNlbmRlckluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjqXlkKxcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BY2NlcHQoc2VuZGVyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdIG1ldGhvZCBleGNlcHRpb24gLT4gb25BY2NlcHQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgICAqIOW9k+aciei/nOerr+eUqOaIt+aMguaWrVxuICAgICAgICAgKi9cbiAgICAgIG9uSHVuZ3VwOiAoc2VuZGVyOiBJU2VuZGVySW5mbywgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25IdW5ndXBdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH0gcmVhc29uLT4ke3JlYXNvbn1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjILmlq1cbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25IdW5ndXAoc2VuZGVyLCByZWFzb24sIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbkh1bmd1cF0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbkh1bmd1cCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOS6uuWRmOWPmOabtFxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZW1iZXJNb2RpZnk6ICh7IHNlbmRlciwgaW52aXRlZFVzZXJzIH06IElNZW1iZXJNb2RpZnlJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uTWVtYmVyTW9kaWZ5XSBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XnlKjmiLfkurrlkZjlj5jmm7RcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25NZW1iZXJNb2RpZnkoc2VuZGVyLCBpbnZpdGVkVXNlcnMsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lbWJlck1vZGlmeV0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbk1lbWJlck1vZGlmeScpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmAmuivneexu+Wei+WPmOabtCAo6YCa6K+d6ZmN57qnKVxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZWRpYU1vZGlmeTogKHsgc2VuZGVyLCBtZWRpYVR5cGUgfTogSU1lZGlhTW9kaWZ5SW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgICAgIC8vIOi/nOerr+aUtuWIsOmAmuivnemZjee6p+mAmuefpeWQju+8jOi/nOerr+aJp+ihjOmZjee6p+mAmuivnSjkuI3lj5Hmtojmga8pXG4gICAgICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uTWVkaWFNb2RpZnkoc2VuZGVyLCBtZWRpYVR5cGUsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uTWVkaWFNb2RpZnknKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm6LeoYXBwa2V5XG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBjcm9zc0FwcGtleTogKGlzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gY3Jvc3NBcHBrZXldIOaYr+WQpui3qCBhcHBrZXk6ICR7aXNDcm9zc0FwcGtleX1gKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7mjILmlq3nmoTmjqjpgIHkv6Hmga9cbiAgICAgKi9cbiAgICBjb25zdCB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfSA9IHRoaXMuX29wdGlvbnMuaHVuZ3VwUHVzaENvbmZpZyE7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnNldEh1bmd1cFB1c2hDb25maWcocHVzaFRpdGxlLCBwdXNoQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICogIOWKoOWFpeaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfam9pblJvb20ocm9vbUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBsZXQgY2FsbEJhY2s7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuaXNDcm9zc0FwcGtleSkge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luQ3Jvc3NSVENSb29tKHJvb21JZCwgdGhpcy5fb3B0aW9ucy5qb2luVHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbShyb29tSWQsIHRoaXMuX29wdGlvbnMuam9pblR5cGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvZGUsIHVzZXJJZHMsIHJvb20gfSA9IGNhbGxCYWNrO1xuXG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAgICAgIGlmIChjb2RlID09PSBSQ1JUQ0NvZGUuTk9UX09QRU5fVklERU9fQVVESU9fU0VSVkVSKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNFUlZJQ0VfTk9UX09QRU5FRCk7XG4gICAgICAgICAgLy8g5bex5pa55YW25LuW56uv5bey5Zyo6YCa6K+d5LitXG4gICAgICAgIH0gaWYgKGNvZGUgPT09IFJDUlRDQ29kZS5TSUdOQUxfSk9JTl9SVENfUk9PTV9SRUZVU0VEKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9JTl9DQUxMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IF9qb2luUm9vbV0gam9pbiByb29tIGZhaWxlZDogcm9vbUlkIC0+ICR7cm9vbUlkfSBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICog576k6IGK5pys56uv5Yqg5YWl5oi/6Ze05ZCO77yM5pu05paw5Lq65ZGY54q25oCB5Li66YCa6K+d5LitXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvblR5cGUgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q29udmVyc2F0aW9uVHlwZSgpO1xuICAgICAgY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCAmJiB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4oW3RoaXMuX3J0Y0NsaWVudC5nZXRDdXJyZW50SWQoKV0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIOmSiOWvueengeacieS6kSBAcm9uZ2Nsb3VkL3BsdWdpbi1ydGNANS4xLjEwLWVudGVycHJpc2UuNyDlop7liqDooaXkuIHvvIxcbiAgICAgICAqIOengeacieS6keWNh+WujCBSVEMgc2RrIOeJiOacrOWQjuWIoOaOieatpOihpeS4gVxuICAgICAgICog5Yqg5a6M5oi/6Ze05ZCO77yM5a+55pa55oyC5pat5LqG77yM6ZyA6YCA5Ye65oi/6Ze0XG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3RhdGUoKSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHJvb20hKTtcbiAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOiiq+WPq+aWueWKoOWFpeaIv+mXtOaIkOWKn++8jOS9huS4u+WPq+aWueWcqOWKoOWFpeaIv+mXtOWJjeemu+e6v1xuICAgICAgaWYgKHVzZXJJZHMhLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhpcy5qb2luUm9vbVRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IpO1xuICAgICAgICB9LCA2MDAwMCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yb29tID0gcm9vbSBhcyBSQ1JUQ1Jvb207XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9ydGNDbGllbnQuam9pblJUQ1Jvb20gdGhyb3cgZXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS4iuazqOWGjOebkeWQrOS6i+S7tlxuICAgIHRoaXMuX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKTtcblxuICAgIC8vIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgIHRoaXMuX3JlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDorqLpmIXov5znqIvnmoTmtYHvvIzmiorov5znqIvnmoTmtYHmipvnu5nnlKjmiLdcbiAgICAgIGF3YWl0IHRoaXMuX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOe7k+adn+mAmuivnXNlc3Npb25cbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5TVUJTQ1JJQkVfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9qb2luUm9vbV0gX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrIEV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8g5b6A5oi/6Ze06YeM5Y+R5biD5pys5Zyw6LWE5rqQXG4gICAgICBhd2FpdCB0aGlzLl9wdWJsaXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOe7k+adn+mAmuivnXNlc3Npb25cbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5QVUJMSVNIX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9wdWJsaXNoIEV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiAo5Yid5aeL5YyW5oi/6Ze055qE5pe25YCZKSDorqLpmIXov5znqIvnmoTmtYHvvIzmiorov5znqIvnmoTmtYHmipvnu5nnlKjmiLdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrKCkge1xuICAgIC8vIOiOt+WPluaJgOaciei/nOeoi+W3suWPkeW4g+eahOmfs+inhumikei1hOa6kOWIl+ihqFxuICAgIGNvbnN0IHRyYWNrczogUkNSZW1vdGVUcmFja1tdID0gdGhpcy5fcm9vbS5nZXRSZW1vdGVUcmFja3MoKTtcbiAgICBpZiAodHJhY2tzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdWJzY3JpYmVSZXRyeSh0cmFja3MsIHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LCB0aGlzLl9SRVRSWUNPVU5UKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SKTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFja10gUmVzb3VyY2Ugc3Vic2NyaXB0aW9uIGZhaWxlZCByb29tSWQgLT4gJHt0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCl9IFJUQyBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y+v5Lul6YeN6K+V55qE6K6i6ZiFXG4gICAqIEBwYXJhbSBwYXJhbXMudHJhY2tzIHRyYWNrc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSDmmK/lkKblhYHorrjph43or5VcbiAgICogQHBhcmFtIHBhcmFtcy5jb3VudCDlhYHorrjph43or5XnmoTmrKHmlbBcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3N1YnNjcmliZVJldHJ5KHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IGJvb2xlYW4gPSBmYWxzZSwgY291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPHsgY29kZTogUkNSVENDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20uc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1N1YnNjcmliZUZhaWwgJiYgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tTdWJzY3JpYmVGYWlsKGNvZGUsIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uXSBfbGlzdGVuZXIub25UcmFja1N1YnNjcmliZUZhaWwgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzkuI3lhYHorrjph43or5XvvIznm7TmjqXov5Tlm55cbiAgICAgIGlmICghaXNBbGxvd1N1YnNjcmliZVJldHJ5KSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY291bnQtLTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZVJldHJ5KHRyYWNrcywgaXNBbGxvd1N1YnNjcmliZVJldHJ5LCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HluIPmnKzlnLDotYTmupDnmoTpgLvovpFcbiAgICpcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3B1Ymxpc2goKSB7XG4gICAgY29uc3QgdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyE7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9wdWJsaXNoUmV0cnkodHJhY2tzLCB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksIHRoaXMuX1JFVFJZQ09VTlQpO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUFVCTElTSF9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBfcHVibGlzdF0gUmVzb3VyY2UgcHVibGlzaGluZyBmYWlsZWQ6IHJvb21JZCAtPiAke3RoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKX0gUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/kuLvliqjlj5HotbfnmoTlkbzlj6vvvIzlt7Lmj5DliY3mipvlh7rkuobotYTmupAsIOiiq+WKqOWRvOWPq++8jOi/memHjOaJjemcgOimgeaKm+WHulxuICAgIGlmICh0aGlzLl9vcHRpb25zLnByb2R1Y2VUeXBlID09PSBQcm9kdWNlVHlwZXMuQ0FMTEVFKSB7XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYEsIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkodHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y+v5Lul6YeN6K+V55qE5Y+R5biDXG4gICAqIEBwYXJhbSBwYXJhbXMudHJhY2tzIHRyYWNrc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlzQWxsb3dQdWJsaXNoUmV0cnkg5piv5ZCm5YWB6K646YeN6K+VXG4gICAqIEBwYXJhbSBwYXJhbXMuY291bnQg5YWB6K646YeN6K+V55qE5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdWJsaXNoUmV0cnkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSwgaXNBbGxvd1B1Ymxpc2hSZXRyeTogYm9vbGVhbiA9IGZhbHNlLCBjb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8eyBjb2RlOiBSQ1JUQ0NvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1B1Ymxpc2hGYWlsICYmIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUHVibGlzaEZhaWwoY29kZSwgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb25dIF9saXN0ZW5lci5vblRyYWNrUHVibGlzaEZhaWwgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzkuI3lhYHorrjph43or5XvvIznm7TmjqXov5Tlm55cbiAgICAgIGlmICghaXNBbGxvd1B1Ymxpc2hSZXRyeSkge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIHJldHVybiB0aGlzLl9wdWJsaXNoUmV0cnkodHJhY2tzLCBpc0FsbG93UHVibGlzaFJldHJ5LCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2xlYXZlUm9vbSgpIHtcbiAgICB0cnkge1xuICAgICAgLy8g6YCA5Ye65oi/6Ze0XG4gICAgICBjb25zdCBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20odGhpcy5fcm9vbSk7XG4gICAgICAvLyDmiJDlip/pgIDlh7rmiL/pl7TvvIzop6blj5FSQ0NhbGxDbGllbnTlrp7kvovkuIrnmoRvblNlc3Npb25DbG9zZeebkeWQrO+8jOaKm+e7meeUqOaIt+S/oeaBr1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2xlYXZlUm9vbV0gU3VjY2Vzc2Z1bGx5IGV4aXRlZCB0aGUgcm9vbSBjb2RlOiAke2NhbGxCYWNrLmNvZGV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBfbGVhdmVSb29tXSBsZWF2ZVJvb20gdGhyb3cgZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpO1xuICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWHuueOsOW8guW4uOWQjuimgeWkhOeQhueahOmAu+i+kSxcbiAgICogQHBhcmFtIGVuZFJlYXNvbiDljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX2V4Y2VwdGlvbkNsb3NlKGVuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uKSB7XG4gICAgLy8g6ZSA5q+B5pys5Zyw5rWBXG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9kZXN0cm95VHJhY2tzKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpO1xuXG4gICAgLy8g57uT5p2f54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLmNsb3NlKGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog55So5oi36LCD55So55qE77yM5rOo5YaMc2Vzc2lvbuS4iueahOebkeWQrFxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyOiBJU2Vzc2lvbkxpc3RlbmVyKTogdm9pZCB7XG4gICAgLy8g5YWI5qCh6aqMbGlzdGVuZXIsIOWmguaenOS4jemAmui/h++8jOS8mnRyb3cgZXJyb3JcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbFNlc3Npb24gcmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXJdICR7Y29uY2x1c2lvbi5tc2d9YCk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyID0geyAuLi5saXN0ZW5lciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiwg1JUQyBBUEkg6I635b6X5pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDmo4DmtYvmmK/lkKbog73lpJ/ojrflvpfmnKzlnLDmtYFcbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgeyAuLi5jb25zdHJhaW50cy5hdWRpbyB9KTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gc3VjY2Vzc2Z1bGx5IGdldCBBdWRpbyBsb2NhbCB0cmFja3MnKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3M6IFt0cmFjayFdIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUFuZENhbWVyYVRyYWNrcygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgeyAuLi5jb25zdHJhaW50cyB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIGdldCBBdWRpbyBhbmQgVmlkZW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIHN1Y2Nlc3NmdWxseSBnZXQgYXVkaW8gYW5kIHZpZGVvIGxvY2FsIHRyYWNrcycpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2sobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5bm25LiU5piv6I635b6X6Z+z6KeG6aKRLCDlubbkuJQg77yI5aaC5p6c6I635b6X6Z+z6KeG6aKR5LiN5oiQ5Yqf77yM5YWB6K646ZmN57qn6I635b6X6Z+z6aKR77yJXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPLCBjb25zdHJhaW50cyk7XG5cbiAgICAgIC8vIOWmguaenOmfs+inhumikeS4jeiDveiOt+W+l++8jOWwsemZjee6p+iOt+W+l+mfs+mikVxuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGNvbnN0cmFpbnRzKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgLy8g6I635Y+W6LWE5rqQ5aSx6LSl77yM6ZyA6KaB6LCD54q25oCB5py6c3RhdGUg5Li6IGVuZFxuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5HRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SKTtcbiAgICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAvLyDojrflj5botYTmupDlpLHotKXvvIzpnIDopoHosIPnirbmgIHmnLpzdGF0ZSDkuLogZW5kXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUik7XG5cbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3mm7TmjaLpn7PpopHorr7lpIdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VBdWRpb0RldmljZShhdWRpb0NvbnN0cmFpbnRzPzogSU1pY3Bob25lQXVkaW9Qcm9maWxlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgLy8g5paw6K6+5aSH55qEdHJhY2tcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICAvLyDmlbTnkIblkI7nmoTmnKzlnLB0cmFja1xuICAgIGNvbnN0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgYXVkaW9Db25zdHJhaW50cyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gY2hhbmdlRGV2aWNlXSBnZXQgbG9jYWwgQXVkaW8gdHJhY2tzIGZhaWxlZCBSQ1RMaWIgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTpn7PpopHpg73plIDmr4HvvIzvvIhSVENMaWIgU0RL5YaF6YOo5Lya5ZyoIGFkZExvY2FsVHJhY2sg5riF55CG5ZCM57G75Z6L6L2o6YGT5pWw5o2u77yM5omA5Lul6L+Z6YeM5rOo6YeK5o6J77yJXG4gICAgICAgIC8vIHRyYWNrLmRlc3Ryb3koKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q5oqK5LmL5YmN55qE6KeG6aKR55WZ5LiLXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVjZW50VHJhY2tzLnB1c2godHJhY2shKTtcblxuICAgIC8vIOWKoOS4iuacrOWcsOaWsOS6p+eUn+eahOmfs+mikVxuICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzID0gbG9jYWxUcmFja3M7XG4gICAgLy8g6YCa55+l5Lia5Yqh5bGCdHJhY2tSZWFkeVxuICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkocmVjZW50VHJhY2tzKTtcblxuICAgIC8vIOWmguaenOW9k+WJjeW3suWKoOWFpeaIv+mXtO+8jOWPkeW4g+aWsOa1gVxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmlrDmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkFVRElPX1BVQkxJU0hfRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbzlj6vkuK3nu6fnu63pgoDor7dcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRyYSDmtojmga/nmoTmianlsZXkv6Hmga9cbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg5bqf5byDIG9wdGlvbnMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDlup/lvIMgb3B0aW9ucy5wdXNoQ29udGVudCDpgJrnn6XlhoXlrrlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGV4dHJhID0gJycgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJyB9ID0gKHRoaXMuX29wdGlvbnMuY2FsbFB1c2hDb25maWc/LnB1c2hUaXRsZSB8fCB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnPy5wdXNoQ29udGVudCkgPyB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnIDogb3B0aW9ucztcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVXNlcklkcyh1c2VySWRzKSwgdmFsaWRhdGVFeHRyYShleHRyYSksIHZhbGlkYXRlUHVzaFRpdGxlKHB1c2hUaXRsZSksIHZhbGlkYXRlUHVzaENvbnRlbnQocHVzaENvbnRlbnQpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBpbnZpdGVdICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuaW52aXRlKHVzZXJJZHMsIHsgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfSk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQjOaEj+aOpeWQrFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjY2VwdChjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMoY29uc3RyYWludHMhKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF0gJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG5cbiAgICAvLyDmjqXlkKzkuYvliY3vvIzlhYjmjILmlq3lvZPliY3kuYvlpJbnmoRzZXNzaW9u77yM546w6Zi25q615LiN5YWB6K6455So5oi35YWI5oup5o6l5ZCsc2Vzc2lvbu+8jOS6i+WFiOS8muWcqOeKtuaAgeacuuWGhemDqOaMguaWre+8jOi/memHjOaKm+WHuuWOu++8jOS8mua4heeQhuWFtuWug+eahHNlZXNpb25cbiAgICBldmVudEVtaXR0ZXIuZW1pdCgnaHVuZ3VwT3RoZXJTZXNzaW9uJywgeyBzZXNzaW9uOiB0aGlzIH0pO1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IHRyYWNrcztcblxuICAgIC8vIOWPkemAgeaOpeWQrOeahOa2iOaBr1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lLmFjY2VwdCgpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF1TZW5kIGFjY2VwdCBtZXNzYWdlIGZhaWxlZCAtPiBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBodW5ndXAoKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZTsgfT4ge1xuICAgIC8vIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKVxuICAgIC8vIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5odW5ndXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53lqpLkvZPlj5jmm7RcbiAgICogIEBwYXJhbSBtZWRpYVR5cGUgUkNDYWxsTWVkaWFUeXBlLkFVRElPIOaUueS4uumfs+mikemAmuivnSB8IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyDmlLnkuLrpn7Pop4bpopHpgJror51cbiAgICovXG4gIHB1YmxpYyBhc3luYyBfY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2NoYW5nZU1lZGlhVHlwZV0gY2hhbmdlIG1lZGlhIHR5cGUgZmFpbCBjb2RlLT4gJHtjb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKRXG4gICAqL1xuICBwcml2YXRlIF9nZXRMb2NhbFZpZGVvVHJhY2tzKCk6IFJDTG9jYWxUcmFja1tdIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2tzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcykge1xuICAgICAgbG9jYWxWaWRlb1RyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNWaWRlb1RyYWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxWaWRlb1RyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDpn7PpopFcbiAgICovXG4gIHByaXZhdGUgX2dldExvY2FsQXVkaW9UcmFja3MoKTogUkNMb2NhbFRyYWNrW10ge1xuICAgIGxldCBsb2NhbEF1ZGlvdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIGxvY2FsQXVkaW90cmFja3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKSB7XG4gICAgICBsb2NhbEF1ZGlvdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvdHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiumAmuivneeahE1lZGlhVHlwZeWNh+e6p+WIsOmfs+inhumikVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2V0TWVkaWFUeXBlVG9BdWRpb0FuZFZpZGVvKCkge1xuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWPkeW4g+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChbdHJhY2shXSk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoX2NvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2VuYWJsZVZpZGVvXSBSZXNvdXJjZSBwdWJsaXNoaW5nIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG5cbiAgICAvLyDlj5Hmtojmga9cbiAgICB0aGlzLl9jaGFuZ2VNZWRpYVR5cGUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiorpgJror53nmoRNZWRpYVR5cGXpmY3nuqfliLDpn7PpopFcbiAgICogQHBhcmFtIGlzU2VuZE1lc3NzYWdlIOaYr+WQpumcgOimgeWPkea2iOaBrywg6buY6K6k5Y+R5raI5oGvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZXRNZWRpYVR5cGVUb0F1ZGlvKCkge1xuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgaWYgKHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnVucHVibGlzaCh0cmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRoaXMuX2Rlc3Ryb3lUcmFja3ModHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d6ZmN57qn77yM55uu5YmN6ZyA5rGC5Y+q5YGa6YCa6K+d6ZmN57qn77yM6Z+z6KeG6aKR5Y+v5Lul6ZmN57qn5Li66Z+z6aKR77yM6Z+z6aKR5LiN6IO95Y2H5Yiw6Z+z6KeG6aKRLCDlj5Hmtojmga/miJDlip/miY3nrpfpmY3nuqfmiJDlip9cbiAgICpcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXNjZW5kQWJpbGl0eSgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NoYW5nZU1lZGlhVHlwZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8pO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6KeG6aKRdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNhYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9UcmFja10gUm9vbSBtaXNzaW5nIHZpZGVvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOinhumikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5tdXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyDlpoLmnpzkuI3pnIDlhbPpl63mkYTlg4/lpLRcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS51bnB1Ymxpc2godHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuVU5QVUJMSVNIX1ZJREVPX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjop4bpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZVZpZGVvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWmguaenOS4jemcgOWFs+mXreaRhOWDj+WktFxuICAgIGlmICghdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUpIHtcbiAgICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJvb20gbWlzc2luZyB2aWRlbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICAvLyDlkK/nlKjop4bpopFcbiAgICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gR2V0IFJlc291cmNlIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTop4bpopHpg73plIDmr4FcbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q55WZ5LiL5LmL5YmN55qE6Z+z6aKRXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5Yqg5LiK5pys5Zyw5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOS4uuS6huinpuWPkeWvueaWueeahG9uVmlkZW9NdXRlQ2hhbmdlIOWFiOemgeeUqFxuICAgIHRyYWNrIS5tdXRlKCk7XG5cbiAgICAvLyDlj5HluIPmnKznq6/op4bpopHotYTmupBcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2goW3RyYWNrIV0pO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKF9jb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlZJREVPX1BVQkxJU0hfRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlkK/nlKhcbiAgICB0cmFjayEudW5tdXRlKCk7XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCkge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxBdWRpb1RyYWNrcygpO1xuXG4gICAgLy8g56aB55So6Z+z6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZUF1ZGlvVHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk7XG5cbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWQr+eUqOmfs+mikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay51bm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgX2Rlc3Ryb3lUcmFja3ModHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSkge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlUcmFja1JlYWR5KHRyYWNrczogUkNMb2NhbFRyYWNrW10gfCBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjayB8IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUmVhZHkodHJhY2ssIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9ub3RpZnlUcmFja1JlYWR5XSBfbGlzdGVuZXIgb25UcmFja1JlYWR5IGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiL/pl7TkuIrms6jlhozkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5fcm9vbS5yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKFxuICAgICAge1xuICAgICAgICAvKipcbiAgICAgICAgICog5pys56uv6KKr6Lii5Ye65oi/6Ze05pe26Kem5Y+RXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAgICog5Y+m5LiA56eN5Y+v6IO95piv5bex5pa5IHJ0Y1Bpbmcg5aSx6LSl5qyh5pWw6LaF5Ye65LiK6ZmQ77yM5pWF6ICM5Li75Yqo5pat57q/XG4gICAgICAgICAqIEBwYXJhbSBieVNlcnZlclxuICAgICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgICAqIOW9k+WAvOS4uiB0cnVlIOaXtu+8jOivtOaYjuacrOerr+aUtuWIsOiiq+i4ouWHuuaIv+mXtOmAmuefpVxuICAgICAgICAgKi9cbiAgICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVzZXJJZDogc3RyaW5nID0gdGhpcy5fcnRjQ2xpZW50LmdldEN1cnJlbnRJZCgpO1xuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VyTGVhdmUoW2N1cnJlbnRVc2VySWRdKTtcblxuICAgICAgICAgIGlmICghYnlTZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uU0VSVkVSX0tJQ0spIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSykge1xuICAgICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmjqXmlLbliLDmiL/pl7Tkv6Hku6Tml7blm57osIPvvIznlKjmiLflj6/pgJrov4fmiL/pl7Tlrp7kvovnmoQgYHNlbmRNZXNzYWdlKG5hbWUsIGNvbnRlbnQpYCDmjqXlj6Plj5HpgIHkv6Hku6RcbiAgICAgICAgICogQHBhcmFtIG5hbWUg5L+h5Luk5ZCNXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50IOS/oeS7pOWGheWuuVxuICAgICAgICAgKiBAcGFyYW0gc2VuZGVyVXNlcklkIOWPkemAgeiAhSBJZFxuICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZVVJZCDmtojmga/llK/kuIDmoIfor4ZcbiAgICAgICAgICovXG4gICAgICAgIG9uTWVzc2FnZVJlY2VpdmUobmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnksIHNlbmRlclVzZXJJZDogc3RyaW5nLCBtZXNzYWdlVUlkOiBzdHJpbmcpIHtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOebkeWQrOaIv+mXtOWxnuaAp+WPmOabtOmAmuefpVxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gY29udGVudFxuICAgICAgICAgKi9cbiAgICAgICAgb25Sb29tQXR0cmlidXRlQ2hhbmdlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HluIPogIXnpoHnlKgv5ZCv55So6Z+z6aKRXG4gICAgICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrIFJDUmVtb3RlQXVkaW9UcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uQXVkaW9NdXRlQ2hhbmdlOiAoYXVkaW9UcmFjazogUkNSZW1vdGVBdWRpb1RyYWNrKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BdWRpb011dGVDaGFuZ2VdIHVzZXJJZC0+JHthdWRpb1RyYWNrLmdldFVzZXJJZCgpfSBtdXRlZCAtPiAke2F1ZGlvVHJhY2suaXNPd25lck11dGVkKCl9YCk7XG4gICAgICAgICAgY29uc3QgbXV0ZVVzZXI6IElNdXRlVXNlciA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIG11dGVkOiBhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgICAga2luZDogJ2F1ZGlvJyxcbiAgICAgICAgICAgIHRyYWNrSWQ6IGF1ZGlvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uQXVkaW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uQXVkaW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25UcmFja011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWPkeW4g+iAheemgeeUqC/lkK/nlKjop4bpopFcbiAgICAgICAgICogQHBhcmFtIHZpZGVvVHJhY2sgUkNSZW1vdGVWaWRlb1RyYWNrIOexu+WunuS+i+WvueixoVxuICAgICAgICAgKi9cbiAgICAgICAgb25WaWRlb011dGVDaGFuZ2U6ICh2aWRlb1RyYWNrOiBSQ1JlbW90ZVZpZGVvVHJhY2spID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblZpZGVvTXV0ZUNoYW5nZV11c2VySWQtPiR7dmlkZW9UcmFjay5nZXRVc2VySWQoKX0gbXV0ZWQgLT4gJHt2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpfWApO1xuICAgICAgICAgIGNvbnN0IG11dGVVc2VyOiBJTXV0ZVVzZXIgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IHZpZGVvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICAgIGtpbmQ6ICd2aWRlbycsXG4gICAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVmlkZW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uVmlkZW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25WaWRlb011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOWGheWFtuS7lueUqOaIt+aWsOWPkeW4g+i1hOa6kOaXtuinpuWPkVxuICAgICAgICAgKiDlpoLpnIDojrflj5bliqDlhaXmiL/pl7TkuYvliY3miL/pl7TlhoXmn5DkuKrnlKjmiLflj5HluIPnmoTotYTmupDliJfooajvvIzlj6/kvb/nlKggcm9vbS5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCgndXNlcklkJykg6I635Y+WXG4gICAgICAgICAqIEBwYXJhbSB0cmFja3Mg5paw5Y+R5biD55qE6Z+z6L2o5LiO6KeG6L2o5pWw5o2u5YiX6KGo77yM5YyF5ZCr5paw5Y+R5biD55qEIFJDUmVtb3RlQXVkaW9UcmFjayDkuI4gUkNSZW1vdGVWaWRlb1RyYWNrIOWunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1B1Ymxpc2g6IGFzeW5jICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuICAgICAgICAgIC8vIOmAgOWHuuaIv+mXtOWQju+8jOi/mOS8mui1sOWIsOi/me+8n++8n++8jOaJgOS7peWIpOaWreS4gOS4i++8jOayoeaciXJvb23kuI3miafooYzorqLpmIVcbiAgICAgICAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g5oyJ5Lia5Yqh6ZyA5rGC6YCJ5oup6ZyA6KaB6K6i6ZiF6LWE5rqQ77yM6YCa6L+HIHJvb20uc3Vic2NyaWJlIOaOpeWPo+i/m+ihjOiuoumYhVxuICAgICAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnN1YnNjcmliZSh0cmFja3MpO1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBvblRyYWNrUHVibGlzaF0gc3Vic2NyaWJlIGZhaWxlZCBSVENDb2RlIC0+JHtjb2RlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOeUqOaIt+WPlua2iOWPkeW4g+i1hOa6kFxuICAgICAgICAgKiBAcGFyYW0gdHJhY2tzIOiiq+WPlua2iOWPkeW4g+eahOmfs+i9qOS4juinhui9qOaVsOaNruWIl+ihqFxuICAgICAgICAgKiBAZGVzY3JpcHRpb24g5b2T6LWE5rqQ6KKr5Y+W5raI5Y+R5biD5pe277yMU0RLIOWGhemDqOS8muWPlua2iOWvueebuOWFs+i1hOa6kOeahOiuoumYhe+8jOS4muWKoeWxguS7hemcgOWkhOeQhiBVSSDkuJrliqFcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tVbnB1Ymxpc2g6ICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDorqLpmIXnmoTpn7Pop4bpopHmtYHpgJrpgZPlt7Llu7rnq4ssIHRyYWNrIOW3suWPr+S7pei/m+ihjOaSreaUvlxuICAgICAgICAgKiBAcGFyYW0gdHJhY2sgUkNSZW1vdGVUcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tSZWFkeTogKHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuXG4gICAgICAgICAgLy8g5pyJ5pe25a+55pa55rKh5pyJ6ZmN57qn5oiQ5Yqf77yM5omU5oqb6L+H5p2l6KeG6aKR77yM6L+Z5pe255qE6KeG6aKR5LiN5a+55aSW5oqb5Ye6XG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPICYmIHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8g5omn6KGM55So5oi355qEb25UcmFja1JlYWR555uR5ZCsXG4gICAgICAgICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2tdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS6uuWRmOWKoOWFpVxuICAgICAgICAgKiBAcGFyYW0gdXNlcklkcyDliqDlhaXnmoTkurrlkZggaWQg5YiX6KGoXG4gICAgICAgICAqL1xuICAgICAgICBvblVzZXJKb2luOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAvLyDmnInkurrliqDlhaXmuIXpmaTlrprml7blmahcbiAgICAgICAgICBpZiAodGhpcy5qb2luUm9vbVRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLmpvaW5Sb29tVGltZXIuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4odXNlcklkcyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDkurrlkZjpgIDlh7pcbiAgICAgICAgICogQHBhcmFtIHVzZXJJZHNcbiAgICAgICAgICovXG4gICAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJMZWF2ZV0gbGlzdGVuaW5nIG9uVXNlckxlYXZlIHVzZXJJZHMgLT4gJHt1c2VySWRzPy5qb2luKCcsJyl9YCk7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJMZWF2ZSh1c2VySWRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmr4/mrKEgUGluZyDnu5PmnpxcbiAgICAgICAgICovXG4gICAgICAgIG9uUGluZzogKHJlc3VsdDogUkNSVENQaW5nUmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25QaW5nXSR7cmVzdWx0fWApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDpgJrnn6Xnu5nkuJrliqFcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblBpbmcgJiYgdGhpcy5fbGlzdGVuZXIhLm9uUGluZyhyZXN1bHQsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25QaW5nXSBsaXN0ZW5pbmcgb25QaW5nIGV4Y2VwdGlvbicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcigpIHtcbiAgICAvLyDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICB0aGlzLl9yb29tLnJlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDnlKjkuo7mjqXmlLbnirbmgIHmlbDmja7miqXlkYpcbiAgICAgICAqIEBwYXJhbSByZXBvcnRcbiAgICAgICAqL1xuICAgICAgb25TdGF0ZVJlcG9ydDogKHJlcG9ydDogSVJDUlRDU3RhdGVSZXBvcnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydCAmJiB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydChyZXBvcnQsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblN0YXRlUmVwb3J0XSBsaXN0ZW5lciBvblN0YXRlUmVwb3J0IGV4Y2VwdGlvbicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIH5JQ0Ug6L+e5o6l54q25oCB5Y+Y5pu06YCa55+lflxuICAgICAgICogQHNpbmNlIHZlcnNpb24gNS4xLjVcbiAgICAgICAqL1xuICAgICAgb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2U6IChzdGF0ZTogUlRDSWNlQ29ubmVjdGlvblN0YXRlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlICYmIHRoaXMuX2xpc3RlbmVyIS5vbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlXSBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSBleGNlcHRpb24nKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICDojrflj5bmiL/pl7TlvZPliY3kvJror50gSWTvvIzlvZPmiL/pl7TlhoXlt7Lml6DmiJDlkZjml7bmiL/pl7TkvJrlm57mlLbvvIzph43mlrDliqDlhaXml7Ygc2Vzc2lvbklkIOWwhuabtOaWsO+8jCjnlKjmiLflvZXliLbotYTmupDnlKjnmoQpXG4gICAqL1xuICBwdWJsaWMgZ2V0UlRDU2Vzc2lvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb29tID8gdGhpcy5fcm9vbS5nZXRTZXNzaW9uSWQoKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFyZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFRhcmdldElkKCk7XG4gIH1cblxuICAvKipcbiAgICogIOiOt+WPluS8muivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDb252ZXJzYXRpb25UeXBlKCk7XG4gIH1cblxuICAvKipcbiAgICogIOe7hOe7hyBJRFxuICAgKi9cbiAgcHVibGljIGdldENoYW5uZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2hhbm5lbElkKCk7XG4gIH1cblxuICAvKipcbiAgICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVtb3RlVXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gKi9cbiAgcHVibGljIGdldFVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFJlbW90ZVVzZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lq65ZGY54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICBpZiAoIXVzZXJJZCB8fCB0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VySWQgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRVc2VyU3RhdGUodXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZzZXNzaW9u54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogUkNDYWxsU2Vzc2lvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5Lya6K+d5Y+R6LW36ICFaWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpdtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRNZWRpYVR5cGUoKTogUkNDYWxsTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBSVENQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgSVJUQ0pvaW5lZEluZm8sIEVycm9yQ29kZSwgUlRDSm9pblR5cGUsIElMb2dnZXIsIEJhc2ljTG9nZ2VyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ0NhbGxFbmdpbmUsIFJDQ2FsbFN0YXRlTWFjaGluZSwgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsTWVkaWFUeXBlLCBJT2ZmbGluZVJlY29yZCxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ2xpZW50LCBSQ1JUQ0NvZGUsIFJDTG9jYWxUcmFjayB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQge1xuICBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBQcm9kdWNlVHlwZXMgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvbiB9IGZyb20gJy4vUkNDYWxsU2Vzc2lvbic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUxpc3RlbmVyLCB2YWxpZGF0ZVRhcmdldElkLCB2YWxpZGF0ZU1lZGlhVHlwZSwgdmFsaWRhdGVVc2VySWRzLCB2YWxpZGF0ZUV4dHJhLCB2YWxpZGF0ZVB1c2hUaXRsZSwgdmFsaWRhdGVQdXNoQ29udGVudCwgdmFsaWRhdGVQdXNoQ29uZmlnLFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxDbGllbnQge1xuICAvKipcbiAgICogcnRj5a6e5L6LXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydGNDbGllbnQ6IFJDUlRDQ2xpZW50XG5cbiAgLyoqXG4gICAqIGNhbGxFbmdpbmXlsYLlrp7kvotcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZVxuXG4gIC8qKlxuICAgKiDlhbblroPlj4LmlbBcbiAgICovXG4gIHByaXZhdGUgX29wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9uc1xuXG4gIC8qKlxuICAgKiBzZXNzaW9u5YiX6KGoXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uTGlzdDogUkNDYWxsU2Vzc2lvbltdID0gW11cblxuICBwcml2YXRlIF9jYWxsUHVzaENvbmZpZzogSVB1c2hDb25maWcgPSB7fVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hDb25maWc6IElQdXNoQ29uZmlnID17fVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBfb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLl9ydGNDbGllbnQgPSBfb3B0aW9ucy5ydGNDbGllbnQ7XG5cbiAgICB0aGlzLl9vcHRpb25zID0geyAvKipcbiAgICAgICAqIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivle+8jCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+V77yM6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktCwg6buY6K6k5YWz6ZetXG4gICAgICAgKi9cbiAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei++8jOm7mOiupCAgIFJUQ0pvaW5UeXBlLkNPRVhJU1QgPSAyIOS4pOS4quiuvuWkh+WFseWtmFxuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLktJQ0sgPSAwLOi4ouWJjeS4gOS4quiuvuWkh1xuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLlJFRlVTRSA9IDEs5b2T5YmN5Yqg5YWl5ouS57udXG4gICAgICAgKiAgICAgUlRDSm9pblR5cGUuQ09FWElTVCA9IDIg5Lik5Liq6K6+5aSH5YWx5a2YXG4gICAgICAgKi9cbiAgICAgIGpvaW5UeXBlOiBSVENKb2luVHlwZS5DT0VYSVNULFxuXG4gICAgICAvKipcbiAgICAgICAqIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIOivreiogOiuvue9riAo5o6o6YCBKSwg5LiN5Lyg6buY6K6k5Li65Lit5paHXG4gICAgICAgKi9cbiAgICAgIGxhbmc6IFJDQ2FsbExhbmd1YWdlLlpILFxuICAgICAgLi4uX29wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIOWIneWni+WMlmNhbGxFbmdpbmUsIOW5tuebkeWQrG9uSW52aXRlXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwge1xuXG4gICAgICAvKipcbiAgICAgICAqIOebkeWQrOaUtuWIsGludml0ZVxuICAgICAgICovXG4gICAgICBvbkludml0ZTogdGhpcy5fb25JbnZpdGUuYmluZCh0aGlzKSxcblxuICAgICAgLyoqXG4gICAgICAgKiDnm5HlkKznprvnur/mtojmga/miqXlkYpcbiAgICAgICAqL1xuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl9vbk9mZmxpbmVSZWNvcmQuYmluZCh0aGlzKSxcbiAgICB9LCB7XG5cbiAgICAgIC8qKlxuICAgICAgICog6K+t6KiA6K6+572uICjmjqjpgIEpLCDkuI3kvKDpu5jorqTkuLrkuK3mlodcbiAgICAgICAqL1xuICAgICAgbGFuZzogdGhpcy5fb3B0aW9ucy5sYW5nIHx8IFJDQ2FsbExhbmd1YWdlLlpILFxuXG4gICAgfSk7XG5cbiAgICBldmVudEVtaXR0ZXIub24oJ3Nlc3Npb25DbG9zZScsICh7IHNlc3Npb24sIHN1bW1hcnlJbmZvIH0pID0+IHtcbiAgICAgIC8vIOS7jnNlc3Npb25MaXN05Y675o6J6L+Z5Liq5YWz6Zet55qEc2Vzc2lvblxuICAgICAgdGhpcy5fcmVtb3ZlU2Vzc2lvbihzZXNzaW9uKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5vblNlc3Npb25DbG9zZShzZXNzaW9uLCBzdW1tYXJ5SW5mbyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ0NhbGxDbGllbnRdIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOaOpeWQrOS5i+WJjeaMguaWreWFtuWug+eahHNlc3Npb25cbiAgICBldmVudEVtaXR0ZXIub24oJ2h1bmd1cE90aGVyU2Vzc2lvbicsICh7IHNlc3Npb24gfSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBzZXNzaW9uLmdldFNlc3Npb25JZCgpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBodW5ndXBPdGhlclNlc3Npb25dIHNlc3Npb25JZCByZWFkeSB0byBhY2NlcHQgLT4gJHtpZH1gKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBzZXNzaW9uTGlzdCAtPiR7dGhpcy5fc2Vzc2lvbkxpc3QubWFwKChzZXMpID0+IHNlcy5nZXRTZXNzaW9uSWQoKSkuam9pbignLCcpfWApO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgd2hpbGUgKHRoaXMuX3Nlc3Npb25MaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8g5aaC5p6c5LiO6KaB5o6l5ZCs55qEc2Vzc2lvbuS4jeS4gOiHtFxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkxpc3RbaV0uZ2V0U2Vzc2lvbklkKCkgIT09IGlkKSB7XG4gICAgICAgICAgLy8g5oyC5patXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkxpc3RbaV0uaHVuZ3VwKCk7XG5cbiAgICAgICAgICAvLyDmjILmlq3lkI7liKDpmaRcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uTGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g5aaC5p6c5piv6KaB5o6l5ZCs55qEc2Vzc2lvbu+8jOi3s+i/h+i/meS4que0ouW8le+8jOaJgOS7peWKoDFcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBjdXJyZW50IHNlc3Npb25MaXN0IGxlbmd0aCAtPiR7dGhpcy5fc2Vzc2lvbkxpc3QubGVuZ3RofWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOebkeWQrG9uSW52aXRlXG4gICAqL1xuICBwcml2YXRlIF9vbkludml0ZShzdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSwgZXh0cmE/OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9vbkludml0ZV0gUmVjZWl2ZWQgaW52aXRlIG1lc3NhZ2UnKTtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuXG4gICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgIC8vIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivlVxuICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAvKipcbiAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICovXG4gICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAqL1xuICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgLy8g5qCH5piO5piv6KKr5Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRUUsXG5cbiAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICB9KTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9vbkludml0ZV0gUmVjZWl2ZWQgaW52aXRlIG1lc3NhZ2UsIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24nKTtcblxuICAgIC8qKlxuICAgICAqIOWmguaenOmAmuivneeahOaXtuWAmeS4jeWFgeiuuOaOpeWQrOaWsOeahOmAmuivne+8jOebtOaOpeaMguaWre+8jCDov5nkupvlt6XkvZzlnKhjYWxsRW5naW5l6YeM5a6M5oiQXG4gICAgICovXG4gICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDmiafooYznlKjmiLdBUEnnmoTnm5HlkKxcbiAgICAgIHRoaXMuX29wdGlvbnMub25TZXNzaW9uKHNlc3Npb24sIGV4dHJhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25TZXNzaW9uXSBvblNlc3Npb24gZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuXG4gICAgLy8g5b+F6aG75Zyob25TZXNzaW9u6YeM5rOo5YaMc2Vzc2lvbuebkeWQrOS6i+S7tu+8jOi/memHjOajgOa1i+S4gOS4i+acieayoeacieazqOWGjFxuICAgIGlmIChzZXNzaW9uLl9saXN0ZW5lcikge1xuICAgICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUxpc3RlbmVyKHNlc3Npb24uX2xpc3RlbmVyKTtcbiAgICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmNsdXNpb24ubXNnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25TZXNzaW9uXSBzZXNzaW9uIE11c3QgSGF2ZSBMaXN0ZW5lcicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUkNDYWxsU2Vzc2lvbiAgX29wdGlvbnMub25TZXNzaW9uXSBzZXNzaW9uIE11c3QgSGF2ZSBMaXN0ZW5lcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnm5HlkKznprvnur/mtojmga/miqXlkYpcbiAgICogQHBhcmFtIHJlY29yZFxuICAgKi9cbiAgcHVibGljIF9vbk9mZmxpbmVSZWNvcmQocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkge1xuICAgIHRyeSB7XG4gICAgICAvLyDmiafooYznlKjmiLdBUEnnmoTnm5HlkKxcbiAgICAgIHRoaXMuX29wdGlvbnMub25PZmZsaW5lUmVjb3JkICYmIHRoaXMuX29wdGlvbnMub25PZmZsaW5lUmVjb3JkKHJlY29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uT2ZmbGluZVJlY29yZF0gb25PZmZsaW5lUmVjb3JkIGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhoznlKjmiLfkv6Hmga/jgILms6jlhozlkI7vvIzlnKjlj5HotbfpgoDor7fmiJbmjILmlq3nrYnmk43kvZzml7bvvIzkvJrlsIbor6Xkv6Hmga/kuIDlubblj5HpgIHnu5nlr7nnq69cbiAgICogQHBhcmFtIGluZm8ubmFtZSAgICAgICAg55So5oi35ZCN56ewXG4gICAqIEBwYXJhbSBpbmZvLnBvcnRyYWl0VXJpIOeUqOaIt+WktOWDj+S/oeaBr1xuICAgKiBAcGFyYW0gaW5mby5leHRyYSAgICAgICDpooTnlZnmi5PlsZXlrZfmrrVcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclVzZXJJbmZvKGluZm86IHsgbmFtZT86IHN0cmluZzsgcG9ydHJhaXRVcmk/OiBzdHJpbmc7IGV4dHJhPzogc3RyaW5nOyB9ID0ge30pIHtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnJlZ2lzdGVyVXNlckluZm8oaW5mbyk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCByZWdpc3RlclVzZXJJbmZvXSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXIgdXNlciBpbmZvIGRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAqIOi3qEFwcOWNleWRvO+8jFxi5Y+R6YCBaW52aXRl5raI5oGv77yM5Zue6LCD5Zue5p2l5o6l5pS2c3RhdGVNYWNoaW5lLCDlu7pzZXNzaW9uXG4gICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDooqvlkbzlj6vkuIDmlrnnmoTnlKjmiLcgaWQg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyAg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5jb25zdHJhaW50cyDojrflj5bpn7PpopHmiJbpn7Pop4bpopHotYTmupDml7bnmoTlj4LmlbAg5Y+v6YCJXG4gICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICpcbiAgKi9cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q3Jvc3NDYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbGwoe1xuICAgICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LCBiaXRyYXRlLCBpc0Nyb3NzQXBwa2V5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvO+8jFxi5Y+R6YCBaW52aXRl5raI5oGv77yM5Zue6LCD5Zue5p2l5o6l5pS2c3RhdGVNYWNoaW5lLCDlu7pzZXNzaW9uXG4gICAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0SWQg6KKr5ZG85Y+r5LiA5pa555qE55So5oi3IGlkIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLm1lZGlhVHlwZSDpn7PpopHlkbzlj6sgb3Ig6Z+z6KeG6aKR5ZG85Y+rICDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX19jYWxsKHtcbiAgICAgIHRhcmdldElkLCBtZWRpYVR5cGUsIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgYml0cmF0ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19jYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSwgaXNDcm9zc0FwcGtleSA9IGZhbHNlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHsgcHVzaFRpdGxlOiBwdXNoVGl0bGVWYWx1ZSA9ICcnLCBwdXNoQ29udGVudDogcHVzaENvbnRlbnRWYWx1ZSA9ICcnIH0gPSAodGhpcy5fY2FsbFB1c2hDb25maWcucHVzaFRpdGxlIHx8IHRoaXMuX2NhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50KSA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBleHRyYS0+JHtleHRyYX0gcHVzaFRpdGxlLT4ke3B1c2hUaXRsZVZhbHVlfSBwdXNoQ29udGVudC0+JHtwdXNoQ29udGVudFZhbHVlfWApO1xuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0W10gPSBbdmFsaWRhdGVUYXJnZXRJZCh0YXJnZXRJZCksIHZhbGlkYXRlTWVkaWFUeXBlKG1lZGlhVHlwZSksIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKSwgdmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlVmFsdWUpLCB2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50VmFsdWUpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbF0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgbG9jYWxUcmFja3MgPSB0cmFja3MhO1xuXG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOiuvue9rueggeeOh1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpICYmIGJpdHJhdGU/LmF1ZGlvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8uYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpICYmIGJpdHJhdGU/LnZpZGVvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8udmlkZW8/Lm1heCwgYml0cmF0ZT8udmlkZW8/Lm1pbiwgYml0cmF0ZT8udmlkZW8/LnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgICAgbGlzdGVuZXIub25UcmFja1JlYWR5KHRyYWNrKTtcbiAgICB9KTtcblxuICAgIC8vIOiwg+eUqGNhbGxFbmdpbmXnmoRjYWxs6L+U5Zue5LiA5Liq54q25oCB5py655qE5a6e5L6LXG4gICAgY29uc3QgeyBjb2RlLCBzdGF0ZU1hY2hpbmUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FsbChjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoVGl0bGVWYWx1ZSwgcHVzaENvbnRlbnRWYWx1ZSwgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzdGF0ZSBtYWNoaW5lJyk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBsb2NhbFRyYWNrcyxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAgICovXG4gICAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAgIC8vIOagh+aYjuaYr+S4u+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRVIsXG5cbiAgICAgICAgaXNDcm9zc0FwcGtleSxcblxuICAgICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXNzaW9u5LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgICBzZXNzaW9uLnJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbiBvYmplY3QsIHNlc3Npb25JZDogJHtzZXNzaW9uLmdldFNlc3Npb25JZCgpfWApO1xuICAgICAgcmV0dXJuIHsgY29kZSwgc2Vzc2lvbiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBjYWxsIGZhaWxlZCBjb2RlIC0+OiAke2NvZGV9YCk7XG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2subXV0ZSgpO1xuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HotbfnvqTnu4Tlkbzlj6tcbiAgICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDnvqTnu4QgSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcklkcyDooqvlkbzlj6vnmoTnvqTlhoXmiJDlkZggSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBryDlj6/pgIlcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsSW5Hcm91cCh7XG4gICAgdGFyZ2V0SWQsIHVzZXJJZHMsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxJbkdyb3VwUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHsgcHVzaFRpdGxlOiBwdXNoVGl0bGVWYWx1ZSA9ICcnLCBwdXNoQ29udGVudDogcHVzaENvbnRlbnRWYWx1ZSA9ICcnIH0gPSAodGhpcy5fY2FsbFB1c2hDb25maWcucHVzaFRpdGxlIHx8IHRoaXMuX2NhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50KSA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVVc2VySWRzKHVzZXJJZHMpLCB2YWxpZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGUpLCB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSwgdmFsaWRhdGVFeHRyYShleHRyYSksIHZhbGlkYXRlUHVzaFRpdGxlKHB1c2hUaXRsZVZhbHVlKSwgdmFsaWRhdGVQdXNoQ29udGVudChwdXNoQ29udGVudFZhbHVlKV07XG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgbGV0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIGxvY2FsVHJhY2tzID0gdHJhY2tzITtcblxuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDorr7nva7noIHnjodcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSAmJiBiaXRyYXRlPy5hdWRpbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSAmJiBiaXRyYXRlPy52aWRlbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LnZpZGVvPy5tYXgsIGJpdHJhdGU/LnZpZGVvPy5taW4sIGJpdHJhdGU/LnZpZGVvPy5zdGFydCk7XG4gICAgICB9XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICAgIGxpc3RlbmVyLm9uVHJhY2tSZWFkeSh0cmFjayk7XG4gICAgfSk7XG5cbiAgICAvLyDlvoDnu4Tph4zlj5Hmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIHN0YXRlTWFjaGluZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5jYWxsSW5Hcm91cChjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsIGV4dHJhLCBwdXNoVGl0bGVWYWx1ZSwgcHVzaENvbnRlbnRWYWx1ZSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc3RhdGUgbWFjaGluZScpO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBSQ0NhbGxTZXNzaW9uKHN0YXRlTWFjaGluZSwgdGhpcy5fcnRjQ2xpZW50LCB0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgbG9jYWxUcmFja3MsXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K645Y+R5biD6YeN6K+VXG4gICAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSxcblxuICAgICAgICAvKipcbiAgICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0XG4gICAgICAgICAqL1xuICAgICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6LXG4gICAgICAgICAqL1xuICAgICAgICBqb2luVHlwZTogdGhpcy5fb3B0aW9ucy5qb2luVHlwZSxcblxuICAgICAgICAvLyDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgICAvLyDmoIfmmI7mmK/kuLvlj6vkuqfnlJ/nmoRzZXNzaW9uXG4gICAgICAgIHByb2R1Y2VUeXBlOiBQcm9kdWNlVHlwZXMuQ0FMTEVSLFxuXG4gICAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNlc3Npb27kuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICAgIHNlc3Npb24ucmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24gb2JqZWN0LCBzZXNzaW9uSWQ6ICR7c2Vzc2lvbi5nZXRTZXNzaW9uSWQoKX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGUsIHNlc3Npb24gfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gY2FsbEluR3JvdXAgZmFpbGVkIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDnpoHnlKjop4bpopFcbiAgICAgIHRyYWNrLm11dGUoKTtcblxuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6LCDUlRDIEFQSSDojrflvpfmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOajgOa1i+aYr+WQpuiDveWkn+iOt+W+l+acrOWcsOa1gVxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB7IC4uLmNvbnN0cmFpbnRzLmF1ZGlvIH0pO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gc3VjY2Vzc2Z1bGx5IGdldCBBdWRpbyBsb2NhbCB0cmFja3MnKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3M6IFt0cmFjayFdIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUFuZENhbWVyYVRyYWNrcygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgeyAuLi5jb25zdHJhaW50cyB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gZ2V0IEF1ZGlvIGFuZCBWaWRlbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBzdWNjZXNzZnVsbHkgZ2V0IGF1ZGlvIGFuZCB2aWRlbyBsb2NhbCB0cmFja3MnKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOWmguaenOaYr+WFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOW5tuS4lOaYr+iOt+W+l+mfs+inhumikVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTywgY29uc3RyYWludHMpO1xuXG4gICAgICAvLyDlpoLmnpzpn7Pop4bpopHkuI3og73ojrflvpfvvIzlsLHpmY3nu4Tojrflvpfpn7PpopFcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBjb25zdHJhaW50cyk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDku45zZXNzaW9uTGlzdOWIoOmZpOafkOS4qnNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZVNlc3Npb24oc2Vzc2lvbjogUkNDYWxsU2Vzc2lvbikge1xuICAgIGNvbnN0IGlkID0gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKTtcbiAgICB0aGlzLl9zZXNzaW9uTGlzdCA9IHRoaXMuX3Nlc3Npb25MaXN0LmZpbHRlcigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKSAhPT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW3seaWueWFtuS7luerr+WKoOWFpemAmuivne+8iOW3suWKoOWFpSBSVEMg5oi/6Ze077yJ55qE55So5oi35L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Sm9pbmVkUm9vbUluZm8oKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgZGF0YT86IElSVENKb2luZWRJbmZvW10gfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5nZXRSVENKb2luZWRVc2VySW5mbyh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKTtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBnZXRKb2luZWRVc2VySW5mbyBlcnJvciBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUVVFUllfSk9JTkVEX1VTRVJfSU5GT19FUlJPUiB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5ZG85Y+r44CB5oyC5pat5o6o6YCB5pWw5o2uXG4gICAqIEBwYXJhbSBjYWxsUHVzaENvbmZpZyDlkbzlj6vmjqjpgIHphY3nva5cbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnLnB1c2hUaXRsZSDlkbzlj6vmjqjpgIHmoIfpophcbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50IOWRvOWPq+aOqOmAgeWGheWuuVxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZyDmjILmlq3mjqjpgIHphY3nva5cbiAgICogQHBhcmFtIGh1bmd1cFB1c2hDb25maWcucHVzaFRpdGxlIOaMguaWreaOqOmAgeagh+mimFxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZy5wdXNoQ29udGVudCDmjILmlq3mjqjpgIHlhoXlrrlcbiAgICovXG4gIHB1YmxpYyBzZXRQdXNoQ29uZmlnKGNhbGxQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9IHt9LCBodW5ndXBQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgY29uY2x1c2lvbiA9IFtjYWxsUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZ10ubWFwKChwdXNoQ29uZmlnOiBJUHVzaENvbmZpZykgPT4gdmFsaWRhdGVQdXNoQ29uZmlnKHB1c2hDb25maWcpKVswXTtcblxuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwIGNhbGxQdXNoQ29uZmlnIG9yIGh1bmd1cFB1c2hDb25maWddICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbFB1c2hDb25maWcgPSBjYWxsUHVzaENvbmZpZztcbiAgICB0aGlzLl9odW5ndXBQdXNoQ29uZmlnID0gaHVuZ3VwUHVzaENvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSVBsdWdpbkdlbmVyYXRvciwgSVJ1bnRpbWUsIFJUQ1BsdWdpbkNvbnRleHQsIFZlcnNpb25NYW5hZ2UsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbEVycm9yQ29kZSwgUkNDYWxsTGFuZ3VhZ2UsIFJDQ2FsbEVuZFJlYXNvbiwgUkNDYWxsTWVkaWFUeXBlLCBSQ0NhbGxVc2VyU3RhdGUsIFJDQ2FsbFNlc3Npb25TdGF0ZSwgSUVuZFN1bW1hcnksIElJbnZpdGVkVXNlcnMsIElTZW5kZXJJbmZvLCBJT2ZmbGluZVJlY29yZCxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IElSQ1JUQ1N0YXRlUmVwb3J0IH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElSQ0NhbGxJbml0T3B0aW9ucywgSVJDQ2FsbFBhcmFtcywgSVJDQ2FsbEluR3JvdXBQYXJhbXMsIElTZXNzaW9uTGlzdGVuZXIsIElNdXRlVXNlciwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElEZXZpY2VDaGFuZ2VQYXJhbXMsIElWYWxpZGF0aW9uUmVzdWx0LCBJUHVzaENvbmZpZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IFJDQ2FsbENsaWVudCBmcm9tICcuL1JDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uIH0gZnJvbSAnLi9SQ0NhbGxTZXNzaW9uJztcbmltcG9ydCB7IHZhbGlkYXRlQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi92YWxpZGF0aW9uJztcblxuLy8gcGx1Z2luLWNhbGwg54mI5pys5LiK5oqlXG5WZXJzaW9uTWFuYWdlLmFkZCgncGx1Z2luLWNhbGwnLCBfX1ZFUlNJT05fXyk7XG5cbmNvbnN0IGluc3RhbGxlcjogSVBsdWdpbkdlbmVyYXRvcjxSQ0NhbGxDbGllbnQsIElSQ0NhbGxJbml0T3B0aW9ucz4gPSB7XG4gIHRhZzogJ1JDQ2FsbCcsXG4gIHZlcmlmeShydW50aW1lOiBJUnVudGltZSkge1xuICAgIHJldHVybiBydW50aW1lLnRhZyA9PT0gJ2Jyb3dzZXInO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogUkNDYWxsQ2xpZW50IHtcbiAgICAvLyDlhYjmoKHpqozlj4LmlbBcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlQ2FsbEluaXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbExpYiBpbnN0YWxsZXIgc3RldXBdJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG5cbiAgICAvLyDmoKHpqozlvZPliY3lronoo4XnmoQgZW5naW5lIOeJiOacrOaYr+WQpuWPr+eUqFxuICAgIGlmICghVmVyc2lvbk1hbmFnZS52YWxpZEVuZ2luZShfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX18pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbCByZXF1aXJlZCBlbmdpbmUgdmVyc2lvbiBhdCBsZWFzdCAnJHtfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX199Jy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignUkNDYWxsJywgJ1JUQycpO1xuICAgIG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwgJiYgbG9nZ2VyLnNldE91dHB1dExldmVsKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmxvZ0xldmVsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbG9nZ2VyLndhcm4oJ18nLCAnVGhlIFxcJ2xvZ0xldmVsXFwnIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIFxcJ2xvZ091dHB1dExldmVsXFwnIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsQ2xpZW50KGNvbnRleHQsIHJ1bnRpbWUsIGxvZ2dlciwgb3B0aW9ucyk7XG4gIH0sXG59O1xuXG5leHBvcnQge1xuICBpbnN0YWxsZXIsXG4gIFJDQ2FsbENsaWVudCxcbiAgUkNDYWxsU2Vzc2lvbixcbiAgUkNDYWxsTGFuZ3VhZ2UsXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbFVzZXJTdGF0ZSxcbiAgUkNDYWxsU2Vzc2lvblN0YXRlLFxufTtcblxuZXhwb3J0IHR5cGUge1xuICBJRW5kU3VtbWFyeSxcbiAgSVJDQ2FsbEluaXRPcHRpb25zLFxuICBJUkNDYWxsUGFyYW1zLFxuICBJUkNDYWxsSW5Hcm91cFBhcmFtcyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVNlbmRlckluZm8sXG4gIElNdXRlVXNlcixcbiAgSUludml0ZWRVc2VycyxcbiAgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsXG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElPZmZsaW5lUmVjb3JkLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgSVB1c2hDb25maWcsXG59O1xuIl0sIm5hbWVzIjpbInRpbWVyU2V0VGltZW91dCIsImV2ZW50RW1pdHRlciIsIkV2ZW50RW1pdHRlciIsIk1zZ0NhbGxTdGF0dXMiLCJSQ0NhbGxFcnJvckNvZGUiLCJSQ0NhbGxFbmRSZWFzb24iLCJSQ0NhbGxNZXNzYWdlVHlwZSIsIlJDQ2FsbFNlc3Npb25TdGF0ZSIsIlJDQ2FsbFVzZXJTdGF0ZSIsIlJDQ3Jvc3NDYWxsVHlwZSIsIkNvbnZlcnNhdGlvblR5cGUiLCJUaW1lciIsIlJDQ2FsbE1lZGlhVHlwZSIsIk1lbWJlck1vZGlmeVR5cGUiLCJQbGF0Zm9ybSIsIkVycm9yQ29kZSIsIm1lc3NhZ2VUeXBlIiwiUkNDYWxsTGFuZ3VhZ2UiLCJQcm9kdWNlVHlwZXMiLCJSVENKb2luVHlwZSIsIkxvZ0wiLCJSQ1Jlc29sdXRpb24iLCJSQ1JUQ0NvZGUiLCJjb2RlIiwidHJhY2tzIiwidHJhY2siLCJSQ0tpY2tSZWFzb24iLCJzZXNzaW9uIiwiVmVyc2lvbk1hbmFnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUVBLFFBQU0sZUFBZSxDQUFDLFdBQW1CO0FBQ2pDLFVBQUEsUUFBUSxtRUFBbUUsTUFBTSxFQUFFO0FBQ25GLFVBQUEsUUFBUSxNQUFNLFNBQVM7QUFDN0IsUUFBSSxVQUFVLENBQUM7QUFDZixVQUFNLE1BQU0sQ0FBQTtBQUNULE9BQUE7QUFDRCxZQUFNLE1BQU0sVUFBVTtBQUN0QixpQkFBVyxVQUFVLE9BQU87QUFDeEIsVUFBQSxRQUFRLE1BQU0sR0FBRyxDQUFDO0FBQUEsSUFDZixTQUFBO0FBQ0YsV0FBQSxJQUFJLEtBQUssRUFBRTtBQUFBLEVBQ3BCO0FBRUEsUUFBTSxVQUFVLE1BQU0sdUNBQXVDLFFBQVEsU0FBUyxDQUFDLE1BQU07QUFDbkYsVUFBTSxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUs7QUFDL0IsVUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFLLElBQUks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
|
|
3591
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9lbmdpbmUvaGVscGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTXNnQ2FsbFN0YXR1cy50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbENvZGUudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24udHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL1RpbWVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvU3RhdGVNYWNoaW5lLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTWVtYmVyTW9kaWZ5VHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1BsYXRmb3JtLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvT2ZmbGluZVJlY29yZGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvTWVzc2FnZUhhbmRsZXIudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxMYW5nLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2VuLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL3poLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vZW5naW5lL2luZGV4LnRzIiwiLi4vLi4vLi4vc3JjL2VudW1zLnRzIiwiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vLi4vc3JjL2V2ZW50RW1pdHRlci50cyIsIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2hlbHBlci50cyIsIi4uLy4uLy4uL3NyYy90aW1lci50cyIsIi4uLy4uLy4uL3NyYy9SQ0NhbGxTZXNzaW9uLnRzIiwiLi4vLi4vLi4vc3JjL1JDQ2FsbENsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElSdW50aW1lIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcblxuLyoqXG4gKiDnlJ/miJDpmo/mnLogaWQg5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJhbmRvbUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICBsZXQgdXVpZCA9IGdldFVVSUQyMigpO1xuICB1dWlkID0gdXVpZC5yZXBsYWNlKC9cXC8vZywgJzAnKTtcbiAgY29uc3QgaW5mbyA9IFt1dWlkLCBEYXRlLm5vdygpLCByYW5kb21dO1xuICByZXR1cm4gaW5mby5qb2luKCdfJyk7XG59O1xuXG5leHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCB0aW1lckludGVydmFsID0gKGZ1bjogRnVuY3Rpb24sIGl0djogbnVtYmVyKTogbnVtYmVyID0+IHNldEludGVydmFsKGZ1biwgaXR2KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogY2FsbCBkZXZpY2VJZCDlrZjlgqjlnKggc2Vzc2lvblN0b3JhZ2Ug5LitXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDYWxsRGV2aWNlSWQgPSAocnVudGltZTogSVJ1bnRpbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gJ1JDQ2FsbERldmljZUlkJztcbiAgbGV0IHV1aWQgPSBydW50aW1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgaWYgKCF1dWlkKSB7XG4gICAgdXVpZCA9IGdldFVVSUQyMigpO1xuICAgIHJ1bnRpbWUuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHV1aWQpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsIi8qKlxuICog5rOo6YeKXG4gKiBUT0RPXG4gKi9cbmV4cG9ydCBlbnVtIE1zZ0NhbGxTdGF0dXMge1xuICBPVVRHT0lORyA9IDEsIC8vIHdhaXRpbmdcbiAgSU5DT01JTkcsIC8vIHdhaXRpbmdcbiAgUklOR0lORywgLy8gd2FpdGluZ1xuICBDT05ORUNURUQsIC8vIGtlZXBpbmdcbiAgSURMRSwgLy8gZW5kXG4gIEFDQ0VQVEVEIC8vIHdhaXRpbmdcbn1cbiIsIi8qKlxuICog6ZSZ6K+v56CB77yM5LiO56e75Yqo56uv5a+56b2QXG4gKiBAZGVzY3JpcHRpb25cbiAqIDEuIGA1MTAwMCAtIDUxOTk5YCDkuLogQW5kcm9pZCDkuJPnlKjmrrVcbiAqIDIuIGA1MjAwMCAtIDUyOTk5YCDkuLogaU9TIOS4k+eUqOautVxuICogMy4gYDUzMDAwIC0gNTMxOTlgIOS4uiBXZWIgUlRDIOS4k+eUqOautVxuICogNC4gYDUzMjAwIC0gNTM0OTlgIOS4uiBXZWIgQ2FsbExpYiDkuJPnlKjmrrVcbiAqICogIGA1MzIwMCAtIDUzMjk5YCDkuLogV2ViIENhbGxFbmdpbmUg5LiT55So56uvXG4gKiAqICBgNTMzMDAgLSA1MzQ5OWAg5Li6IFdlYiBDYWxsIOS4k+eUqOerr1xuICogNS4gYDUzNTAwIC0gNTM5OTlgIOS4uiBXZWIg5L+d55WZ5q61XG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbEVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1MgPSAxMDAwMCxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahOeKtuaAgeaculxuICAgKi9cbiAgU1RBVEVfTUFDSElORV9FWElUID0gNTMyMDAsXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGv5aSx6LSlXG4gICAqL1xuICBTRU5EX01TR19FUlJPUiA9IDUzMjAxLFxuICAvKipcbiAgICog6KKr5a+55pa55Yqg5YWl6buR5ZCN5Y2VXG4gICAqL1xuICBSRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPSA1MzIwMixcbiAgLyoqXG4gICAqIOW9k+WJjeeUqOaIt+S4jeWGjee+pOe7hOS4rVxuICAgKi9cbiAgTk9UX0lOX0dST1VQID0gNTMyMDMsXG5cbiAgLyoqXG4gICAqIENhbGwg55u45YWzXG4gICAqL1xuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgPSA1MzMwMSxcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgPSA1MzMwMixcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDMsXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUk9SID0gNTMzMDQsXG5cbiAgLyoqXG4gICAqIOWPkeW4g+mfs+mikeWksei0pVxuICAgKi9cbiAgQVVESU9fUFVCTElTSF9FUlJPUiA9IDUzMzA1LFxuXG4gIC8qKlxuICAgKiDlj5HluIPop4bpopHlpLHotKVcbiAgICovXG4gIFZJREVPX1BVQkxJU0hfRVJST1IgPSA1MzMwNixcblxuICAvKipcbiAgICog5Y+R5biD6Z+z6KeG6aKR5aSx6LSlXG4gICAqL1xuICBBVURJT19BTkRfVklERU9fUFVCTElTSF9FUlJPUiA9IDUzMzA3LFxuXG4gIC8qKlxuICAgKiDmn6Xor6LmiL/pl7TnlKjmiLfkv6Hmga/lpLHotKVcbiAgICovXG4gIFFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgPSA1MzMwOCxcblxuICAvKipcbiAgICog56aB55So5ZCv55So6KeG6aKR5pe277yM5oi/6Ze05YaF57y65bCR6KeG6aKR5rWBXG4gICAqL1xuICBNSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDksXG5cbiAgLyoqXG4gICAqIOWPlua2iOWPkeW4g+inhumikeWksei0pVxuICAgKi9cbiAgVU5QVUJMSVNIX1ZJREVPX0VSUk9SID0gNTMzMTAsXG5cbiAgLyoqXG4gICAqIOS8muivneS4jeaYr+e+pOe7hFxuICAgKi9cbiAgQ09OVkVSU0FUSU9OX05PVF9HUk9VUF9FUlJPUiA9IDUzMzExLFxuXG4gIC8qKlxuICAqIOS4jeWcqHJvb23kuK3npoHnlKjpn7Pop4bpopFcbiAgKi9cbiAgTk9UX0lOX1JPT01fRVJST1IgPSA1MzMxMlxuXG59XG4iLCIvKipcbiAqIOaMguaWreWOn+WboFxuICogQGRlc2NyaXB0aW9uXG4gKiDmoLnmja7ljp/mnIkgSGFuZ3VwUmVhc29uIOiuvuiuoe+8jOW3seaWueWOn+WboOS4juWvueaWueWOn+WboOacieebuOW3riAxMCDnmoTlt67ot50uXG4gKiDnjrDmnInmnKzlnLDljp/lm6Dlj5blgLzojIPlm7Q6IDEgfiAxMCwg6L+c56uv5Y6f5Zug5Y+W5YC86IyD5Zu0OiAxMSB+IDIwLlxuICog5Li65L6/5LqOIEhhbmd1cFJlYXNvbiDmianlsZXvvIzkv53nlZkgMTAwIOS7peWGheeahOWPluWAvC5cbiAqIOmcgOimgeWGjeasoeaJqeWxleaXtu+8jOW3seaWueWOn+WboOS9v+eUqDogMjEgfiAzMCwg5a+55bqU5a+55pa55Y6f5Zug5L2/55SoOiAzMSB+IDQwLFxuICog5Lul5q2k57G75o6o77yMXG4gKiDlt7Hmlrnljp/lm6Dkvb/nlKg6IDQxIH4gNTAsIOWvueaWueWOn+WboOS9v+eUqDogNTEgfiA2MCxcbiAqIOW3seaWueWOn+WboOS9v+eUqDogNjEgfiA3MCwg5a+55pa55Y6f5Zug5L2/55SoOiA3MSB+IDgwLFxuICog5bex5pa55Y6f5Zug5L2/55SoOiA3MSB+IDkwLCDlr7nmlrnljp/lm6Dkvb/nlKg6IDkxIH4gMTAwLlxuICpcbiAqIOWQhOW5s+WPsOeLrOacieWtl+auteiMg+WbtFxuICogQW5kcm9pZCAyMDEgfiAyOTlcbiAqIGlPUyAgICAgMzAxIH4gMzk5XG4gKiBXZWIgICAgIDQwMSB+IDQ5OVxuICog6K+m57uG5paH5qGj77yaaHR0cHM6Ly9naXRib29rLnJvbmdjbG91ZC5uZXQvcnRjLWRvY3MvIy9ydGMtY2xpZW50L2lvcy9hbmFseXNpcy9jYWxsbGliL0hhbmd1cFJlYXNvblxuICovXG5leHBvcnQgZW51bSBSQ0NhbGxFbmRSZWFzb24ge1xuICAvKipcbiAgICog5bex5pa55Y+W5raI5bey5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBDQU5DRUwgPSAxLFxuICAvKipcbiAgICog5bex5pa55ouS57ud5pS25Yiw55qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRUpFQ1QgPSAyLFxuICAvKipcbiAgICog5bex5pa55oyC5patXG4gICAqL1xuICBIQU5HVVAgPSAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KMXG4gICAqL1xuICBCVVNZX0xJTkUgPSA0LFxuICAvKipcbiAgICog5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBOT19SRVNQT05TRSA9IDUsXG4gIC8qKlxuICAgKiDlt7HmlrnkuI3mlK/mjIHlvZPliY3pn7Pop4bpopHlvJXmk45cbiAgICovXG4gIEVOR0lORV9VTlNVUFBPUlRFRCA9IDYsXG4gIC8qKlxuICAgKiDlt7HmlrnnvZHnu5zplJnor69cbiAgICovXG4gIE5FVFdPUktfRVJST1IgPSA3LFxuICAvKipcbiAgICog5bex5pa55pGE5YOP5aS06LWE5rqQ6I635Y+W5aSx6LSl77yM5Y+v6IO95piv5p2D6ZmQ5Y6f5ZugXG4gICAqL1xuICBHRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SID0gOCxcbiAgLyoqXG4gICAqIOW3seaWuei1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUFVCTElTSF9FUlJPUiA9IDksXG4gIC8qKlxuICAgKiDlt7HmlrnorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlJPUiA9IDEwLFxuICAvKipcbiAgICog5a+55pa55Y+W5raI5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRU1PVEVfQ0FOQ0VMID0gMTEsXG4gIC8qKlxuICAgKiDlr7nmlrnmi5Lnu53mlLbliLDnmoTpgJror53or7fmsYJcbiAgICovXG4gIFJFTU9URV9SRUpFQ1QgPSAxMixcbiAgLyoqXG4gICAqIOmAmuivnei/h+eoi+S4reWvueaWueaMguaWrVxuICAgKi9cbiAgUkVNT1RFX0hBTkdVUCA9IDEzLFxuICAvKipcbiAgICog5a+55pa55b+Z56KMXG4gICAqL1xuICBSRU1PVEVfQlVTWV9MSU5FID0gMTQsXG4gIC8qKlxuICAgKiDlr7nmlrnmnKrmjqXlkKxcbiAgICovXG4gIFJFTU9URV9OT19SRVNQT05TRSA9IDE1LFxuICAvKipcbiAgICog5a+55pa55byV5pOO5LiN5pSv5oyBXG4gICAqL1xuICBSRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVEID0gMTYsXG4gIC8qKlxuICAgKiDlr7nmlrnnvZHnu5zplJnor69cbiAgICovXG4gIFJFTU9URV9ORVRXT1JLX0VSUk9SID0gMTcsXG4gIC8qKlxuICAgKiDlr7nmlrnmkYTlg4/lpLTotYTmupDojrflj5blpLHotKXvvIzlj6/og73mmK/mnYPpmZDljp/lm6BcbiAgICovXG4gIFJFTU9URV9HRVRfTUVESUFfUkVTT1VSQ0VfRVJST1IgPSAxOCxcbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxOSxcbiAgLyoqXG4gICAqIOi/nOerr+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDIwLFxuICAvKipcbiAgICog5bex5pa55YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwgPSAyMSxcbiAgLyoqXG4gICAqIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX0NBTEwgPSAyMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDIzLFxuICAvKipcbiAgICog5bex5pa55o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIEFDQ0VQVF9TWVNURU1fQ0FMTCA9IDI0LFxuICAvKipcbiAgICog6L+c56uv5YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMID0gMzEsXG4gIC8qKlxuICAgKiDov5znq6/lhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfSU5fQ0FMTCA9IDMyLFxuICAvKipcbiAgICog6L+c56uv6KKr56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDMzLFxuICAvKipcbiAgICog6L+c56uv5o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIFJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwgPSAzNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aOpeWQrFxuICAgKi9cbiAgQUNDRVBUX0JZX09USEVSX0NMSUVOVCA9IDEwMSxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aMguaWrVxuICAgKi9cbiAgSEFOR1VQX0JZX09USEVSX0NMSUVOVCA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+WvueaWueWKoOWFpem7keWQjeWNlVxuICAgKi9cbiAgQURERURfVE9fQkxBQ0tMSVNUID0gMTAzLFxuICAvKipcbiAgICog6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAqL1xuICBTRVJWSUNFX05PVF9PUEVORUQgPSAxMDRcbn1cblxuLyoqXG4gKiDlt7Hmlrnljp/lm6DovazkuLrlr7nmlrnljp/lm6BcbiAqL1xuZXhwb3J0IGNvbnN0IENhbGxSZW1vdGVFbmRSZWFzb246IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRW5kUmVhc29uIH0gPSB7XG4gIFtSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVKRUNUXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9SRUpFQ1QsXG4gIFtSQ0NhbGxFbmRSZWFzb24uSEFOR1VQXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gIFtSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9CVVNZX0xJTkUsXG4gIFtSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0VdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkVOR0lORV9VTlNVUFBPUlRFRF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVELFxuICBbUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUl06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfR0VUX01FRElBX1JFU09VUkNFX0VSUk9SLFxuICBbUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX1BVQkxJU0hfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9TVUJTQ1JJQkVfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTExdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9JTl9DQUxMLFxuICBbUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVJdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFXTogUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbE1lc3NhZ2VUeXBlIHtcbiAgLyoqXG4gICAqIOmCgOivt+a2iOaBr1xuICAgKi9cbiAgVkNJbnZpdGUgPSAnUkM6VkNJbnZpdGUnLFxuICAvKipcbiAgICog5ZON6ZOD5raI5oGvXG4gICAqL1xuICBWQ1JpbmdpbmcgPSAnUkM6VkNSaW5naW5nJyxcbiAgLyoqXG4gICAqIOaOpeWQrOa2iOaBr1xuICAgKi9cbiAgVkNBY2NlcHQgPSAnUkM6VkNBY2NlcHQnLFxuICAvKipcbiAgICog5oyC5pat5raI5oGvXG4gICAqL1xuICBWQ0hhbmd1cCA9ICdSQzpWQ0hhbmd1cCcsXG4gIC8qKlxuICAgKiDnvqTlkbzkuK0g5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBWQ01vZGlmeU1lbSA9ICdSQzpWQ01vZGlmeU1lbScsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovkv67mlLnmtojmga9cbiAgICovXG4gIFZDTW9kaWZ5TWVkaWEgPSAnUkM6VkNNb2RpZnlNZWRpYScsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAvKipcbiAgICog562J5b6F5bu656uL6L+e5o6lXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog5Lya6K+d57u05oyB5LitXG4gICAqL1xuICBLRUVQSU5HLFxuICAvKipcbiAgICog5Lya6K+d5bey57uT5p2fXG4gICAqL1xuICBFTkRcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiDnlKjmiLfkuI3lrZjlnKjkuo7pgJror53kuK1cbiAgICovXG4gIE5PTkUgPSAwLFxuICAvKipcbiAgICog562J5b6F5o6l5ZCsXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBLRUVQSU5HLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDcm9zc0NhbGxUeXBlIHtcbiAgLyohXG4gIOWQjEFwcOmAmuivnVxuICAqL1xuICBSQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwgPSAwLFxuICAvKiFcbiAg6LeoQXBw6YCa6K+dXG4gICovXG4gIFJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA9IDdcbn1cbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgTXNnQ2FsbFN0YXR1cyB9IGZyb20gJy4vZW51bXMvTXNnQ2FsbFN0YXR1cyc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7XG4gIElFeGlzdGVkVXNlclBvZmlsZXMsIElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsIElSaW5naW5nTXNnQ29udGVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVVzZXJEYXRhLCBJVXNlclByb2ZpbGUsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi9UaW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxTdGF0ZU1hY2hpbmUge1xuICAvKipcbiAgICog5oi/6Ze054q25oCBXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uU3RhdGU6IFJDQ2FsbFNlc3Npb25TdGF0ZSB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOeUqOaIt+eKtuaAgeWPiuS/oeaBr1xuICAgKi9cbiAgcHJpdmF0ZSBfdXNlckluZm86IHsgW3VzZXJJZDogc3RyaW5nXTogSVVzZXJEYXRhIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDnlKjmiLforqHml7blmajmmKDlsIRcbiAgICovXG4gIHByaXZhdGUgX3VzZXJUaW1lcnM6IHsgW3VzZXJJZDogc3RyaW5nXTogVGltZXIgfSA9IHt9XG5cbiAgLyoqXG4gICAqIOebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfd2F0Y2hlcnMhOiBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzXG5cbiAgLyoqXG4gICAqIOWRvOWPq+i2heaXtuaXtumXtCAo5Y2V5L2N77ya5q+r56eSKVxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFRpbWVvdXQ6IG51bWJlciA9IDYwICogMTAwMFxuXG4gIC8qKlxuICAgKiDpgJror53lu7rnq4vlvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+aXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24gfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDkuLvlj6sgSURcbiAgICog5Y+R6LW36YKA6K+35Li65b2T5YmN55So5oi3IElEXG4gICAqIOaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWRcbiAgICog5pS25Yiw5Lq65ZGY5Y+Y5pu06YKA6K+35Li65raI5oGv5L2T5LitIGNhbGxlcklkXG4gICAqL1xuICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5b2T5qyh6YCa6K+d6YKA6K+36ICFIElEXG4gICAqIOWPkei1t+mCgOivt+S4uuW9k+WJjeeUqOaItyBJROOAgeaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWTjgIHmlLbliLDkurrlkZjlj5jmm7TpgoDor7fkuLrmtojmga/kvZPkuK0gc2VuZGVyVXNlcklkXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOaYr+WQpuaYr+i3qCBhcHBrZXlcbiAgICovXG4gIHByaXZhdGUgX2lzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hUaXRsZTogc3RyaW5nID0gJydcblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29udGVudDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsTXNnSGFuZGxlcjogQ2FsbE1lc3NhZ2VIYW5kbGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5uZWxJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvblJpbmdpbmcnLCB0aGlzLl9vblJpbmdpbmcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkFjY2VwdCcsIHRoaXMuX29uQWNjZXB0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkLCAnb25NZWRpYU1vZGlmeScsIHRoaXMuX29uTWVkaWFNb2RpZnkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkh1bmd1cCcsIHRoaXMuX29uSHVuZ3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluagoeato+WQjui2heaXtuaXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VGltZW91dChzZW50VGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICBpZiAoZGVsYXlUaW1lIDwgMCkge1xuICAgICAgZGVsYXlUaW1lID0gNTAwOyAvLyDlgYforr7lu7bov5/ml7bpl7TkuLogNTAwIG1zXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9jYWxsVGltZW91dCAtIGRlbGF5VGltZTtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBfZ2V0VGltZW91dCAtPiB0aW1lb3V0OiAke3RpbWVvdXR9YCk7XG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVyQnlJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBiZWZvcmUgX2NsZWFyVGltZXJCeUlkICAtPiB1c2VySWQ6ICR7dXNlcklkfSB1c2VyVGltZXJzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3VzZXJUaW1lcnMpfWApO1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXS5zdG9wKCk7XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdO1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWZ0ZXIgX2NsZWFyVGltZXJCeUlkIC0+IHVzZXJUaW1lcnM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fdXNlclRpbWVycyl9YCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlTdGF0ZUNoYW5nZShzdGF0ZTogUkNDYWxsU2Vzc2lvblN0YXRlLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlTdGF0ZUNoYW5nZSAtPiBpbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIHN0YXRlLCByZWFzb24sXG4gICAgfSl9YCk7XG5cbiAgICB0aGlzLl9lbmRSZWFzb24gPSByZWFzb24gfHwgbnVsbDtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl93YXRjaGVycz8ub25TdGF0ZUNoYW5nZSh7IHN0YXRlLCByZWFzb24gfSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgLy8g5b2T54q25oCB5py657uT5p2f5pe277yM6ZyA5ZyoIENhbGxFbmdpbmUg5riF6ZmkXG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnb25TdGF0ZU1hY2hpbmVDbG9zZScsIHRoaXMuX2NhbGxJZCk7XG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci51bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlcjogSVVzZXJEYXRhLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlVc2VyU3RhdGVDaGFuZ2UgLT4gaW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VyLCByZWFzb24sXG4gICAgfSl9YCk7XG4gICAgdGhpcy5fd2F0Y2hlcnM/Lm9uVXNlclN0YXRlQ2hhbmdlKHsgdXNlciwgcmVhc29uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3RoZXJDbGllbnRIYW5kbGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCByZWFzb246IGh1bmd1cFJlYXNvbiB9LCBtZXNzYWdlVHlwZSB9ID0gbWVzc2FnZTtcbiAgICB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdID0ge1xuICAgICAgdXNlcklkOiBzZW5kZXJVc2VySWQsXG4gICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICBpc1JlbW90ZTogZmFsc2UsXG4gICAgfTtcbiAgICAvLyDlpJrnq6/mjqXlkKzjgIHlpJrnq6/mi5Lnu53vvIzmuIXpmaTmlLbliLDpgoDor7flkI7otbfnmoTorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICAvLyDlhbbku5bnq6/mjqXlkKxcbiAgICBsZXQgZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9CWV9PVEhFUl9DTElFTlQ7XG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSkge1xuICAgICAgICBlbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEw7XG4gICAgICB9IGVsc2UgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFKSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5OT19SRVNQT05TRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVBfQllfT1RIRVJfQ0xJRU5UO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDmt7vliqDnlKjmiLfnroDopoHkv6Hmga9cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBlbmRSZWFzb24pO1xuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5Lit77yM5LiU5LiN5piv5b2T5YmN5bey5o6l6YCa55So5oi36K6+5aSH77yIZGV2aWNlSWTvvInlj5HmnaXnmoTmtojmga9cbiAgKi9cbiAgcHJpdmF0ZSBfaXNSZW1vdGVJbnZhbGlkTXNnKHJlbW90ZVVzZXJJZDogc3RyaW5nLCBtc2dEZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdLmRldmljZUlkIHx8ICFtc2dEZXZpY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcgJiYgdGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5kZXZpY2VJZCAhPT0gbXNnRGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vblJpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiBzdWlkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCB9IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBvblJpbmdpbmcgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICByZXR1cm47IC8vIOWkmuerr+WkhOeQhlxuICAgIH1cbiAgICB0aGlzLl93YXRjaGVycy5vblJpbmdpbmcoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudDogeyB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQ6IHNlbmRlckRldmljZUlkIH0sIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBzZW5kZXJEZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25BY2NlcHQgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHRoaXMuX290aGVyQ2xpZW50SGFuZGxlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOe+pOe7hOmAmuivneaXtu+8miBB44CBQiDpgJror50gQemCgOivt0MsIEPlkIzmhI/mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahOiuoeaXtuWZqO+8jOaJgOS7pei/memHjOWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoc2VuZGVyVXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBjb25zdCBpZHMgPSAodGhpcy5fY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSA/IFtjdXJyZW50VXNlcklkLCBzZW5kZXJVc2VySWRdIDogW3NlbmRlclVzZXJJZF07XG4gICAgaWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgaXNDdXJyZW50VXNlcklkID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLktFRVBJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGRldmljZUlkOiBpc0N1cnJlbnRVc2VySWQgPyBnZXRDYWxsRGV2aWNlSWQodGhpcy5fcnVudGltZSkgOiBzZW5kZXJEZXZpY2VJZCxcbiAgICAgIH07XG4gICAgICBpZiAoIWlzQ3VycmVudFVzZXJJZCkge1xuICAgICAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldENhbGxlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICB9XG4gICAgLy8g5oqb5Ye6b25BY2NlcHTml7bnirbmgIHlt7Lnu4/lsLHnu6pcbiAgICB0aGlzLl93YXRjaGVycy5vbkFjY2VwdCh7IHVzZXJJZDogc2VuZGVyVXNlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgbWVkaWFUeXBlLCB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICBpZiAodGhpcy5faXNSZW1vdGVJbnZhbGlkTXNnKHNlbmRlclVzZXJJZCwgZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gX29uTWVkaWFNb2RpZnkgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOabtOaWsCBtZWRpYVR5cGVcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fd2F0Y2hlcnMub25NZWRpYU1vZGlmeSh7XG4gICAgICBzZW5kZXI6IHsgdXNlcklkOiBzZW5kZXJVc2VySWQsIC4uLjxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCBzZW5kZXJVc2VySWQgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gc3VpZC5zcGxpdCgnXycpWzFdIDogc3VpZDtcbiAgICBjb25zdCB7IHJlYXNvbiwgdXNlcjogdXNlclByb2ZpbGUsIGRldmljZUlkIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25IdW5ndXAgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhiDmipvlh7rlpJrnq6/lt7LlpITnkIYgcmVhc29uXG4gICAgICB0aGlzLl9vdGhlckNsaWVudEhhbmRsZShtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAvLyDlpoLmnpzlt7HmlrnmiL/pl7TnirbmgIHlt7Lnu5PmnZ/vvIzlho3mlLbliLAgaHVuZ3VwIOa2iOaBr+S4jeWGjeWkhOeQhlxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gSW52YWxpZCBoYW5nIHVwIG1lc3NhZ2UsIGN1cnJlbnQgcm9vbSBzdGF0dXMgaGFzIGVuZGVkIC0+IHNlc3Npb25TdGF0ZTogJHt0aGlzLl9zZXNzaW9uU3RhdGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOS/ruaUueWGheWtmOaAgeaVsOaNruW5tumAmuefpVxuICAgICAgdGhpcy5fdXNlckluZm9bc2VuZGVyVXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCA8SVVzZXJQcm9maWxlPnVzZXJQcm9maWxlKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF07XG4gICAgfVxuXG4gICAgLy8gdGltZXIg5riF6ZmkXG4gICAgaWYgKENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXSA9PT0gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwpIHtcbiAgICAgIC8vIOi/nOerr+WPlua2iOmAmuivne+8jOayoeaciei/nOerr+eUqOaIt++8jOa4hemZpOW3seerr+eahOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoIDwgMSAmJiB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SW52aXRlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIC8vIOi/nOerr+aLkue7neOAgeW/meeijOOAgeacquaOpeWQrOetie+8jOmAmui/h+iHquW3seaYr+WQpuaYr+S4u+WPq+adpeWIpOaWreimgea4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqCDmiJYg5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChzZW5kZXJVc2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPCAxICYmIHRoaXMuX2NsZWFyVGltZXJCeUlkKGN1cnJlbnRVc2VySWQpO1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgIGNvbnN0IGlzTGVzc1RoYW5Ud28gPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMjtcbiAgICAvLyDnvqTlkbzkuK3pgoDor7fogIXmjILmlq3vvIjpnZ7lkbzlj6vlj5HotbfogIXvvInkuJTmiL/pl7TkuK3ooqvpgoDor7fogIXpg73mnKrmjqXlkKzvvIzpgJrnn6XmiL/pl7TnirbmgIHnu5PmnZ9cbiAgICBjb25zdCBpc0ludml0ZVVzZXIgPSB0aGlzLl9pbnZpdGVySWQgPT09IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCBpc05vT25lQW5zd2VyZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3VzZXJJbmZvKS5ldmVyeSgodXNlcikgPT4gdXNlci5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgIGlmIChpc0xlc3NUaGFuVHdvIHx8IChpc0ludml0ZVVzZXIgJiYgaXNOb09uZUFuc3dlcmVkKSkge1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7ogb25IdW5ndXAg5pe254q25oCB5bey57uP5bCx57uqXG4gICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9LCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tuebkeWQrFxuICAgKiBAcGFyYW1zIHdhdGNoZXJzXG4gICAqL1xuICByZWdpc3RlckV2ZW50TGlzdGVuZXIod2F0Y2hlcnM6IElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMpIHtcbiAgICB0aGlzLl93YXRjaGVycyA9IHdhdGNoZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBpbnZpdGUg5raI5oGv5pe254q25oCB5py65pu05paw77yIQ2FsbEVuZ2luZSDlhoXpg6josIPnlKjvvIlcbiAgICogQHBhcmFtIG1lc3NhZ2Ug5o6l5pS25raI5oGvXG4gICAqL1xuICBfX29uSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCwgc2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlVXNlcklkczogaW5pZHMsIHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCwgcm9vbVR5cGUsXG4gICAgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgLy8g5aSE55CG6LeoIGFwcGtleSDpgoDor7cgc2VuZGVyVXNlcklkIOW4puaciSBhcHBrZXkg5LiO5pys5ZywIGN1cnJlbnRVc2VySWQg5Yy56YWN6Zeu6aKYXG4gICAgLy8g5ZCM5pe26K6w5b2V5pys5Zyw5piv5ZCm5Li66LeoIGFwcGtleSDnirbmgIFcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlID09PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuY3Jvc3NBcHBrZXkodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZGVyVXNlcklkID0gc3VpZDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5q2j5Zyo6YCa6K+d5Lit77yM6L+c56uv5aSa56uv5Y+R55qE5raI5oGv55u05o6l6L+H5rukXG4gICAgaWYgKHRoaXMuX2lzUmVtb3RlSW52YWxpZE1zZyhzZW5kZXJVc2VySWQsIGRldmljZUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIF9fb25JbnZpdGUgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCB1c2VySWRMaXN0ID0gW3N1aWQsIC4uLmluaWRzXTtcbiAgICAvLyDmlLbliLDpgoDor7flkI7vvIzlhoXpg6jlm57lupTlk43pk4Pmtojmga8sIHVzZXJJZHMg5Lyg6Zmk6Ieq5bex55qE5omA5pyJ5Lq6XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB1c2VySWRzOiB1c2VySWRMaXN0LmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gaWQuc3BsaXQoJ18nKVsxXSAhPT0gY3VycmVudFVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludml0ZVVzZXJJZHMgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gW2luaWRzWzBdLnNwbGl0KCdfJylbMV1dIDogaW5pZHM7XG5cbiAgICAvLyDlkIzmraXmnKzlnLDnlKjmiLfliJfooajpnIDopoHkvb/nlKjmi4bliIblkI7nmoQgVXNlcklkIOS/neivgeacrOWcsOWFtuS7luaWueazleWMuemFjSB1c2VyaWRcbiAgICBjb25zdCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBhbGxVc2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiB1c2VySWQgPT09IHNlbmRlclVzZXJJZCxcbiAgICAgICAgaXNSZW1vdGU6IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCxcbiAgICAgIH07XG4gICAgICBpZiAodXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGv5Y+KIGRldmljZUlkXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOe7meaJgOacieiiq+mCgOivt+S6uuWQr+WKqOaOpeWQrOiuoeaXtuWZqFxuICAgICAgaWYgKHVzZXJJZCAhPT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkID8gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7IC8vIOe+pOiBiuS4reW3seaWuei2heaXtuaXoOmcgOWPkeaMguaWrea2iOaBr++8jOWPqumcgOS/ruaUueS6uuWRmOOAgemAmuivneaMguaWreeKtuaAgVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbiwgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIOWFtuS7luS6uuWRmOi2heaXtuWPqumAmuefpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICog6LaF5pe25ZCO77yM5bqU5riF6Zmk5ZCv5Yqo55qE6LaF5pe25a6a5pe25ZmoXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+mXtOeKtuaAgemAmuefpVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5XQUlUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgbWVtYmVyTW9kaWZ5IOa2iOaBr+aXtueKtuaAgeacuuabtOaWsO+8iENhbGxFbmdpbmUg5YaF6YOo6LCD55So77yJXG4gICAqIEBwYXJhbSBtZXNzYWdlIOaOpeaUtua2iOaBr1xuICAgKi9cbiAgX19vbk1lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQsIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXI6IHVzZXJQcm9maWxlLCBleGlzdGVkVXNlclBvZmlsZXMsIGNhbGxlciwgZGV2aWNlSWQsIGludml0ZVVzZXJJZHMsIG1lZGlhVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICAvLyB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdICYmICF0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLmRldmljZUlkICYmICFkZXZpY2VJZCAmJlxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfX29uTWVtYmVyTW9kaWZ5IC0+IG5vdCB0aGUgcmVtb3RlIGRldmljZSB0aGF0IGlzIGN1cnJlbnRseSB0YWxraW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgIC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsZXJJZCA9IGNhbGxlcjtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgaW52aXRlVXNlcklkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLnB1c2goeyB1c2VySWQ6IGlkLCBtZWRpYVR5cGUsIGNhbGxTdGF0dXM6IE1zZ0NhbGxTdGF0dXMuSU5DT01JTkcgfSk7XG4gICAgfSk7XG4gICAgLy8g5bex5pa554q25oCB5Li6IE5PTkUgKOacquWtmOWcqOW3seaWueeUqOaIt+S/oeaBrykg6K+05piO6Ieq5bex5Li66KKr6YKA6K+36ICFLCDpnIDlj5HpgIEgcmluZ2luZ1xuICAgIGNvbnN0IGlzTmV3SW52aXRlZFVzZXIgPSBpbnZpdGVVc2VySWRzLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc05ld0ludml0ZWRVc2VyKSB7XG4gICAgICBjb25zdCBuZWVkUmluZ2luZ1VzZXJJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgICAgaWYgKHVzZXJJbmZvLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIG5lZWRSaW5naW5nVXNlcklkcy5wdXNoKHVzZXJJbmZvLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgdXNlcklkczogbmVlZFJpbmdpbmdVc2VySWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOiiq+mCgOivt+iAhemAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlt7LlnKjpgJror53mtYHnqIvkuK3nlKjmiLfvvIzmipvlh7rkurrlkZjlj5jmm7Tnm5HlkKxcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uTWVtYmVyTW9kaWZ5KHtcbiAgICAgICAgc2VuZGVyOiB7IHVzZXJJZDogc2VuZGVyVXNlcklkLCAuLi51c2VyUHJvZmlsZSB9LFxuICAgICAgICBpbnZpdGVkVXNlcnM6IGludml0ZVVzZXJJZHMubWFwKChpZCkgPT4gKHsgdXNlcklkOiBpZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmm7TmlrDlhajph4/nlKjmiLfnirbmgIFcbiAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsU3RhdHVzIH0gPSB1c2VySW5mbztcbiAgICAgIC8vIOS6uuWRmOS4uue7k+adn+eKtuaAgeaXtu+8jOS4jeWGjeabtOaWsFxuICAgICAgaWYgKGNhbGxTdGF0dXMgPT09IE1zZ0NhbGxTdGF0dXMuSURMRSkgcmV0dXJuO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogY2FsbFN0YXR1cyAhPT0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQgPyBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyA6IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HLFxuICAgICAgICBpc0NhbGxlcjogc2VuZGVyVXNlcklkID09PSB1c2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBjdXJyZW50VXNlcklkICE9PSB1c2VySWQsXG4gICAgICB9O1xuICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGvIOWPiiBkZXZpY2VJZFxuICAgICAgaWYgKHVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgLy8g6Zmk5LqGIGNhbGxNc2dTdGF0dXMuY29ubmVjdGVkICzlhbbku5bkurrpg73otbforqHml7blmahcblxuICAgICAgaWYgKGNhbGxTdGF0dXMgIT09IE1zZ0NhbGxTdGF0dXMuQ09OTkVDVEVEICYmICF0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS7hee7meiiq+mCgOivt+aIkOWRmOWQr+WKqOWumuaXtuWZqFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCFpbnZpdGVVc2VySWRzLmluY2x1ZGVzKHVzZXJJZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgPyBSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2FsbCBvbmh1bmd1cCBlcnJvciAtPiAke2Vycm9yPy5zdGFja31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKog5oiWIOacquaOpeWQrOeahOaYr+iHquW3se+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICog6LaF5pe25ZCO77yM5bqU5riF6Zmk5ZCv5Yqo55qE6LaF5pe25a6a5pe25ZmoXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuW3suaciSBzZXNzaW9uIO+8jOS4jeWFgeiuuOWGjeaOpeWQrOaWsOS8muivneaDheWGtVxuICAgKi9cbiAgX19oYW5kbGVJbnZpdGVJblNlc3Npb24oKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnU3RhdGVNYWNoaW5lIC0+IF9faGFuZGxlSW52aXRlSW5TZXNzaW9uJyk7XG4gICAgLy8g5L+u5pS55omA5pyJ55So5oi354q25oCB5bm25oqb5Ye677yM5riF56m66K6h5pe25ZmoXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgJiYgKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICAvLyDlsIblt7LlrZjlnKjnmoTorqHml7blmajpg73muIXmjolcbiAgICAgIHRoaXMuX2NsZWFyVGltZXJCeUlkKHVzZXJJZCk7XG4gICAgfVxuICAgIC8vIOebtOaOpee7iOatouW9k+WJjSBzZXNzaW9uIOeKtuaAgVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5CVVNZX0xJTkUpO1xuICAgIC8vIOWPkemAgeaMguaWrea2iOaBr++8jOW5tuaQuuW4piDlt7Hmlrnlv5nnoowg5Y6f5ZugXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHJlYXNvbjogUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOS4u+WKqOWRvOWPqyAoQ2FsbEVuZ2luZSDlhoXpg6josIPnlKgpXG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+eUqOaItyBJRCDliJfooahcbiAgICogQHBhcmFtIGV4dHJhIOa2iOaBr+eahOaJqeWxleS/oeaBr1xuICAgKiBAcGFyYW0gcHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAcGFyYW0gcHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICAqL1xuICBhc3luYyBfX2NhbGwodXNlcklkczogc3RyaW5nW10sIGV4dHJhOiBzdHJpbmcgPSAnJywgcHVzaFRpdGxlOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnLCBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UpIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gaW52aXRlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5Y+R6YCB6YKA6K+35raI5oGvXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NhbGxlcklkID0gdGhpcy5faW52aXRlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRJbnZpdGUoe1xuICAgICAgcm9vbVR5cGU6IGlzQ3Jvc3NBcHBrZXkgPyBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsIDogUkNDcm9zc0NhbGxUeXBlLlJDQ2FsbFJvb21UeXBlTm9ybWFsQ2FsbCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkczogdXNlcklkcy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgfSk7XG5cbiAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcblxuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgY29uc3QgeyBzZW50VGltZSB9ID0gbWVzc2FnZSE7XG5cbiAgICAgIC8qKlxuICAgICAgICog6LeoIGFwcGtleSDku4XlrZjlnKjljZXogYrvvIzlr7nnq68gdXNlcklkIOmcgOWPluS4i+WIkue6v+WQjumdoueahOmDqOWIhlxuICAgICAgICovXG4gICAgICBjb25zdCBpZHMgPSBpc0Nyb3NzQXBwa2V5ID8gW2N1cnJlbnRVc2VySWQsIC4uLlt1c2VySWRzWzBdLnNwbGl0KCdfJylbMV1dXSA6IFtjdXJyZW50VXNlcklkLCAuLi51c2VySWRzXTtcblxuICAgICAgLy8g6YGN5Y6G5pu05paw5oi/6Ze05omA5pyJ5Lq65ZGY54q25oCB44CB5bm257uZ6KKr5Y+r5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICBpZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzQ2FsbGVyID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgICAgaXNDYWxsZXIsXG4gICAgICAgICAgaXNSZW1vdGU6ICFpc0NhbGxlcixcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcblxuICAgICAgICAvLyDlkK/liqjlkbzlj6votoXml7borqHml7blmahcbiAgICAgICAgaWYgKCFpc0NhbGxlcikge1xuICAgICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7blpITnkIbnirbmgIHjgIHlubbpgJrnn6UgY2FsbCDlsYJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25pyq5o6l5oqb5Ye6b25IdW5ndXBcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6L+c56uv5Lq65ZGY5aSn5LqOIDEg5LiU5bex5pa55LiN5Li65q2j5Zyo6YCa6K+d5pe277yM5Y+R6YCBIGh1bmd1cCwg5ZGK6K+J6L+c56uv6Ieq5bex6YCA5Ye66YCa6K+dXG4gICAgICAgICAgICBjb25zdCBpc05lZWRTZW5kSHVuZ3VwID0gdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoID09PSAwICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgICAgICAgaWYgKGlzTmVlZFNlbmRIdW5ndXApIHtcbiAgICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRoaXMuX2dldFRpbWVvdXQoc2VudFRpbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbmRDb2RlID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZENvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXlkKxcbiAgICovXG4gIGFzeW5jIGFjY2VwdCgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWNjZXB0Jyk7XG5cbiAgICAvLyDlj5HpgIHmjqXlkKzmtojmga9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRBY2NlcHQoe1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuXG4gICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoY3VycmVudFVzZXJJZCk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HKTtcbiAgICAgIHRoaXMuX2JlZ2luVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXSk7XG4gICAgICAvLyDkv67mlLnlubbpgJrnn6UgY2FsbCDlsYLmiL/pl7TnirbmgIHlj5jmm7RcbiAgICAgIGNvbnN0IGVuZFJlYXNvbiA9IGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPyBSQ0NhbGxFbmRSZWFzb24uQURERURfVE9fQkxBQ0tMSVNUIDogUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1I7XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuRU5ELCBlbmRSZWFzb24pO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbzlj6vkuK3nu6fnu63pgoDor7dcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdLCBvcHRpb25zOiBJSW52aXRlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKHRoaXMuX2NvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVApIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5DT05WRVJTQVRJT05fTk9UX0dST1VQX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGludml0ZSAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IGV4aXN0ZWRVc2VySWRzID0gT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pO1xuICAgIGNvbnN0IGV4aXN0ZWRVc2VyUG9maWxlczogSUV4aXN0ZWRVc2VyUG9maWxlc1tdID0gZXhpc3RlZFVzZXJJZHMubWFwKCh1c2VySWQpID0+IHtcbiAgICAgIGxldCBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQ7XG4gICAgICAvLyDljIXlkKvooqvpgoDor7fogIXvvIzmiJbogIXnlKjmiLfnirbmgIHkuLogd2F0aW5nIOaXtu+8jOeKtuaAgeS4uiDlk43pk4NcbiAgICAgIGlmICh1c2VySWRzLmluY2x1ZGVzKHVzZXJJZCkgfHwgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLldBSVRJTkcpIHtcbiAgICAgICAgY2FsbFN0YXR1cyA9IE1zZ0NhbGxTdGF0dXMuUklOR0lORztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICAgIGNhbGxTdGF0dXMsXG4gICAgICAgIG1lZGlhSWQ6IHVzZXJJZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYSA9IG9wdGlvbnMuZXh0cmEgfHwgJyc7XG4gICAgY29uc3QgcHVzaFRpdGxlID0gb3B0aW9ucy5wdXNoVGl0bGUgfHwgJyc7XG4gICAgY29uc3QgcHVzaENvbnRlbnQgPSBvcHRpb25zLnB1c2hDb250ZW50IHx8ICcnO1xuXG4gICAgLy8g5Y+R6YCB5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kTWVtZWJlck1vZGlmeSh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgcHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQsXG4gICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgIC8vIOmZpOiHquW3se+8jOWFtuS7luaJgOacieS6uuWdh+mcgOaUtuWIsCBtb2RpZnkg5raI5oGv77yM5Lul5q2k5pu05paw54q25oCBXG4gICAgICBpbnZpdGVVc2VySWRzOiB1c2VySWRzLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICAgIGNhbGxlcklkOiB0aGlzLmdldENhbGxlcklkKCksXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3Q6IFsuLi5leGlzdGVkVXNlcklkcywgLi4udXNlcklkc10uZmlsdGVyKChpZCkgPT4gaWQgIT09IGN1cnJlbnRVc2VySWQpLFxuICAgIH0pO1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcbiAgICAgIC8vIOS/ruaUueiiq+mCgOivt+S6uueKtuaAge+8jOW5tumAmuefpVxuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc3RhdGU6IFJDQ2FsbFVzZXJTdGF0ZS5XQUlUSU5HLFxuICAgICAgICAgIGlzQ2FsbGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1JlbW90ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgICAgLy8g5ZCv5Yqo5ZG85Y+r6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgICAgLy8g5oi/6Ze05Lq65ZGY5L+h5oGv5bCR5LqO5Lik5Liq77yM6YCa55+l5oi/6Ze054q25oCBXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuRU5ELCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX2dldFRpbWVvdXQoc2VudFRpbWUpKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDpgJrnn6XkurrlkZjlj5jmm7RcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuTk9ORSxcbiAgICAgICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICAgICAgaXNSZW1vdGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuXG4gICAgICAgIGNvbnN0IGVuZFJlYXNvbiA9IGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPyBSQ0NhbGxFbmRSZWFzb24uQURERURfVE9fQkxBQ0tMSVNUIDogUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1I7XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBlbmRSZWFzb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfaHVuZ3VwSGFuZGxlKHJlYXNvbjogUkNDYWxsRW5kUmVhc29uLCBpc1NlbmRIYW5ndXBNZXNzYWdlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuXG4gICAgLy8g5Y+R6YCB5oyC5pat57G75Z6L5raI5oGvXG4gICAgbGV0IGNvZGUgPSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUztcbiAgICBpZiAoaXNTZW5kSGFuZ3VwTWVzc2FnZSkge1xuICAgICAgY29uc3QgaGFuZ3VwUGFyYW1zID0ge1xuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgcmVhc29uLFxuICAgICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICAgICAgcHVzaFRpdGxlOiB0aGlzLl9odW5ndXBQdXNoVGl0bGUsXG4gICAgICAgIHB1c2hDb250ZW50OiB0aGlzLl9odW5ndXBQdXNoQ29udGVudCxcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZWFzb24gPT09IFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwpIHtcbiAgICAgICAgLy8g5bex56uv6KKr5aSa56uv5Yqg5YWlIFJUQyDmiL/pl7TmjKTmjonlkI7vvIzkuI3lho3nrYnlj5HmjILmlq3mtojmga/nmoTnu5PmnpzvvIzpmLLmraLotbAgdXNlckxlYXZlIOWvvOiHtOaMguaWreWOn+WboOS4jeWHhuehrlxuICAgICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGNvZGU6IG1zZ0NvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRIdW5ndXAoaGFuZ3VwUGFyYW1zKTtcbiAgICAgICAgY29kZSA9IG1zZ0NvZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAvLyDmm7TmlrDpgJror53kurrlkZjnirbmgIHjgIHpgJror53nu5PmnZ/ml7bpl7Qg5bm26YCa55+lXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOa4heepuuWGheWtmOaAgeaVsOaNru+8jOW5tumAmuefpVxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgcmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqL1xuICBhc3luYyBodW5ndXAocHVzaFRpdGxlOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIGh1bmd1cCcpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOm7mOiupOaMguaWrSByZWFzb24g5Li66YCa6K+d6L+H56iL5Lit77yM5bex5pa55q2j5bi45Y+W5raI6YCa6K+dXG4gICAgbGV0IHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgLyoqXG4gICAgICog6Iul6LaF5pe26K6h5pe25Zmo5a2Y5ZyoLCDlt7HmlrnkuLogY2FsbGVyIOWOn+WboOS4uuW3seaWueWPlua2iOmAmuivnSxcbiAgICAgKiDlt7HmlrnkuLogY2FsbGVlIOS4lOacqui/m+WFpemAmuivneS4re+8jOWOn+WboOS4uuW3seaWueaLkue7nemAmuivnVxuICAgICAqL1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VyVGltZXJzKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uaXNDYWxsZXIpIHtcbiAgICAgICAgcmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkNBTkNFTDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uc3RhdGUgPT09IFJDQ2FsbFVzZXJTdGF0ZS5XQUlUSU5HKSB7XG4gICAgICAgIHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5SRUpFQ1Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5riF6Zmk5omA5pyJ6LaF5pe26K6h5pe25ZmoXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlclRpbWVycykge1xuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2h1bmd1cEhhbmRsZShyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIOS/ruaUuemAmuivneWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIFJDQ2FsbE1lZGlhVHlwZS5BVURJTyDmlLnkuLrpn7PpopHpgJror50gfCBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8g5pS55Li66Z+z6KeG6aKR6YCa6K+dXG4gICAqL1xuICBhc3luYyBjaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2hhbmdlTWVkaWFUeXBlIC0+IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kTWVkaWFNb2RpZnkoe1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICB9KTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+WKoOWFpemAmuivneihpeWBv+acuuWItu+8iHJ0YyB1c2VySm9pbiDkuovku7bop6blj5HvvIlcbiAgICog5Li75Y+r5ZG85Y+r5ZCO77yM5pyq5pS25Yiw6KKr5Y+rIGFjY2VwdCDmtojmga/vvIzkvYbmlLbliLDkuoYgdXNlckpvaW4g5ZCM5qC36KGl5YG/5pu05paw55So5oi344CB5oi/6Ze054q25oCB44CB5ZG85Y+r6K6h5pe25ZmoXG4gICAqL1xuICB1c2VySm9pbih1c2VySWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSB1c2VySm9pbiAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIC8vIOW7tui/nyAzMDBtcyDpmLLmraIgdXNlckppb24g5ZKMIGFjY2VwdCDmtojmga/pg73mnInnmoTmg4XlhrXkuIvvvIwgdXNlckpvaW4g5q+UIGFjY2VwdCDlhYjliLBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgLy8g5pu05paw5Lq65ZGY54q25oCBICgvLyDnvqTnu4TpgJror53ml7bvvJogQeWQkULjgIFD5Y+R6LW36YCa6K+dIELlhYjmjqXlkKzvvIxD5ZCO5o6l5ZCs77yM6L+Z5pe2QuayoeaciUPnmoR1c2VySWTlr7nlupTnmoRfdXNlckluZm/vvIzmiYDku6Xov5nph4zliKTmlq3kuIDkuIspXG4gICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICB1c2VySW5mby5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh1c2VySW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5pu05paw5oi/6Ze054q25oCBXG4gICAgICAgIGlmICh0aGlzLl9zZXNzaW9uU3RhdGUgIT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKSB7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWBnOatouW5tua4hemZpOWRvOWPq+iuoeaXtuWZqFxuICAgICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgICAgfSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKjmiLfnprvlvIDpgJror53ooaXlgb/mnLrliLbvvIhydGMgdXNlckxlYXZl44CBa2lja09mZiDkuovku7bop6blj5HvvIlcbiAgICog6YCa6K+d5Lit6L+c56uv55So5oi35oyC5pat77yM5oyC5pat5raI5oGv5pyq5Yiw77yM5L2G5piv55uR5ZCs5YiwIHJ0YyB1c2VyTGVhdmUg5ZCM5qC36KGl5YG/5pu05paw55So5oi344CB5oi/6Ze054q25oCBXG4gICAqL1xuICB1c2VyTGVhdmUodXNlcklkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gdXNlckxlYXZlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5bu26L+fIDMwMG1zIOmYsuatoiB1c2VyTGVhdmUg5ZKMIGh1bmd1cCDmtojmga/pg73mnInnmoTmg4XlhrXkuIvvvIx1c2VyTGVhdmUg5q+UIGh1bmd1cCDlhYjliLBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgLy8g5pu05paw5Lq65ZGY54q25oCBXG4gICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLk5PTkUpIHtcbiAgICAgICAgICB1c2VySW5mby5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh1c2VySW5mbywgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHVzZXJJbmZvLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Li75Y+r5pa5576k6IGK6YKA6K+36KKr5Y+r5pa55ZCO56a757q/77yM5Li75Y+r5pa55q2k5pe25Li6562J5b6F54q25oCB5ZCO5LiN5YaN5LiK57q/77yM6KKr5Y+r5pa55o6l5ZCs5ZCO5oyC5pat6Iez5Ymp5L2Z5LiA5Lq65pe2562J5b6F5LiA5YiG6ZKf5ZCO5oyC5patXG4gICAgICAgIGNvbnN0IHJlbW90ZVVzZXJzVGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW90ZVVzZXJzID0gdGhpcy5nZXRSZW1vdGVVc2VycygpO1xuICAgICAgICAgIC8vIOi/nOerr+WPquacieS4gOS4queUqOaIt+S4lOaYr+etieW+heeKtuaAge+8jOetieW+heS4gOWIhumSn+WQjuaMguaWrVxuICAgICAgICAgIGlmIChyZW1vdGVVc2Vycy5sZW5ndGggPT09IDEgJiYgcmVtb3RlVXNlcnNbMF0uc3RhdGUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2h1bmd1cEhhbmRsZShSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgNjAwMDApO1xuICAgICAgICAvLyDmm7TmlrDmiL/pl7TnirbmgIFcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyICYmIHRoaXMuX3Nlc3Npb25TdGF0ZSAhPT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIHRoaXMuX2VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwg5bGC5bex5pa55byC5bi45aSx6LSl5ZCO6LCD55So55qE5pa55rOVXG4gICAqIOinpuWPkeaXtuacuu+8mumfs+inhumikeacjeWKoeW8guW4uOOAgeiOt+WPlui1hOa6kOWksei0peOAgeWKoOWFpSBSVEMg5oi/6Ze05aSx6LSl44CB5Y+R5biDfOiuoumYheWksei0pVxuICAgKi9cbiAgY2xvc2UocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9odW5ndXBIYW5kbGUocmVhc29uKTtcbiAgfVxuXG4gIHNldEh1bmd1cFB1c2hDb25maWcocHVzaENvbmZpZzogc3RyaW5nID0gJycsIHB1c2hDb250ZW50OiBzdHJpbmcgPSAnJykge1xuICAgIHRoaXMuX2h1bmd1cFB1c2hUaXRsZSA9IHB1c2hDb25maWc7XG4gICAgdGhpcy5faHVuZ3VwUHVzaENvbnRlbnQgPSBwdXNoQ29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIGdldENhbGxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsSWQ7XG4gIH1cblxuICAvKipcbiAgICog5aSa57uE57uHIElEXG4gICAqL1xuICBnZXRDaGFubmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBnZXRUYXJnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YXJnZXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkvJror53nsbvlnotcbiAgICovXG4gIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnZlcnNhdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6L+c56uv5oiQ5ZGYIElEIOWIl+ihqFxuICAgKi9cbiAgZ2V0UmVtb3RlVXNlcklkcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYWxsVXNlcklkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKTtcbiAgICBjb25zdCByZW1vdGVVc2VySWRzID0gYWxsVXNlcklkcy5maWx0ZXIoKGlkKSA9PiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpICE9PSBpZCk7XG4gICAgcmV0dXJuIHJlbW90ZVVzZXJJZHM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6L+c56uv5oiQ5ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICBnZXRSZW1vdGVVc2VycygpOiBJVXNlckRhdGFbXSB7XG4gICAgY29uc3QgcmVtb3RlVXNlcjogSVVzZXJEYXRhW10gPSBbXTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBmb3IgKGNvbnN0IHVpZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgY29uc3QgeyB1c2VySWQgfSA9IHRoaXMuX3VzZXJJbmZvW3VpZF07XG4gICAgICBpZiAodXNlcklkICE9PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHJlbW90ZVVzZXIucHVzaCh0aGlzLl91c2VySW5mb1t1aWRdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlbW90ZVVzZXI7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5oi/6Ze054q25oCBXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uU3RhdGUgPT09IG51bGwgPyBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EIDogdGhpcy5fc2Vzc2lvblN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS6uuWRmOeKtuaAgVxuICAgKi9cbiAgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckluZm9bdXNlcklkXT8uc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lya6K+d5Y+R6LW36ICFIElkXG4gICAqL1xuICBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsZXJJZCE7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5qyh5Lya6K+d6YKA6K+36ICFIElkXG4gICAqL1xuICBnZXRJbnZpdGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faW52aXRlcklkITtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3pgJror53lqpLkvZPnsbvlnotcbiAgICovXG4gIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5ZCO5Y+v6LCD55SoXG4gICAqL1xuICBnZXRTdW1tYXJ5KCk6IElFbmRTdW1tYXJ5IHtcbiAgICAvLyDpgJror53ml7bpl7TorqHnrpdcbiAgICBjb25zdCBiZWdpblRpbWVzdGFtcCA9IHRoaXMuX2JlZ2luVGltZXN0YW1wO1xuICAgIGNvbnN0IGVuZFRpbWVzdGFtcCA9IHRoaXMuX2VuZFRpbWVzdGFtcDtcbiAgICBsZXQgZHVyYXRpb24gPSAwO1xuICAgIGlmIChlbmRUaW1lc3RhbXAgPiBiZWdpblRpbWVzdGFtcCAmJiBiZWdpblRpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgZHVyYXRpb24gPSBlbmRUaW1lc3RhbXAgLSBiZWdpblRpbWVzdGFtcDtcbiAgICB9XG5cbiAgICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBiZWdpblRpbWVzdGFtcCxcbiAgICAgIGVuZFRpbWVzdGFtcCxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgZW5kUmVhc29uOiB0aGlzLl9lbmRSZWFzb24hLFxuICAgIH07XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gZ2V0U3VtbWFyeSAtPiBzdW1tYXJ5OiAke0pTT04uc3RyaW5naWZ5KHN1bW1hcnkpfWApO1xuICAgIHJldHVybiBzdW1tYXJ5O1xuICB9XG59XG4iLCIvKipcbiAqIOmAmuivneWqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxNZWRpYVR5cGUge1xuICAvKipcbiAgICog6Z+z6aKR6YCa6K+dXG4gICAqL1xuICBBVURJTyA9IDEsXG4gIC8qKlxuICAgKiDop4bpopHpgJror51cbiAgICovXG4gIEFVRElPX1ZJREVPXG59XG4iLCJleHBvcnQgZW51bSBNZW1iZXJNb2RpZnlUeXBlIHtcbiAgQUREID0gMSxcbiAgUkVNT1ZFXG59XG4iLCIvKipcbiAqIOW5s+WPsFxuICovXG5leHBvcnQgZW51bSBQbGF0Zm9ybSB7XG4gIFdFQiA9ICdXZWInLFxuICBJT1MgPSAnaU9TJyxcbiAgQU5EUk9JRCA9ICdBbmRyb2lkJ1xufVxuIiwiaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHlwZSwgSUxvZ2dlciwgSVJlY2VpdmVkTWVzc2FnZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lZGlhTW9kaWZ5TXNnQ29udGVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPZmZsaW5lUmVjb3JkIHtcbiAgY2hhbm5lbElkOiBzdHJpbmcsXG4gIGNvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gIHRhcmdldElkOiBzdHJpbmcsXG4gIG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLFxuICBjYWxsSWQ6IHN0cmluZyxcbiAgaW52aXRlcklkOiBzdHJpbmcsXG4gIGVuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uLFxuICBiZWdpblRpbWVzdGFtcDogbnVtYmVyLFxuICBlbmRUaW1lc3RhbXA6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlclxufVxuXG4vKipcbiAqIOemu+e6v+mAmuivneiusOW9leWZqFxuICovXG5leHBvcnQgY2xhc3MgT2ZmbGluZVJlY29yZGVyIHtcbiAgcHJpdmF0ZSBfbWVzc2FnZXM6IElSZWNlaXZlZE1lc3NhZ2VbXSB8IFtdID0gW11cblxuICBwcml2YXRlIF9jaGFubmVsSWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9jb252ZXJzYXRpb25UeXBlITogQ29udmVyc2F0aW9uVHlwZVxuXG4gIHByaXZhdGUgX3RhcmdldElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfbWVkaWFUeXBlITogUkNDYWxsTWVkaWFUeXBlXG5cbiAgcHJpdmF0ZSBfY2FsbElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfY2FsbGVySWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9pbnZpdGVySWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9lbmRSZWFzb24hOiBSQ0NhbGxFbmRSZWFzb25cblxuICBwcml2YXRlIF9iZWdpblRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX2VuZFRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uUmVjb3JkOiAocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkgPT4gdm9pZCxcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOe7k+adn1xuICAgKiDljp/lm6DmoLnmja7lt7HmlrnmmK/lkKbkuLrkuLvlj6vvvIzkuLvlj6vkuLrov5znq6/mnKrmjqXlkKwg6KKr5Y+r6KKr5bex56uv5pyq5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9kb0ludml0ZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZGVyVXNlcklkLCBjb250ZW50LFxuICAgIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgY2FsbElkLCBtZWRpYVR5cGUgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgdGhpcy5fY2hhbm5lbElkID0gY2hhbm5lbElkITtcbiAgICB0aGlzLl9jb252ZXJzYXRpb25UeXBlID0gY29udmVyc2F0aW9uVHlwZTtcbiAgICB0aGlzLl90YXJnZXRJZCA9IHRhcmdldElkO1xuICAgIHRoaXMuX2NhbGxJZCA9IGNhbGxJZDtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgY29uc3QgaXNDYWxsZXIgPSBzZW5kZXJVc2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgdGhpcy5faW52aXRlcklkID0gc2VuZGVyVXNlcklkO1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IGlzQ2FsbGVyID8gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSA6IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0U7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGludml0ZSB8IG1lbWJlck1vZGlmeSDnu5PmnZ9cbiAgICog5Y6f5Zug5qC55o2u5bex5pa55piv5ZCm5Li65Li75Y+r77yM5Li75Y+r5Li66L+c56uv5pyq5o6l5ZCsIOiiq+WPq+iiq+W3seerr+acquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9NZW1iZXJNb2RpZnkobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2RvSW52aXRlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg6K6h566X55qE56a757q/6K6w5b2VXG4gICAqL1xuICBwcml2YXRlIF9kb1JpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBhY2NlcHQg6K+05piO6YCa6K+d5bey5bu656uLXG4gICAqIOWOn+WboOm7mOiupOW3seaWueato+W4uOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfZG9BY2NlcHQobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBtZXNzYWdlLnNlbnRUaW1lO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBodW5ndXAg6K+05piO5Li65q2j5bi45oyC5patXG4gICAqIOWOn+WboOWPlua2iOaBr+S9k+mHjOaMguaWreWOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9IdW5ndXAobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY29udGVudCwgc2VudFRpbWUsIHNlbmRlclVzZXJJZCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IHJlYXNvbiB9ID0gY29udGVudCBhcyBJSHVuZ3VwTXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBpc1NlbGZTZW5kID0gc2VuZGVyVXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IGlzU2VsZlNlbmQgPyByZWFzb24gOiBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl07XG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gc2VudFRpbWU7XG5cbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj6rkv67mlLnpgJror53nsbvlnotcbiAgICovXG4gIHByaXZhdGUgX2RvTWVkaWFNb2RpZnkobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSB9ID0gY29udGVudCBhcyBJTWVkaWFNb2RpZnlNc2dDb250ZW50O1xuICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbkdlblJlY29yZCgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsZXQgZHVyYXRpb24gPSAwO1xuICAgICAgY29uc3QgaXNOZWVkRHVyYXRpb25SZWFzb24gPSBbXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVAsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9KT0lORURfQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfS0lDS0VEX0JZX1NFUlZFUixcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwsXG4gICAgICBdLmluY2x1ZGVzKHRoaXMuX2VuZFJlYXNvbik7XG4gICAgICBpZiAoaXNOZWVkRHVyYXRpb25SZWFzb24pIHtcbiAgICAgICAgZHVyYXRpb24gPSB0aGlzLl9lbmRUaW1lc3RhbXAgLSB0aGlzLl9iZWdpblRpbWVzdGFtcDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29uUmVjb3JkKHtcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICAgIGludml0ZXJJZDogdGhpcy5faW52aXRlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgZW5kUmVhc29uOiB0aGlzLl9lbmRSZWFzb24sXG4gICAgICAgIGJlZ2luVGltZXN0YW1wOiB0aGlzLl9iZWdpblRpbWVzdGFtcCxcbiAgICAgICAgZW5kVGltZXN0YW1wOiB0aGlzLl9lbmRUaW1lc3RhbXAsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZWN2T2ZmbGluZU1zZ3MobWVzc2FnZXM6IElSZWNlaXZlZE1lc3NhZ2VbXSkge1xuICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgZG8ge1xuICAgICAgY29uc3QgbXNnID0gdGhpcy5fbWVzc2FnZXMuc2hpZnQoKSE7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VUeXBlLCBjb250ZW50OiB7IGNhbGxJZCB9IH0gPSBtc2c7XG4gICAgICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGU6XG4gICAgICAgICAgdGhpcy5fZG9JbnZpdGUobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1Jpbmdpbmc6XG4gICAgICAgICAgdGhpcy5fZG9SaW5naW5nKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQ6XG4gICAgICAgICAgdGhpcy5fZG9BY2NlcHQobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbTpcbiAgICAgICAgICB0aGlzLl9kb01lbWJlck1vZGlmeShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWE6XG4gICAgICAgICAgdGhpcy5fZG9NZWRpYU1vZGlmeShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwOlxuICAgICAgICAgIHRoaXMuX2RvSHVuZ3VwKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtPZmZsaW5lUmVjb3JkZXJdIG9uUmVjdk9mZmxpbmVNc2dzIC0+IHVuZXhwZWN0ZWQgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtc2cpfWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRoaXMuX21lc3NhZ2VzLmxlbmd0aCA+IDApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgSUxvZ2dlciwgSVB1c2hDb25maWcsIElSZWNlaXZlZE1lc3NhZ2UsIElSdW50aW1lLCBJU2VuZE1zZ09wdGlvbnMsIFJUQ1BsdWdpbkNvbnRleHQsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IE1lbWJlck1vZGlmeVR5cGUgfSBmcm9tICcuL2VudW1zL01lbWJlck1vZGlmeVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJVXNlclByb2ZpbGUgfSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0TXNnQ29udGVudCwgSUFjY2VwdE1zZ09wdGlvbnMsIElDYWxsTXNnT3B0aW9uLCBJSHVuZ3VwTXNnQ29udGVudCwgSUh1bmd1cE1zZ09wdGlvbnMsXG4gIElJbnZpdGVNc2dDb250ZW50LCBJSW52aXRlTXNnT3B0aW9ucywgSU1lZGlhTW9kaWZ5TXNnQ29udGVudCwgSU1lZGlhTW9kaWZ5TXNnT3B0aW9ucywgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsXG4gIElNZW1iZXJNb2RpZnlNc2dPcHRpb25zLCBJTXNnTGlzdGVuZXIsIElSaW5naW5nTXNnQ29udGVudCwgSVJpbmdpbmdNc2dPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnLi9lbnVtcy9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgSU9mZmxpbmVSZWNvcmQsIE9mZmxpbmVSZWNvcmRlciB9IGZyb20gJy4vT2ZmbGluZVJlY29yZGVyJztcbmltcG9ydCB7IFJDQ2FsbFN0YXRlTWFjaGluZSB9IGZyb20gJy4uJztcblxuY29uc3QgY2FsbE1zZ1R5cGVzID0gWydSQzpWQ0FjY2VwdCcsICdSQzpWQ1JpbmdpbmcnLCAnUkM6VkNTdW1tYXJ5JywgJ1JDOlZDSGFuZ3VwJywgJ1JDOlZDSW52aXRlJywgJ1JDOlZDTW9kaWZ5TWVkaWEnLCAnUkM6VkNNb2RpZnlNZW0nXTtcblxudHlwZSBNc2dMaXN0ZW5lcktleXMgPSBrZXlvZiBJTXNnTGlzdGVuZXJcblxuaW50ZXJmYWNlIElNc2dCdWZmZXJJdGVtIHtcbiAgbWFya1RpbWU6IG51bWJlcixcbiAgbXNnOiBJUmVjZWl2ZWRNZXNzYWdlXG59XG5cbmNvbnN0IEVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZTogeyBba2V5OiBudW1iZXJdOiBSQ0NhbGxFcnJvckNvZGUgfSA9IHtcbiAgW0Vycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1RdOiBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNULFxuICBbRXJyb3JDb2RlLk5PVF9JTl9HUk9VUF06IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fR1JPVVAsXG59O1xuXG4vKipcbiAqIOa2iOaBr+aOpeaUtuWkhOeQhjog5Zyo57q/5raI5oGv44CB56a757q/5raI5oGvXG4gKiDlj5HpgIHmtojmga/lpITnkIY6IOWPkemAgeS4jeWQjOexu+Wei+a2iOaBr+WwgeijhVxuICovXG5leHBvcnQgY2xhc3MgQ2FsbE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBfd2F0Y2hlcnM6IElNc2dMaXN0ZW5lciA9IHt9XG5cbiAgcHJpdmF0ZSBfdXNlckluZm86IElVc2VyUHJvZmlsZSA9IHt9XG5cbiAgcHJpdmF0ZSBfbXNnQnVmZmVyTGlzdDogSU1zZ0J1ZmZlckl0ZW1bXSA9IFtdXG5cbiAgcHJpdmF0ZSBfaGFkSGFuZGxlTXNnVGltZXI6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX29mZmxpbmVSZWNvcmRlciE6IE9mZmxpbmVSZWNvcmRlclxuXG4gIHByaXZhdGUgX2RldmljZUlkOiBzdHJpbmcgPSAnJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOemu+e6v+a2iOaBr+WkhOeQhuaXtumXtOmXtOmalFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29mZmxpbmVNc2dJdHY6IG51bWJlciA9IDYwICogMTAwMCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nZXRTdGF0ZU1hY2hpbmU6IChjYWxsSWQ6IHN0cmluZykgPT4gUkNDYWxsU3RhdGVNYWNoaW5lIHwgbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBkZXZpY2VJZFxuICAgIHRoaXMuX2RldmljZUlkID0gZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDlpITnkIbmtojmga/mlLblj5FcbiAgICB0aGlzLl9jb250ZXh0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgIC8vIOWkhOeQhuemu+e6v+a2iOaBr+iusOW9lVxuICAgIHRoaXMuX29mZmxpbmVSZWNvcmRlciA9IG5ldyBPZmZsaW5lUmVjb3JkZXIodGhpcy5fY29udGV4dCwgdGhpcy5fbG9nZ2VyLCAocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gb2ZmbGluZVJlY29yZGVyIC0+ICR7SlNPTi5zdHJpbmdpZnkocmVjb3JkKX1gKTtcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZCAmJiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQocmVjb3JkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTWVzc2FnZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgaXNDYWxsTXNnID0gY2FsbE1zZ1R5cGVzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpO1xuICAgIGlmIChpc0NhbGxNc2cpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBfb25NZXNzYWdlIC0+IGNhbGwgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgIC8vIOmAmui/h+mBjeWOhiBidWZmZXJMaXN0IOafpeaJvuimgeaPkuWFpeeahOiKgueCuVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFya1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB7IHNlbnRUaW1lOiBjdXJyZW50TXNnU2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgICAgIGxldCBpbnNlcnRJbmRleCA9IDA7XG4gICAgICAgIC8vIOmcgOmBjeWOhuaVsOe7hOWFqOmDqOmhue+8jOaVheS9v+eUqCBmb3JFYWNoLCBmaW5kSW5kZXgg5om+5Yiw56ys5LiA5Liq56ym5ZCI5p2h5Lu255qE5bCx5Lya57uI5q2iXG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3QuZm9yRWFjaCgoeyBtc2c6IHsgc2VudFRpbWUgfSB9LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50TXNnU2VudFRpbWUgPj0gc2VudFRpbWUpIHtcbiAgICAgICAgICAgIC8vIGluc2VydEluZGV4IOmcgOS4uuW9k+WJjeespuWQiOadoeS7tuWFg+e0oOeahOWQjuS4gOS9je+8jOaVhSArMVxuICAgICAgICAgICAgaW5zZXJ0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHtcbiAgICAgICAgICBtYXJrVGltZSxcbiAgICAgICAgICBtc2c6IG1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBvbk1lc3NhZ2UgLT4gbXNnQnVmZmVyTGlzdDogJHt0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzcGxpY2UgYnVmZmVyIG1zZyBlcnJvciAtPiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIOWQr+WKqOa2iOaBr+WkhOeQhlxuICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjnur/mtojmga/mipvnu5nnirbmgIHmnLrlpITnkIZcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdk9ubGluZUNhbGxNc2cobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYG9uTWVzc2FnZSAtPiBfb25SZWN2T25saW5lQ2FsbE1zZzogJHttZXNzYWdlLm1lc3NhZ2VUeXBlfWApO1xuICAgIGNvbnN0IHsgY29udGVudDogeyBjYWxsSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDlnKjnur/mtojmga/nm7TmjqXmipvlh7pcbiAgICBzd2l0Y2ggKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGU6XG4gICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlICYmIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vblJpbmdpbmdgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0OlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbkFjY2VwdGAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW06XG4gICAgICAgIC8vIOaUtuWIsOS6uuWRmOWPmOabtOaKm+WHuiBvbkludml0ZSDnlJ/miJDnirbmgIHmnLrlrp7kvotcbiAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUgJiYgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbk1lZGlhTW9kaWZ5YCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cDpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25IdW5ndXBgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBvblJlY3ZPbmxpbmVDYWxsTXNnIC0+IHVuZXhwZWN0ZWQgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOa2iOaBryBidWZmZXIg5YiX6KGo5aSE55CG6YC76L6RXG4gICAqIDHjgIHmr48gMjBtcyDmo4Dmn6XkuIDmrKEgYnVmZmVyIGxpc3RcbiAgICogMuOAgeWPluWHuuW3sue7j+W7tui/nyAyMDAg55qE5raI5oGv5YiX6KGo6L+b6KGM5raI6LS5IHwg5peg5bu26L+fIDIwMG1zIOWGhea2iOaBr+ebtOaOpemAkuW9klxuICAgKiAz44CB5raI6LS55YiG5Li6IOemu+e6v+a2iOaBr+a2iOi0uemAu+i+keOAgeWcqOe6v+a2iOaBr+a2iOi0uemAu+i+ke+8jOa2iOi0ueWQjumAkuW9klxuICAqL1xuICBwcml2YXRlIF9oYW5kbGVCdWZmZXJNc2dzKCkge1xuICAgIC8vIOa2iOaBryBidWZmZXIg5YiX6KGo6ZW/5bqm5Li6IDAg5pe25Yqg6ZSBXG4gICAgaWYgKHRoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RoID09PSAwIHx8IHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdfaGFuZGxlQnVmZmVyTXNncyByZXR1cm4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g6ZyA6KaB5Yqg6ZSB77yM5pS25Yiw5aSa5qyh5raI5oGv5ZCO77yM5Y+v6IO95Lya6LW35aSa5LiqIHRpbWVyXG4gICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8g5Y+W5Ye65aSn5LqOIDIwMCBtcyDmtojmga/liJfooahcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbHRlcigoaXRlbSkgPT4gY3VycmVudFRpbWUgLSBpdGVtLm1hcmtUaW1lID49IDIwMCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gaGFuZGxlQnVmZmVyTXNncyAtPiBsaXN0cyBvdmVyIDIwMG1zIDogJHtKU09OLnN0cmluZ2lmeShidWZmZXJzLm1hcCgoeyBtc2c6IHsgbWVzc2FnZVVJZCwgaXNPZmZMaW5lTWVzc2FnZSwgY29udGVudDogeyBjYWxsSWQgfSB9IH0pID0+ICh7IG1lc3NhZ2VVSWQsIGlzT2ZmTGluZU1lc3NhZ2UsIGNhbGxJZCB9KSkpfWApO1xuICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIOayoeacieW7tui/nyAyMDBtcyDnmoTmtojmga/vvIzmtojotLnpgLvovpHop6PplIHlubbpgJLlvZLmiafooYxcbiAgICAgICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChidWZmZXJzWzBdLm1zZy5pc09mZkxpbmVNZXNzYWdlKSB7XG4gICAgICAgIC8vIOW9k+esrOS4gOadoea2iOaBr+S4uuemu+e6v+a2iOaBr+aXtu+8jOebtOaOpeS7jiBidWZmZXIg5Lit5Y+W5Ye65omA5pyJ56a757q/5raI5oGv77yM6L+b6KGM5raI5oGvXG4gICAgICAgIGxldCBvZmZsaW5lQnVmZmVycyA9IHRoaXMuX21zZ0J1ZmZlckxpc3QuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm1zZy5pc09mZkxpbmVNZXNzYWdlKTtcblxuICAgICAgICAvLyDnprvnur/mtojmga/lpITnkIbpgLvovpFcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvblR5cGUsIG1lc3NhZ2VUeXBlLCBzZW50VGltZSwgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IGNhbGxJZDogaW52aXRlQ2FsbElkLCBpbnZpdGVVc2VySWRzIH0sXG4gICAgICAgICAgfSA9IG9mZmxpbmVCdWZmZXJzWzBdLm1zZztcblxuICAgICAgICAgIGNvbnN0IGlzSW52aXRlTXNnVHlwZSA9IFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW1dLmluY2x1ZGVzKG1lc3NhZ2VUeXBlIGFzIFJDQ2FsbE1lc3NhZ2VUeXBlKTtcblxuICAgICAgICAgIC8vIOiuoeeul+W9k+WJjeaXtumXtOS4jua2iOaBr+WPkemAgeaXtumXtOW3rlxuICAgICAgICAgIGNvbnN0IGRlbGF5VGltZSA9IHRoaXMuX2NvbnRleHQuZ2V0U2VydmVyVGltZSgpIC0gc2VudFRpbWU7XG4gICAgICAgICAgY29uc3QgaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgPSBkZWxheVRpbWUgPCB0aGlzLl9vZmZsaW5lTXNnSXR2O1xuXG4gICAgICAgICAgaWYgKCFpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0dikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgb2ZmbGluZSBtc2cgZGVsYXlUaW1lOiAke2RlbGF5VGltZX1tc2ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0ludml0ZU1zZ1R5cGUpIHsgLy8g5Y+W5Ye655qE56ys5LiA5p2h5raI5oGv5Li6IGludml0ZSB8IG1lbU1vZGlmeVxuICAgICAgICAgICAgLy8g5Y+W5Ye655u45ZCMIENhbGxJZCDmtojmga/liJfooahcbiAgICAgICAgICAgIGNvbnN0IHRhc2tNc2dMaXN0OiBJUmVjZWl2ZWRNZXNzYWdlW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2ZmbGluZUJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG9mZmxpbmVCdWZmZXJzW2ldLm1zZztcbiAgICAgICAgICAgICAgY29uc3QgeyBjb250ZW50OiB7IGNhbGxJZDogb3RoZXJDYWxsSWQgfSB9ID0gaXRlbTtcbiAgICAgICAgICAgICAgaWYgKGludml0ZUNhbGxJZCA9PT0gb3RoZXJDYWxsSWQpIHtcbiAgICAgICAgICAgICAgICB0YXNrTXNnTGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGB0YXNrTXNnTGlzdCBsZW5ndGg6ICR7dGFza01zZ0xpc3QubGVuZ3RofWApO1xuXG4gICAgICAgICAgICBpZiAodGFza01zZ0xpc3QubGVuZ3RoID4gMCkgeyAvLyDpmLLmraIgdGFza01zZ0xpc3Qg5Li6IDBcbiAgICAgICAgICAgICAgLy8g5om+5Ye6IG1zZ0J1ZmZlckxpc3Qg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgICAgICAgIGNvbnN0IGRlbEluZGV4ID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubXNnLm1lc3NhZ2VVSWQgPT09IHRhc2tNc2dMaXN0W3Rhc2tNc2dMaXN0Lmxlbmd0aCAtIDFdLm1lc3NhZ2VVSWQpO1xuICAgICAgICAgICAgICAvLyDliKDpmaTmtojotLnov4cgbXNnQnVmZmVyTGlzdCDnmoTmtojmga9cbiAgICAgICAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdCA9IHRoaXMuX21zZ0J1ZmZlckxpc3Quc2xpY2UoZGVsSW5kZXggKyAxKTtcblxuICAgICAgICAgICAgICAvLyDmib7lh7ogb2ZmbGluZU1zZ3Mg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgICAgICAgIGNvbnN0IGRlbE9mZmxpbmVJbmRleCA9IG9mZmxpbmVCdWZmZXJzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5tc2cubWVzc2FnZVVJZCA9PT0gdGFza01zZ0xpc3RbdGFza01zZ0xpc3QubGVuZ3RoIC0gMV0ubWVzc2FnZVVJZCk7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpOa2iOi0uei/hyBvZmZsaW5lQnVmZmVycyDnmoTmtojmga9cbiAgICAgICAgICAgICAgb2ZmbGluZUJ1ZmZlcnMgPSBvZmZsaW5lQnVmZmVycy5zbGljZShkZWxPZmZsaW5lSW5kZXggKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog5Y2V6IGK5pyq57uT5p2f6YCa6K+d5Yik5patXG4gICAgICAgICAgICAgKiDlpoLmnpzmtojmga/lnKggNjBzIOWGhe+8jOWIpOaWreaYr+WQpuacquaIkOWvue+8iOWPquaciSBpbnZpdGUg5oiW5Y+q5pyJIGludml0ZSDmiJYgcmluZ2luZyDmiJDlr7nmipvnu5kg56a757q/6K6w5b2V5Zmo77yM5pyq5oiQ5a+55oqb57uZ54q25oCB5py6XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVW5maW5pc2hlZFByaXZhdGVDYWxsOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuUFJJVkFURSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCBpc09ubHlJbnZpdGUgPSB0YXNrTXNnTGlzdC5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICAgIGNvbnN0IGhhc0ludml0ZUFuZFJpbmdpbmcgPSB0YXNrTXNnTGlzdC5ldmVyeSgoaXRlbSkgPT4gW1JDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1JpbmdpbmddLmluY2x1ZGVzKGl0ZW0ubWVzc2FnZVR5cGUgYXMgUkNDYWxsTWVzc2FnZVR5cGUpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzT25seUludml0ZSB8fCBoYXNJbnZpdGVBbmRSaW5naW5nO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog576k6IGK5pyq57uT5p2f6YCa6K+d5Yik5patXG4gICAgICAgICAgICAgKiDpgJrov4cgbGlzdCDkuK0gaW52aXRlIOWSjCBtZW1iZXJNb2RpZnkg5raI5oGv5Lit5Y+W5Ye65omA5pyJ5Y+C5LiO6YCa6K+d55qEIHVzZXJJZFxuICAgICAgICAgICAgICog6YGN5Y6GIGxpc3Qg5om+5Ye65omA5pyJIGhhbmd1cCDnmoQgc2VuZFVzZXJJZFxuICAgICAgICAgICAgICogICAgIOaAu+S6uuaVsCAtIOaMguaWreS6uuaVsCA+IDEgIOS4lOWJqeS9meS6uuaVsOWMheWQq+iHquW3se+8jOiupOS4uumAmuivneacquaMguaWrei/m+eKtuaAgeaculxuICAgICAgICAgICAgICogICAgIOaAu+S6uuaVsCAtIOaMguaWreS6uuaVsCA8PSAxIOmAmuivneaMguaWre+8jOi/m+emu+e6v+a2iOaBr+WkhOeQhuWZqFxuICAgICAgICAgICAgICogICAgIOS4u+WPq+ebtOaOpeaMguaWreS4lOWFtuS7luS6uuacquaOpeWQrOebtOaOpei/m+emu+e6v+WkhOeQhuWZqFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBpc1VuZmluaXNoZWRHcnBDYWxsOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgbGV0IGlzVW5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgbm9PbmVBY2NlcHQgPSB0cnVlO1xuICAgICAgICAgICAgICBsZXQgYWxsVXNlcklkcyA9IFtzZW5kZXJVc2VySWQsIC4uLmludml0ZVVzZXJJZHNdO1xuICAgICAgICAgICAgICBsZXQgaXNDYWxsZXJIdW5ndXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrTXNnTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiB0YXNrTXNnU2VuZGVyVXNlcklkLCBtZXNzYWdlVHlwZSB9ID0gdGFza01zZ0xpc3RbaV07XG4gICAgICAgICAgICAgICAgLy8g5Y+q6KaB6Ieq5bex5oyC5pat55u05o6l6Lez5Ye65b6q546v77yM6L+b56a757q/5raI5oGvXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCAmJiB0YXNrTXNnU2VuZGVyVXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5om+5Ye65omA5pyJ5oyC5pat55qE5Lq65ZGY77yM5Lul5Y+K6YCa6K+d5Y+R6LW36ICF5piv5ZCm5oyC5patXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgICAgICAgICAgICAgaXNDYWxsZXJIdW5ndXAgPSBzZW5kZXJVc2VySWQgPT09IHRhc2tNc2dTZW5kZXJVc2VySWQ7XG4gICAgICAgICAgICAgICAgICBhbGxVc2VySWRzID0gYWxsVXNlcklkcy5maWx0ZXIoKGlkKSA9PiB0YXNrTXNnU2VuZGVyVXNlcklkICE9PSBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOWIpOaWreaYr+WQpuaXoOS6uuaOpeWQrFxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQpIHtcbiAgICAgICAgICAgICAgICAgIG5vT25lQWNjZXB0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIOS4jeaYr+S4u+WPq+aMguaWreS4lOaXoOS6uuaOpeWQrO+8jOS4lOWJqeS9meS6uuaVsOWkp+S6jiAxXG4gICAgICAgICAgICAgIGlmICghKG5vT25lQWNjZXB0ICYmIGlzQ2FsbGVySHVuZ3VwKSAmJiBhbGxVc2VySWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpc1VuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBpc1VuZmluaXNoZWQ7XG4gICAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgJiYgKGlzVW5maW5pc2hlZFByaXZhdGVDYWxsIHx8IGlzVW5maW5pc2hlZEdycENhbGwpKSB7XG4gICAgICAgICAgICAgIHRhc2tNc2dMaXN0LmZvckVhY2godGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZywgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZsaW5lUmVjb3JkZXIub25SZWN2T2ZmbGluZU1zZ3ModGFza01zZ0xpc3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgJiYgdGhpcy5fZ2V0U3RhdGVNYWNoaW5lKGludml0ZUNhbGxJZCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZyhvZmZsaW5lQnVmZmVyc1swXS5tc2cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIHVuZXhjZXB0ZWQgb2ZmbGluZSBtc2cgLT4gJHtKU09OLnN0cmluZ2lmeShvZmZsaW5lQnVmZmVyc1swXS5tc2cpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmbGluZUJ1ZmZlcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG9mZmxpbmVCdWZmZXJzLmxlbmd0aCA+IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Zyo57q/5raI5oGv5aSE55CG6YC76L6RXG4gICAgICAgIGJ1ZmZlcnMuZm9yRWFjaCgoeyBtc2cgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuX29uUmVjdk9ubGluZUNhbGxNc2cobXNnISk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyDmib7lh7ogbXNnQnVmZmVyTGlzdCDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgY29uc3QgZGVsQ291bnQgPSBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+H55qE5raI5oGvXG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc3BsaWNlKDAsIGRlbENvdW50KTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYHRpbWVyIG9ubGluZSBtc2cgaGFuZGxlIC0+IGRlbENvdW50OiAke2RlbENvdW50fSBtc2dCdWZmZXJMaXN0OiAke3RoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RofWApO1xuICAgICAgfVxuICAgICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICB9LCAyMCk7XG4gIH1cblxuICByZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElNc2dMaXN0ZW5lcikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fd2F0Y2hlcnMsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQoY2FsbElkOiBzdHJpbmcsIGZ1bmNOYW1lOiBNc2dMaXN0ZW5lcktleXMsIGV2ZW50OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSBjYWxsSWQgKyBmdW5jTmFtZTtcbiAgICBzdXBlci5vbihldmVudFR5cGUsIGV2ZW50KTtcbiAgfVxuXG4gIHVucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudChjYWxsSWQ6IHN0cmluZykge1xuICAgIFsnb25SaW5naW5nJywgJ29uQWNjZXB0JywgJ29uSHVuZ3VwJywgJ29uTWVkaWFNb2RpZnknXS5mb3JFYWNoKChmdW5jTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRUeXBlID0gY2FsbElkICsgZnVuY05hbWU7XG4gICAgICBzdXBlci5yZW1vdmVBbGwoZXZlbnRUeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX3VzZXJJbmZvID0gdXNlckluZm87XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCBIElNIOa2iOaBr1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZENhbGxNZXNzYWdlKG9wdGlvbnM6IElDYWxsTXNnT3B0aW9uKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgbWVzc2FnZT86IElSZWNlaXZlZE1lc3NhZ2UgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIC0+IG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YCk7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgcHVzaFRpdGxlLCBwdXNoRGF0YSwgcHVzaENvbnRlbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2VuZE9wdHM6IElTZW5kTXNnT3B0aW9ucyA9IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIG1lc3NhZ2VUeXBlLFxuICAgICAgY29udGVudCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdCxcbiAgICB9O1xuXG4gICAgaWYgKFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSkpIHtcbiAgICAgIGNvbnN0IHB1c2hDb25pZmc6IElQdXNoQ29uZmlnID0ge1xuICAgICAgICBwdXNoVGl0bGU6IHB1c2hUaXRsZSB8fCAnJyxcbiAgICAgICAgcHVzaENvbnRlbnQ6IHB1c2hDb250ZW50IHx8ICcnLFxuICAgICAgICBwdXNoRGF0YTogcHVzaERhdGEgfHwgJycsXG4gICAgICAgIGFuZHJvaWRDb25maWc6IHtcbiAgICAgICAgICBjYXRlZ29yeUhXOiAnVk9JUCcsXG4gICAgICAgICAgY2F0ZWdvcnlWaXZvOiAnSU0nLFxuICAgICAgICB9LFxuICAgICAgICBpT1NDb25maWc6IHtcbiAgICAgICAgICBhcG5zQ29sbGFwc2VJZDogY29udGVudC5jYWxsSWQsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVQdXNoVGl0bGU6IGZhbHNlLFxuICAgICAgICBmb3JjZVNob3dEZXRhaWxDb250ZW50OiBmYWxzZSxcbiAgICAgICAgdGVtcGxhdGVJZDogJycsXG4gICAgICB9O1xuICAgICAgc2VuZE9wdHMucHVzaENvbmZpZyA9IHB1c2hDb25pZmc7XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5zZW5kTWVzc2FnZShjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZE9wdHMpO1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgZXJyb3IgLT4gY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogRW5naW5lRXJyb3JDb2RlVG9DYWxsRXJyb3JDb2RlW2NvZGVdIHx8IFJDQ2FsbEVycm9yQ29kZS5TRU5EX01TR19FUlJPUixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBtZXNzYWdlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB6YKA6K+35raI5oGvXG4gICAqL1xuICBhc3luYyBzZW5kSW52aXRlKG9wdGlvbnM6IElJbnZpdGVNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm9vbVR5cGUsIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCBpbnZpdGVVc2VySWRzLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIHNlbmRJbnZpdGUnLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgdGhpcy5fd2F0Y2hlcnMuc2VuZEFjY2VwdCAmJiB0aGlzLl93YXRjaGVycy5zZW5kQWNjZXB0KHsgY2FsbElkIH0pO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElJbnZpdGVNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJvb21UeXBlLFxuICAgICAgZXh0cmEsXG4gICAgICBlbmdpbmVUeXBlOiA0LFxuICAgICAgY2hhbm5lbEluZm86IHsgSWQ6IGNhbGxJZCwgS2V5OiAnJyB9LFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkcyxcbiAgICAgIG9ic2VydmVyVXNlcklkczogW10sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCA/IGludml0ZVVzZXJJZHMgOiBbdGFyZ2V0SWRdLFxuICAgICAgcHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQsXG4gICAgICBwdXNoRGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHVzZXJJZExpc3Q6IGludml0ZVVzZXJJZHMsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeS6uuWRmOWPmOabtOa2iOaBr1xuICAgKi9cbiAgYXN5bmMgc2VuZE1lbWViZXJNb2RpZnkob3B0aW9uczogSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgaW52aXRlVXNlcklkcywgY2FsbGVySWQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLCAvLyBUT0RPIOS4jiBJTSDkuIDoh7RcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5naW5lVHlwZTogNCxcbiAgICAgIGNoYW5uZWxJbmZvOiB7IElkOiBjYWxsSWQsIEtleTogJycgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZHMsXG4gICAgICBvYnNlcnZlclVzZXJJZHM6IFtdLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgICBjYWxsZXI6IGNhbGxlcklkLFxuICAgICAgbW9kaWZ5TWVtVHlwZTogTWVtYmVyTW9kaWZ5VHlwZS5BREQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3QsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIHB1c2hEYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgdXNlcklkTGlzdDogaW52aXRlVXNlcklkcyxcbiAgICAgICAgY2FsbElkLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5ZON6ZOD5raI5oGvXG4gICAqL1xuICBzZW5kUmluZ2luZyhvcHRpb25zOiBJUmluZ2luZ01zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSVJpbmdpbmdNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlkIzmhI/mjqXlkKzmtojmga9cbiAgICovXG4gIHNlbmRBY2NlcHQob3B0aW9uczogSUFjY2VwdE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJQWNjZXB0TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHmjILmlq3mtojmga9cbiAgICovXG4gIHNlbmRIdW5ndXAob3B0aW9uczogSUh1bmd1cE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHJlYXNvbiwgdXNlcklkcywgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJSHVuZ3VwTXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgcHVzaERhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2FsbElkLCByZWFzb24sXG4gICAgICB9KSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlqpLkvZPlj5jmm7Tmtojmga9cbiAgICovXG4gIHNlbmRNZWRpYU1vZGlmeShvcHRpb25zOiBJTWVkaWFNb2RpZnlNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lZGlhTW9kaWZ5TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxMYW5ndWFnZSB7XG4gIFpIID0gJ3poJyxcbiAgRU4gPSAnZW4nXG59XG4iLCJleHBvcnQgY29uc3QgRU4gPSB7XG4gIFB1c2hUaXRsZToge1xuICAgIEFVRElPOiAnWW91IGhhdmUgYSB2b2ljZSBjYWxsJyxcbiAgICBWSURFTzogJ1lvdSBoYXZlIGEgdmlkZW8gY2FsbCcsXG4gIH0sXG59O1xuIiwiZXhwb3J0IGNvbnN0IFpIID0ge1xuICBQdXNoVGl0bGU6IHtcbiAgICBBVURJTzogJ+aCqOacieS4gOadoemfs+mikemAmuivnScsXG4gICAgVklERU86ICfmgqjmnInkuIDmnaHop4bpopHpgJror50nLFxuICB9LFxufTtcbiIsImltcG9ydCB7IFJDQ2FsbExhbmd1YWdlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBFTiB9IGZyb20gJy4vZW4nO1xuaW1wb3J0IHsgWkggfSBmcm9tICcuL3poJztcblxuLyoqXG4gKiBDYWxsRW5naW5lIOWFqOWxgOivreiogOiuvue9ru+8jOW9k+WJjeS7heaUr+aMgeS4reOAgeiLseaWh1xuICovXG5leHBvcnQgY2xhc3MgTG9jYWwge1xuICBzdGF0aWMgX2xhbmc6IFJDQ2FsbExhbmd1YWdlID0gUkNDYWxsTGFuZ3VhZ2UuWkhcblxuICBzdGF0aWMgc2V0KGxhbmc6IFJDQ2FsbExhbmd1YWdlKSB7XG4gICAgdGhpcy5fbGFuZyA9IGxhbmc7XG4gIH1cblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIGlmICh0aGlzLl9sYW5nID09PSBSQ0NhbGxMYW5ndWFnZS5FTikge1xuICAgICAgcmV0dXJuIEVOO1xuICAgIH1cbiAgICByZXR1cm4gWkg7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBDb252ZXJzYXRpb25UeXBlLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsU3RhdGVNYWNoaW5lIH0gZnJvbSAnLi9jb3JlL1N0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSU1lZGlhTW9kaWZ5SW5mbywgSU1lbWJlck1vZGlmeUluZm8sIElTZW5kZXJJbmZvLCBJU3RhdGVDaGFuZ2VJbmZvLCBJVXNlclByb2ZpbGUsIElVc2VyU3RhdGVDaGFuZ2VJbmZvLCBJVXNlckRhdGEsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7IFJDQ2FsbEVycm9yQ29kZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxVc2VyU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvblN0YXRlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxFbmRSZWFzb24gfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsRW5kUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbE1lZGlhVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgQ2FsbE1lc3NhZ2VIYW5kbGVyIH0gZnJvbSAnLi9jb3JlL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IGV2ZW50RW1pdHRlciwgZ2VuZXJhdGVSYW5kb21JZCwgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBJQ2FsbEVuZ2luZU9wdGlvbnMsIElDYWxsRW5naW5lV2F0Y2hlcnMgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJSW52aXRlTXNnQ29udGVudCB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQgeyBMb2NhbCB9IGZyb20gJy4vY29yZS9sb2NhbGUnO1xuaW1wb3J0IHsgSU9mZmxpbmVSZWNvcmQgfSBmcm9tICcuL2NvcmUvT2ZmbGluZVJlY29yZGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0Nyb3NzQ2FsbFR5cGUnO1xuXG5jbGFzcyBSQ0NhbGxFbmdpbmUge1xuICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IHsgW2NhbGxJZDogc3RyaW5nXTogUkNDYWxsU3RhdGVNYWNoaW5lIH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxNc2dIYW5kbGVyOiBDYWxsTWVzc2FnZUhhbmRsZXJcblxuICAvKipcbiAgICog5Yid5aeL5YyWXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBlbmdpbmUgUGxndWluQ29udGV4dCDlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIC8qKlxuICAgICAqIOi/kOihjOaXtuebuOWFs1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSDml6Xlv5fmqKHlnZflrp7kvovvvIznlLEgQ2FsbExpYiDlsYLliJ3lp4vljJZcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOebkeWQrOaWueazlVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3dhdGNoZXJzOiBJQ2FsbEVuZ2luZVdhdGNoZXJzLFxuICAgIC8qKlxuICAgICAqIOWFtuS7lumFjee9rumhuVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IElDYWxsRW5naW5lT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIFZlcnNpb246ICR7X19WRVJTSU9OX199IENvbW1pdElkOiAke19fQ09NTUlUX0lEX199YCk7XG4gICAgLy8g6K6+572uIERldmljZUlkXG4gICAgZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDnm5HlkKwgSU0g5raI5oGvXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIgPSBuZXcgQ2FsbE1lc3NhZ2VIYW5kbGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwgdGhpcy5fb3B0aW9ucy5vZmZsaW5lTXNnSXR2LCB0aGlzLl9nZXRTdGF0ZU1hY2hpbmUuYmluZCh0aGlzKSk7XG4gICAgLy8g5rOo5YaM5raI5oGv5qih5Z2X55uR5ZCsXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJFdmVudExpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgc2VuZEFjY2VwdDogdGhpcy5faGFuZGxlU2VuZEFjY2VwdC5iaW5kKHRoaXMpLFxuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQsXG4gICAgfSk7XG4gICAgLy8g55uR5ZCs54q25oCB5py65YWz6ZetXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdvblN0YXRlTWFjaGluZUNsb3NlJywgKGNhbGxJZDogc3RyaW5nKSA9PiB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgfSk7XG4gICAgLy8g6K6+572u6K+t6KiAXG4gICAgTG9jYWwuc2V0KF9vcHRpb25zLmxhbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25JbnZpdGUobXNnOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIHNlbmRlclVzZXJJZDogc3VpZCwgcHVzaENvbmZpZyxcbiAgICB9ID0gbXNnO1xuICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYFJDQ2FsbEVuZ2luZSBfb25JbnZpdGU6dGFyZ2V0SWQgJHt0YXJnZXRJZH0gc2VuZGVyVXNlcklkOiAke3N1aWR9YCk7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWFUeXBlLCBjYWxsSWQsIGV4dHJhLCByb29tVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJSW52aXRlTXNnQ29udGVudDtcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlICE9PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBzZW5kZXJVc2VySWQgPSBzdWlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBjb25zdCBjcnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpID09PSBzZW5kZXJVc2VySWQpIHsgLy8g5aSa56uv5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog576k6IGK6YCa6K+d5pyJ5YW25LuW56uv5aSE55CG5pe277yM5LiN5YaN5aSE55CG5q2k6YCa6K+d5Lit55qE6YKA6K+35raI5oGvXG4gICAgICog5p2h5Lu2MTog5q2k5Lq65bey6KKr6YKA6K+36YCa6K+dXG4gICAgICog5p2h5Lu2Mjog5pys56uv5peg5q2k6YCa6K+d55qE54q25oCB5py6XG4gICAgICovXG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgY29uc3QgaXNLZWVwaW5nID0gY29udGVudC5leGlzdGVkVXNlclBvZmlsZXMuc29tZSgoaXRlbTogeyB1c2VySWQ6IHN0cmluZyB9KSA9PiAoaXRlbS51c2VySWQgPT09IGNydFVzZXJJZCkpO1xuICAgICAgaWYgKGlzS2VlcGluZyAmJiAhdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlTWFjaGluZSA9IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdO1xuICAgIGlmICghc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICAgIGNoYW5uZWxJZCEsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgICk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsRW5naW5lXSBSQ0NhbGxTdGF0ZU1hY2hpbmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgLT4gY2FsbElkOiAke2NhbGxJZH1gKTtcblxuICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSkge1xuICAgICAgICAvLyDnirbmgIHmnLrlhoXpg6jlpITnkIYgaW52aXRlIOa2iOaBr1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uSW52aXRlKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uTWVtYmVyTW9kaWZ5KG1zZyk7XG4gICAgICB9XG4gICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSh0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSwgZXh0cmEpO1xuXG4gICAgICBjb25zdCBoYXNPdGhlclN0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkuZmlsdGVyKChvdGhlckNhbGxJZCkgPT4gY2FsbElkICE9PSBvdGhlckNhbGxJZCkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChoYXNPdGhlclN0YXRlTWFjaGluZSAmJiAhKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwgfHwgZmFsc2UpKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9faGFuZGxlSW52aXRlSW5TZXNzaW9uKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0pIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5YWB6K645o6l5ZCs5paw55qE6YCa6K+d5pe277yM5o6l5ZCs5a6M5paw55qE6YCa6K+d5ZCO77yM5oyC5pat5YW25LuW6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVTZW5kQWNjZXB0KGluZm86IHsgY2FsbElkOiBzdHJpbmcgfSkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dBY2NlcHROZXdDYWxsKSB7XG4gICAgICBjb25zdCB7IGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc3RhdGVNYWNoaW5lKSB7XG4gICAgICAgIGlmIChjYWxsSWQgIT09IGlkKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXS5odW5ndXAoKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlueKtuaAgeaculxuICAqL1xuICBwcml2YXRlIF9nZXRTdGF0ZU1hY2hpbmUoY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM55So5oi35L+h5oGvLCDlj5HpgIEgY2FsbCDmtojmga/ml7bnlKjmiLfkv6Hmga/mkLrluKZcbiAgICovXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSByZWdpc3RlclVzZXJJbmZvIC0+IHVzZXJJbmZvOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJbmZvKX1gKTtcblxuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyVXNlckluZm8odXNlckluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvFxuICAgKiBAcGFyYW0gY2hhbm5lbElkIOe7hOe7hyBJRFxuICAgKiBAcGFyYW0gdGFyZ2V0SWQgIOWvueaWuSBJRFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIGNhbGwoXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IG51bWJlcixcbiAgICBleHRyYTogc3RyaW5nID0gJycsXG4gICAgcHVzaFRpdGxlOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29udGVudDogc3RyaW5nID0gJycsXG4gICAgaXNDcm9zc0FwcGtleSA9IGZhbHNlLFxuICApOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzdGF0ZU1hY2hpbmU/OiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSBjYWxsIC0+IGFyZ3M6ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9KX1gKTtcbiAgICBjb25zdCBjYWxsSWQgPSBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgY29uc3QgaGFzU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNTdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVEFURV9NQUNISU5FX0VYSVQgfTtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0gPSBuZXcgUkNDYWxsU3RhdGVNYWNoaW5lKFxuICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIENvbnZlcnNhdGlvblR5cGUuUFJJVkFURSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgY2FsbElkLFxuICAgICk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX2NhbGwoW3RhcmdldElkXSwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsIGlzQ3Jvc3NBcHBrZXkpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsXG4gICAgICAgIHN0YXRlTWFjaGluZTogdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog576k5ZG8XG4gICAqIEBwYXJhbSBjaGFubmVsSWQg57uE57uHIElEXG4gICAqIEBwYXJhbSB0YXJnZXRJZCAg576k57uEIElEXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+S6uuWRmOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIGNhbGxJbkdyb3VwKFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgbWVkaWFUeXBlOiBudW1iZXIsXG4gICAgdXNlcklkczogc3RyaW5nW10sXG4gICAgZXh0cmE6IHN0cmluZyA9ICcnLFxuICAgIHB1c2hUaXRsZTogc3RyaW5nID0gJycsXG4gICAgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnLFxuICApOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzdGF0ZU1hY2hpbmU/OiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSBjYWxsSW5Hcm91cCAtPiBhcmdzOiAke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5HUk9VUCxcbiAgICAgIHRhcmdldElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgY2FsbElkLFxuICAgICk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX2NhbGwodXNlcklkcywgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsXG4gICAgICAgIHN0YXRlTWFjaGluZTogdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6ZSA5q+B5b2T5YmN55qE54q25oCB5py6XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsRW5naW5lXSBkZXN0cm95Jyk7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lID0ge307XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUkNDYWxsRW5naW5lLFxuICBSQ0NhbGxTdGF0ZU1hY2hpbmUsIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbEVuZFJlYXNvbixcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxMYW5ndWFnZSxcbn07XG5cbmV4cG9ydCB0eXBlIHtcbiAgSUNhbGxTdGF0ZU1hY2hpbmVXYXRjaGVycywgSUVuZFN1bW1hcnksXG4gIElDYWxsRW5naW5lV2F0Y2hlcnMsXG4gIElVc2VyU3RhdGVDaGFuZ2VJbmZvLFxuICBJU3RhdGVDaGFuZ2VJbmZvLFxuICBJU2VuZGVySW5mbyxcbiAgSU1lbWJlck1vZGlmeUluZm8sXG4gIElNZWRpYU1vZGlmeUluZm8sXG4gIElJbnZpdGVkVXNlcnMsXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJQcm9maWxlLFxuICBJT2ZmbGluZVJlY29yZCxcbiAgSUludml0ZU9wdGlvbnMsXG59O1xuIiwiLyoqXG4gKiDkuqfnlJ9zZXNzaW9u55qE5Zy65pmvXG4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y2VUeXBlcyB7XG4gIC8qKlxuICAgKiDkuLvlj6tcbiAgICovXG4gIENBTExFUiA9IDEsXG5cbiAgLyoqXG4gICAqIOiiq+WPq1xuICAgKi9cbiAgQ0FMTEVFID0gMlxufVxuIiwiY2xhc3MgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsaXN0OiB7W3Byb3BOYW1lOiBzdHJpbmddOiBhbnlbXX0gPSB7fVxuXG4gIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBmdW46KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICAodGhpcy5saXN0W2V2ZW50XSB8fCAodGhpcy5saXN0W2V2ZW50XSA9IFtdKSkucHVzaChmdW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuOihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgY29uc3Qgb24gPSAoZGF0YT86YW55KSA9PiB7XG4gICAgICB0aGlzLm9mZihldmVudCwgb24pO1xuICAgICAgZnVuLmNhbGwodGhpcywgZGF0YSk7XG4gICAgfTtcbiAgICBvbi5mdW4gPSBmdW47XG4gICAgdGhpcy5vbihldmVudCwgb24pO1xuICB9XG5cbiAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBmdW4/OihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgY29uc3QgZnVucyA9IHRoaXMubGlzdFtldmVudF07XG4gICAgaWYgKCFmdW5zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZnVuKSB7XG4gICAgICAvLyDlpoLmnpzmsqHmnInkvKAgZm4g55qE6K+d77yM5bCx5Lya5bCGIGV2ZW50IOWAvOWvueW6lOe8k+WtmOWIl+ihqOS4reeahCBmdW4g6YO95riF56m6XG4gICAgICBmdW5zICYmIChmdW5zLmxlbmd0aCA9IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDoi6XmnIkgZnVu77yM6YGN5Y6G57yT5a2Y5YiX6KGo77yM55yL55yL5Lyg5YWl55qEIGZuIOS4juWTquS4quWHveaVsOebuOWQjO+8jOWmguaenOebuOWQjOWwseebtOaOpeS7jue8k+WtmOWIl+ihqOS4reWIoOaOieWNs+WPr1xuICAgICAgbGV0IGNiO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIHsgbGVuZ3RoIH0gPSBmdW5zOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2IgPSBmdW5zW2ldO1xuICAgICAgICBpZiAoY2IgPT09IGZ1biB8fCBjYi5mdW4gPT09IGZ1bikge1xuICAgICAgICAgIGZ1bnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgZGF0YT86YW55KSB7XG4gICAgLy8g56ys5LiA5Liq5Y+C5pWw5piv5a+55bqU55qEIGV2ZW50IOWAvO+8jOebtOaOpeeUqOaVsOe7hOeahCBzaGlmdCDmlrnms5Xlj5blh7pcbiAgICBjb25zdCBmdW5zID0gWy4uLnRoaXMubGlzdFtldmVudF1dO1xuXG4gICAgLy8g5aaC5p6c57yT5a2Y5YiX6KGo6YeM5rKh5pyJIGZ1biDlsLHov5Tlm54gZmFsc2VcbiAgICBpZiAoIWZ1bnMgfHwgZnVucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8g6YGN5Y6GIGV2ZW50IOWAvOWvueW6lOeahOe8k+WtmOWIl+ihqO+8jOS+neasoeaJp+ihjCBmblxuICAgIGZ1bnMuZm9yRWFjaCgoZnVuKSA9PiB7XG4gICAgICBmdW4uY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXZlbnRFbWl0dGVyLFxufTtcbiIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgRXZlbnRFbWl0dGVyKCk7XG4iLCJpbXBvcnQgeyBSVENKb2luVHlwZSwgTG9nTCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZXNvbHV0aW9uIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHtcbiAgSVNlc3Npb25MaXN0ZW5lciwgSVJDQ2FsbEluaXRPcHRpb25zLCBJVmFsaWRhdGlvblJlc3VsdCwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmZ1bmN0aW9uIGlzTGFuZ3VhZ2UodmFsOiBzdHJpbmcpIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IE9iamVjdC52YWx1ZXMoUkNDYWxsTGFuZ3VhZ2UpO1xuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmZ1bmN0aW9uIGlzSm9pblR5cGUodmFsOiBudW1iZXIpIHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhSVENKb2luVHlwZSkgYXMgbnVtYmVyW107XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModmFsKTtcbn1cblxuZnVuY3Rpb24gaXNMb2dMZXZlbCh2YWw6IG51bWJlcikge1xuICByZXR1cm4gW0xvZ0wuREVCVUcsIExvZ0wuSU5GTywgTG9nTC5XQVJOLCBMb2dMLkVSUk9SXS5pbmNsdWRlcyh2YWwpO1xufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgPSAob3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG4gIGNvbnN0IGtleU5hbWVzOiBzdHJpbmdbXSA9IFsncnRjQ2xpZW50JywgJ29uU2Vzc2lvbicsICdvblNlc3Npb25DbG9zZSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAvLyDmoKHpqozloavpobnmmK/lkKbpg73ljIXlkKvvvIzlpoLmnpzlk6rkuKrkuI3ljIXlkKvlsLHmlLbpm4botbfmnaVcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8g5aaC5p6c57y65bCR5b+F5aGr55qE55uR5ZCs5Ye95pWw5oiW5a+56LGhXG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5ydGNDbGllbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5vblNlc3Npb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25cXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25DbG9zZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqGaXNBbGxvd1N1YnNjcmliZVJldHJ5IOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5ICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc0FsbG93U3Vic2NyaWJlUmV0cnlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd1B1Ymxpc2hSZXRyeVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JUQ0pvaW5UeXBl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5qb2luVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzSm9pblR5cGUob3B0aW9ucy5qb2luVHlwZSEpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnam9pblR5cGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JDQ2FsbExhbmd1YWdl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sYW5nICE9PSAndW5kZWZpbmVkJyAmJiAhaXNMYW5ndWFnZShvcHRpb25zLmxhbmchKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xhbmdcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwgIT09ICd1bmRlZmluZWQnICYmICFpc0xvZ0xldmVsKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwhKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ091dHB1dExldmVsXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiDmoKHpqoxyZWdpc3RlclNlc3Npb25MaXN0ZW5lcuWPguaVsFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnbGlzdGVuZXIgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cbiAgY29uc3Qga2V5TmFtZXM6IHN0cmluZ1tdID0gWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25UcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25SaW5naW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25SaW5naW5nXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkFjY2VwdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uQWNjZXB0XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkh1bmd1cCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uSHVuZ3VwXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vblRyYWNrUmVhZHkgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvblRyYWNrUmVhZHlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVRhcmdldElkID0gKHRhcmdldElkOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0YXJnZXRJZCAmJiB0eXBlb2YgdGFyZ2V0SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndGFyZ2V0SWRcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFUeXBlID0gKG1lZGlhVHlwZTogbnVtYmVyKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gfHwgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdtZWRpYVR5cGVcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnUkNDYWxsTWVkaWFUeXBlXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUV4dHJhID0gKGV4dHJhOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgZXh0cmEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZXh0cmFcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaFRpdGxlID0gKHB1c2hUaXRsZTogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIHB1c2hUaXRsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoVGl0bGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbnRlbnQgPSAocHVzaENvbnRlbnQ6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwdXNoQ29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoQ29udGVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb25maWcgPSAocHVzaENvbmZpZzogSVB1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJyB9ID0gcHVzaENvbmZpZztcbiAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFtdO1xuICBjb25jbHVzaW9uLnB1c2godmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlKSk7XG4gIGNvbmNsdXNpb24ucHVzaCh2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50KSk7XG4gIHJldHVybiBjb25jbHVzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVXNlcklkcyA9ICh1c2VySWRzOiBzdHJpbmdbXSk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJJZHMpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMuZXZlcnkoKHN0cikgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuXG5mdW5jdGlvbiBpc1JDRnJhbWVSYXRlKHZhbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFycnMgPSBbJ0ZQU18xMCcsICdGUFNfMTUnLCAnRlBTXzI0JywgJ0ZQU18zMCddO1xuICByZXR1cm4gYXJycy5pbmNsdWRlcyh2YWwpO1xufVxuXG5jb25zdCBpc1ZhbGlkUmVzb2x1dGlvbiA9IChyZXNvbHV0aW9uPzogUkNSZXNvbHV0aW9uKTogYm9vbGVhbiA9PiAhIVJDUmVzb2x1dGlvbltyZXNvbHV0aW9uIV07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMgPSAoY29uc3RyYWludHM6IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5taWNwaG9uZUlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5zYW1wbGVSYXRlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ251bWJlclxcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICAvLyBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3VzZXInICYmIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAnZW52aXJvbm1lbnQnKSB7XG4gIC8vICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSAgXFwndXNlclxcJyBvciBcXCdlbnZpcm9ubWVudFxcJycgfVxuICAvLyB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzUkNGcmFtZVJhdGUoY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2ZyYW1lUmF0ZVxcJyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAndW5kZWZpbmVkJyAmJiAhaXNWYWxpZFJlc29sdXRpb24oY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbikpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdyZXNvbHV0aW9uXFwnIHZhbHVlIGlzIG91dCBvZiByYW5nZScgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgKCFjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgfHwgIWNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24pKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncmVzb2x1dGlvblxcJyBhbmQgXFwncmVzb2x1dGlvblxcJyBpcyByZXF1aXJlZCcgfTtcbiAgfVxuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIFRpbWVyIHtcbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgc3RvcCgpOiB7XG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgZW5kVGltZTogbnVtYmVyLFxuICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICB9IHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG5cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZHVyYXRpb24gPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUgPT09IDApIHtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgICBlbmRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnZlcnNhdGlvblR5cGUsIElMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJTWVkaWFNb2RpZnlJbmZvLFxuICBJTWVtYmVyTW9kaWZ5SW5mbyxcbiAgSVNlbmRlckluZm8sXG4gIElTdGF0ZUNoYW5nZUluZm8sXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJTdGF0ZUNoYW5nZUluZm8sXG4gIElJbnZpdGVPcHRpb25zLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbFN0YXRlTWFjaGluZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIFJDS2lja1JlYXNvbixcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZUF1ZGlvVHJhY2ssXG4gIFJDUmVtb3RlVHJhY2ssXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNSVENQaW5nUmVzdWx0LFxuICBSQ1JUQ1Jvb20sXG4gIElNaWNwaG9uZUF1ZGlvUHJvZmlsZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHsgUHJvZHVjZVR5cGVzIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmltcG9ydCB7XG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLFxuICBJTXV0ZVVzZXIsXG4gIElSQ0NhbGxTZXNzaW9uT3B0aW9ucyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVMaXN0ZW5lciwgdmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCB2YWxpZGF0ZVVzZXJJZHMsIHZhbGlkYXRlRXh0cmEsIHZhbGlkYXRlUHVzaFRpdGxlLCB2YWxpZGF0ZVB1c2hDb250ZW50LFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tICcuL3RpbWVyJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFNlc3Npb24ge1xuICAvKipcbiAgICogUlRD5oi/6Ze05a6e5L6LXG4gICAqL1xuICBwcml2YXRlIF9yb29tITogUkNSVENSb29tXG5cbiAgLyoqXG4gICAqIOeUqOaIt+S8oOi/m+adpeeahCDlr7lzZXNzaW9u55qE55uR5ZCsICjopoHlnKhSQ0NhbGxDbGllbnTnmoRfb25JbnZpdGXph4zliKTmlq3vvIzopoHmsYLmiafooYzlroxvblNlc3Npb27lv4Xpobvms6jlhoxzZXNzaW9u55qE55uR5ZCs77yM5omA5Lul6L+Z6YeM5pivcHVibGljKVxuICAgKi9cbiAgcHVibGljIF9saXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJUQ+iuoumYheOAgeWPkeW4g+mHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfUkVUUllDT1VOVDogbnVtYmVyID0gMlxuXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7Tlrprml7blmahcbiAgICovXG5cbiAgcHJpdmF0ZSBqb2luUm9vbVRpbWVyOiBhbnkgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoXG5cbiAgICAvKipcbiAgICAgKiDnirbmgIHmnLrlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSxcblxuICAgIC8qKlxuICAgICAqIHJ0Y+WunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnQsXG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG5cbiAgICAvKipcbiAgICAgKiBzZXNzaW9u55qE5YW25a6D6YCJ6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbFNlc3Npb25PcHRpb25zID0ge30sXG5cbiAgKSB7XG4gICAgLy8g55uR5ZCs54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOaIt+eKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtIGluZm9cbiAgICAgICAqL1xuICAgICAgb25Vc2VyU3RhdGVDaGFuZ2U6ICh7IHVzZXIsIHJlYXNvbiB9OiBJVXNlclN0YXRlQ2hhbmdlSW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJTdGF0ZUNoYW5nZV0gdXNlcklkLT4ke3VzZXI/LnVzZXJJZH0gc3RhdGUtPiR7dXNlcj8uc3RhdGV9IHJlYXNvbi0+JHtyZWFzb259YCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtXG4gICAgICAgKi9cbiAgICAgIG9uU3RhdGVDaGFuZ2U6IGFzeW5jIChpbmZvOiBJU3RhdGVDaGFuZ2VJbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHJlYXNvbiB9ID0gaW5mbztcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gOiBzdGF0ZS0+JHtzdGF0ZX0gcmVhc29uLT4ke3JlYXNvbn1gKTtcblxuICAgICAgICAvLyDlpoLmnpzlnKjpgJror53kuK3vvIzlsLHliqDmiL/pl7RcbiAgICAgICAgaWYgKHN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIGNvbnN0IHJvb21JZDogc3RyaW5nID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIHJvb21JZDogJHtyb29tSWR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fam9pblJvb20ocm9vbUlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIGpvaW5Sb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAg5Lul5LiL5LiJ5p2h5Y+q6KaB5ruh6Laz5LiA5p2h77yM54q25oCB5Lya5Y+Y5oiQUkNDYWxsU2Vzc2lvblN0YXRlLkVORFxuICAgICAgICAgICAqICAx44CB5pys56uv55So5oi36Ieq5bex5Li75Yqo5oyC5patXG4gICAgICAgICAgICogIDLjgIHmnI3liqHnq6/miormnKznq6/nlKjmiLfouKLlh7pSVEPmiL/pl7RcbiAgICAgICAgICAgKiAgM+OAgeaIv+mXtOmHjOWwj+S6jjLkuKrkurpcbiAgICAgICAgICAgKi9cbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIC8vIOi/mOacquWKoOWFpeaIv+mXtOWwseaMguaWrVxuICAgICAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g6ZSA5q+B5pys5Zyw5rWB77yM5YWz6Zet5pGE5YOP5aS0XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KCk7XG4gICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gbG9jYWxUcmFja3MgZGVzdHJveWVkJyk7XG4gICAgICAgICAgdGhpcy5fbGVhdmVSb29tKCk7XG4gICAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw5ZON6ZODXG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBvblJpbmdpbmc6IChzZW5kZXI6IElTZW5kZXJJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uUmluZ2luZ11zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l55So5oi35ZON6ZODXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUmluZ2luZyhzZW5kZXIsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblJpbmdpbmddIG1ldGhvZCBleGNlcHRpb24gLT4gb25SaW5naW5nJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICAgKiDlvZPov5znq6/nlKjmiLflkIzmhI/mjqXlkKxcbiAgICAgICAgICovXG4gICAgICBvbkFjY2VwdDogKHNlbmRlcjogSVNlbmRlckluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjqXlkKxcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BY2NlcHQoc2VuZGVyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdIG1ldGhvZCBleGNlcHRpb24gLT4gb25BY2NlcHQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgICAqIOW9k+aciei/nOerr+eUqOaIt+aMguaWrVxuICAgICAgICAgKi9cbiAgICAgIG9uSHVuZ3VwOiAoc2VuZGVyOiBJU2VuZGVySW5mbywgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25IdW5ndXBdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH0gcmVhc29uLT4ke3JlYXNvbn1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjILmlq1cbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25IdW5ndXAoc2VuZGVyLCByZWFzb24sIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbkh1bmd1cF0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbkh1bmd1cCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOS6uuWRmOWPmOabtFxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZW1iZXJNb2RpZnk6ICh7IHNlbmRlciwgaW52aXRlZFVzZXJzIH06IElNZW1iZXJNb2RpZnlJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uTWVtYmVyTW9kaWZ5XSBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XnlKjmiLfkurrlkZjlj5jmm7RcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25NZW1iZXJNb2RpZnkoc2VuZGVyLCBpbnZpdGVkVXNlcnMsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lbWJlck1vZGlmeV0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbk1lbWJlck1vZGlmeScpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmAmuivneexu+Wei+WPmOabtCAo6YCa6K+d6ZmN57qnKVxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZWRpYU1vZGlmeTogKHsgc2VuZGVyLCBtZWRpYVR5cGUgfTogSU1lZGlhTW9kaWZ5SW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgICAgIC8vIOi/nOerr+aUtuWIsOmAmuivnemZjee6p+mAmuefpeWQju+8jOi/nOerr+aJp+ihjOmZjee6p+mAmuivnSjkuI3lj5Hmtojmga8pXG4gICAgICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uTWVkaWFNb2RpZnkoc2VuZGVyLCBtZWRpYVR5cGUsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uTWVkaWFNb2RpZnknKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm6LeoYXBwa2V5XG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBjcm9zc0FwcGtleTogKGlzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gY3Jvc3NBcHBrZXldIOaYr+WQpui3qCBhcHBrZXk6ICR7aXNDcm9zc0FwcGtleX1gKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7mjILmlq3nmoTmjqjpgIHkv6Hmga9cbiAgICAgKi9cbiAgICBjb25zdCB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfSA9IHRoaXMuX29wdGlvbnMuaHVuZ3VwUHVzaENvbmZpZyE7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnNldEh1bmd1cFB1c2hDb25maWcocHVzaFRpdGxlLCBwdXNoQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICogIOWKoOWFpeaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfam9pblJvb20ocm9vbUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBsZXQgY2FsbEJhY2s7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuaXNDcm9zc0FwcGtleSkge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luQ3Jvc3NSVENSb29tKHJvb21JZCwgdGhpcy5fb3B0aW9ucy5qb2luVHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbShyb29tSWQsIHRoaXMuX29wdGlvbnMuam9pblR5cGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvZGUsIHVzZXJJZHMsIHJvb20gfSA9IGNhbGxCYWNrO1xuXG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAgICAgIGlmIChjb2RlID09PSBSQ1JUQ0NvZGUuTk9UX09QRU5fVklERU9fQVVESU9fU0VSVkVSKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNFUlZJQ0VfTk9UX09QRU5FRCk7XG4gICAgICAgICAgLy8g5bex5pa55YW25LuW56uv5bey5Zyo6YCa6K+d5LitXG4gICAgICAgIH0gaWYgKGNvZGUgPT09IFJDUlRDQ29kZS5TSUdOQUxfSk9JTl9SVENfUk9PTV9SRUZVU0VEKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9JTl9DQUxMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IF9qb2luUm9vbV0gam9pbiByb29tIGZhaWxlZDogcm9vbUlkIC0+ICR7cm9vbUlkfSBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICog576k6IGK5pys56uv5Yqg5YWl5oi/6Ze05ZCO77yM5pu05paw5Lq65ZGY54q25oCB5Li66YCa6K+d5LitXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvblR5cGUgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q29udmVyc2F0aW9uVHlwZSgpO1xuICAgICAgY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCAmJiB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4oW3RoaXMuX3J0Y0NsaWVudC5nZXRDdXJyZW50SWQoKV0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIOmSiOWvueengeacieS6kSBAcm9uZ2Nsb3VkL3BsdWdpbi1ydGNANS4xLjEwLWVudGVycHJpc2UuNyDlop7liqDooaXkuIHvvIxcbiAgICAgICAqIOengeacieS6keWNh+WujCBSVEMgc2RrIOeJiOacrOWQjuWIoOaOieatpOihpeS4gVxuICAgICAgICog5Yqg5a6M5oi/6Ze05ZCO77yM5a+55pa55oyC5pat5LqG77yM6ZyA6YCA5Ye65oi/6Ze0XG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3RhdGUoKSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHJvb20hKTtcbiAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOiiq+WPq+aWueWKoOWFpeaIv+mXtOaIkOWKn++8jOS9huS4u+WPq+aWueWcqOWKoOWFpeaIv+mXtOWJjeemu+e6v1xuICAgICAgaWYgKHVzZXJJZHMhLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhpcy5qb2luUm9vbVRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IpO1xuICAgICAgICB9LCA2MDAwMCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yb29tID0gcm9vbSBhcyBSQ1JUQ1Jvb207XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9ydGNDbGllbnQuam9pblJUQ1Jvb20gdGhyb3cgZXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS4iuazqOWGjOebkeWQrOS6i+S7tlxuICAgIHRoaXMuX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKTtcblxuICAgIC8vIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgIHRoaXMuX3JlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDorqLpmIXov5znqIvnmoTmtYHvvIzmiorov5znqIvnmoTmtYHmipvnu5nnlKjmiLdcbiAgICAgIGF3YWl0IHRoaXMuX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOe7k+adn+mAmuivnXNlc3Npb25cbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5TVUJTQ1JJQkVfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9qb2luUm9vbV0gX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrIEV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8g5b6A5oi/6Ze06YeM5Y+R5biD5pys5Zyw6LWE5rqQXG4gICAgICBhd2FpdCB0aGlzLl9wdWJsaXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOe7k+adn+mAmuivnXNlc3Npb25cbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5QVUJMSVNIX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9wdWJsaXNoIEV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiAo5Yid5aeL5YyW5oi/6Ze055qE5pe25YCZKSDorqLpmIXov5znqIvnmoTmtYHvvIzmiorov5znqIvnmoTmtYHmipvnu5nnlKjmiLdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrKCkge1xuICAgIC8vIOiOt+WPluaJgOaciei/nOeoi+W3suWPkeW4g+eahOmfs+inhumikei1hOa6kOWIl+ihqFxuICAgIGNvbnN0IHRyYWNrczogUkNSZW1vdGVUcmFja1tdID0gdGhpcy5fcm9vbS5nZXRSZW1vdGVUcmFja3MoKTtcbiAgICBpZiAodHJhY2tzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdWJzY3JpYmVSZXRyeSh0cmFja3MsIHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LCB0aGlzLl9SRVRSWUNPVU5UKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SKTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFja10gUmVzb3VyY2Ugc3Vic2NyaXB0aW9uIGZhaWxlZCByb29tSWQgLT4gJHt0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCl9IFJUQyBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y+v5Lul6YeN6K+V55qE6K6i6ZiFXG4gICAqIEBwYXJhbSBwYXJhbXMudHJhY2tzIHRyYWNrc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSDmmK/lkKblhYHorrjph43or5VcbiAgICogQHBhcmFtIHBhcmFtcy5jb3VudCDlhYHorrjph43or5XnmoTmrKHmlbBcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3N1YnNjcmliZVJldHJ5KHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IGJvb2xlYW4gPSBmYWxzZSwgY291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPHsgY29kZTogUkNSVENDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20uc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1N1YnNjcmliZUZhaWwgJiYgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tTdWJzY3JpYmVGYWlsKGNvZGUsIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uXSBfbGlzdGVuZXIub25UcmFja1N1YnNjcmliZUZhaWwgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzkuI3lhYHorrjph43or5XvvIznm7TmjqXov5Tlm55cbiAgICAgIGlmICghaXNBbGxvd1N1YnNjcmliZVJldHJ5KSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY291bnQtLTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZVJldHJ5KHRyYWNrcywgaXNBbGxvd1N1YnNjcmliZVJldHJ5LCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HluIPmnKzlnLDotYTmupDnmoTpgLvovpFcbiAgICpcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3B1Ymxpc2goKSB7XG4gICAgY29uc3QgdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyE7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9wdWJsaXNoUmV0cnkodHJhY2tzLCB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksIHRoaXMuX1JFVFJZQ09VTlQpO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUFVCTElTSF9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBfcHVibGlzdF0gUmVzb3VyY2UgcHVibGlzaGluZyBmYWlsZWQ6IHJvb21JZCAtPiAke3RoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKX0gUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/kuLvliqjlj5HotbfnmoTlkbzlj6vvvIzlt7Lmj5DliY3mipvlh7rkuobotYTmupAsIOiiq+WKqOWRvOWPq++8jOi/memHjOaJjemcgOimgeaKm+WHulxuICAgIGlmICh0aGlzLl9vcHRpb25zLnByb2R1Y2VUeXBlID09PSBQcm9kdWNlVHlwZXMuQ0FMTEVFKSB7XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYEsIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkodHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y+v5Lul6YeN6K+V55qE5Y+R5biDXG4gICAqIEBwYXJhbSBwYXJhbXMudHJhY2tzIHRyYWNrc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlzQWxsb3dQdWJsaXNoUmV0cnkg5piv5ZCm5YWB6K646YeN6K+VXG4gICAqIEBwYXJhbSBwYXJhbXMuY291bnQg5YWB6K646YeN6K+V55qE5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdWJsaXNoUmV0cnkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSwgaXNBbGxvd1B1Ymxpc2hSZXRyeTogYm9vbGVhbiA9IGZhbHNlLCBjb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8eyBjb2RlOiBSQ1JUQ0NvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1B1Ymxpc2hGYWlsICYmIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUHVibGlzaEZhaWwoY29kZSwgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb25dIF9saXN0ZW5lci5vblRyYWNrUHVibGlzaEZhaWwgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzkuI3lhYHorrjph43or5XvvIznm7TmjqXov5Tlm55cbiAgICAgIGlmICghaXNBbGxvd1B1Ymxpc2hSZXRyeSkge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIHJldHVybiB0aGlzLl9wdWJsaXNoUmV0cnkodHJhY2tzLCBpc0FsbG93UHVibGlzaFJldHJ5LCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2xlYXZlUm9vbSgpIHtcbiAgICB0cnkge1xuICAgICAgLy8g6YCA5Ye65oi/6Ze0XG4gICAgICBjb25zdCBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20odGhpcy5fcm9vbSk7XG4gICAgICAvLyDmiJDlip/pgIDlh7rmiL/pl7TvvIzop6blj5FSQ0NhbGxDbGllbnTlrp7kvovkuIrnmoRvblNlc3Npb25DbG9zZeebkeWQrO+8jOaKm+e7meeUqOaIt+S/oeaBr1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2xlYXZlUm9vbV0gU3VjY2Vzc2Z1bGx5IGV4aXRlZCB0aGUgcm9vbSBjb2RlOiAke2NhbGxCYWNrLmNvZGV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBfbGVhdmVSb29tXSBsZWF2ZVJvb20gdGhyb3cgZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpO1xuICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWHuueOsOW8guW4uOWQjuimgeWkhOeQhueahOmAu+i+kSxcbiAgICogQHBhcmFtIGVuZFJlYXNvbiDljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX2V4Y2VwdGlvbkNsb3NlKGVuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uKSB7XG4gICAgLy8g6ZSA5q+B5pys5Zyw5rWBXG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9kZXN0cm95VHJhY2tzKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpO1xuXG4gICAgLy8g57uT5p2f54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLmNsb3NlKGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog55So5oi36LCD55So55qE77yM5rOo5YaMc2Vzc2lvbuS4iueahOebkeWQrFxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyOiBJU2Vzc2lvbkxpc3RlbmVyKTogdm9pZCB7XG4gICAgLy8g5YWI5qCh6aqMbGlzdGVuZXIsIOWmguaenOS4jemAmui/h++8jOS8mnRyb3cgZXJyb3JcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbFNlc3Npb24gcmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXJdICR7Y29uY2x1c2lvbi5tc2d9YCk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyID0geyAuLi5saXN0ZW5lciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiwg1JUQyBBUEkg6I635b6X5pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDmo4DmtYvmmK/lkKbog73lpJ/ojrflvpfmnKzlnLDmtYFcbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgeyAuLi5jb25zdHJhaW50cy5hdWRpbyB9KTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gc3VjY2Vzc2Z1bGx5IGdldCBBdWRpbyBsb2NhbCB0cmFja3MnKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3M6IFt0cmFjayFdIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUFuZENhbWVyYVRyYWNrcygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgeyAuLi5jb25zdHJhaW50cyB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIGdldCBBdWRpbyBhbmQgVmlkZW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIHN1Y2Nlc3NmdWxseSBnZXQgYXVkaW8gYW5kIHZpZGVvIGxvY2FsIHRyYWNrcycpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2sobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5bm25LiU5piv6I635b6X6Z+z6KeG6aKRLCDlubbkuJQg77yI5aaC5p6c6I635b6X6Z+z6KeG6aKR5LiN5oiQ5Yqf77yM5YWB6K646ZmN57qn6I635b6X6Z+z6aKR77yJXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPLCBjb25zdHJhaW50cyk7XG5cbiAgICAgIC8vIOWmguaenOmfs+inhumikeS4jeiDveiOt+W+l++8jOWwsemZjee6p+iOt+W+l+mfs+mikVxuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGNvbnN0cmFpbnRzKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgLy8g6I635Y+W6LWE5rqQ5aSx6LSl77yM6ZyA6KaB6LCD54q25oCB5py6c3RhdGUg5Li6IGVuZFxuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5HRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SKTtcbiAgICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAvLyDojrflj5botYTmupDlpLHotKXvvIzpnIDopoHosIPnirbmgIHmnLpzdGF0ZSDkuLogZW5kXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUik7XG5cbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3mm7TmjaLpn7PpopHorr7lpIdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VBdWRpb0RldmljZShhdWRpb0NvbnN0cmFpbnRzPzogSU1pY3Bob25lQXVkaW9Qcm9maWxlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgLy8g5paw6K6+5aSH55qEdHJhY2tcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICAvLyDmlbTnkIblkI7nmoTmnKzlnLB0cmFja1xuICAgIGNvbnN0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgYXVkaW9Db25zdHJhaW50cyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gY2hhbmdlRGV2aWNlXSBnZXQgbG9jYWwgQXVkaW8gdHJhY2tzIGZhaWxlZCBSQ1RMaWIgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTpn7PpopHpg73plIDmr4HvvIzvvIhSVENMaWIgU0RL5YaF6YOo5Lya5ZyoIGFkZExvY2FsVHJhY2sg5riF55CG5ZCM57G75Z6L6L2o6YGT5pWw5o2u77yM5omA5Lul6L+Z6YeM5rOo6YeK5o6J77yJXG4gICAgICAgIC8vIHRyYWNrLmRlc3Ryb3koKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q5oqK5LmL5YmN55qE6KeG6aKR55WZ5LiLXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVjZW50VHJhY2tzLnB1c2godHJhY2shKTtcblxuICAgIC8vIOWKoOS4iuacrOWcsOaWsOS6p+eUn+eahOmfs+mikVxuICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzID0gbG9jYWxUcmFja3M7XG4gICAgLy8g6YCa55+l5Lia5Yqh5bGCdHJhY2tSZWFkeVxuICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkocmVjZW50VHJhY2tzKTtcblxuICAgIC8vIOWmguaenOW9k+WJjeW3suWKoOWFpeaIv+mXtO+8jOWPkeW4g+aWsOa1gVxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmlrDmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkFVRElPX1BVQkxJU0hfRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbzlj6vkuK3nu6fnu63pgoDor7dcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRyYSDmtojmga/nmoTmianlsZXkv6Hmga9cbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg5bqf5byDIG9wdGlvbnMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDlup/lvIMgb3B0aW9ucy5wdXNoQ29udGVudCDpgJrnn6XlhoXlrrlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGV4dHJhID0gJycgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJyB9ID0gKHRoaXMuX29wdGlvbnMuY2FsbFB1c2hDb25maWc/LnB1c2hUaXRsZSB8fCB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnPy5wdXNoQ29udGVudCkgPyB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnIDogb3B0aW9ucztcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVXNlcklkcyh1c2VySWRzKSwgdmFsaWRhdGVFeHRyYShleHRyYSksIHZhbGlkYXRlUHVzaFRpdGxlKHB1c2hUaXRsZSksIHZhbGlkYXRlUHVzaENvbnRlbnQocHVzaENvbnRlbnQpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBpbnZpdGVdICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuaW52aXRlKHVzZXJJZHMsIHsgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfSk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQjOaEj+aOpeWQrFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjY2VwdChjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMoY29uc3RyYWludHMhKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF0gJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG5cbiAgICAvLyDmjqXlkKzkuYvliY3vvIzlhYjmjILmlq3lvZPliY3kuYvlpJbnmoRzZXNzaW9u77yM546w6Zi25q615LiN5YWB6K6455So5oi35YWI5oup5o6l5ZCsc2Vzc2lvbu+8jOS6i+WFiOS8muWcqOeKtuaAgeacuuWGhemDqOaMguaWre+8jOi/memHjOaKm+WHuuWOu++8jOS8mua4heeQhuWFtuWug+eahHNlZXNpb25cbiAgICBldmVudEVtaXR0ZXIuZW1pdCgnaHVuZ3VwT3RoZXJTZXNzaW9uJywgeyBzZXNzaW9uOiB0aGlzIH0pO1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IHRyYWNrcztcblxuICAgIC8vIOWPkemAgeaOpeWQrOeahOa2iOaBr1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lLmFjY2VwdCgpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF1TZW5kIGFjY2VwdCBtZXNzYWdlIGZhaWxlZCAtPiBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBodW5ndXAoKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZTsgfT4ge1xuICAgIC8vIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKVxuICAgIC8vIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5odW5ndXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53lqpLkvZPlj5jmm7RcbiAgICogIEBwYXJhbSBtZWRpYVR5cGUgUkNDYWxsTWVkaWFUeXBlLkFVRElPIOaUueS4uumfs+mikemAmuivnSB8IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyDmlLnkuLrpn7Pop4bpopHpgJror51cbiAgICovXG4gIHB1YmxpYyBhc3luYyBfY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2NoYW5nZU1lZGlhVHlwZV0gY2hhbmdlIG1lZGlhIHR5cGUgZmFpbCBjb2RlLT4gJHtjb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKRXG4gICAqL1xuICBwcml2YXRlIF9nZXRMb2NhbFZpZGVvVHJhY2tzKCk6IFJDTG9jYWxUcmFja1tdIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2tzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcykge1xuICAgICAgbG9jYWxWaWRlb1RyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNWaWRlb1RyYWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxWaWRlb1RyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDpn7PpopFcbiAgICovXG4gIHByaXZhdGUgX2dldExvY2FsQXVkaW9UcmFja3MoKTogUkNMb2NhbFRyYWNrW10ge1xuICAgIGxldCBsb2NhbEF1ZGlvdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIGxvY2FsQXVkaW90cmFja3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKSB7XG4gICAgICBsb2NhbEF1ZGlvdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvdHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiumAmuivneeahE1lZGlhVHlwZeWNh+e6p+WIsOmfs+inhumikVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2V0TWVkaWFUeXBlVG9BdWRpb0FuZFZpZGVvKCkge1xuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWPkeW4g+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChbdHJhY2shXSk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoX2NvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2VuYWJsZVZpZGVvXSBSZXNvdXJjZSBwdWJsaXNoaW5nIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG5cbiAgICAvLyDlj5Hmtojmga9cbiAgICB0aGlzLl9jaGFuZ2VNZWRpYVR5cGUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiorpgJror53nmoRNZWRpYVR5cGXpmY3nuqfliLDpn7PpopFcbiAgICogQHBhcmFtIGlzU2VuZE1lc3NzYWdlIOaYr+WQpumcgOimgeWPkea2iOaBrywg6buY6K6k5Y+R5raI5oGvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZXRNZWRpYVR5cGVUb0F1ZGlvKCkge1xuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgaWYgKHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnVucHVibGlzaCh0cmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRoaXMuX2Rlc3Ryb3lUcmFja3ModHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d6ZmN57qn77yM55uu5YmN6ZyA5rGC5Y+q5YGa6YCa6K+d6ZmN57qn77yM6Z+z6KeG6aKR5Y+v5Lul6ZmN57qn5Li66Z+z6aKR77yM6Z+z6aKR5LiN6IO95Y2H5Yiw6Z+z6KeG6aKRLCDlj5Hmtojmga/miJDlip/miY3nrpfpmY3nuqfmiJDlip9cbiAgICpcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXNjZW5kQWJpbGl0eSgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NoYW5nZU1lZGlhVHlwZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8pO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6KeG6aKRdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNhYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9UcmFja10gUm9vbSBtaXNzaW5nIHZpZGVvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOinhumikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5tdXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyDlpoLmnpzkuI3pnIDlhbPpl63mkYTlg4/lpLRcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS51bnB1Ymxpc2godHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuVU5QVUJMSVNIX1ZJREVPX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjop4bpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZVZpZGVvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWmguaenOS4jemcgOWFs+mXreaRhOWDj+WktFxuICAgIGlmICghdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUpIHtcbiAgICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJvb20gbWlzc2luZyB2aWRlbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICAvLyDlkK/nlKjop4bpopFcbiAgICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gR2V0IFJlc291cmNlIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTop4bpopHpg73plIDmr4FcbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q55WZ5LiL5LmL5YmN55qE6Z+z6aKRXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5Yqg5LiK5pys5Zyw5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOS4uuS6huinpuWPkeWvueaWueeahG9uVmlkZW9NdXRlQ2hhbmdlIOWFiOemgeeUqFxuICAgIHRyYWNrIS5tdXRlKCk7XG5cbiAgICAvLyDlj5HluIPmnKznq6/op4bpopHotYTmupBcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2goW3RyYWNrIV0pO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKF9jb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlZJREVPX1BVQkxJU0hfRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlkK/nlKhcbiAgICB0cmFjayEudW5tdXRlKCk7XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCkge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxBdWRpb1RyYWNrcygpO1xuXG4gICAgLy8g56aB55So6Z+z6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZUF1ZGlvVHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk7XG5cbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWQr+eUqOmfs+mikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay51bm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgX2Rlc3Ryb3lUcmFja3ModHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSkge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlUcmFja1JlYWR5KHRyYWNrczogUkNMb2NhbFRyYWNrW10gfCBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjayB8IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUmVhZHkodHJhY2ssIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9ub3RpZnlUcmFja1JlYWR5XSBfbGlzdGVuZXIgb25UcmFja1JlYWR5IGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiL/pl7TkuIrms6jlhozkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5fcm9vbS5yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKFxuICAgICAge1xuICAgICAgICAvKipcbiAgICAgICAgICog5pys56uv6KKr6Lii5Ye65oi/6Ze05pe26Kem5Y+RXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAgICog5Y+m5LiA56eN5Y+v6IO95piv5bex5pa5IHJ0Y1Bpbmcg5aSx6LSl5qyh5pWw6LaF5Ye65LiK6ZmQ77yM5pWF6ICM5Li75Yqo5pat57q/XG4gICAgICAgICAqIEBwYXJhbSBieVNlcnZlclxuICAgICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgICAqIOW9k+WAvOS4uiB0cnVlIOaXtu+8jOivtOaYjuacrOerr+aUtuWIsOiiq+i4ouWHuuaIv+mXtOmAmuefpVxuICAgICAgICAgKi9cbiAgICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVzZXJJZDogc3RyaW5nID0gdGhpcy5fcnRjQ2xpZW50LmdldEN1cnJlbnRJZCgpO1xuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VyTGVhdmUoW2N1cnJlbnRVc2VySWRdKTtcblxuICAgICAgICAgIGlmICghYnlTZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uU0VSVkVSX0tJQ0spIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSykge1xuICAgICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmjqXmlLbliLDmiL/pl7Tkv6Hku6Tml7blm57osIPvvIznlKjmiLflj6/pgJrov4fmiL/pl7Tlrp7kvovnmoQgYHNlbmRNZXNzYWdlKG5hbWUsIGNvbnRlbnQpYCDmjqXlj6Plj5HpgIHkv6Hku6RcbiAgICAgICAgICogQHBhcmFtIG5hbWUg5L+h5Luk5ZCNXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50IOS/oeS7pOWGheWuuVxuICAgICAgICAgKiBAcGFyYW0gc2VuZGVyVXNlcklkIOWPkemAgeiAhSBJZFxuICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZVVJZCDmtojmga/llK/kuIDmoIfor4ZcbiAgICAgICAgICovXG4gICAgICAgIG9uTWVzc2FnZVJlY2VpdmUobmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnksIHNlbmRlclVzZXJJZDogc3RyaW5nLCBtZXNzYWdlVUlkOiBzdHJpbmcpIHtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOebkeWQrOaIv+mXtOWxnuaAp+WPmOabtOmAmuefpVxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gY29udGVudFxuICAgICAgICAgKi9cbiAgICAgICAgb25Sb29tQXR0cmlidXRlQ2hhbmdlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HluIPogIXnpoHnlKgv5ZCv55So6Z+z6aKRXG4gICAgICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrIFJDUmVtb3RlQXVkaW9UcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uQXVkaW9NdXRlQ2hhbmdlOiAoYXVkaW9UcmFjazogUkNSZW1vdGVBdWRpb1RyYWNrKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BdWRpb011dGVDaGFuZ2VdIHVzZXJJZC0+JHthdWRpb1RyYWNrLmdldFVzZXJJZCgpfSBtdXRlZCAtPiAke2F1ZGlvVHJhY2suaXNPd25lck11dGVkKCl9YCk7XG4gICAgICAgICAgY29uc3QgbXV0ZVVzZXI6IElNdXRlVXNlciA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIG11dGVkOiBhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgICAga2luZDogJ2F1ZGlvJyxcbiAgICAgICAgICAgIHRyYWNrSWQ6IGF1ZGlvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uQXVkaW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uQXVkaW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25UcmFja011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWPkeW4g+iAheemgeeUqC/lkK/nlKjop4bpopFcbiAgICAgICAgICogQHBhcmFtIHZpZGVvVHJhY2sgUkNSZW1vdGVWaWRlb1RyYWNrIOexu+WunuS+i+WvueixoVxuICAgICAgICAgKi9cbiAgICAgICAgb25WaWRlb011dGVDaGFuZ2U6ICh2aWRlb1RyYWNrOiBSQ1JlbW90ZVZpZGVvVHJhY2spID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblZpZGVvTXV0ZUNoYW5nZV11c2VySWQtPiR7dmlkZW9UcmFjay5nZXRVc2VySWQoKX0gbXV0ZWQgLT4gJHt2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpfWApO1xuICAgICAgICAgIGNvbnN0IG11dGVVc2VyOiBJTXV0ZVVzZXIgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IHZpZGVvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICAgIGtpbmQ6ICd2aWRlbycsXG4gICAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVmlkZW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uVmlkZW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25WaWRlb011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOWGheWFtuS7lueUqOaIt+aWsOWPkeW4g+i1hOa6kOaXtuinpuWPkVxuICAgICAgICAgKiDlpoLpnIDojrflj5bliqDlhaXmiL/pl7TkuYvliY3miL/pl7TlhoXmn5DkuKrnlKjmiLflj5HluIPnmoTotYTmupDliJfooajvvIzlj6/kvb/nlKggcm9vbS5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCgndXNlcklkJykg6I635Y+WXG4gICAgICAgICAqIEBwYXJhbSB0cmFja3Mg5paw5Y+R5biD55qE6Z+z6L2o5LiO6KeG6L2o5pWw5o2u5YiX6KGo77yM5YyF5ZCr5paw5Y+R5biD55qEIFJDUmVtb3RlQXVkaW9UcmFjayDkuI4gUkNSZW1vdGVWaWRlb1RyYWNrIOWunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1B1Ymxpc2g6IGFzeW5jICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuICAgICAgICAgIC8vIOmAgOWHuuaIv+mXtOWQju+8jOi/mOS8mui1sOWIsOi/me+8n++8n++8jOaJgOS7peWIpOaWreS4gOS4i++8jOayoeaciXJvb23kuI3miafooYzorqLpmIVcbiAgICAgICAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g5oyJ5Lia5Yqh6ZyA5rGC6YCJ5oup6ZyA6KaB6K6i6ZiF6LWE5rqQ77yM6YCa6L+HIHJvb20uc3Vic2NyaWJlIOaOpeWPo+i/m+ihjOiuoumYhVxuICAgICAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnN1YnNjcmliZSh0cmFja3MpO1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBvblRyYWNrUHVibGlzaF0gc3Vic2NyaWJlIGZhaWxlZCBSVENDb2RlIC0+JHtjb2RlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOeUqOaIt+WPlua2iOWPkeW4g+i1hOa6kFxuICAgICAgICAgKiBAcGFyYW0gdHJhY2tzIOiiq+WPlua2iOWPkeW4g+eahOmfs+i9qOS4juinhui9qOaVsOaNruWIl+ihqFxuICAgICAgICAgKiBAZGVzY3JpcHRpb24g5b2T6LWE5rqQ6KKr5Y+W5raI5Y+R5biD5pe277yMU0RLIOWGhemDqOS8muWPlua2iOWvueebuOWFs+i1hOa6kOeahOiuoumYhe+8jOS4muWKoeWxguS7hemcgOWkhOeQhiBVSSDkuJrliqFcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tVbnB1Ymxpc2g6ICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDorqLpmIXnmoTpn7Pop4bpopHmtYHpgJrpgZPlt7Llu7rnq4ssIHRyYWNrIOW3suWPr+S7pei/m+ihjOaSreaUvlxuICAgICAgICAgKiBAcGFyYW0gdHJhY2sgUkNSZW1vdGVUcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tSZWFkeTogKHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuXG4gICAgICAgICAgLy8g5pyJ5pe25a+55pa55rKh5pyJ6ZmN57qn5oiQ5Yqf77yM5omU5oqb6L+H5p2l6KeG6aKR77yM6L+Z5pe255qE6KeG6aKR5LiN5a+55aSW5oqb5Ye6XG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPICYmIHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8g5omn6KGM55So5oi355qEb25UcmFja1JlYWR555uR5ZCsXG4gICAgICAgICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2tdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS6uuWRmOWKoOWFpVxuICAgICAgICAgKiBAcGFyYW0gdXNlcklkcyDliqDlhaXnmoTkurrlkZggaWQg5YiX6KGoXG4gICAgICAgICAqL1xuICAgICAgICBvblVzZXJKb2luOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAvLyDmnInkurrliqDlhaXmuIXpmaTlrprml7blmahcbiAgICAgICAgICBpZiAodGhpcy5qb2luUm9vbVRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLmpvaW5Sb29tVGltZXIuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4odXNlcklkcyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDkurrlkZjpgIDlh7pcbiAgICAgICAgICogQHBhcmFtIHVzZXJJZHNcbiAgICAgICAgICovXG4gICAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJMZWF2ZV0gbGlzdGVuaW5nIG9uVXNlckxlYXZlIHVzZXJJZHMgLT4gJHt1c2VySWRzPy5qb2luKCcsJyl9YCk7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJMZWF2ZSh1c2VySWRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmr4/mrKEgUGluZyDnu5PmnpxcbiAgICAgICAgICovXG4gICAgICAgIG9uUGluZzogKHJlc3VsdDogUkNSVENQaW5nUmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25QaW5nXSR7cmVzdWx0fWApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDpgJrnn6Xnu5nkuJrliqFcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblBpbmcgJiYgdGhpcy5fbGlzdGVuZXIhLm9uUGluZyhyZXN1bHQsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25QaW5nXSBsaXN0ZW5pbmcgb25QaW5nIGV4Y2VwdGlvbicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcigpIHtcbiAgICAvLyDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICB0aGlzLl9yb29tLnJlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDnlKjkuo7mjqXmlLbnirbmgIHmlbDmja7miqXlkYpcbiAgICAgICAqIEBwYXJhbSByZXBvcnRcbiAgICAgICAqL1xuICAgICAgb25TdGF0ZVJlcG9ydDogKHJlcG9ydDogSVJDUlRDU3RhdGVSZXBvcnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydCAmJiB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydChyZXBvcnQsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblN0YXRlUmVwb3J0XSBsaXN0ZW5lciBvblN0YXRlUmVwb3J0IGV4Y2VwdGlvbicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIH5JQ0Ug6L+e5o6l54q25oCB5Y+Y5pu06YCa55+lflxuICAgICAgICogQHNpbmNlIHZlcnNpb24gNS4xLjVcbiAgICAgICAqL1xuICAgICAgb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2U6IChzdGF0ZTogUlRDSWNlQ29ubmVjdGlvblN0YXRlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlICYmIHRoaXMuX2xpc3RlbmVyIS5vbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlXSBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSBleGNlcHRpb24nKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICDojrflj5bmiL/pl7TlvZPliY3kvJror50gSWTvvIzlvZPmiL/pl7TlhoXlt7Lml6DmiJDlkZjml7bmiL/pl7TkvJrlm57mlLbvvIzph43mlrDliqDlhaXml7Ygc2Vzc2lvbklkIOWwhuabtOaWsO+8jCjnlKjmiLflvZXliLbotYTmupDnlKjnmoQpXG4gICAqL1xuICBwdWJsaWMgZ2V0UlRDU2Vzc2lvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb29tID8gdGhpcy5fcm9vbS5nZXRTZXNzaW9uSWQoKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFyZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFRhcmdldElkKCk7XG4gIH1cblxuICAvKipcbiAgICogIOiOt+WPluS8muivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDb252ZXJzYXRpb25UeXBlKCk7XG4gIH1cblxuICAvKipcbiAgICogIOe7hOe7hyBJRFxuICAgKi9cbiAgcHVibGljIGdldENoYW5uZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2hhbm5lbElkKCk7XG4gIH1cblxuICAvKipcbiAgICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVtb3RlVXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gKi9cbiAgcHVibGljIGdldFVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFJlbW90ZVVzZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lq65ZGY54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICBpZiAoIXVzZXJJZCB8fCB0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VySWQgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRVc2VyU3RhdGUodXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZzZXNzaW9u54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogUkNDYWxsU2Vzc2lvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5Lya6K+d5Y+R6LW36ICFaWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpdtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRNZWRpYVR5cGUoKTogUkNDYWxsTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBSVENQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgSVJUQ0pvaW5lZEluZm8sIEVycm9yQ29kZSwgUlRDSm9pblR5cGUsIElMb2dnZXIsIEJhc2ljTG9nZ2VyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ0NhbGxFbmdpbmUsIFJDQ2FsbFN0YXRlTWFjaGluZSwgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsTWVkaWFUeXBlLCBJT2ZmbGluZVJlY29yZCxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ2xpZW50LCBSQ1JUQ0NvZGUsIFJDTG9jYWxUcmFjayB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQge1xuICBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBQcm9kdWNlVHlwZXMgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvbiB9IGZyb20gJy4vUkNDYWxsU2Vzc2lvbic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUxpc3RlbmVyLCB2YWxpZGF0ZVRhcmdldElkLCB2YWxpZGF0ZU1lZGlhVHlwZSwgdmFsaWRhdGVVc2VySWRzLCB2YWxpZGF0ZUV4dHJhLCB2YWxpZGF0ZVB1c2hUaXRsZSwgdmFsaWRhdGVQdXNoQ29udGVudCwgdmFsaWRhdGVQdXNoQ29uZmlnLFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxDbGllbnQge1xuICAvKipcbiAgICogcnRj5a6e5L6LXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydGNDbGllbnQ6IFJDUlRDQ2xpZW50XG5cbiAgLyoqXG4gICAqIGNhbGxFbmdpbmXlsYLlrp7kvotcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZVxuXG4gIC8qKlxuICAgKiDlhbblroPlj4LmlbBcbiAgICovXG4gIHByaXZhdGUgX29wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9uc1xuXG4gIC8qKlxuICAgKiBzZXNzaW9u5YiX6KGoXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uTGlzdDogUkNDYWxsU2Vzc2lvbltdID0gW11cblxuICBwcml2YXRlIF9jYWxsUHVzaENvbmZpZzogSVB1c2hDb25maWcgPSB7fVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hDb25maWc6IElQdXNoQ29uZmlnID17fVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBfb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLl9ydGNDbGllbnQgPSBfb3B0aW9ucy5ydGNDbGllbnQ7XG5cbiAgICB0aGlzLl9vcHRpb25zID0geyAvKipcbiAgICAgICAqIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivle+8jCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+V77yM6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktCwg6buY6K6k5YWz6ZetXG4gICAgICAgKi9cbiAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei++8jOm7mOiupCAgIFJUQ0pvaW5UeXBlLkNPRVhJU1QgPSAyIOS4pOS4quiuvuWkh+WFseWtmFxuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLktJQ0sgPSAwLOi4ouWJjeS4gOS4quiuvuWkh1xuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLlJFRlVTRSA9IDEs5b2T5YmN5Yqg5YWl5ouS57udXG4gICAgICAgKiAgICAgUlRDSm9pblR5cGUuQ09FWElTVCA9IDIg5Lik5Liq6K6+5aSH5YWx5a2YXG4gICAgICAgKi9cbiAgICAgIGpvaW5UeXBlOiBSVENKb2luVHlwZS5DT0VYSVNULFxuXG4gICAgICAvKipcbiAgICAgICAqIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIOivreiogOiuvue9riAo5o6o6YCBKSwg5LiN5Lyg6buY6K6k5Li65Lit5paHXG4gICAgICAgKi9cbiAgICAgIGxhbmc6IFJDQ2FsbExhbmd1YWdlLlpILFxuICAgICAgLi4uX29wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIOWIneWni+WMlmNhbGxFbmdpbmUsIOW5tuebkeWQrG9uSW52aXRlXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwge1xuXG4gICAgICAvKipcbiAgICAgICAqIOebkeWQrOaUtuWIsGludml0ZVxuICAgICAgICovXG4gICAgICBvbkludml0ZTogdGhpcy5fb25JbnZpdGUuYmluZCh0aGlzKSxcblxuICAgICAgLyoqXG4gICAgICAgKiDnm5HlkKznprvnur/mtojmga/miqXlkYpcbiAgICAgICAqL1xuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl9vbk9mZmxpbmVSZWNvcmQuYmluZCh0aGlzKSxcbiAgICB9LCB7XG5cbiAgICAgIC8qKlxuICAgICAgICog6K+t6KiA6K6+572uICjmjqjpgIEpLCDkuI3kvKDpu5jorqTkuLrkuK3mlodcbiAgICAgICAqL1xuICAgICAgbGFuZzogdGhpcy5fb3B0aW9ucy5sYW5nIHx8IFJDQ2FsbExhbmd1YWdlLlpILFxuXG4gICAgfSk7XG5cbiAgICBldmVudEVtaXR0ZXIub24oJ3Nlc3Npb25DbG9zZScsICh7IHNlc3Npb24sIHN1bW1hcnlJbmZvIH0pID0+IHtcbiAgICAgIC8vIOS7jnNlc3Npb25MaXN05Y675o6J6L+Z5Liq5YWz6Zet55qEc2Vzc2lvblxuICAgICAgdGhpcy5fcmVtb3ZlU2Vzc2lvbihzZXNzaW9uKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5vblNlc3Npb25DbG9zZShzZXNzaW9uLCBzdW1tYXJ5SW5mbyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ0NhbGxDbGllbnRdIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOaOpeWQrOS5i+WJjeaMguaWreWFtuWug+eahHNlc3Npb25cbiAgICBldmVudEVtaXR0ZXIub24oJ2h1bmd1cE90aGVyU2Vzc2lvbicsICh7IHNlc3Npb24gfSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBzZXNzaW9uLmdldFNlc3Npb25JZCgpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBodW5ndXBPdGhlclNlc3Npb25dIHNlc3Npb25JZCByZWFkeSB0byBhY2NlcHQgLT4gJHtpZH1gKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBzZXNzaW9uTGlzdCAtPiR7dGhpcy5fc2Vzc2lvbkxpc3QubWFwKChzZXMpID0+IHNlcy5nZXRTZXNzaW9uSWQoKSkuam9pbignLCcpfWApO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgd2hpbGUgKHRoaXMuX3Nlc3Npb25MaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8g5aaC5p6c5LiO6KaB5o6l5ZCs55qEc2Vzc2lvbuS4jeS4gOiHtFxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkxpc3RbaV0uZ2V0U2Vzc2lvbklkKCkgIT09IGlkKSB7XG4gICAgICAgICAgLy8g5oyC5patXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkxpc3RbaV0uaHVuZ3VwKCk7XG5cbiAgICAgICAgICAvLyDmjILmlq3lkI7liKDpmaRcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uTGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g5aaC5p6c5piv6KaB5o6l5ZCs55qEc2Vzc2lvbu+8jOi3s+i/h+i/meS4que0ouW8le+8jOaJgOS7peWKoDFcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBjdXJyZW50IHNlc3Npb25MaXN0IGxlbmd0aCAtPiR7dGhpcy5fc2Vzc2lvbkxpc3QubGVuZ3RofWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOebkeWQrG9uSW52aXRlXG4gICAqL1xuICBwcml2YXRlIF9vbkludml0ZShzdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSwgZXh0cmE/OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9vbkludml0ZV0gUmVjZWl2ZWQgaW52aXRlIG1lc3NhZ2UnKTtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuXG4gICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgIC8vIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivlVxuICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAvKipcbiAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICovXG4gICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAqL1xuICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgLy8g5qCH5piO5piv6KKr5Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRUUsXG5cbiAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICB9KTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9vbkludml0ZV0gUmVjZWl2ZWQgaW52aXRlIG1lc3NhZ2UsIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24nKTtcblxuICAgIC8qKlxuICAgICAqIOWmguaenOmAmuivneeahOaXtuWAmeS4jeWFgeiuuOaOpeWQrOaWsOeahOmAmuivne+8jOebtOaOpeaMguaWre+8jCDov5nkupvlt6XkvZzlnKhjYWxsRW5naW5l6YeM5a6M5oiQXG4gICAgICovXG4gICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDmiafooYznlKjmiLdBUEnnmoTnm5HlkKxcbiAgICAgIHRoaXMuX29wdGlvbnMub25TZXNzaW9uKHNlc3Npb24sIGV4dHJhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25TZXNzaW9uXSBvblNlc3Npb24gZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuXG4gICAgLy8g5b+F6aG75Zyob25TZXNzaW9u6YeM5rOo5YaMc2Vzc2lvbuebkeWQrOS6i+S7tu+8jOi/memHjOajgOa1i+S4gOS4i+acieayoeacieazqOWGjFxuICAgIGlmIChzZXNzaW9uLl9saXN0ZW5lcikge1xuICAgICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUxpc3RlbmVyKHNlc3Npb24uX2xpc3RlbmVyKTtcbiAgICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmNsdXNpb24ubXNnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25TZXNzaW9uXSBzZXNzaW9uIE11c3QgSGF2ZSBMaXN0ZW5lcicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUkNDYWxsU2Vzc2lvbiAgX29wdGlvbnMub25TZXNzaW9uXSBzZXNzaW9uIE11c3QgSGF2ZSBMaXN0ZW5lcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnm5HlkKznprvnur/mtojmga/miqXlkYpcbiAgICogQHBhcmFtIHJlY29yZFxuICAgKi9cbiAgcHVibGljIF9vbk9mZmxpbmVSZWNvcmQocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkge1xuICAgIHRyeSB7XG4gICAgICAvLyDmiafooYznlKjmiLdBUEnnmoTnm5HlkKxcbiAgICAgIHRoaXMuX29wdGlvbnMub25PZmZsaW5lUmVjb3JkICYmIHRoaXMuX29wdGlvbnMub25PZmZsaW5lUmVjb3JkKHJlY29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uT2ZmbGluZVJlY29yZF0gb25PZmZsaW5lUmVjb3JkIGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhoznlKjmiLfkv6Hmga/jgILms6jlhozlkI7vvIzlnKjlj5HotbfpgoDor7fmiJbmjILmlq3nrYnmk43kvZzml7bvvIzkvJrlsIbor6Xkv6Hmga/kuIDlubblj5HpgIHnu5nlr7nnq69cbiAgICogQHBhcmFtIGluZm8ubmFtZSAgICAgICAg55So5oi35ZCN56ewXG4gICAqIEBwYXJhbSBpbmZvLnBvcnRyYWl0VXJpIOeUqOaIt+WktOWDj+S/oeaBr1xuICAgKiBAcGFyYW0gaW5mby5leHRyYSAgICAgICDpooTnlZnmi5PlsZXlrZfmrrVcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclVzZXJJbmZvKGluZm86IHsgbmFtZT86IHN0cmluZzsgcG9ydHJhaXRVcmk/OiBzdHJpbmc7IGV4dHJhPzogc3RyaW5nOyB9ID0ge30pIHtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnJlZ2lzdGVyVXNlckluZm8oaW5mbyk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCByZWdpc3RlclVzZXJJbmZvXSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXIgdXNlciBpbmZvIGRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAqIOi3qEFwcOWNleWRvO+8jFxi5Y+R6YCBaW52aXRl5raI5oGv77yM5Zue6LCD5Zue5p2l5o6l5pS2c3RhdGVNYWNoaW5lLCDlu7pzZXNzaW9uXG4gICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDooqvlkbzlj6vkuIDmlrnnmoTnlKjmiLcgaWQg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyAg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5jb25zdHJhaW50cyDojrflj5bpn7PpopHmiJbpn7Pop4bpopHotYTmupDml7bnmoTlj4LmlbAg5Y+v6YCJXG4gICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICpcbiAgKi9cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q3Jvc3NDYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbGwoe1xuICAgICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LCBiaXRyYXRlLCBpc0Nyb3NzQXBwa2V5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvO+8jFxi5Y+R6YCBaW52aXRl5raI5oGv77yM5Zue6LCD5Zue5p2l5o6l5pS2c3RhdGVNYWNoaW5lLCDlu7pzZXNzaW9uXG4gICAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0SWQg6KKr5ZG85Y+r5LiA5pa555qE55So5oi3IGlkIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLm1lZGlhVHlwZSDpn7PpopHlkbzlj6sgb3Ig6Z+z6KeG6aKR5ZG85Y+rICDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX19jYWxsKHtcbiAgICAgIHRhcmdldElkLCBtZWRpYVR5cGUsIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgYml0cmF0ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19jYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSwgaXNDcm9zc0FwcGtleSA9IGZhbHNlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHsgcHVzaFRpdGxlOiBwdXNoVGl0bGVWYWx1ZSA9ICcnLCBwdXNoQ29udGVudDogcHVzaENvbnRlbnRWYWx1ZSA9ICcnIH0gPSAodGhpcy5fY2FsbFB1c2hDb25maWcucHVzaFRpdGxlIHx8IHRoaXMuX2NhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50KSA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBleHRyYS0+JHtleHRyYX0gcHVzaFRpdGxlLT4ke3B1c2hUaXRsZVZhbHVlfSBwdXNoQ29udGVudC0+JHtwdXNoQ29udGVudFZhbHVlfWApO1xuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0W10gPSBbdmFsaWRhdGVUYXJnZXRJZCh0YXJnZXRJZCksIHZhbGlkYXRlTWVkaWFUeXBlKG1lZGlhVHlwZSksIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKSwgdmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlVmFsdWUpLCB2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50VmFsdWUpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbF0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgbG9jYWxUcmFja3MgPSB0cmFja3MhO1xuXG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOiuvue9rueggeeOh1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpICYmIGJpdHJhdGU/LmF1ZGlvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8uYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpICYmIGJpdHJhdGU/LnZpZGVvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8udmlkZW8/Lm1heCwgYml0cmF0ZT8udmlkZW8/Lm1pbiwgYml0cmF0ZT8udmlkZW8/LnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgICAgbGlzdGVuZXIub25UcmFja1JlYWR5KHRyYWNrKTtcbiAgICB9KTtcblxuICAgIC8vIOiwg+eUqGNhbGxFbmdpbmXnmoRjYWxs6L+U5Zue5LiA5Liq54q25oCB5py655qE5a6e5L6LXG4gICAgY29uc3QgeyBjb2RlLCBzdGF0ZU1hY2hpbmUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FsbChjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoVGl0bGVWYWx1ZSwgcHVzaENvbnRlbnRWYWx1ZSwgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzdGF0ZSBtYWNoaW5lJyk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBsb2NhbFRyYWNrcyxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAgICovXG4gICAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAgIC8vIOagh+aYjuaYr+S4u+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRVIsXG5cbiAgICAgICAgaXNDcm9zc0FwcGtleSxcblxuICAgICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXNzaW9u5LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgICBzZXNzaW9uLnJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbiBvYmplY3QsIHNlc3Npb25JZDogJHtzZXNzaW9uLmdldFNlc3Npb25JZCgpfWApO1xuICAgICAgcmV0dXJuIHsgY29kZSwgc2Vzc2lvbiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBjYWxsIGZhaWxlZCBjb2RlIC0+OiAke2NvZGV9YCk7XG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2subXV0ZSgpO1xuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HotbfnvqTnu4Tlkbzlj6tcbiAgICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDnvqTnu4QgSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcklkcyDooqvlkbzlj6vnmoTnvqTlhoXmiJDlkZggSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBryDlj6/pgIlcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsSW5Hcm91cCh7XG4gICAgdGFyZ2V0SWQsIHVzZXJJZHMsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxJbkdyb3VwUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHsgcHVzaFRpdGxlOiBwdXNoVGl0bGVWYWx1ZSA9ICcnLCBwdXNoQ29udGVudDogcHVzaENvbnRlbnRWYWx1ZSA9ICcnIH0gPSAodGhpcy5fY2FsbFB1c2hDb25maWcucHVzaFRpdGxlIHx8IHRoaXMuX2NhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50KSA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVVc2VySWRzKHVzZXJJZHMpLCB2YWxpZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGUpLCB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSwgdmFsaWRhdGVFeHRyYShleHRyYSksIHZhbGlkYXRlUHVzaFRpdGxlKHB1c2hUaXRsZVZhbHVlKSwgdmFsaWRhdGVQdXNoQ29udGVudChwdXNoQ29udGVudFZhbHVlKV07XG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgbGV0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIGxvY2FsVHJhY2tzID0gdHJhY2tzITtcblxuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDorr7nva7noIHnjodcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSAmJiBiaXRyYXRlPy5hdWRpbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSAmJiBiaXRyYXRlPy52aWRlbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LnZpZGVvPy5tYXgsIGJpdHJhdGU/LnZpZGVvPy5taW4sIGJpdHJhdGU/LnZpZGVvPy5zdGFydCk7XG4gICAgICB9XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICAgIGxpc3RlbmVyLm9uVHJhY2tSZWFkeSh0cmFjayk7XG4gICAgfSk7XG5cbiAgICAvLyDlvoDnu4Tph4zlj5Hmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIHN0YXRlTWFjaGluZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5jYWxsSW5Hcm91cChjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsIGV4dHJhLCBwdXNoVGl0bGVWYWx1ZSwgcHVzaENvbnRlbnRWYWx1ZSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc3RhdGUgbWFjaGluZScpO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBSQ0NhbGxTZXNzaW9uKHN0YXRlTWFjaGluZSwgdGhpcy5fcnRjQ2xpZW50LCB0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgbG9jYWxUcmFja3MsXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K645Y+R5biD6YeN6K+VXG4gICAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSxcblxuICAgICAgICAvKipcbiAgICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0XG4gICAgICAgICAqL1xuICAgICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6LXG4gICAgICAgICAqL1xuICAgICAgICBqb2luVHlwZTogdGhpcy5fb3B0aW9ucy5qb2luVHlwZSxcblxuICAgICAgICAvLyDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgICAvLyDmoIfmmI7mmK/kuLvlj6vkuqfnlJ/nmoRzZXNzaW9uXG4gICAgICAgIHByb2R1Y2VUeXBlOiBQcm9kdWNlVHlwZXMuQ0FMTEVSLFxuXG4gICAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNlc3Npb27kuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICAgIHNlc3Npb24ucmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24gb2JqZWN0LCBzZXNzaW9uSWQ6ICR7c2Vzc2lvbi5nZXRTZXNzaW9uSWQoKX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGUsIHNlc3Npb24gfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gY2FsbEluR3JvdXAgZmFpbGVkIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDnpoHnlKjop4bpopFcbiAgICAgIHRyYWNrLm11dGUoKTtcblxuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6LCDUlRDIEFQSSDojrflvpfmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOajgOa1i+aYr+WQpuiDveWkn+iOt+W+l+acrOWcsOa1gVxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB7IC4uLmNvbnN0cmFpbnRzLmF1ZGlvIH0pO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gc3VjY2Vzc2Z1bGx5IGdldCBBdWRpbyBsb2NhbCB0cmFja3MnKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3M6IFt0cmFjayFdIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUFuZENhbWVyYVRyYWNrcygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgeyAuLi5jb25zdHJhaW50cyB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gZ2V0IEF1ZGlvIGFuZCBWaWRlbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBzdWNjZXNzZnVsbHkgZ2V0IGF1ZGlvIGFuZCB2aWRlbyBsb2NhbCB0cmFja3MnKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOWmguaenOaYr+WFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOW5tuS4lOaYr+iOt+W+l+mfs+inhumikVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTywgY29uc3RyYWludHMpO1xuXG4gICAgICAvLyDlpoLmnpzpn7Pop4bpopHkuI3og73ojrflvpfvvIzlsLHpmY3nu4Tojrflvpfpn7PpopFcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBjb25zdHJhaW50cyk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDku45zZXNzaW9uTGlzdOWIoOmZpOafkOS4qnNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZVNlc3Npb24oc2Vzc2lvbjogUkNDYWxsU2Vzc2lvbikge1xuICAgIGNvbnN0IGlkID0gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKTtcbiAgICB0aGlzLl9zZXNzaW9uTGlzdCA9IHRoaXMuX3Nlc3Npb25MaXN0LmZpbHRlcigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKSAhPT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW3seaWueWFtuS7luerr+WKoOWFpemAmuivne+8iOW3suWKoOWFpSBSVEMg5oi/6Ze077yJ55qE55So5oi35L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Sm9pbmVkUm9vbUluZm8oKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgZGF0YT86IElSVENKb2luZWRJbmZvW10gfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5nZXRSVENKb2luZWRVc2VySW5mbyh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKTtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBnZXRKb2luZWRVc2VySW5mbyBlcnJvciBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUVVFUllfSk9JTkVEX1VTRVJfSU5GT19FUlJPUiB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5ZG85Y+r44CB5oyC5pat5o6o6YCB5pWw5o2uXG4gICAqIEBwYXJhbSBjYWxsUHVzaENvbmZpZyDlkbzlj6vmjqjpgIHphY3nva5cbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnLnB1c2hUaXRsZSDlkbzlj6vmjqjpgIHmoIfpophcbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50IOWRvOWPq+aOqOmAgeWGheWuuVxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZyDmjILmlq3mjqjpgIHphY3nva5cbiAgICogQHBhcmFtIGh1bmd1cFB1c2hDb25maWcucHVzaFRpdGxlIOaMguaWreaOqOmAgeagh+mimFxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZy5wdXNoQ29udGVudCDmjILmlq3mjqjpgIHlhoXlrrlcbiAgICovXG4gIHB1YmxpYyBzZXRQdXNoQ29uZmlnKGNhbGxQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9IHt9LCBodW5ndXBQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgY29uY2x1c2lvbiA9IFtjYWxsUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZ10ubWFwKChwdXNoQ29uZmlnOiBJUHVzaENvbmZpZykgPT4gdmFsaWRhdGVQdXNoQ29uZmlnKHB1c2hDb25maWcpKVswXTtcblxuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwIGNhbGxQdXNoQ29uZmlnIG9yIGh1bmd1cFB1c2hDb25maWddICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbFB1c2hDb25maWcgPSBjYWxsUHVzaENvbmZpZztcbiAgICB0aGlzLl9odW5ndXBQdXNoQ29uZmlnID0gaHVuZ3VwUHVzaENvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSVBsdWdpbkdlbmVyYXRvciwgSVJ1bnRpbWUsIFJUQ1BsdWdpbkNvbnRleHQsIFZlcnNpb25NYW5hZ2UsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbEVycm9yQ29kZSwgUkNDYWxsTGFuZ3VhZ2UsIFJDQ2FsbEVuZFJlYXNvbiwgUkNDYWxsTWVkaWFUeXBlLCBSQ0NhbGxVc2VyU3RhdGUsIFJDQ2FsbFNlc3Npb25TdGF0ZSwgSUVuZFN1bW1hcnksIElJbnZpdGVkVXNlcnMsIElTZW5kZXJJbmZvLCBJT2ZmbGluZVJlY29yZCxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IElSQ1JUQ1N0YXRlUmVwb3J0IH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElSQ0NhbGxJbml0T3B0aW9ucywgSVJDQ2FsbFBhcmFtcywgSVJDQ2FsbEluR3JvdXBQYXJhbXMsIElTZXNzaW9uTGlzdGVuZXIsIElNdXRlVXNlciwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElEZXZpY2VDaGFuZ2VQYXJhbXMsIElWYWxpZGF0aW9uUmVzdWx0LCBJUHVzaENvbmZpZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IFJDQ2FsbENsaWVudCBmcm9tICcuL1JDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uIH0gZnJvbSAnLi9SQ0NhbGxTZXNzaW9uJztcbmltcG9ydCB7IHZhbGlkYXRlQ2FsbEluaXRPcHRpb25zIH0gZnJvbSAnLi92YWxpZGF0aW9uJztcblxuLy8gcGx1Z2luLWNhbGwg54mI5pys5LiK5oqlXG5WZXJzaW9uTWFuYWdlLmFkZCgncGx1Z2luLWNhbGwnLCBfX1ZFUlNJT05fXyk7XG5cbmNvbnN0IGluc3RhbGxlcjogSVBsdWdpbkdlbmVyYXRvcjxSQ0NhbGxDbGllbnQsIElSQ0NhbGxJbml0T3B0aW9ucz4gPSB7XG4gIHRhZzogJ1JDQ2FsbCcsXG4gIHZlcmlmeShydW50aW1lOiBJUnVudGltZSkge1xuICAgIHJldHVybiBydW50aW1lLnRhZyA9PT0gJ2Jyb3dzZXInO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogUkNDYWxsQ2xpZW50IHtcbiAgICAvLyDlhYjmoKHpqozlj4LmlbBcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlQ2FsbEluaXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbExpYiBpbnN0YWxsZXIgc3RldXBdJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG5cbiAgICAvLyDmoKHpqozlvZPliY3lronoo4XnmoQgZW5naW5lIOeJiOacrOaYr+WQpuWPr+eUqFxuICAgIGlmICghVmVyc2lvbk1hbmFnZS52YWxpZEVuZ2luZShfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX18pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbCByZXF1aXJlZCBlbmdpbmUgdmVyc2lvbiBhdCBsZWFzdCAnJHtfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX199Jy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignUkNDYWxsJywgJ1JUQycpO1xuICAgIG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwgJiYgbG9nZ2VyLnNldE91dHB1dExldmVsKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmxvZ0xldmVsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbG9nZ2VyLndhcm4oJ18nLCAnVGhlIFxcJ2xvZ0xldmVsXFwnIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIFxcJ2xvZ091dHB1dExldmVsXFwnIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsQ2xpZW50KGNvbnRleHQsIHJ1bnRpbWUsIGxvZ2dlciwgb3B0aW9ucyk7XG4gIH0sXG59O1xuXG5leHBvcnQge1xuICBpbnN0YWxsZXIsXG4gIFJDQ2FsbENsaWVudCxcbiAgUkNDYWxsU2Vzc2lvbixcbiAgUkNDYWxsTGFuZ3VhZ2UsXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbFVzZXJTdGF0ZSxcbiAgUkNDYWxsU2Vzc2lvblN0YXRlLFxufTtcblxuZXhwb3J0IHR5cGUge1xuICBJRW5kU3VtbWFyeSxcbiAgSVJDQ2FsbEluaXRPcHRpb25zLFxuICBJUkNDYWxsUGFyYW1zLFxuICBJUkNDYWxsSW5Hcm91cFBhcmFtcyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVNlbmRlckluZm8sXG4gIElNdXRlVXNlcixcbiAgSUludml0ZWRVc2VycyxcbiAgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsXG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElPZmZsaW5lUmVjb3JkLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgSVB1c2hDb25maWcsXG59O1xuIl0sIm5hbWVzIjpbInRpbWVyU2V0VGltZW91dCIsImV2ZW50RW1pdHRlciIsIkV2ZW50RW1pdHRlciIsIk1zZ0NhbGxTdGF0dXMiLCJSQ0NhbGxFcnJvckNvZGUiLCJSQ0NhbGxFbmRSZWFzb24iLCJSQ0NhbGxNZXNzYWdlVHlwZSIsIlJDQ2FsbFNlc3Npb25TdGF0ZSIsIlJDQ2FsbFVzZXJTdGF0ZSIsIlJDQ3Jvc3NDYWxsVHlwZSIsIkNvbnZlcnNhdGlvblR5cGUiLCJUaW1lciIsIlJDQ2FsbE1lZGlhVHlwZSIsIk1lbWJlck1vZGlmeVR5cGUiLCJQbGF0Zm9ybSIsIkVycm9yQ29kZSIsIm1lc3NhZ2VUeXBlIiwiUkNDYWxsTGFuZ3VhZ2UiLCJQcm9kdWNlVHlwZXMiLCJSVENKb2luVHlwZSIsIkxvZ0wiLCJSQ1Jlc29sdXRpb24iLCJSQ1JUQ0NvZGUiLCJjb2RlIiwidHJhY2tzIiwidHJhY2siLCJSQ0tpY2tSZWFzb24i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
|