piper-utils 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/main.js
CHANGED
|
@@ -56,8 +56,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.userRole
|
|
|
56
56
|
* Get the allowed businessIds for a user from the lambda event, compare it to businessIds, return what user has access to.
|
|
57
57
|
*
|
|
58
58
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
59
|
+
* @param {{useCognitoBid:boolean}} [options] - An object with options, useCognitoBid prefers the businessId set in cognito if set and does not return the local bid of 1 if a bid is in the claim.
|
|
59
60
|
* @returns {array} A list of businessIds that have been requested and are allowed to for some user.
|
|
60
|
-
*/function accessRightsUtils(event) {const requestedBusinessIds = getRequestedBusinessIds(event);const allowedBusinessIds = getAllowedBusinessIds(event);const localBidList = ['1']; // if we are on local return for all bids in access rights
|
|
61
|
+
*/function accessRightsUtils(event, options) {const useCognitoBid = _lodash2.default.get(options, 'useCognitoBid', false);const requestedBusinessIds = getRequestedBusinessIds(event);const allowedBusinessIds = getAllowedBusinessIds(event, useCognitoBid);const localBidList = ['1']; // if we are on local return for all bids in access rights
|
|
61
62
|
if (_lodash2.default.isEmpty(allowedBusinessIds) && !_lodash2.default.get(event, 'requestContext.authorizer.claims') && !_lodash2.default.get(event, 'requestContext.authorizer.custom:AR') && process.env.BUILD_ENV !== 'production' && process.env.BUILD_ENV !== 'staging') {if (requestedBusinessIds.length === 0) {return localBidList;} else {return _lodash2.default.intersection(requestedBusinessIds, localBidList);}} else if (requestedBusinessIds.length === 0) {return allowedBusinessIds;}return _lodash2.default.intersection(requestedBusinessIds, allowedBusinessIds);} /**
|
|
62
63
|
* Get the businessID set in cognito as custom:DBI.
|
|
63
64
|
*
|
|
@@ -72,8 +73,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.userRole
|
|
|
72
73
|
* Get the allowed businessIds for a user from cognito custom:AR property.
|
|
73
74
|
*
|
|
74
75
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
76
|
+
* @param useCognitoBid
|
|
75
77
|
* @returns {array} The businessID requested by the query string
|
|
76
|
-
*/function getAllowedBusinessIds(event) {const businesses = getBusinessesInfo(event);return Object.keys(businesses);}function getBusinessesInfo(event) {let jsonToParse = _lodash2.default.get(event, 'requestContext.authorizer.claims.custom:AR') || _lodash2.default.get(event, 'requestContext.authorizer.custom:AR') || '{}';const accessRights = JSON.parse(jsonToParse);if (process.env.BUILD_ENV === 'local') {if (!(0, _lodash.isEmpty)(accessRights)) {const bids = _lodash2.default.get(accessRights, 'businessIds', {});
|
|
78
|
+
*/function getAllowedBusinessIds(event, useCognitoBid) {const businesses = getBusinessesInfo(event, useCognitoBid);return Object.keys(businesses);}function getBusinessesInfo(event, useCognitoBid) {let jsonToParse = _lodash2.default.get(event, 'requestContext.authorizer.claims.custom:AR') || _lodash2.default.get(event, 'requestContext.authorizer.custom:AR') || '{}';const accessRights = JSON.parse(jsonToParse);if (process.env.BUILD_ENV === 'local') {if (!(0, _lodash.isEmpty)(accessRights)) {const bids = _lodash2.default.get(accessRights, 'businessIds', {});let withLocal;if (useCognitoBid) {withLocal = { ...bids };} else {withLocal = { ...bids, '1': 'A' };}_lodash2.default.set(accessRights, 'businessIds', withLocal);return _lodash2.default.get(accessRights, 'businessIds', {});} else {const ar = { 'businessIds': { '1': 'A' } };return _lodash2.default.get(ar, 'businessIds', {});}}return _lodash2.default.get(accessRights, 'businessIds', {});} /**
|
|
77
79
|
* Get the modules listed in custom:MOD.
|
|
78
80
|
*
|
|
79
81
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
@@ -992,4 +994,4 @@ for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_expor
|
|
|
992
994
|
if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true });
|
|
993
995
|
/******/ })()
|
|
994
996
|
;
|
|
995
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEdBQUFuUixzQkFBQSxHQUFHeVUsK0JBQW9CO0FBQzNDLE1BQU14RCxXQUFXLEdBQUFqUixtQkFBQSxHQUFHMFUsNEJBQWlCO0FBQ3JDLE1BQU14RCxrQ0FBa0MsR0FBQWxSLDBDQUFBLEdBQUcyVSxtREFBd0M7QUFDbkYsTUFBTWxPLGNBQWMsR0FBQXpHLHNCQUFBLEdBQUc0VSw4QkFBb0I7QUFDM0MsTUFBTTdVLGlCQUFpQixHQUFBQyx5QkFBQSxHQUFHNlUsb0NBQXVCO0FBQ2pELE1BQU1uUyxTQUFTLEdBQUExQyxpQkFBQSxHQUFHOFUsMEJBQWU7QUFDakMsTUFBTXpELFVBQVUsR0FBQXJSLGtCQUFBLEdBQUcrVSwyQkFBZ0I7QUFDbkMsTUFBTTdVLGlCQUFpQixHQUFBRix5QkFBQSxHQUFHZ1Ysb0NBQXVCO0FBQ2pELE1BQU0vVSxjQUFjLEdBQUFELHNCQUFBLEdBQUdpVixpQ0FBb0I7QUFDM0MsTUFBTTVVLGdCQUFnQixHQUFBTCx3QkFBQSxHQUFHa1YsbUNBQXNCLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9kYXRhYmFzZS9kYlNldHVwL21pZ3JhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2FjY2Vzc1JpZ2h0c1V0aWxzLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9jcmVhdGVGaWx0ZXJzLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9jcmVhdGVTb3J0LmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9kZWZhdWx0RmlsdGVycy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvZmluZEFsbC5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9keW5hbW8vZHluYW1vVXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZXZlbnRNYW5hZ2VyL2hhbmRsZUV2ZW50cy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9ldmVudE1hbmFnZXIvaGFuZGxlRmlsZS5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9ldmVudE1hbmFnZXIvcHVibGlzaEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9ldmVudE1hbmFnZXIvd2F0Y2hCdWNrZXQuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvcmVxdWVzdFJlc29uc2UvZXJyb3JDb2Rlcy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9yZXF1ZXN0UmVzb25zZS9yZXF1ZXN0UmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvczMvUzNVdGlscy5qcy9TM1V0aWxzLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL3Nucy9TTlNVdGlscy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwiQGF3cy1zZGsvY2xpZW50LXMzXCIiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJAYXdzLXNkay9jbGllbnQtc25zXCIiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJAYXdzLXNkay9saWItZHluYW1vZGJcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcImJsdWViaXJkXCIiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJsb2Rhc2hcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcIm1vbWVudFwiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwibW9tZW50L21vbWVudC5qc1wiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwic2VxdWVsaXplXCIiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJ1bXp1Z1wiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTZXF1ZWxpemVTdG9yYWdlLCBVbXp1ZyB9IGZyb20gJ3VtenVnJztcblxuLyoqXG4gKiBFeGVjdXRlIGRhdGFiYXNlIG1pZ3JhdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZU5hbWUgLSBuYW1lIG9mIGRhdGFiYXNlIHRvIGNyZWF0ZSAob3IgdmVyaWZ5IGV4aXN0ZW5jZSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBzZXF1ZWxpemVJbnN0YW5jZSAtIGluc3RhbmNlIG9mIFNlcXVlbGl6ZSAobXVzdCBiZSBpbml0aWFsaXplZClcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGluaXRpYWxpemVNb2RlbHMgLSBmdW5jdGlvbiB0byBydW4gdG8gc3luYyBTZXF1ZWxpemUgbW9kZWxzIHdpdGggZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoVG9NaWdyYXRpb25Gb2xkZXIgLSBwYXNzIGluIHRoZSBwYXRoIGlmIHVzaW5nIHdpbmRvd3MuIHdpbmRvd3MgYW5kIGxpbnV4IFBXRCB3aWxsIGJlIGRpZmZlcmVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWlncmF0aW9ucyhkYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZWxpemVJbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVNb2RlbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVG9NaWdyYXRpb25Gb2xkZXIgPSBgJHtwcm9jZXNzLmVudi5QV0R9L21pZ3JhdGlvbnMvKi5qc2ApIHtcbiAgICBjb25zdCB1bXp1ZyA9IG5ldyBVbXp1Zyh7XG4gICAgICAgIG1pZ3JhdGlvbnM6IHsgZ2xvYjogcGF0aFRvTWlncmF0aW9uRm9sZGVyIH0sXG4gICAgICAgIGNvbnRleHQ6IHNlcXVlbGl6ZUluc3RhbmNlLmdldFF1ZXJ5SW50ZXJmYWNlKCksXG4gICAgICAgIHN0b3JhZ2U6IG5ldyBTZXF1ZWxpemVTdG9yYWdlKHsgc2VxdWVsaXplOiBzZXF1ZWxpemVJbnN0YW5jZSB9KSxcbiAgICAgICAgbG9nZ2VyOiBjb25zb2xlXG4gICAgfSk7XG5cbiAgICBjb25zdCBwZW5kaW5nTWlncmF0aW9ucyA9IGF3YWl0IHVtenVnLnBlbmRpbmcoKTtcbiAgICBjb25zb2xlLmxvZygnLS0tLS0tLT5VVElMIFBlbmRpbmcgTWlncmF0aW9uczonLCBwZW5kaW5nTWlncmF0aW9ucywgcGF0aFRvTWlncmF0aW9uRm9sZGVyKTtcbiAgICBhd2FpdCB1bXp1Zy51cCgpLmNhdGNoKCh1cEVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiB1bXp1Zy5kb3duKHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnM6IF8uY2hhaW4ocGVuZGluZ01pZ3JhdGlvbnMpXG4gICAgICAgICAgICAgICAgLm1hcCgnZmlsZScpXG4gICAgICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgIC52YWx1ZSgpXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gJ1VUSUwgRXJyb3I6IEVycm9yIHdpdGggbWlncmF0aW5nIHVwOicgKyB1cEVycm9yO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH0sIChkb3duRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdVVElMIEVycm9yOiBFcnJvciB3aXRoIG1pZ3JhdGluZyBkb3duOicgKyBkb3duRXJyb3I7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgbmVlZGVkIHRvIHN5bmMgKGNyZWF0ZSkgdGFibGVzLCBidXQgbm90IHRvIGRhdGFiYXNlIHVwZGF0ZXNcbiAgICAvLyBpbiB0aGUgcGFzdCBpdCB3b3JrZWQgdG8gbGVhdmUgaXQgaW4sIGJ1dCBub3cgdGhlIHRhZ3MgbW9kdWxlIGNhdXNlcyBmb3JlaWduIGtleSBwcm9ibGVtc1xuICAgIC8vIFRoZSB0YWJsZXMgYXJlIHN0aWxsIGluaXRpYXRlZCBieSBiZWluZyBwYXNzZWQgaW4gdG8gcnVuIG1pZ3JhdGlvbnNcbiAgICBhd2FpdCBpbml0aWFsaXplTW9kZWxzKCk7XG59IiwiaW1wb3J0IF8sIHsgaXNFbXB0eSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckxpc3QgfSBmcm9tICcuLi8uLi8uLi9yZXF1ZXN0UmVzb25zZS9lcnJvckNvZGVzLmpzJztcbmltcG9ydCB7IHBhcnNlQm9keSB9IGZyb20gJy4uLy4uLy4uL3JlcXVlc3RSZXNvbnNlL3JlcXVlc3RSZXNwb25zZS5qcyc7XG5cbi8qKlxuICogR2V0IHRoZSBhbGxvd2VkIGJ1c2luZXNzSWRzIGZvciBhIHVzZXIgZnJvbSB0aGUgbGFtYmRhIGV2ZW50LCBjb21wYXJlIGl0IHRvIGJ1c2luZXNzSWRzLCByZXR1cm4gd2hhdCB1c2VyIGhhcyBhY2Nlc3MgdG8uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IC0gVGhlIGxhbWJkYSBldmVudCBwYXNzZWQgaW4gYnkgYSB2YWxpZGF0ZWQgYXBpIHJlcXVlc3QuXG4gKiBAcmV0dXJucyB7YXJyYXl9IEEgIGxpc3Qgb2YgYnVzaW5lc3NJZHMgdGhhdCBoYXZlIGJlZW4gcmVxdWVzdGVkIGFuZCBhcmUgYWxsb3dlZCB0byBmb3Igc29tZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNjZXNzUmlnaHRzVXRpbHMoZXZlbnQpIHtcbiAgICBjb25zdCByZXF1ZXN0ZWRCdXNpbmVzc0lkcyA9IGdldFJlcXVlc3RlZEJ1c2luZXNzSWRzKGV2ZW50KTtcbiAgICBjb25zdCBhbGxvd2VkQnVzaW5lc3NJZHMgPSBnZXRBbGxvd2VkQnVzaW5lc3NJZHMoZXZlbnQpO1xuICAgIGNvbnN0IGxvY2FsQmlkTGlzdCA9IFsnMSddO1xuXG4gICAgLy8gaWYgd2UgYXJlIG9uIGxvY2FsIHJldHVybiBmb3IgYWxsIGJpZHMgaW4gYWNjZXNzIHJpZ2h0c1xuICAgIGlmIChfLmlzRW1wdHkoYWxsb3dlZEJ1c2luZXNzSWRzKSAmJlxuICAgICAgICAhXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcycpICYmXG4gICAgICAgICFfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY3VzdG9tOkFSJykgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlVJTERfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlVJTERfRU5WICE9PSAnc3RhZ2luZycpIHtcbiAgICAgICAgaWYgKHJlcXVlc3RlZEJ1c2luZXNzSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsQmlkTGlzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfLmludGVyc2VjdGlvbihyZXF1ZXN0ZWRCdXNpbmVzc0lkcywgbG9jYWxCaWRMaXN0KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdGVkQnVzaW5lc3NJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBhbGxvd2VkQnVzaW5lc3NJZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIF8uaW50ZXJzZWN0aW9uKHJlcXVlc3RlZEJ1c2luZXNzSWRzLCBhbGxvd2VkQnVzaW5lc3NJZHMpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYnVzaW5lc3NJRCBzZXQgaW4gY29nbml0byBhcyBjdXN0b206REJJLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCAtIFRoZSBsYW1iZGEgZXZlbnQgcGFzc2VkIGluIGJ5IGEgdmFsaWRhdGVkIGFwaSByZXF1ZXN0LlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGJ1c2luZXNzSUQgc2V0IGluIGNvZ25pdG8gYXMgY3VzdG9tOkRCSVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlckRlZmF1bHRCaWQoZXZlbnQpIHtcbiAgICBsZXQganNvblRvUGFyc2UgPSBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY2xhaW1zLmN1c3RvbTpEQkknKSB8fFxuICAgICAgICBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY3VzdG9tOkRCSScpIHx8XG4gICAgICAgICd7fSc7XG5cbiAgICBjb25zdCBkYmkgPSBKU09OLnBhcnNlKGpzb25Ub1BhcnNlKTtcbiAgICByZXR1cm4gXy5nZXQoZGJpLCAnZGVmYXVsdEJpZCcsICcnKSB8fCAnMSc7XG59XG5cbi8qKlxuICogR2V0ICByZXF1ZXN0ZWQgYnVzaW5lc3NJZHMgZnJvbSB0aGUgcXVlcnkgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCAtIFRoZSBsYW1iZGEgZXZlbnQgcGFzc2VkIGluIGJ5IGEgdmFsaWRhdGVkIGFwaSByZXF1ZXN0LlxuICogQHJldHVybnMge2FycmF5fSBUaGUgYnVzaW5lc3NJRCByZXF1ZXN0ZWQgYnkgdGhlIHF1ZXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRSZXF1ZXN0ZWRCdXNpbmVzc0lkcyhldmVudCkge1xuICAgIGxldCByZXF1ZXN0ZWRCdXNpbmVzc0lkcyA9IF8uZ2V0KGV2ZW50LCAncXVlcnlTdHJpbmdQYXJhbWV0ZXJzLmJ1c2luZXNzSWRzJywgbnVsbCk7XG5cbiAgICByZXR1cm4gcmVxdWVzdGVkQnVzaW5lc3NJZHMgPyByZXF1ZXN0ZWRCdXNpbmVzc0lkcy5zcGxpdCgnLCcpIDogW107XG59XG5cbi8qKlxuICogR2V0IHRoZSBhbGxvd2VkIGJ1c2luZXNzSWRzIGZvciBhIHVzZXIgZnJvbSBjb2duaXRvIGN1c3RvbTpBUiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBUaGUgbGFtYmRhIGV2ZW50IHBhc3NlZCBpbiBieSBhIHZhbGlkYXRlZCBhcGkgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHthcnJheX0gVGhlIGJ1c2luZXNzSUQgcmVxdWVzdGVkIGJ5IHRoZSBxdWVyeSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0QWxsb3dlZEJ1c2luZXNzSWRzKGV2ZW50KSB7XG4gICAgY29uc3QgYnVzaW5lc3NlcyA9IGdldEJ1c2luZXNzZXNJbmZvKGV2ZW50KTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYnVzaW5lc3Nlcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdXNpbmVzc2VzSW5mbyhldmVudCkge1xuICAgIGxldCBqc29uVG9QYXJzZSA9IF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jbGFpbXMuY3VzdG9tOkFSJykgfHxcbiAgICAgICAgXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmN1c3RvbTpBUicpIHx8XG4gICAgICAgICd7fSc7XG4gICAgY29uc3QgYWNjZXNzUmlnaHRzID0gSlNPTi5wYXJzZShqc29uVG9QYXJzZSk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuQlVJTERfRU5WID09PSAnbG9jYWwnKSB7XG4gICAgICAgIGlmICghaXNFbXB0eShhY2Nlc3NSaWdodHMpKSB7XG4gICAgICAgICAgICBjb25zdCBiaWRzID0gXy5nZXQoYWNjZXNzUmlnaHRzLCAnYnVzaW5lc3NJZHMnLCB7fSk7XG4gICAgICAgICAgICBjb25zdCB3aXRoTG9jYWwgPSB7IC4uLmJpZHMsICcxJzogJ0EnIH07XG4gICAgICAgICAgICBfLnNldChhY2Nlc3NSaWdodHMsICdidXNpbmVzc0lkcycsIHdpdGhMb2NhbCk7XG5cbiAgICAgICAgICAgIHJldHVybiBfLmdldChhY2Nlc3NSaWdodHMsICdidXNpbmVzc0lkcycsIHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFyID0geyAnYnVzaW5lc3NJZHMnOiB7ICcxJzogJ0EnIH0gfTtcbiAgICAgICAgICAgIHJldHVybiBfLmdldChhciwgJ2J1c2luZXNzSWRzJywge30pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF8uZ2V0KGFjY2Vzc1JpZ2h0cywgJ2J1c2luZXNzSWRzJywge30pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbW9kdWxlcyBsaXN0ZWQgaW4gY3VzdG9tOk1PRC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBUaGUgbGFtYmRhIGV2ZW50IHBhc3NlZCBpbiBieSBhIHZhbGlkYXRlZCBhcGkgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHthcnJheX0gVGhlIE1vZHVsZSBhY2Nlc3MgbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlSW5mbyhldmVudCkge1xuICAgIGxldCBqc29uVG9QYXJzZSA9XG4gICAgICAgIF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jbGFpbXMuY3VzdG9tOk1PRCcpIHx8XG4gICAgICAgIF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jdXN0b206TU9EJykgfHxcbiAgICAgICAgXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5jdXN0b206QVInKSB8fFxuICAgICAgICBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY3VzdG9tOkFSJykgfHxcblxuICAgICAgICAne30nO1xuXG4gICAgY29uc3QgbW9kdWxlUmlnaHRzID0gSlNPTi5wYXJzZShqc29uVG9QYXJzZSk7XG4gICAgcmV0dXJuIF8uZ2V0KG1vZHVsZVJpZ2h0cywgJ21vZHVsZScsIHt9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG1vZHVsZXMgbGlzdGVkIGluIGN1c3RvbTpNT0QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZU5hbWUgLSBBIHN0aW5nIG5hbWUgZm9yIGEgbW9kdWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IC0gVGhlIGxhbWJkYSBldmVudCBwYXNzZWQgaW4gYnkgYSB2YWxpZGF0ZWQgYXBpIHJlcXVlc3QuXG4gKiBAcmV0dXJucyB7YXJyYXl9IFRoZSBNb2R1bGUgYWNjZXNzIGxpc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTW9kdWxlKG1vZHVsZU5hbWUsIGV2ZW50KSB7XG4gICAgY29uc3QgbW9kdWxlUmlnaHRzID0gZ2V0TW9kdWxlSW5mbyhldmVudCk7XG4gICAgbGV0IGFsbG93QWNjZXNzID0gXy5nZXQobW9kdWxlUmlnaHRzLCBtb2R1bGVOYW1lLCBmYWxzZSk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuQlVJTERfRU5WID09PSAnbG9jYWwnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFhbGxvd0FjY2Vzcykge1xuICAgICAgICB0aHJvdyBlcnJvckxpc3QudW5hdXRob3JpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHVzZXJSb2xlcyA9IHtcbiAgICBhZG1pbjogJ0EnLFxuICAgIHJlYWQ6ICdSJyxcbiAgICB3cml0ZTogJ1cnXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7e2JvZHk6IHN0cmluZ319IGV2ZW50XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBidXNpbmVzc0lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1dyaXRlQWNjZXNzKGV2ZW50KSB7XG4gICAgY29uc3QgZXZlbnRCb2R5ID0gcGFyc2VCb2R5KGV2ZW50KTtcbiAgICBjb25zdCBidXNpbmVzc0lkcyA9IGFjY2Vzc1JpZ2h0c1V0aWxzKGV2ZW50KSB8fCBbXTtcbiAgICBjb25zdCBidXNpbmVzc0lkID0gYnVzaW5lc3NJZHMuZmluZCgoaWQpID0+IGlkID09PSBldmVudEJvZHkuYnVzaW5lc3NJZCk7XG4gICAgY29uc3QgcmF3ID0gZ2V0QnVzaW5lc3Nlc0luZm8oZXZlbnQpO1xuICAgIGNvbnN0IHVzZXJSaWdodCA9IHJhd1tidXNpbmVzc0lkXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5CVUlMRF9FTlYgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50Qm9keS5idXNpbmVzc0lkO1xuICAgIH1cblxuICAgIGlmICgodXNlclJpZ2h0ICE9PSB1c2VyUm9sZXMuYWRtaW4gJiYgdXNlclJpZ2h0ICE9PSB1c2VyUm9sZXMud3JpdGUpIHx8ICghdXNlclJpZ2h0KSkge1xuICAgICAgICB0aHJvdyBlcnJvckxpc3QudW5hdXRob3JpemVkO1xuICAgIH1cbiAgICByZXR1cm4gYnVzaW5lc3NJZDtcbn1cblxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBEQiBmcm9tICdzZXF1ZWxpemUnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQvbW9tZW50LmpzJztcbmltcG9ydCB7IGVycm9yTGlzdCB9IGZyb20gJy4uLy4uLy4uL3JlcXVlc3RSZXNvbnNlL2Vycm9yQ29kZXMuanMnO1xuaW1wb3J0IHsgYWNjZXNzUmlnaHRzVXRpbHMgfSBmcm9tICcuL2FjY2Vzc1JpZ2h0c1V0aWxzLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgc2VxdWVsaXplIHdoZXJlIGNsYXVzZSBmcm9tIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGFuZCBkZWZhdWx0IHNvcnQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IC0gdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgZXZlbnQgcGFzc2VkIGJ5IGxhbWJkYVxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdEZpbHRlcnMgLSB0aGUgZGVmYXVsdCBmaWx0ZXJzIG9iamVjdCBjcmVhdGVkIGJ5IGNyZWF0ZURlZmF1bHRGaWx0ZXJzXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBBbiBzZXF1ZWxpemUgd2hlcmUgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVGaWx0ZXJzID0gZnVuY3Rpb24gKGV2ZW50LCBvYmplY3RGaWx0ZXJzKXtcbiAgICBsZXQgcXVlcnkgPSBfLmdldChldmVudCwgJ3F1ZXJ5U3RyaW5nUGFyYW1ldGVycycsIHt9KSB8fCB7fTtcbiAgICBjb25zdCBzdGFydERhdGUgPSBfLmdldChxdWVyeSwgJ3N0YXJ0RGF0ZScpO1xuICAgIGNvbnN0IGVuZERhdGUgPSBfLmdldChxdWVyeSwgJ2VuZERhdGUnKTtcbiAgICBjb25zdCB3aGVyZSA9IE9iamVjdC5rZXlzKHF1ZXJ5KS5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSBfLmdldChvYmplY3RGaWx0ZXJzLCBpdGVtLCBudWxsKTtcblxuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtTmFtZSA9IGl0ZW0uaW5jbHVkZXMoJy4nKVxuICAgICAgICAgICAgICAgID8gYCQke2l0ZW19JGBcbiAgICAgICAgICAgICAgICA6IGl0ZW07XG5cbiAgICAgICAgICAgIGFjY1tpdGVtTmFtZV0gPSB7fTtcbiAgICAgICAgICAgIGlmICh2YWwuZmlsdGVyVHlwZSA9PT0gREIuT3AuaUxpa2UpIHtcbiAgICAgICAgICAgICAgICBhY2NbaXRlbU5hbWVdW3ZhbC5maWx0ZXJUeXBlXSA9IGAlJHtxdWVyeVtpdGVtXX0lYDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsLmZpbHRlclR5cGUgPT09IERCLk9wLm9yKSB7XG4gICAgICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXVt2YWwuZmlsdGVyVHlwZV0gPSBbLTEgKiArcXVlcnlbaXRlbV0sICtxdWVyeVtpdGVtXV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbC5maWx0ZXJUeXBlID09PSBEQi5PcC5pbikge1xuICAgICAgICAgICAgICAgIGFjY1tpdGVtTmFtZV1bdmFsLmZpbHRlclR5cGVdID0gcXVlcnlbaXRlbV0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsLmZpbHRlclR5cGUgPT09IERCLk9wLmluKSB7XG4gICAgICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXVt2YWwuZmlsdGVyVHlwZV0gPSBxdWVyeVtpdGVtXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkSnNvbjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyBKU09OLCBwYXJzZSBpdFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRKc29uID0gSlNPTi5wYXJzZShxdWVyeVtpdGVtXSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyBub3QgSlNPTiwgcGFzcyB0aHJvdWdoIGFzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZEpzb24gPSBxdWVyeVtpdGVtXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXVt2YWwuZmlsdGVyVHlwZV0gPSBwYXJzZWRKc29uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsLnR5cGUgPT09IERCLkJPT0xFQU4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVZhbHVlID0gXy5nZXQocXVlcnksIGl0ZW0sICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9vbGVhbk1hcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgJ2ZhbHNlJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICdudWxsJzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgJ3RydWUnOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGFjY1tpdGVtTmFtZV1bdmFsLmZpbHRlclR5cGVdID0gYm9vbGVhbk1hcFtxdWVyeVZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgaWYgKG9iamVjdEZpbHRlcnM/LmFjdGl2ZSAmJiAhd2hlcmU/LmFjdGl2ZSkge1xuICAgICAgICB3aGVyZS5hY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1c2luZXNzSWRzID0gYWNjZXNzUmlnaHRzVXRpbHMoZXZlbnQpO1xuICAgIGNvbnN0IGZpbHRlckFkZHMgPSB7XG4gICAgICAgIGJ1c2luZXNzSWQ6IGJ1c2luZXNzSWRzXG4gICAgfTtcblxuICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xuICAgICAgICBjb25zdCBzID0gbW9tZW50LnV0YyhzdGFydERhdGUpO1xuICAgICAgICBjb25zdCBlID0gbW9tZW50LnV0YyhlbmREYXRlKTtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB7XG4gICAgICAgICAgICBbREIuT3AuYmV0d2Vlbl06IFtzLnRvRGF0ZSgpLCBlLnRvRGF0ZSgpXVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyB7IC4uLmVycm9yTGlzdC5pbnZhbGlkU3RhcnREYXRlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWUuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyB7IC4uLmVycm9yTGlzdC5pbnZhbGlkRW5kRGF0ZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZmlsdGVyQWRkcy5jcmVhdGVkQXQgPSBkYXRlcztcbiAgICB9XG5cbiAgICBjb25zdCB3aXRoRGF0ZSA9IE9iamVjdC5hc3NpZ24od2hlcmUsIGZpbHRlckFkZHMpO1xuXG4gICAgcmV0dXJuIHdpdGhEYXRlO1xufTtcbiIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogQ3JlYXRlIHNlcXVlbGl6ZSBvcmRlciBjbGF1c2UgZnJvbSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyBhbmQgZGVmYXVsdCBzb3J0IG9iamVjdFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCAtIHRoZSBldmVudCBjcmVhdGVkIEFXUyBsYW1iZGEsIGl0IHdpbGwgY29udGFpbiBxdWVyeVN0cmluZ1BhcmFtZXRlcnMgd2l0aCBzb3J0IHByb3BlcnR5IGEgY29tbWEgc2VwZXJhdGVkIGxpc3Qgb2Ygc29ydGFibGUgZmllbGRzICogQHBhcmFtIHtvYmplY3R9IG9iamVjdEZpbHRlcnMgLSB0aGUgZGVmYXVsdCBmaWx0ZXJzIG9iamVjdCBjcmVhdGVkIGJ5IGNyZWF0ZURlZmF1bHRGaWx0ZXJzXG4gKiBAcGFyYW0ge29iamVjdH0gZGVmYXVsdEZpbHRlciAtIEEgZGVmYXVsdCBmaWx0ZXIgb2JqZWN0IGFzIGJ1aWx0IGJ5IGNyZWF0ZURlZmF1bHQgRmlsdGVycywgaWYgaXRlbXMgYXJlIG5vdCBvbiB0aGUgc2NoZW1hIHRoZXkgd2lsbCBub3QgYmUgaW4gdGhlIG9yZGVyIGJ5XG4gKiBAcmV0dXJucyB7b2JqZWN0fSAgQW4gc2VxdWVsaXplIG9yZGVyIGJ5IG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlU29ydCA9IGZ1bmN0aW9uIChldmVudCwgZGVmYXVsdEZpbHRlcikge1xuICAgIGxldCBjb3B5T2ZEZWZhdWx0RmlsdGVyID0gXy5jbG9uZShkZWZhdWx0RmlsdGVyKTtcbiAgICBsZXQgcXVlcnkgPSBfLmdldChldmVudCwgJ3F1ZXJ5U3RyaW5nUGFyYW1ldGVycycsIHt9KSB8fCB7fTtcbiAgICBsZXQgc29ydCA9IF8uZ2V0KHF1ZXJ5LCAnc29ydCcsICctdXBkYXRlZEF0JykgfHwgJy11cGRhdGVkQXQnO1xuXG4gICAgcmV0dXJuIHNvcnQuc3BsaXQoJywnKS5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHRlc3RJdGVtID0gaXRlbS5pbmRleE9mKCctJykgPT09IDAgPyBpdGVtLnN1YnN0cigxKSA6IGl0ZW07XG5cbiAgICAgICAgaWYgKF8uZ2V0KGNvcHlPZkRlZmF1bHRGaWx0ZXIsIHRlc3RJdGVtLCBudWxsKSkge1xuICAgICAgICAgICAgY29uc3Qgc29ydEl0ZW0gPSBbXTtcblxuICAgICAgICAgICAgdGVzdEl0ZW0uc3BsaXQoJy4nKS5mb3JFYWNoKChwYXJlbnRDaGlsZExpc3QpID0+IHtcbiAgICAgICAgICAgICAgICBzb3J0SXRlbS5wdXNoKHBhcmVudENoaWxkTGlzdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0uaW5kZXhPZignLScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc29ydEl0ZW0ucHVzaCgnREVTQycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3J0SXRlbS5wdXNoKCdBU0MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjYy5wdXNoKHNvcnRJdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xufTtcbiIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgREIgZnJvbSAnc2VxdWVsaXplJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IHdpdGggZGVmYXVsdCBmaWx0ZXJzIGZvciBhIGdpdmVuIHNlcXVlbGlhemUgU2NoZW1hIE9iamVjdCwgYW5kIHNldCBvZiBzdWIgc2NoZW1hc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWEgLSB0eXBlIGlzIHNlcXVlbGl6ZSBkYXRhIHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdWJTY2hlbWFzIC0gQW4gb2JqZWN0IHdpdGggYWxpYXMgYXMgdGhlIGtleSBhbmQgc2VxdWVsaXplIHNjaGVtYSBhcyB0aGUgdmFsdWUgaHR0cDovL2RvY3Muc2VxdWVsaXplanMuY29tL2NsYXNzL2xpYi9zZXF1ZWxpemUuanN+U2VxdWVsaXplLmh0bWwjaW5zdGFuY2UtbWV0aG9kLWRlZmluZVxuICogc3ViIHNjaGVtYSBjYW4gYmUge2xvY2F0aW9uOiBsb2NhdGlvblNjaGVtYX0gb3Ige2xvY2F0aW9uOiB7YXM6IFwiYXNBbGlhc1wiLCBzY2hlbWE6IHNjaGVtYX19XG4gKiBAcmV0dXJucyB7b2JqZWN0fSBBbiBPYmplY3Qgd2l0aCBhIGRlZmF1bHQgZmlsdGVyIGZvciBlYWNoIGRhdGFUeXBlIENIQVIgYW5kIFRFWFQgd2lsbCBnZXQgYSAkbGlrZSBvcGVyYXRvciwgSU5URUdFUiwgREVDSU1BTCBhbmQgQk9PTEVBTiB3aWxsIGdldCBhICRlcS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXJzKHNjaGVtYSwgc3ViU2NoZW1hcyA9IHt9KSB7XG4gICAgc2NoZW1hID0gXy5jbG9uZShzY2hlbWEpO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHt9O1xuXG4gICAgYWRkRmlsdGVyc0Zyb21TY2hlbWEoc2NoZW1hLCBmaWx0ZXJzKTtcbiAgICBPYmplY3Qua2V5cyhzdWJTY2hlbWFzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgYWRkRmlsdGVyc0Zyb21TY2hlbWEoc3ViU2NoZW1hc1trZXldLCBmaWx0ZXJzLCBrZXkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbHRlcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaWx0ZXJzRnJvbVNjaGVtYShzY2hlbWEsIGFjY3VtdWxhdG9yLCBrZXlQcmVmaXggPSAnJykge1xuICAgIGNvbnN0IGFzTGlua0FsaWFzID0gXy5nZXQoc2NoZW1hLCAnYXMnLCBudWxsKTtcbiAgICBzY2hlbWEgPSBfLmdldChzY2hlbWEsICdzY2hlbWEnKSB8fCBzY2hlbWE7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hKS5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgICAgICBsZXQga2V5ID0gaXRlbTtcblxuICAgICAgICBpZiAoYXNMaW5rQWxpYXMpIHtcbiAgICAgICAgICAgIGFjY1thc0xpbmtBbGlhc10gPSB7IHR5cGU6IERCLlNUUklORywgZmlsdGVyVHlwZTogREIuT3AuZXEgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXlQcmVmaXgpIHtcbiAgICAgICAgICAgIGtleSA9IGAke2tleVByZWZpeH0uJHtpdGVtfWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NoZW1hW2l0ZW1dLmZpbHRlclR5cGUpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0geyBmaWx0ZXJUeXBlOiBzY2hlbWFbaXRlbV0uZmlsdGVyVHlwZSB9O1xuXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbVR5cGUgPSBzY2hlbWFbaXRlbV0udHlwZTtcblxuICAgICAgICAvL3RvZG8gdGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQsIHRoZXJlIGFyZSBqdXN0IGhlcmUgZm9yIHNvcnQgdGVzdHNcbiAgICAgICAgc3dpdGNoIChpdGVtVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBEQi5DSEFSOlxuICAgICAgICAgICAgY2FzZSBEQi5TVFJJTkc6XG4gICAgICAgICAgICBjYXNlIERCLlRFWFQ6XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IERCLk9wLmlMaWtlIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgREIuREVDSU1BTDpcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IHsgZmlsdGVyVHlwZTogREIuT3Aub3IgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBEQi5CT09MRUFOOlxuICAgICAgICAgICAgY2FzZSBEQi5CSUdJTlQ6XG4gICAgICAgICAgICBjYXNlIERCLklOVEVHRVI6XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSB7IHR5cGU6IGl0ZW1UeXBlLCBmaWx0ZXJUeXBlOiBEQi5PcC5lcSB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIERCLkRBVEU6XG4gICAgICAgICAgICBjYXNlIERCLkRBVEVPTkxZOlxuICAgICAgICAgICAgICAgIGFjY1trZXldID0geyBmaWx0ZXJUeXBlOiBEQi5PcC5sdCB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9uZXcgc2VxdWVsaXplIHVzZXMgY2xhc3NlcyBpbnN0ZWFkIG9mIG9iamVjdHNcbiAgICAgICAgaWYgKGl0ZW1UeXBlIGluc3RhbmNlb2YgREIuU1RSSU5HKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHsgZmlsdGVyVHlwZTogREIuT3AuaUxpa2UgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSBpbnN0YW5jZW9mIERCLkRFQ0lNQUwpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0geyBmaWx0ZXJUeXBlOiBEQi5PcC5vciB9O1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlIGluc3RhbmNlb2YgREIuSU5URUdFUikge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IERCLk9wLm9yIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5CSUdJTlQpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0geyBmaWx0ZXJUeXBlOiBEQi5PcC5vciB9O1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlIGluc3RhbmNlb2YgREIuQk9PTEVBTikge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IHR5cGU6IGl0ZW1UeXBlLCBmaWx0ZXJUeXBlOiBEQi5PcC5lcSB9O1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlIGluc3RhbmNlb2YgREIuSlNPTkIpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0geyB0eXBlOiBpdGVtVHlwZSwgZmlsdGVyVHlwZTogREIuT3AuY29udGFpbnMgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSBpbnN0YW5jZW9mIERCLkRBVEVPTkxZKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHsgdHlwZTogaXRlbVR5cGUsIGZpbHRlclR5cGU6IERCLk9wLmVxIH07XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoZXNlIGFyZSBub3QgcGFydCBvZiB0aGUgbW9kZWxzIHNvIGFkZCB0aGVtIGFsd2F5c1xuICAgICAgICBhY2NbJ2NyZWF0ZWRBdCddID0geyB0eXBlOiBEQi5EQVRFLCBmaWx0ZXJUeXBlOiBEQi5PcC5sdCB9O1xuICAgICAgICBhY2NbJ3VwZGF0ZWRBdCddID0geyB0eXBlOiBEQi5EQVRFLCBmaWx0ZXJUeXBlOiBEQi5PcC5sdCB9O1xuICAgICAgICBhY2NbJ2lkJ10gPSB7IHR5cGU6IERCLklOVEVHRVIsIGZpbHRlclR5cGU6IERCLk9wLmVxIH07XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBhY2N1bXVsYXRvcik7XG59XG4iLCIvKipcbiAqIGNyZWF0ZSBwYWdpbmF0aW9uIG9iamVjdCBmcm9tIFNlcXVlbGl6ZSBmaW5kQWxsXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzdWx0IC0gc2VxdWVsaXplIHJlc3VsdFxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gbWF4IG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVyblxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIHBhZ2Ugb2Zmc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdpbmF0aW9uRnJvbUZpbmRBbGwocmVzdWx0LCBsaW1pdCwgb2Zmc2V0KSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0IHx8IFtdO1xuICAgIGxpbWl0ID0gbGltaXQgfHwgMDtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGNvbnN0IGhhc01vcmUgPSByZXN1bHQubGVuZ3RoID4gbGltaXQ7XG4gICAgaWYgKGhhc01vcmUpIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZSgtMSwgMSk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VPYmplY3QgPSB7XG4gICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICBsaW1pdDogbGltaXQsXG4gICAgICAgIHJvd3M6IHJlc3VsdCxcbiAgICAgICAgaGFzTW9yZTogaGFzTW9yZVxuICAgIH07XG5cbiAgICByZXR1cm4gcGFnZU9iamVjdDtcbn1cblxuLyoqXG4gKiB3cmFwcGVyIGZvciBTZXF1ZWxpemUgZmluZEFsbFxuICogQHBhcmFtIHtvYmplY3R9IG1vZGVsIC0gaW5zdGFuY2Ugb2YgU2VxdWVsaXplIChtdXN0IGJlIGluaXRpYWxpemVkKVxuICogQHBhcmFtIHsqJntpbmNsdWRlOiBbe21vZGVsOiAqfV0sIHdoZXJlOiB7YnVzaW5lc3NJZDogQXJyYXl9LCBvcmRlcjogW3N0cmluZ1tdXX19IG9wdGlvbnMgLSBpbnN0YW5jZSBvZiBTZXF1ZWxpemUgKG11c3QgYmUgaW5pdGlhbGl6ZWQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQWxsKG1vZGVsLCBvcHRpb25zKSB7XG5cbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgfHwgMDtcbiAgICBjb25zdCBmaW5kQXJncyA9IE9iamVjdC5hc3NpZ24oe2luY2x1ZGU6IHsgYWxsOiB0cnVlLCBuZXN0ZWQ6IHRydWUgfX0sIG9wdGlvbnMsIHsgbGltaXQ6IGxpbWl0ICsgMSB9KTtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgbW9kZWwuZmluZEFsbChmaW5kQXJncyk7XG4gICAgcmV0dXJuIGdldFBhZ2luYXRpb25Gcm9tRmluZEFsbChyZXN1bHRzLCBsaW1pdCwgb3B0aW9ucy5vZmZzZXQpO1xufVxuXG5jb25zdCBmaW5kVXRpbHMgPSB7XG4gICAgZmluZEFsbFxufTtcbmV4cG9ydCBkZWZhdWx0IGZpbmRVdGlsczsiLCJpbXBvcnQgeyBEeW5hbW9EQkRvY3VtZW50IH0gZnJvbSAnQGF3cy1zZGsvbGliLWR5bmFtb2RiJztcclxuaW1wb3J0IHsgRHluYW1vREIgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZHluYW1vZGInO1xyXG5cclxuY29uc3QgZHluYW1vVXRpbCA9IHtcclxuICAgIGdldDogKHBhcmFtcykgPT4gZ2V0KHBhcmFtcylcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3tUYWJsZU5hbWU6c3RyaW5nLCBLZXk6e2tleTpzdHJpbmd9fX0gcGFyYW1zXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBnZXQocGFyYW1zKSB7XHJcbiAgICBjb25zdCBkeW5hbW9EYiA9IER5bmFtb0RCRG9jdW1lbnQuZnJvbShuZXcgRHluYW1vREIoKSk7XHJcbiAgICByZXR1cm4gZHluYW1vRGIuZ2V0KHBhcmFtcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGR5bmFtb1V0aWw7IiwiaW1wb3J0IHsgaGFuZGxlRmlsZSB9IGZyb20gJy4vaGFuZGxlRmlsZS5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXZlbnRzKGV2ZW50LCB0cmFuc2Zvcm1lciwgZXJyb3JIYW5kbGVyUGVyRmlsZSwgc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMgPSBmYWxzZSwgdXNlckltcG9ydFR5cGVzKSB7XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQuUmVjb3Jkcykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIFByb21pc2UubWFwKGV2ZW50LlJlY29yZHMsIChyZWNvcmQpID0+IHtcbiAgICAgICAgY29uc3Qgc25zSW5mbyA9IEpTT04ucGFyc2UoXy5nZXQocmVjb3JkLCAnU25zLk1lc3NhZ2UnLCAne30nKSk7XG4gICAgICAgIGNvbnN0IHMzQnVja2V0ID0gc25zSW5mby5idWNrZXQ7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gc25zSW5mby5maWxlcyB8fCBbXTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5tYXAoZmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudChmaWxlKTtcbiAgICAgICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZpbGUocGF0aCwgczNCdWNrZXQsIHRyYW5zZm9ybWVyLCB7IHNob3VsZFNraXBGYWlsZWRGb2xkZXJzLCB1c2VySW1wb3J0VHlwZXMgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JIYW5kbGVyUGVyRmlsZSAmJiAhZXJyb3JIYW5kbGVyUGVyRmlsZShlcnIsIHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgICAgICAgICB0aHJvdyAnRXJyb3JzIHByb2Nlc3Npbmcgb25lIG9yIG1vcmUgZmlsZXMuIFNlZSBlcnJvciBsb2dzIGZvciBkZXRhaWwgb24gZWFjaCBlcnJvci4nO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFMzVXRpbCBmcm9tICcuLi9zMy9TM1V0aWxzLmpzL1MzVXRpbHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRmlsZShwYXRoLCBzM0J1Y2tldCwgdHJhbnNmb3JtZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzaG91bGRTa2lwRmFpbGVkRm9sZGVycyA9IF8uZ2V0KG9wdGlvbnMsICdzaG91bGRTa2lwRmFpbGVkRm9sZGVycycpO1xuICAgIGNvbnN0IHVzZXJJbXBvcnRUeXBlcyA9IF8uZ2V0KG9wdGlvbnMsICd1c2VySW1wb3J0VHlwZXMnKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIEJ1Y2tldDogczNCdWNrZXQsXG4gICAgICAgIEtleTogcGF0aFxuICAgIH07XG4gICAgbGV0IGJvZHkgPSAne30nXG4gICAgdHJ5IHtcbiAgICAgICAgYm9keSA9IGF3YWl0IFMzVXRpbC5nZXRPYmplY3QocGFyYW1zKTtcbiAgICAgICAgY29uc3QgcGFyc2VkQm9keSA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgIGNvbnN0IHJldHVybmVkVmFsdWUgPSBhd2FpdCB0cmFuc2Zvcm1lcihwYXJzZWRCb2R5KTtcbiAgICAgICAgYXdhaXQgUzNVdGlsLmRlbGV0ZU9iamVjdChwYXJhbXMpO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5lZFZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hhbmRsZS1maWxlLWVycm9yJywgZXJyb3IpO1xuXG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnTm9TdWNoS2V5JyB8fCAhYm9keSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld1BhdGggPSAnJztcblxuICAgICAgICBpZiAodXNlckltcG9ydFR5cGVzKSB7XG4gICAgICAgICAgICAvLyBsb29rIGZvciBpdGVtcyBpbiB0aGUgdXNlckltcG9ydFR5cGVzXG4gICAgICAgICAgICBjb25zdCB1c2Vyc0ltcG9ydHMgPSBPYmplY3QudmFsdWVzKHVzZXJJbXBvcnRUeXBlcyk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gXy5sYXN0KGl0ZW1zKTtcbiAgICAgICAgICAgIGNvbnN0IGZvbGRlck5hbWUgPSBfLmZpcnN0KGl0ZW1zKTtcblxuICAgICAgICAgICAgaWYgKHVzZXJzSW1wb3J0cy5pbmRleE9mKGZvbGRlck5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCA9IGAke2ZvbGRlck5hbWV9L2Vycm9yLyR7ZmlsZU5hbWV9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF8uc3RhcnRzV2l0aChwYXRoLCBgJHtmb2xkZXJOYW1lfS9mYWlsZWQtb25jZS9gKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoID0gXy5yZXBsYWNlKHBhdGgsIGAke2ZvbGRlck5hbWV9L2ZhaWxlZC1vbmNlL2AsIGAke2ZvbGRlck5hbWV9L2ZhaWxlZC10d2ljZS9gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF8uc3RhcnRzV2l0aChwYXRoLCBgJHtmb2xkZXJOYW1lfS9mYWlsZWQtdHdpY2UvYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCA9IF8ucmVwbGFjZShwYXRoLCBgJHtmb2xkZXJOYW1lfS9mYWlsZWQtdHdpY2UvYCwgYCR7Zm9sZGVyTmFtZX0vZXJyb3IvYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCA9IGAke2ZvbGRlck5hbWV9L2ZhaWxlZC1vbmNlLyR7ZmlsZU5hbWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1BhdGggPSBgcGF0aEFuZEV2ZW50TWlzTWF0Y2hFcnJvci8ke3BhdGh9YDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNob3VsZFNraXBGYWlsZWRGb2xkZXJzKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aCA9IGBlcnJvci8ke3BhdGh9YDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5zdGFydHNXaXRoKHBhdGgsICdmYWlsZWQtb25jZS8nKSkge1xuICAgICAgICAgICAgICAgIG5ld1BhdGggPSBfLnJlcGxhY2UocGF0aCwgJ2ZhaWxlZC1vbmNlLycsICdmYWlsZWQtdHdpY2UvJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uc3RhcnRzV2l0aChwYXRoLCAnZmFpbGVkLXR3aWNlLycpKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aCA9IF8ucmVwbGFjZShwYXRoLCAnZmFpbGVkLXR3aWNlLycsICdlcnJvci8nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMocGF0aCwgJ2RlbGF5VW50aWwvJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IF8ubGFzdChwYXRoLnNwbGl0KCcvJykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5ld1BhdGggPSBgZmFpbGVkLW9uY2UvJHtwYXRofWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdQYXJhbXMgPSB7XG4gICAgICAgICAgICBCdWNrZXQ6IHMzQnVja2V0LFxuICAgICAgICAgICAgS2V5OiBuZXdQYXRoLFxuICAgICAgICAgICAgQm9keTogYm9keVxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IFMzVXRpbC5wdXRPYmplY3QobmV3UGFyYW1zKTtcbiAgICAgICAgYXdhaXQgUzNVdGlsLmRlbGV0ZU9iamVjdChwYXJhbXMpO1xuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cbiIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgUzNVdGlscyBmcm9tICcuLi9zMy9TM1V0aWxzLmpzL1MzVXRpbHMuanMnO1xuaW1wb3J0IFNOU1V0aWwgZnJvbSAnLi4vc25zL1NOU1V0aWxzLmpzJztcbmltcG9ydCBkeW5hbW9VdGlsIGZyb20gJy4uL2R5bmFtby9keW5hbW9VdGlscy5qcyc7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldFxuICogQHBhcmFtIHtudW1iZXJ9IG1heEtleXNcbiAqIEBwYXJhbSB7T2JqZWN0fSB1c2VySW1wb3J0VHlwZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvb3AoYnVja2V0LCBtYXhLZXlzLCB1c2VySW1wb3J0VHlwZXMpIHtcbiAgICBsZXQgYnVja2V0UmVzdWx0ID0ge307XG4gICAgbGV0IGZpbGVMaXN0ID0gW107XG5cbiAgICBjb25zdCBjdXJyZW50VGltZSA9IG1vbWVudCgpO1xuXG4gICAgZG8ge1xuICAgICAgICBidWNrZXRSZXN1bHQgPSBhd2FpdCBTM1V0aWxzLmxpc3RPYmplY3RzVjIoe1xuICAgICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgICBNYXhLZXlzOiBtYXhLZXlzLFxuICAgICAgICAgICAgQ29udGludWF0aW9uVG9rZW46IF8uZ2V0KGJ1Y2tldFJlc3VsdCwgJ05leHRDb250aW51YXRpb25Ub2tlbicpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBuZXdGaWxlcyA9IF8uZmlsdGVyKGJ1Y2tldFJlc3VsdC5Db250ZW50cywgKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmIChfLnN0YXJ0c1dpdGgoXy5nZXQoZmlsZSwgJ0tleScpLCAnZGVsYXlVbnRpbC8nKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVEZWxheVRpbWUgPSBfLmdldChmaWxlLCAnS2V5Jykuc3BsaXQoJy8nKVsxXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9tZW50KGZpbGVEZWxheVRpbWUsICdZWVlZTU1EREhIbW0nKS5pc1NhbWVPckJlZm9yZShjdXJyZW50VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXNlckltcG9ydFR5cGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgaXRlbXMgaW4gdGhlIHVzZXJJbXBvcnRUeXBlc1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJzSW1wb3J0cyA9IE9iamVjdC52YWx1ZXModXNlckltcG9ydFR5cGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IGZpbGUuS2V5LnNwbGl0KCcvJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBfLmxhc3QoaXRlbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbGRlck5hbWUgPSBfLmZpcnN0KGl0ZW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoXy5pc0VtcHR5KGZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJzSW1wb3J0cy5pbmRleE9mKGZvbGRlck5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuICFfLnN0YXJ0c1dpdGgoZmlsZS5LZXksIGAke2ZvbGRlck5hbWV9L2Vycm9yYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gIV8uc3RhcnRzV2l0aChmaWxlLktleSwgJ2Vycm9yJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZpbGVMaXN0ID0gXy5jb25jYXQoZmlsZUxpc3QsIG5ld0ZpbGVzKTtcbiAgICB9IHdoaWxlIChidWNrZXRSZXN1bHQuSXNUcnVuY2F0ZWQgJiYgYnVja2V0UmVzdWx0Lk5leHRDb250aW51YXRpb25Ub2tlbiAmJiBmaWxlTGlzdC5sZW5ndGggPCBtYXhLZXlzKTtcblxuICAgIHJldHVybiBmaWxlTGlzdDtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZWQgU05TIGV2ZW50cyBhdCBhIHN0ZWFkeSBwYWNlIGZvciBkYXRhIGluIGEgcGFydGljdWxhciBidWNrZXQuIFNob3VsZCBiZSBleGVjdXRlZCB2aWEgYSBjbG91ZCB3YXRjaCBjcm9uIGpvYiBhcyBhIHBhcnQgb2YgYSBtaWNybyBzZXJ2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ1RhYmxlIC0gVGhlIER5bmFtbyBEQiB0YWJsZSB3aGVyZSB0byBnZXQgdGhlIGNodW5rLXNpemUgYW5kIG1heE1lc3NhZ2Ugc2l6ZVxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlS2V5IC0gVGhlIGtleSB0byB0aGUgaXRlbSBpbiB0aGUgRHluYW1vIERCIHRhYmxlIHRoYXQgaG9sZHMgdGhlIGNodW5rLXNpemUgYW5kIG1heE1lc3NhZ2Ugc2l6ZVxuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIFRoZSBuYW1lIG9mIHRoZSBzMyBidWNrZXQgdG8gd2F0Y2gsIHdoZW4geW91IGRyb3AgaXRlbXMgaW50byB0aGlzIHRhYmxlIGV2ZW50cyB3aWxsIGJlIGNyZWF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzbnNUb3BpYyAtIFRoZSBuYW1lIG9mIHRoZSBzbnNFdmVudCB0byBwdWJsaXNoXG4gKiBAcGFyYW0ge29iamVjdH0gdXNlckltcG9ydFR5cGVzIC0gaW1wb3J0IHR5cGVzIHRvIGZpbHRlciBvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaEV2ZW50cyhjb25maWdUYWJsZSwgdGFibGVLZXksIGJ1Y2tldCwgc25zVG9waWMsIHVzZXJJbXBvcnRUeXBlcykge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZHluYW1vVXRpbC5nZXQoe1xuICAgICAgICAgICAgVGFibGVOYW1lOiBjb25maWdUYWJsZSxcbiAgICAgICAgICAgIEtleTogeyBrZXk6IHRhYmxlS2V5IH1cbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgZ2V0IGNvbmZpZyBmb3Iga2V5OiAke3RhYmxlS2V5fSB0YWJsZTogJHtjb25maWdUYWJsZX0gZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzIG9mIDIgYW5kIDEwYCwgZSk7XG4gICAgfVxuICAgIGxldCBjaHVua1NpemUgPSBfLmdldChyZXN1bHQsICdJdGVtLnNuc0NodW5rU2l6ZScsIDIpO1xuICAgIGxldCBtYXhNZXNzYWdlcyA9IF8uZ2V0KHJlc3VsdCwgJ0l0ZW0uc25zTWF4TWVzc2FnZXMnLCAxMCk7XG5cbiAgICBjb25zdCBzbnNDcmVhdGVUb3BpY1Jlc3BvbnNlID0gYXdhaXQgU05TVXRpbC5jcmVhdGVUb3BpYyh7IE5hbWU6IHNuc1RvcGljIH0pO1xuICAgIGNvbnN0IHRvcGljQXJuID0gc25zQ3JlYXRlVG9waWNSZXNwb25zZS5Ub3BpY0FybjtcbiAgICBjb25zdCBtYXhLZXlzID0gY2h1bmtTaXplICogbWF4TWVzc2FnZXM7XG5cbiAgICBjb25zdCBmaWxlTGlzdCA9IGF3YWl0IGxvb3AoYnVja2V0LCBtYXhLZXlzLCB1c2VySW1wb3J0VHlwZXMpO1xuXG4gICAgY29uc3QgbWVzc2FnZUxpc3QgPSBfLmNoYWluKGZpbGVMaXN0KVxuICAgICAgICAubWFwKCdLZXknKVxuICAgICAgICAuY2h1bmsoY2h1bmtTaXplKVxuICAgICAgICAuc2xpY2UoMCwgbWF4TWVzc2FnZXMpXG4gICAgICAgIC52YWx1ZSgpXG4gICAgO1xuXG4gICAgcmV0dXJuIFByb21pc2UubWFwKG1lc3NhZ2VMaXN0LCAoZmlsZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIFNOU1V0aWwucHVibGlzaCh7XG4gICAgICAgICAgICBNZXNzYWdlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgYnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIFRvcGljQXJuOiB0b3BpY0FyblxuICAgICAgICB9KTtcbiAgICB9KTtcbn0iLCJpbXBvcnQgeyBwdWJsaXNoRXZlbnRzIH0gZnJvbSAnLi9wdWJsaXNoRXZlbnRzLmpzJztcbmltcG9ydCB7IGhhbmRsZUV2ZW50cyB9IGZyb20gJy4vaGFuZGxlRXZlbnRzLmpzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogYnVja2V0IHdhdGNoZXIgd2F0Y2hlcyBhIHMzIGJ1Y2tldCBhbmQgcHVibGlzaGVzIGV2ZW50cyB0byBhIHNucyB0b3BpYywgdGhpcyBhbGxvd3MgeW91IHRvIHByb2Nlc3MgZmlsZXMgaW4gczMgd2l0aCBhIHNvbWUgdHJhbnNmb3JtZXIgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHdhdGNoQnVja2V0LCBzZWUgYmVsb3dcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXMuZXZlbnQgLSBUaGUgZXZlbnQgb2YgdGhlIGxhbWJkYVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5keW5hbW9Db25maWdUYWJsZSAtIFRoZSBEeW5hbW8gREIgdGFibGUgd2hlcmUgdG8gZ2V0IHRoZSBjaHVua1NpemUgYW5kIG1heE1lc3NhZ2Ugc2l6ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5keW5hbW9Db25maWdLZXkgLSBUaGUga2V5IHRvIHRoZSBpdGVtIGluIHRoZSBEeW5hbW8gREIgdGFibGUgdGhhdCBob2xkcyB0aGUgY2h1bmtTaXplIGFuZCBtYXhNZXNzYWdlIHNpemVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuczNCdWNrZXQgLSBUaGUgbmFtZSBvZiB0aGUgczMgYnVja2V0IHRvIHdhdGNoLCB3aGVuIHlvdSBkcm9wIGl0ZW1zIGludG8gdGhpcyB0YWJsZSBldmVudHMgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNuc1RvcGljIC0gVGhlIG5hbWUgb2YgdGhlIHNuc0V2ZW50IHRvIHB1Ymxpc2hcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHBhcmFtcy50cmFuc2Zvcm1lciAtIHRoZSBmdW5jdGlvbiB0byBydW4gb24gZWFjaCBmaWxlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbcGFyYW1zLmVycm9ySGFuZGxlclBlckZpbGVdIC0gdGhlIGZ1bmN0aW9uIHRvIHJ1biBvbiBhcyBhIGNhdGNoIG9uIGVhY2ggZmlsZVxuICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1zLnNob3VsZFNraXBGYWlsZWRGb2xkZXJzXSAtIHdoZXRoZXIgdG8gdXNlIHRoZSBmYWlsZWQtb25jZSwgZmFpbGVkLXR3aWNlLCBlcnJvciBvciBqdXN0IGVycm9yIGZvbGRlcnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zLnVzZXJJbXBvcnRUeXBlc10gLSB1c2VyIGltcG9ydCBzdWIgZGlyZWN0b3JpZXMgb2JqZWN0IG1hcFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2hCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1vQ29uZmlnVGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtb0NvbmZpZ0tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczNCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuc1RvcGljLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyUGVyRmlsZSA9IF8ubm9vcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckltcG9ydFR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkge1xuICAgIGlmICghZXZlbnQgfHwgIWR5bmFtb0NvbmZpZ1RhYmxlIHx8ICFkeW5hbW9Db25maWdLZXkgfHwgIXMzQnVja2V0IHx8ICFzbnNUb3BpYyB8fCAhdHJhbnNmb3JtZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMuIE5lZWQgZXZlbnQsIGR5bmFtb0NvbmZpZ1RhYmxlLCBkeW5hbW9Db25maWdLZXksIHMzQnVja2V0LCBzbnNUb3BpYywgdHJhbnNmb3JtZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCBFdmVudFNvdXJjZSA9IF8uZ2V0KGV2ZW50LCAnUmVjb3Jkc1swXS5FdmVudFNvdXJjZScpO1xuICAgIGlmIChfLmlzRXF1YWwoRXZlbnRTb3VyY2UsICdhd3M6c25zJykpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUV2ZW50cyhldmVudCwgdHJhbnNmb3JtZXIsIGVycm9ySGFuZGxlclBlckZpbGUsIHNob3VsZFNraXBGYWlsZWRGb2xkZXJzLCB1c2VySW1wb3J0VHlwZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoZSBmdW5jdGlvbiBpcyBiZWluZyBydW4gZnJvbSB0aGUgY3JvbiBqb2Igc28gcHVibGlzaCBTTlMgZXZlbnRzXG4gICAgICAgIHJldHVybiBwdWJsaXNoRXZlbnRzKGR5bmFtb0NvbmZpZ1RhYmxlLCBkeW5hbW9Db25maWdLZXksIHMzQnVja2V0LCBzbnNUb3BpYywgdXNlckltcG9ydFR5cGVzKTtcbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QgZXJyb3JMaXN0ID0ge1xuICAgIGludmFsaWRJbnZlbnRvcnlSZWxlYXNlUmVxdWVzdDoge1xuICAgICAgICBtZXNzYWdlOiAnTk9UIEVOT1VHSCBJTlZFTlRPUlkgVE8gRlVMRklMTCBSRUxFQVNFJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxMCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgYWxyZWFkeVJlbGVhc2VkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdBTFJFQURZIFJFTEVBU0VEJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxMScsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgYWxyZWFkeVJlY2VpdmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdSRUNFSVZBQkxFIEFMUkVBRFkgUkVDRUlWRUQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDEyJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkSXRlbXNSZXF1ZXN0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdWQUxJRCBJVEVNUyBNVVNUIEJFIElOQ0xVREVEJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxMycsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZElEOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdJRCBpcyBpbnZhbGlkJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxNCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZFJlY2VpdmFibGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ01VU1QgQ09OVEFJTiBBVCBMRUFTVCBPTkUgUkVDRUlWQUJMRScsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMTUnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRSZXF1ZXN0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdJTlZBTElEIFJFUVVFU1QgREFUQScsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMTYnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRBUElLZXk6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgUkVRVUVTVCAtIEFQSSBNQVkgS0VZIElOVkFMSUQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDE3JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBxYkNyZWF0aW9uRXJyb3I6IHtcbiAgICAgICAgbWVzc2FnZTogJ1FVSUNLQk9PS1MgRVJST1IgLSBFUlJPUiBDUkVBVElORyBPQkpFQ1QgSU4gUVVJQ0tCT09LUycsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMTgnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGNhbm5vdFJlb3Blbjoge1xuICAgICAgICBtZXNzYWdlOiAnQ0FOTk9UIFJFT1BFTiAtIFRIRSBPUkRFUiBIQVMgQUxSRUFEWSBCRUVOIE9QRU5FRCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMTgnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWREYXRlRm9ybWF0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdJTlZBTElEIERBVEUgRk9STUFUJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxOScsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZFN0YXJ0RGF0ZToge1xuICAgICAgICBtZXNzYWdlOiAnSU5WQUxJRCBTVEFSVCBEQVRFJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAyMCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZEVuZERhdGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgRU5EIERBVEUnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDIxJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkT3JkZXJTdGF0dXM6IHtcbiAgICAgICAgbWVzc2FnZTogJ1VOQUJMRSBUTyBFRElUIE9SREVSIElURU1TIFVOTEVTUyBUSEUgT1JERVIgSVMgSU4gRVNUSU1BVEUgU1RBVFVTJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAyMicsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZFBheW1lbnRTdGF0dXM6IHtcbiAgICAgICAgbWVzc2FnZTogJ1VOQUJMRSBUTyBVUERBVEUgUEFZTUVOVCBTVEFUVVMgUEFZTUVOVCBNVVNUIEJFIE9QRU4nLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDIzJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkUmVsZWFzZVN0YXR1czoge1xuICAgICAgICBtZXNzYWdlOiAnVU5BQkxFIFRPIFVQREFURSBSRUxFQVNFLCBTVEFUVVMgUkVMRUFTRSBNVVNUIEJFIE9QRU4nLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDI0JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkUmVjZWl2YWJsZVN0YXR1czoge1xuICAgICAgICBtZXNzYWdlOiAnVU5BQkxFIFRPIFVQREFURSBSRUNFSVZBQkxFLCBTVEFUVVMgUkVDRUlWQUJMRSBNVVNUIEJFIE9QRU4nLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDAyNScsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZEpzb246e1xuICAgICAgICBtZXNzYWdlOiAnSU5WQUxJRCBKU09OJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAwNScsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZEZpbHRlcjp7XG4gICAgICAgIG1lc3NhZ2U6ICdJTlZBTElEIEZJTFRFUicsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMjYnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRVc2VyTmFtZVVwZGF0ZTp7XG4gICAgICAgIG1lc3NhZ2U6ICdVTkFCTEUgVE8gVVBEQVRFIFVTRVJOQU1FJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAyNycsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW1hZ2VTaXplTGltaXQ6e1xuICAgICAgICBtZXNzYWdlOiAnSU1BR0UgU0laRSBMSU1JVCAxMDBLQiBFWENFRURFRCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMjgnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIHVuYXV0aG9yaXplZDp7XG4gICAgICAgIG1lc3NhZ2U6ICdVTkFVVEhPUklaRUQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MTExJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAxXG4gICAgfSxcbiAgICBub3RGb3VuZDp7XG4gICAgICAgIG1lc3NhZ2U6ICdJVEVNIE5PVCBGT1VORCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMDQnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDRcbiAgICB9LFxuICAgIGVtYWlsUmVxdWlyZWQ6e1xuICAgICAgICBtZXNzYWdlOiAnTk8gRU1BSUwgUFJPVklERUQsIENIRUNLIENVU1RPTUVSIEVNQUlMJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAwNCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwNFxuICAgIH0sXG4gICAgbW9iaWxlUGhvbmVSZXF1aXJlZDp7XG4gICAgICAgIG1lc3NhZ2U6ICdOTyBNT0JJTEUgUEhPTkUgUFJPVklERUQsIENIRUNLIENVU1RPTUVSIENPTlRBQ1RTJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAwNCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwNFxuICAgIH0sXG4gICAgaW52YWxpZENhZGVuY2VUeXBlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdJTlZBTElEIENBREVOQ0UgVFlQRScsXG4gICAgICAgIGVycm9yQ29kZTogJzUwMDEnLFxuICAgICAgICBzdGF0dXNDb2RlOiA1MDBcbiAgICB9LFxufTsiLCJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JMaXN0IH0gZnJvbSAnLi9lcnJvckNvZGVzLmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gYm9keVxuICogQHBhcmFtIHt7fX0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3VjY2Vzcyhib2R5LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGJDbG9zZSA9IF8uZ2V0KG9wdGlvbnMsICdkYkNsb3NlJywgXy5ub29wKTtcbiAgICBkYkNsb3NlKCk7XG5cbiAgICByZXR1cm4gYnVpbGRSZXNwb25zZSgyMDAsIGJvZHkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAcGFyYW0ge3tkYkNsb3NlOmZ1bmN0aW9ufHVuZGVmaW5lZH19IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2Nlc3NIdG1sKGh0bWwsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYkNsb3NlID0gXy5nZXQob3B0aW9ucywgJ2RiQ2xvc2UnLCBfLm5vb3ApO1xuXG4gICAgZGJDbG9zZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6ICcqJyxcbiAgICAgICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyc6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogaHRtbFxuICAgIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJucyBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyTmFtZUZyb21Db2duaXRvRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gXy5nZXQoZXZlbnQsICdyZXF1ZXN0LnVzZXJBdHRyaWJ1dGVzJyk7XG5cbiAgICByZXR1cm4gYXR0cmlidXRlc1snY29nbml0bzplbWFpbF9hbGlhcyddIHx8ICdVTktOT1dOIFVTRVInO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdXNlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBldmVudCBvYmplY3RcbiAqXG4gKiBAcGFyYW0gZXZlbnQge09iamVjdH0gYW4gZXZlbnQgb2JqZWN0XG4gKiBAcmV0dXJucyB7e3VzZXJuYW1lOiBzdHJpbmcsIGlkOiBudW1iZXJ9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoZXZlbnQpIHtcbiAgICBsZXQganNvblRvUGFyc2UgPSBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY2xhaW1zLmN1c3RvbTpVSUQnKSB8fFxuICAgICAgICBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY3VzdG9tOlVJRCcpIHx8XG4gICAgICAgICcwJztcblxuICAgIGNvbnN0IGlkID0gSlNPTi5wYXJzZShqc29uVG9QYXJzZSk7XG5cbiAgICBjb25zdCB1c2VybmFtZSA9IF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jbGFpbXMuZW1haWwnKSB8fCBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuZW1haWwnKSB8fCAnTE9DQUwgVEVTVCBVU0VSJztcblxuICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBpZFxuICAgIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZmFpbHVyZSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSBib2R5IHtPYmplY3R9IGFuIGV2ZW50IG9iamVjdFxuICogQHBhcmFtIG9wdGlvbnMge09iamVjdH0gYW4gb3B0aW9ucyBvYmplY3RcbiAqIEByZXR1cm5zIHt7c3RhdHVzQ29kZTpudW1iZXIsIGhlYWRlcnM6b2JqZWN0LCBib2R5OnN0cmluZ319IGEgcmVzcG9uc2Ugb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKGJvZHkgPSB7fSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGRiQ2xvc2UgPSBfLmdldChvcHRpb25zLCAnZGJDbG9zZScsIF8ubm9vcCk7XG4gICAgZGJDbG9zZSgpO1xuICAgIGxldCBjbGVhbmVkRXJyb3JCb2R5O1xuXG4gICAgaWYgKHByb2Nlc3MuZW52LlVUSUxfTE9HID09PSAnTE9HX0FMTCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignLS0tLS0tLT5VVElMIEVSUk9SOicsIGJvZHkpO1xuICAgIH1cblxuICAgIGNvbnN0IE5PUk1BTF9FUlJPUiA9IHsgc3RhdHVzQ29kZTogNTAwLCBlcnJvckNvZGU6ICc1WFgnLCBtZXNzYWdlOiAnSU5URVJOQUwgVVRJTCBFUlJPUicgfTtcbiAgICBjbGVhbmVkRXJyb3JCb2R5ID0gYm9keTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYm9keS5kZXRhaWxzKSkge1xuICAgICAgICBjbGVhbmVkRXJyb3JCb2R5ID0gZGV0ZWN0Sm95RXJyb3IoYm9keSk7XG4gICAgfSBlbHNlIGlmIChfLmlzVW5kZWZpbmVkKGJvZHkuZXJyb3JDb2RlKSB8fCBfLmlzVW5kZWZpbmVkKGJvZHkuc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgY2xlYW5lZEVycm9yQm9keSA9IGRldGVjdFNlcXVlbGl6ZUVycm9yKGJvZHkpO1xuICAgIH1cbiAgICBpZihfLmdldChib2R5LCAncmVzcG9uc2UuZGF0YS5tZXNzYWdlJykpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignLS0tLS0tLT5VVElMIEVSUk9SOiAnK18uZ2V0KGJvZHksICdyZXNwb25zZS5kYXRhLm1lc3NhZ2UnKSlcbiAgICB9XG5cbiAgICBjb25zdCBuZXdCb2R5ID0gXy5tZXJnZShOT1JNQUxfRVJST1IsIGNsZWFuZWRFcnJvckJvZHkpO1xuXG4gICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2UobmV3Qm9keS5zdGF0dXNDb2RlLCBuZXdCb2R5KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmYWlsdXJlIHJlc3BvbnNlIG9iamVjdFxuICpcbiAqIEBwYXJhbSBzdGF0dXNDb2RlIHtOdW1iZXJ9IGEgc3RhdHVzIGNvZGVcbiAqIEBwYXJhbSBib2R5IHtPYmplY3R9IGFuIGV2ZW50IG9iamVjdFxuICogQHJldHVybnMge3tzdGF0dXNDb2RlOm51bWJlciwgaGVhZGVyczpvYmplY3QsIGJvZHk6c3RyaW5nfX0gYSByZXNwb25zZSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gYnVpbGRSZXNwb25zZShzdGF0dXNDb2RlLCBib2R5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogc3RhdHVzQ29kZSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6ICcqJyxcbiAgICAgICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyc6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICB9O1xufVxuXG4vKipcbiAqIHBhcnNlIHRoZSBib2R5IG9mIHRoZSBldmVudCBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcmVxdWVzdEV2ZW50IHt7Ym9keTpzdHJpbmd9fSBhbiBldmVudCBvYmplY3RcbiAqIEByZXR1cm5zIGV2ZW50IHsqfSB0aGUganNvbiBvYmplY3Qgb2YgdGhlIGJvZHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQm9keShyZXF1ZXN0RXZlbnQpIHtcblxuICAgIGxldCBldmVudEJvZHkgPSB7fTtcbiAgICBpZiAoXy5pc1N0cmluZyhyZXF1ZXN0RXZlbnQuYm9keSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV2ZW50Qm9keSA9IEpTT04ucGFyc2UocmVxdWVzdEV2ZW50LmJvZHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIEpTT05cbiAgICAgICAgICAgIGV2ZW50Qm9keSA9IG51bGw7XG5cbiAgICAgICAgICAgIHRocm93IGVycm9yTGlzdC5pbnZhbGlkSnNvbjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChyZXF1ZXN0RXZlbnQuYm9keSkpIHtcbiAgICAgICAgZXZlbnRCb2R5ID0gcmVxdWVzdEV2ZW50LmJvZHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50Qm9keTtcbn1cblxuLyoqXG4gKiBwYXJzZSB0aGUgYm9keSBvZiB0aGUgZXZlbnQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHJlcXVlc3RFdmVudCB7c3RyaW5nfG9iamVjdH0gYW4gZXZlbnQgb2JqZWN0XG4gKiBAcGFyYW0gW2NhbGxiYWNrXSB7ZnVuY3Rpb259IHVuZGVmaW5lZCBhIGNhbGwgYmFjayBmdW5jdGlvblxuICogQHJldHVybnMgZXZlbnQgeyp9IHRoZSBqc29uIG9iamVjdCBvZiB0aGUgYm9keVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFdmVudChyZXF1ZXN0RXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgbGV0IGV2ZW50ID0ge307XG4gICAgaWYgKF8uaXNTdHJpbmcocmVxdWVzdEV2ZW50KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZlbnQgPSBKU09OLnBhcnNlKHJlcXVlc3RFdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgSlNPTlxuICAgICAgICAgICAgZXZlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhFcnJvcihlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QocmVxdWVzdEV2ZW50KSkge1xuICAgICAgICBldmVudCA9IHJlcXVlc3RFdmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGV2ZW50IG9iamVjdFxuICogbG9vayBmb3Igc2VxdWVsaXplIGVycm9ycyBhbmQgcmV0dXJuIGEgbWVzc2FnZVxuICogRVJST1JTIHNob3VsZCBub3QgYmUgY2F1Z2h0IGhlcmUgdGhpcyBpcyBhIGZhbGxiYWNrIGZvciB1bmtub3duIGRhdGFiYXNlIGVycm9yc1xuICpcbiAqIEBwYXJhbSBib2R5IHtvYmplY3R9IHBhcnQgb2YgYSBib2R5IHJlc3BvbnNlXG4gKiBAcmV0dXJucyBlcnJvciBtZXNzYWdlIG9iamVjdCB7bWVzc2FnZTpzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RTZXF1ZWxpemVFcnJvcihib2R5KSB7XG4gICAgY29uc3QgZXJyb3JCb2R5ID0ge307XG5cbiAgICBsZXQgc2VxdWVsaXplRXJyb3IgPSBfLmdldChib2R5LCAnZXJyb3JzJywgW10pLnJlZHVjZSgoYWNjLCBlcnIpID0+IHtcbiAgICAgICAgYWNjID0gYWNjICsgJyAnICsgXy5nZXQoZXJyLCAnbWVzc2FnZScpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sICcnKTtcbiAgICBjb25zdCBwYXJlbnRFcnJvciA9IF8uZ2V0KGJvZHksICdwYXJlbnQnLCAnJyk7XG5cbiAgICBzZXF1ZWxpemVFcnJvciA9IHNlcXVlbGl6ZUVycm9yICsgXy5nZXQoYm9keSwgJ29yaWdpbmFsLmRldGFpbCcsICcnKSArIF8uZ2V0KGJvZHksICdUeXBlRXJyb3InLCAnJykgKyBwYXJlbnRFcnJvcjtcbiAgICBlcnJvckJvZHkubWVzc2FnZSA9IHNlcXVlbGl6ZUVycm9yLnRyaW0oKTtcbiAgICByZXR1cm4gZXJyb3JCb2R5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0Sm95RXJyb3IoYm9keSkge1xuICAgIGNvbnN0IGVycm9yQm9keSA9IHt9O1xuICAgIGNvbnN0IGpveUVycm9yID0gXy5nZXQoYm9keSwgJ2RldGFpbHNbMF0nLCB7fSk7XG4gICAgY29uc29sZS5lcnJvcignVVNFUiBWQUxJREFUSU9OIEVSUk9SOicsIGJvZHkpO1xuXG4gICAgZXJyb3JCb2R5Lm1lc3NhZ2UgPSBqb3lFcnJvci5tZXNzYWdlO1xuICAgIGVycm9yQm9keS5zdGF0dXNDb2RlID0gNDAwO1xuICAgIGVycm9yQm9keS5lcnJvckNvZGUgPSAnNDAwMCc7XG4gICAgcmV0dXJuIGVycm9yQm9keTtcbn0iLCJpbXBvcnQgeyBTMyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gczNVdGlscyhhY3Rpb24sIHBhcmFtcykge1xyXG4gICAgY29uc3QgczMgPSBuZXcgUzMoKTtcclxuICAgIHJldHVybiBzM1thY3Rpb25dKHBhcmFtcyk7XHJcbn1cclxuXHJcbmNvbnN0IFMzVXRpbCA9IHtcclxuICAgIGdldE9iamVjdDogKHBhcmFtcykgPT4gZ2V0UzMocGFyYW1zKSxcclxuICAgIGRlbGV0ZU9iamVjdDogKHBhcmFtcykgPT4gczNVdGlscygnZGVsZXRlT2JqZWN0JywgcGFyYW1zKSxcclxuICAgIHB1dE9iamVjdDogKHBhcmFtcykgPT4gczNVdGlscygncHV0T2JqZWN0JywgcGFyYW1zKSxcclxuICAgIGxpc3RPYmplY3RzVjI6IChwYXJhbXMpID0+IHMzVXRpbHMoJ2xpc3RPYmplY3RzVjInLCBwYXJhbXMpXHJcbn07XHJcbmV4cG9ydCBkZWZhdWx0IFMzVXRpbDtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldFMzKHBhcmFtcykge1xyXG4gICAgY29uc3QgczMgPSBuZXcgUzMoKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgczMuZ2V0T2JqZWN0KHBhcmFtcyk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuQm9keS50cmFuc2Zvcm1Ub1N0cmluZygndXRmLTgnKTtcclxufSIsImltcG9ydCB7IFNOUyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zbnMnO1xyXG5cclxuY29uc3QgU05TVXRpbCA9IHtcclxuICAgIHB1Ymxpc2g6IChwYXJhbXMpID0+IHB1Ymxpc2gocGFyYW1zKSxcclxuICAgIGNyZWF0ZVRvcGljOiAocGFyYW1zKSA9PiBjcmVhdGVUb3BpYyhwYXJhbXMpXHJcbn07XHJcblxyXG5hc3luYyBmdW5jdGlvbiBwdWJsaXNoKHBhcmFtcykge1xyXG4gICAgY29uc3Qgc25zID0gbmV3IFNOUygpO1xyXG4gICAgcmV0dXJuIGF3YWl0IHNucy5wdWJsaXNoKHBhcmFtcyk7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRvcGljKHBhcmFtcykge1xyXG4gICAgY29uc3Qgc25zID0gbmV3IFNOUygpO1xyXG4gICAgcmV0dXJuIGF3YWl0IHNucy5jcmVhdGVUb3BpYyhwYXJhbXMpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTTlNVdGlsO1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGF3cy1zZGsvY2xpZW50LXMzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBhd3Mtc2RrL2NsaWVudC1zbnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGF3cy1zZGsvbGliLWR5bmFtb2RiXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJsdWViaXJkXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb21lbnRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibW9tZW50L21vbWVudC5qc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzZXF1ZWxpemVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidW16dWdcIik7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsImltcG9ydCB7IGhhbmRsZUZpbGUgYXMgaGFuZGxlRmlsZUltcG9ydCB9IGZyb20gJy4vZXZlbnRNYW5hZ2VyL2hhbmRsZUZpbGUuanMnO1xuaW1wb3J0IHsgd2F0Y2hCdWNrZXQgYXMgd2F0Y2hCdWNrZXRJbXBvcnQgfSBmcm9tICcuL2V2ZW50TWFuYWdlci93YXRjaEJ1Y2tldC5qcyc7XG5pbXBvcnQgeyBwdWJsaXNoRXZlbnRzIGFzIHB1Ymxpc2hFdmVudHNJbXBvcnQgfSBmcm9tICcuL2V2ZW50TWFuYWdlci9wdWJsaXNoRXZlbnRzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZpbHRlcnMgYXMgY3JlYXRlRmlsdGVyc0ltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2NyZWF0ZUZpbHRlcnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlU29ydCBhcyBjcmVhdGVTb3J0SW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvY3JlYXRlU29ydC5qcyc7XG5pbXBvcnQgeyBmaW5kQWxsIGFzIGZpbmRBbGxJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9maW5kQWxsLmpzJztcbmltcG9ydCB7IGNoZWNrTW9kdWxlIGFzIGNoZWNrTW9kdWxlSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuaW1wb3J0IHsgZmFpbHVyZSBhcyBmYWlsdXJlSW1wb3J0LCBzdWNjZXNzIGFzIHN1Y2Nlc3NJbXBvcnQgfSBmcm9tICcuL3JlcXVlc3RSZXNvbnNlL3JlcXVlc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBydW5NaWdyYXRpb25zIGFzIHJ1bk1pZ3JhdGlvbnNJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiU2V0dXAvbWlncmF0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRDdXJyZW50VXNlciBhcyBnZXRDdXJyZW50VXNlckltcG9ydCB9IGZyb20gJy4vcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IHN1Y2Nlc3NIdG1sIGFzIHN1Y2Nlc3NIdG1sSW1wb3J0IH0gZnJvbSAnLi9yZXF1ZXN0UmVzb25zZS9yZXF1ZXN0UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudFVzZXJOYW1lRnJvbUNvZ25pdG9FdmVudCBhcyBnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50SW1wb3J0IH0gZnJvbSAnLi9yZXF1ZXN0UmVzb25zZS9yZXF1ZXN0UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgZGVmYXVsdEZpbHRlcnMgYXMgZGVmYXVsdEZpbHRlcnNJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9kZWZhdWx0RmlsdGVycy5qcyc7XG5pbXBvcnQgeyBhY2Nlc3NSaWdodHNVdGlscyBhcyBhY2Nlc3NSaWdodHNVdGlsc0ltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2FjY2Vzc1JpZ2h0c1V0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlQm9keSBhcyBwYXJzZUJvZHlJbXBvcnQgfSBmcm9tICcuL3JlcXVlc3RSZXNvbnNlL3JlcXVlc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUV2ZW50IGFzIHBhcnNlRXZlbnRJbXBvcnQgfSBmcm9tICcuL3JlcXVlc3RSZXNvbnNlL3JlcXVlc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBnZXRCdXNpbmVzc2VzSW5mbyBhcyBnZXRCdXNpbmVzc2VzSW5mb0ltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2FjY2Vzc1JpZ2h0c1V0aWxzLmpzJztcbmltcG9ydCB7IHVzZXJEZWZhdWx0QmlkIGFzIHVzZXJEZWZhdWx0QmlkSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuaW1wb3J0IHsgY2hlY2tXcml0ZUFjY2VzcyBhcyBjaGVja1dyaXRlQWNjZXNzSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlRmlsZSA9IGhhbmRsZUZpbGVJbXBvcnQ7XG5leHBvcnQgY29uc3Qgd2F0Y2hCdWNrZXQgPSB3YXRjaEJ1Y2tldEltcG9ydDtcbmV4cG9ydCBjb25zdCBwdWJsaXNoRXZlbnRzID0gcHVibGlzaEV2ZW50c0ltcG9ydDtcbmV4cG9ydCBjb25zdCBjcmVhdGVGaWx0ZXJzID0gY3JlYXRlRmlsdGVyc0ltcG9ydDtcbmV4cG9ydCBjb25zdCBjcmVhdGVTb3J0ID0gY3JlYXRlU29ydEltcG9ydDtcbmV4cG9ydCBjb25zdCBmaW5kQWxsID0gZmluZEFsbEltcG9ydDtcbmV4cG9ydCBjb25zdCBjaGVja01vZHVsZSA9IGNoZWNrTW9kdWxlSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGZhaWx1cmUgPSBmYWlsdXJlSW1wb3J0O1xuZXhwb3J0IGNvbnN0IHN1Y2Nlc3MgPSBzdWNjZXNzSW1wb3J0O1xuZXhwb3J0IGNvbnN0IHJ1bk1pZ3JhdGlvbnMgPSBydW5NaWdyYXRpb25zSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRVc2VyID0gZ2V0Q3VycmVudFVzZXJJbXBvcnQ7XG5leHBvcnQgY29uc3Qgc3VjY2Vzc0h0bWwgPSBzdWNjZXNzSHRtbEltcG9ydDtcbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50ID0gZ2V0Q3VycmVudFVzZXJOYW1lRnJvbUNvZ25pdG9FdmVudEltcG9ydDtcbmV4cG9ydCBjb25zdCBkZWZhdWx0RmlsdGVycyA9IGRlZmF1bHRGaWx0ZXJzSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGFjY2Vzc1JpZ2h0c1V0aWxzID0gYWNjZXNzUmlnaHRzVXRpbHNJbXBvcnQ7XG5leHBvcnQgY29uc3QgcGFyc2VCb2R5ID0gcGFyc2VCb2R5SW1wb3J0O1xuZXhwb3J0IGNvbnN0IHBhcnNlRXZlbnQgPSBwYXJzZUV2ZW50SW1wb3J0O1xuZXhwb3J0IGNvbnN0IGdldEJ1c2luZXNzZXNJbmZvID0gZ2V0QnVzaW5lc3Nlc0luZm9JbXBvcnQ7XG5leHBvcnQgY29uc3QgdXNlckRlZmF1bHRCaWQgPSB1c2VyRGVmYXVsdEJpZEltcG9ydDtcbmV4cG9ydCBjb25zdCBjaGVja1dyaXRlQWNjZXNzID0gY2hlY2tXcml0ZUFjY2Vzc0ltcG9ydDtcbiJdLCJuYW1lcyI6WyJydW5NaWdyYXRpb25zIiwiX2xvZGFzaCIsInJlcXVpcmUiLCJfbG9kYXNoMiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdW16dWciLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImRhdGFiYXNlTmFtZSIsInNlcXVlbGl6ZUluc3RhbmNlIiwiaW5pdGlhbGl6ZU1vZGVscyIsInBhdGhUb01pZ3JhdGlvbkZvbGRlciIsInByb2Nlc3MiLCJlbnYiLCJQV0QiLCJ1bXp1ZyIsIlVtenVnIiwibWlncmF0aW9ucyIsImdsb2IiLCJjb250ZXh0IiwiZ2V0UXVlcnlJbnRlcmZhY2UiLCJzdG9yYWdlIiwiU2VxdWVsaXplU3RvcmFnZSIsInNlcXVlbGl6ZSIsImxvZ2dlciIsImNvbnNvbGUiLCJwZW5kaW5nTWlncmF0aW9ucyIsInBlbmRpbmciLCJsb2ciLCJ1cCIsImNhdGNoIiwidXBFcnJvciIsImRvd24iLCJfIiwiY2hhaW4iLCJtYXAiLCJyZXZlcnNlIiwidmFsdWUiLCJ0aGVuIiwibXNnIiwiZXJyb3IiLCJFcnJvciIsImRvd25FcnJvciIsImFjY2Vzc1JpZ2h0c1V0aWxzIiwiZXhwb3J0cyIsInVzZXJEZWZhdWx0QmlkIiwiZ2V0QnVzaW5lc3Nlc0luZm8iLCJnZXRNb2R1bGVJbmZvIiwiY2hlY2tNb2R1bGUiLCJjaGVja1dyaXRlQWNjZXNzIiwiX2Vycm9yQ29kZXMiLCJfcmVxdWVzdFJlc3BvbnNlIiwiZXZlbnQiLCJyZXF1ZXN0ZWRCdXNpbmVzc0lkcyIsImdldFJlcXVlc3RlZEJ1c2luZXNzSWRzIiwiYWxsb3dlZEJ1c2luZXNzSWRzIiwiZ2V0QWxsb3dlZEJ1c2luZXNzSWRzIiwibG9jYWxCaWRMaXN0IiwiaXNFbXB0eSIsImdldCIsIkJVSUxEX0VOViIsImxlbmd0aCIsImludGVyc2VjdGlvbiIsImpzb25Ub1BhcnNlIiwiZGJpIiwiSlNPTiIsInBhcnNlIiwic3BsaXQiLCJidXNpbmVzc2VzIiwiT2JqZWN0Iiwia2V5cyIsImFjY2Vzc1JpZ2h0cyIsImJpZHMiLCJ3aXRoTG9jYWwiLCJzZXQiLCJhciIsIm1vZHVsZVJpZ2h0cyIsIm1vZHVsZU5hbWUiLCJhbGxvd0FjY2VzcyIsImVycm9yTGlzdCIsInVuYXV0aG9yaXplZCIsInVzZXJSb2xlcyIsImFkbWluIiwicmVhZCIsIndyaXRlIiwiZXZlbnRCb2R5IiwicGFyc2VCb2R5IiwiYnVzaW5lc3NJZHMiLCJidXNpbmVzc0lkIiwiZmluZCIsImlkIiwicmF3IiwidXNlclJpZ2h0IiwiX3NlcXVlbGl6ZSIsIl9zZXF1ZWxpemUyIiwiX21vbWVudCIsIl9tb21lbnQyIiwiX2FjY2Vzc1JpZ2h0c1V0aWxzIiwiY3JlYXRlRmlsdGVycyIsIm9iamVjdEZpbHRlcnMiLCJxdWVyeSIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJ3aGVyZSIsInJlZHVjZSIsImFjYyIsIml0ZW0iLCJ2YWwiLCJpdGVtTmFtZSIsImluY2x1ZGVzIiwiZmlsdGVyVHlwZSIsIkRCIiwiT3AiLCJpTGlrZSIsIm9yIiwiaW4iLCJwYXJzZWRKc29uIiwiZSIsInR5cGUiLCJCT09MRUFOIiwicXVlcnlWYWx1ZSIsInRvTG93ZXJDYXNlIiwiYm9vbGVhbk1hcCIsImFjdGl2ZSIsImZpbHRlckFkZHMiLCJzIiwibW9tZW50IiwidXRjIiwiZGF0ZXMiLCJiZXR3ZWVuIiwidG9EYXRlIiwiaXNWYWxpZCIsImludmFsaWRTdGFydERhdGUiLCJpbnZhbGlkRW5kRGF0ZSIsImNyZWF0ZWRBdCIsIndpdGhEYXRlIiwiYXNzaWduIiwiY3JlYXRlU29ydCIsImRlZmF1bHRGaWx0ZXIiLCJjb3B5T2ZEZWZhdWx0RmlsdGVyIiwiY2xvbmUiLCJzb3J0IiwidGVzdEl0ZW0iLCJpbmRleE9mIiwic3Vic3RyIiwic29ydEl0ZW0iLCJmb3JFYWNoIiwicGFyZW50Q2hpbGRMaXN0IiwicHVzaCIsImRlZmF1bHRGaWx0ZXJzIiwiYWRkRmlsdGVyc0Zyb21TY2hlbWEiLCJzY2hlbWEiLCJzdWJTY2hlbWFzIiwiZmlsdGVycyIsImtleSIsImFjY3VtdWxhdG9yIiwia2V5UHJlZml4IiwiYXNMaW5rQWxpYXMiLCJTVFJJTkciLCJlcSIsIml0ZW1UeXBlIiwiQ0hBUiIsIlRFWFQiLCJERUNJTUFMIiwiQklHSU5UIiwiSU5URUdFUiIsIkRBVEUiLCJEQVRFT05MWSIsImx0IiwiSlNPTkIiLCJjb250YWlucyIsImdldFBhZ2luYXRpb25Gcm9tRmluZEFsbCIsImZpbmRBbGwiLCJyZXN1bHQiLCJsaW1pdCIsIm9mZnNldCIsImhhc01vcmUiLCJzcGxpY2UiLCJwYWdlT2JqZWN0Iiwicm93cyIsIm1vZGVsIiwib3B0aW9ucyIsImZpbmRBcmdzIiwiaW5jbHVkZSIsImFsbCIsIm5lc3RlZCIsInJlc3VsdHMiLCJmaW5kVXRpbHMiLCJfbGliRHluYW1vZGIiLCJfY2xpZW50RHluYW1vZGIiLCJkeW5hbW9VdGlsIiwicGFyYW1zIiwiZHluYW1vRGIiLCJEeW5hbW9EQkRvY3VtZW50IiwiZnJvbSIsIkR5bmFtb0RCIiwiaGFuZGxlRXZlbnRzIiwiX2hhbmRsZUZpbGUiLCJfYmx1ZWJpcmQiLCJfYmx1ZWJpcmQyIiwidHJhbnNmb3JtZXIiLCJlcnJvckhhbmRsZXJQZXJGaWxlIiwic2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMiLCJ1c2VySW1wb3J0VHlwZXMiLCJSZWNvcmRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJoYXNFcnJvcnMiLCJyZWNvcmQiLCJzbnNJbmZvIiwiczNCdWNrZXQiLCJidWNrZXQiLCJmaWxlcyIsImZpbGUiLCJwYXRoIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaGFuZGxlRmlsZSIsImVyciIsIl9TM1V0aWxzIiwiX1MzVXRpbHMyIiwiQnVja2V0IiwiS2V5IiwiYm9keSIsIlMzVXRpbCIsImdldE9iamVjdCIsInBhcnNlZEJvZHkiLCJyZXR1cm5lZFZhbHVlIiwiZGVsZXRlT2JqZWN0IiwiY29kZSIsIm5ld1BhdGgiLCJ1c2Vyc0ltcG9ydHMiLCJ2YWx1ZXMiLCJpdGVtcyIsImZpbGVOYW1lIiwibGFzdCIsImZvbGRlck5hbWUiLCJmaXJzdCIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwibmV3UGFyYW1zIiwiQm9keSIsInB1dE9iamVjdCIsImxvb3AiLCJwdWJsaXNoRXZlbnRzIiwiX1NOU1V0aWxzIiwiX1NOU1V0aWxzMiIsIl9keW5hbW9VdGlscyIsIl9keW5hbW9VdGlsczIiLCJtYXhLZXlzIiwiYnVja2V0UmVzdWx0IiwiZmlsZUxpc3QiLCJjdXJyZW50VGltZSIsIlMzVXRpbHMiLCJsaXN0T2JqZWN0c1YyIiwiTWF4S2V5cyIsIkNvbnRpbnVhdGlvblRva2VuIiwibmV3RmlsZXMiLCJmaWx0ZXIiLCJDb250ZW50cyIsImZpbGVEZWxheVRpbWUiLCJpc1NhbWVPckJlZm9yZSIsImNvbmNhdCIsIklzVHJ1bmNhdGVkIiwiTmV4dENvbnRpbnVhdGlvblRva2VuIiwiY29uZmlnVGFibGUiLCJ0YWJsZUtleSIsInNuc1RvcGljIiwiVGFibGVOYW1lIiwiY2h1bmtTaXplIiwibWF4TWVzc2FnZXMiLCJzbnNDcmVhdGVUb3BpY1Jlc3BvbnNlIiwiU05TVXRpbCIsImNyZWF0ZVRvcGljIiwiTmFtZSIsInRvcGljQXJuIiwiVG9waWNBcm4iLCJtZXNzYWdlTGlzdCIsImNodW5rIiwic2xpY2UiLCJwdWJsaXNoIiwiTWVzc2FnZSIsInN0cmluZ2lmeSIsIndhdGNoQnVja2V0IiwiX3B1Ymxpc2hFdmVudHMiLCJfaGFuZGxlRXZlbnRzIiwiZHluYW1vQ29uZmlnVGFibGUiLCJkeW5hbW9Db25maWdLZXkiLCJub29wIiwiRXZlbnRTb3VyY2UiLCJpc0VxdWFsIiwiaW52YWxpZEludmVudG9yeVJlbGVhc2VSZXF1ZXN0IiwibWVzc2FnZSIsImVycm9yQ29kZSIsInN0YXR1c0NvZGUiLCJhbHJlYWR5UmVsZWFzZWQiLCJhbHJlYWR5UmVjZWl2ZWQiLCJpbnZhbGlkSXRlbXNSZXF1ZXN0IiwiaW52YWxpZElEIiwiaW52YWxpZFJlY2VpdmFibGUiLCJpbnZhbGlkUmVxdWVzdCIsImludmFsaWRBUElLZXkiLCJxYkNyZWF0aW9uRXJyb3IiLCJjYW5ub3RSZW9wZW4iLCJpbnZhbGlkRGF0ZUZvcm1hdCIsImludmFsaWRPcmRlclN0YXR1cyIsImludmFsaWRQYXltZW50U3RhdHVzIiwiaW52YWxpZFJlbGVhc2VTdGF0dXMiLCJpbnZhbGlkUmVjZWl2YWJsZVN0YXR1cyIsImludmFsaWRKc29uIiwiaW52YWxpZEZpbHRlciIsImludmFsaWRVc2VyTmFtZVVwZGF0ZSIsImltYWdlU2l6ZUxpbWl0Iiwibm90Rm91bmQiLCJlbWFpbFJlcXVpcmVkIiwibW9iaWxlUGhvbmVSZXF1aXJlZCIsImludmFsaWRDYWRlbmNlVHlwZSIsInN1Y2Nlc3MiLCJzdWNjZXNzSHRtbCIsImdldEN1cnJlbnRVc2VyTmFtZUZyb21Db2duaXRvRXZlbnQiLCJnZXRDdXJyZW50VXNlciIsImZhaWx1cmUiLCJwYXJzZUV2ZW50IiwiZGV0ZWN0U2VxdWVsaXplRXJyb3IiLCJkZXRlY3RKb3lFcnJvciIsImRiQ2xvc2UiLCJidWlsZFJlc3BvbnNlIiwiaHRtbCIsImhlYWRlcnMiLCJhdHRyaWJ1dGVzIiwidXNlcm5hbWUiLCJjbGVhbmVkRXJyb3JCb2R5IiwiVVRJTF9MT0ciLCJOT1JNQUxfRVJST1IiLCJpc1VuZGVmaW5lZCIsImRldGFpbHMiLCJuZXdCb2R5IiwibWVyZ2UiLCJyZXF1ZXN0RXZlbnQiLCJpc1N0cmluZyIsImlzT2JqZWN0IiwiY2FsbGJhY2siLCJlcnJvckJvZHkiLCJzZXF1ZWxpemVFcnJvciIsInBhcmVudEVycm9yIiwidHJpbSIsImpveUVycm9yIiwiczNVdGlscyIsIl9jbGllbnRTIiwiYWN0aW9uIiwiczMiLCJTMyIsImdldFMzIiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1Ub1N0cmluZyIsIl9jbGllbnRTbnMiLCJzbnMiLCJTTlMiLCJfd2F0Y2hCdWNrZXQiLCJfY3JlYXRlRmlsdGVycyIsIl9jcmVhdGVTb3J0IiwiX2ZpbmRBbGwiLCJfbWlncmF0aW9ucyIsIl9kZWZhdWx0RmlsdGVycyIsImhhbmRsZUZpbGVJbXBvcnQiLCJ3YXRjaEJ1Y2tldEltcG9ydCIsInB1Ymxpc2hFdmVudHNJbXBvcnQiLCJjcmVhdGVGaWx0ZXJzSW1wb3J0IiwiY3JlYXRlU29ydEltcG9ydCIsImZpbmRBbGxJbXBvcnQiLCJjaGVja01vZHVsZUltcG9ydCIsImZhaWx1cmVJbXBvcnQiLCJzdWNjZXNzSW1wb3J0IiwicnVuTWlncmF0aW9uc0ltcG9ydCIsImdldEN1cnJlbnRVc2VySW1wb3J0Iiwic3VjY2Vzc0h0bWxJbXBvcnQiLCJnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50SW1wb3J0IiwiZGVmYXVsdEZpbHRlcnNJbXBvcnQiLCJhY2Nlc3NSaWdodHNVdGlsc0ltcG9ydCIsInBhcnNlQm9keUltcG9ydCIsInBhcnNlRXZlbnRJbXBvcnQiLCJnZXRCdXNpbmVzc2VzSW5mb0ltcG9ydCIsInVzZXJEZWZhdWx0QmlkSW1wb3J0IiwiY2hlY2tXcml0ZUFjY2Vzc0ltcG9ydCJdLCJzb3VyY2VSb290IjoiIn0=
|
|
997
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUdvVSxzQkFBZ0I7QUFDbkMsTUFBTWxNLE9BQU8sR0FBQWxJLGVBQUEsR0FBR3FVLGdCQUFhO0FBQzdCLE1BQU1qVSxXQUFXLEdBQUFKLG1CQUFBLEdBQUdzVSw4QkFBaUI7QUFDckMsTUFBTWpELE9BQU8sR0FBQXJSLGVBQUEsR0FBR3VVLHdCQUFhO0FBQzdCLE1BQU10RCxPQUFPLEdBQUFqUixlQUFBLEdBQUd3VSx3QkFBYTtBQUM3QixNQUFNclgsYUFBYSxHQUFBNkMscUJBQUEsR0FBR3lVLHlCQUFtQjtBQUN6QyxNQUFNckQsY0FBYyxHQUFBcFIsc0JBQUEsR0FBRzBVLCtCQUFvQjtBQUMzQyxNQUFNeEQsV0FBVyxHQUFBbFIsbUJBQUEsR0FBRzJVLDRCQUFpQjtBQUNyQyxNQUFNeEQsa0NBQWtDLEdBQUFuUiwwQ0FBQSxHQUFHNFUsbURBQXdDO0FBQ25GLE1BQU1qTyxjQUFjLEdBQUEzRyxzQkFBQSxHQUFHNlUsOEJBQW9CO0FBQzNDLE1BQU05VSxpQkFBaUIsR0FBQUMseUJBQUEsR0FBRzhVLG9DQUF1QjtBQUNqRCxNQUFNbFMsU0FBUyxHQUFBNUMsaUJBQUEsR0FBRytVLDBCQUFlO0FBQ2pDLE1BQU16RCxVQUFVLEdBQUF0UixrQkFBQSxHQUFHZ1YsMkJBQWdCO0FBQ25DLE1BQU05VSxpQkFBaUIsR0FBQUYseUJBQUEsR0FBR2lWLG9DQUF1QjtBQUNqRCxNQUFNaFYsY0FBYyxHQUFBRCxzQkFBQSxHQUFHa1YsaUNBQW9CO0FBQzNDLE1BQU03VSxnQkFBZ0IsR0FBQUwsd0JBQUEsR0FBR21WLG1DQUFzQixDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZGF0YWJhc2UvZGJTZXR1cC9taWdyYXRpb25zLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9hY2Nlc3NSaWdodHNVdGlscy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvY3JlYXRlRmlsdGVycy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvY3JlYXRlU29ydC5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvZGVmYXVsdEZpbHRlcnMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2ZpbmRBbGwuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZHluYW1vL2R5bmFtb1V0aWxzLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL2V2ZW50TWFuYWdlci9oYW5kbGVFdmVudHMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZXZlbnRNYW5hZ2VyL2hhbmRsZUZpbGUuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZXZlbnRNYW5hZ2VyL3B1Ymxpc2hFdmVudHMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZXZlbnRNYW5hZ2VyL3dhdGNoQnVja2V0LmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL3JlcXVlc3RSZXNvbnNlL2Vycm9yQ29kZXMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL3MzL1MzVXRpbHMuanMvUzNVdGlscy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9zbnMvU05TVXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwiQGF3cy1zZGsvY2xpZW50LXNuc1wiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwiQGF3cy1zZGsvbGliLWR5bmFtb2RiXCIiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJibHVlYmlyZFwiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwibG9kYXNoXCIiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJtb21lbnRcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcIm1vbWVudC9tb21lbnQuanNcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcInNlcXVlbGl6ZVwiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwidW16dWdcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgU2VxdWVsaXplU3RvcmFnZSwgVW16dWcgfSBmcm9tICd1bXp1Zyc7XG5cbi8qKlxuICogRXhlY3V0ZSBkYXRhYmFzZSBtaWdyYXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VOYW1lIC0gbmFtZSBvZiBkYXRhYmFzZSB0byBjcmVhdGUgKG9yIHZlcmlmeSBleGlzdGVuY2UpXG4gKiBAcGFyYW0ge29iamVjdH0gc2VxdWVsaXplSW5zdGFuY2UgLSBpbnN0YW5jZSBvZiBTZXF1ZWxpemUgKG11c3QgYmUgaW5pdGlhbGl6ZWQpXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBpbml0aWFsaXplTW9kZWxzIC0gZnVuY3Rpb24gdG8gcnVuIHRvIHN5bmMgU2VxdWVsaXplIG1vZGVscyB3aXRoIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFRvTWlncmF0aW9uRm9sZGVyIC0gcGFzcyBpbiB0aGUgcGF0aCBpZiB1c2luZyB3aW5kb3dzLiB3aW5kb3dzIGFuZCBsaW51eCBQV0Qgd2lsbCBiZSBkaWZmZXJlbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk1pZ3JhdGlvbnMoZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVsaXplSW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplTW9kZWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFRvTWlncmF0aW9uRm9sZGVyID0gYCR7cHJvY2Vzcy5lbnYuUFdEfS9taWdyYXRpb25zLyouanNgKSB7XG4gICAgY29uc3QgdW16dWcgPSBuZXcgVW16dWcoe1xuICAgICAgICBtaWdyYXRpb25zOiB7IGdsb2I6IHBhdGhUb01pZ3JhdGlvbkZvbGRlciB9LFxuICAgICAgICBjb250ZXh0OiBzZXF1ZWxpemVJbnN0YW5jZS5nZXRRdWVyeUludGVyZmFjZSgpLFxuICAgICAgICBzdG9yYWdlOiBuZXcgU2VxdWVsaXplU3RvcmFnZSh7IHNlcXVlbGl6ZTogc2VxdWVsaXplSW5zdGFuY2UgfSksXG4gICAgICAgIGxvZ2dlcjogY29uc29sZVxuICAgIH0pO1xuXG4gICAgY29uc3QgcGVuZGluZ01pZ3JhdGlvbnMgPSBhd2FpdCB1bXp1Zy5wZW5kaW5nKCk7XG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0+VVRJTCBQZW5kaW5nIE1pZ3JhdGlvbnM6JywgcGVuZGluZ01pZ3JhdGlvbnMsIHBhdGhUb01pZ3JhdGlvbkZvbGRlcik7XG4gICAgYXdhaXQgdW16dWcudXAoKS5jYXRjaCgodXBFcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gdW16dWcuZG93bih7XG4gICAgICAgICAgICBtaWdyYXRpb25zOiBfLmNoYWluKHBlbmRpbmdNaWdyYXRpb25zKVxuICAgICAgICAgICAgICAgIC5tYXAoJ2ZpbGUnKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAudmFsdWUoKVxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdVVElMIEVycm9yOiBFcnJvciB3aXRoIG1pZ3JhdGluZyB1cDonICsgdXBFcnJvcjtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9LCAoZG93bkVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSAnVVRJTCBFcnJvcjogRXJyb3Igd2l0aCBtaWdyYXRpbmcgZG93bjonICsgZG93bkVycm9yO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIGlzIG5lZWRlZCB0byBzeW5jIChjcmVhdGUpIHRhYmxlcywgYnV0IG5vdCB0byBkYXRhYmFzZSB1cGRhdGVzXG4gICAgLy8gaW4gdGhlIHBhc3QgaXQgd29ya2VkIHRvIGxlYXZlIGl0IGluLCBidXQgbm93IHRoZSB0YWdzIG1vZHVsZSBjYXVzZXMgZm9yZWlnbiBrZXkgcHJvYmxlbXNcbiAgICAvLyBUaGUgdGFibGVzIGFyZSBzdGlsbCBpbml0aWF0ZWQgYnkgYmVpbmcgcGFzc2VkIGluIHRvIHJ1biBtaWdyYXRpb25zXG4gICAgYXdhaXQgaW5pdGlhbGl6ZU1vZGVscygpO1xufSIsImltcG9ydCBfLCB7IGlzRW1wdHkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JMaXN0IH0gZnJvbSAnLi4vLi4vLi4vcmVxdWVzdFJlc29uc2UvZXJyb3JDb2Rlcy5qcyc7XG5pbXBvcnQgeyBwYXJzZUJvZHkgfSBmcm9tICcuLi8uLi8uLi9yZXF1ZXN0UmVzb25zZS9yZXF1ZXN0UmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIEdldCB0aGUgYWxsb3dlZCBidXNpbmVzc0lkcyBmb3IgYSB1c2VyIGZyb20gdGhlIGxhbWJkYSBldmVudCwgY29tcGFyZSBpdCB0byBidXNpbmVzc0lkcywgcmV0dXJuIHdoYXQgdXNlciBoYXMgYWNjZXNzIHRvLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCAtIFRoZSBsYW1iZGEgZXZlbnQgcGFzc2VkIGluIGJ5IGEgdmFsaWRhdGVkIGFwaSByZXF1ZXN0LlxuICogQHBhcmFtIHt7dXNlQ29nbml0b0JpZDpib29sZWFufX0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucywgdXNlQ29nbml0b0JpZCBwcmVmZXJzIHRoZSBidXNpbmVzc0lkIHNldCBpbiBjb2duaXRvIGlmIHNldCBhbmQgZG9lcyBub3QgcmV0dXJuIHRoZSBsb2NhbCBiaWQgb2YgMSBpZiBhIGJpZCBpcyBpbiB0aGUgY2xhaW0uXG4gKiBAcmV0dXJucyB7YXJyYXl9IEEgIGxpc3Qgb2YgYnVzaW5lc3NJZHMgdGhhdCBoYXZlIGJlZW4gcmVxdWVzdGVkIGFuZCBhcmUgYWxsb3dlZCB0byBmb3Igc29tZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNjZXNzUmlnaHRzVXRpbHMoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2VDb2duaXRvQmlkID0gXy5nZXQob3B0aW9ucywgJ3VzZUNvZ25pdG9CaWQnLCBmYWxzZSk7XG4gICAgY29uc3QgcmVxdWVzdGVkQnVzaW5lc3NJZHMgPSBnZXRSZXF1ZXN0ZWRCdXNpbmVzc0lkcyhldmVudCk7XG4gICAgY29uc3QgYWxsb3dlZEJ1c2luZXNzSWRzID0gZ2V0QWxsb3dlZEJ1c2luZXNzSWRzKGV2ZW50LCB1c2VDb2duaXRvQmlkKTtcbiAgICBjb25zdCBsb2NhbEJpZExpc3QgPSBbJzEnXTtcblxuICAgIC8vIGlmIHdlIGFyZSBvbiBsb2NhbCByZXR1cm4gZm9yIGFsbCBiaWRzIGluIGFjY2VzcyByaWdodHNcbiAgICBpZiAoXy5pc0VtcHR5KGFsbG93ZWRCdXNpbmVzc0lkcykgJiZcbiAgICAgICAgIV8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jbGFpbXMnKSAmJlxuICAgICAgICAhXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmN1c3RvbTpBUicpICYmXG4gICAgICAgIHByb2Nlc3MuZW52LkJVSUxEX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgIHByb2Nlc3MuZW52LkJVSUxEX0VOViAhPT0gJ3N0YWdpbmcnKSB7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRCdXNpbmVzc0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbEJpZExpc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXy5pbnRlcnNlY3Rpb24ocmVxdWVzdGVkQnVzaW5lc3NJZHMsIGxvY2FsQmlkTGlzdCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZEJ1c2luZXNzSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYWxsb3dlZEJ1c2luZXNzSWRzO1xuICAgIH1cblxuICAgIHJldHVybiBfLmludGVyc2VjdGlvbihyZXF1ZXN0ZWRCdXNpbmVzc0lkcywgYWxsb3dlZEJ1c2luZXNzSWRzKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJ1c2luZXNzSUQgc2V0IGluIGNvZ25pdG8gYXMgY3VzdG9tOkRCSS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBUaGUgbGFtYmRhIGV2ZW50IHBhc3NlZCBpbiBieSBhIHZhbGlkYXRlZCBhcGkgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBidXNpbmVzc0lEIHNldCBpbiBjb2duaXRvIGFzIGN1c3RvbTpEQklcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJEZWZhdWx0QmlkKGV2ZW50KSB7XG4gICAgbGV0IGpzb25Ub1BhcnNlID0gXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5jdXN0b206REJJJykgfHxcbiAgICAgICAgXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmN1c3RvbTpEQkknKSB8fFxuICAgICAgICAne30nO1xuXG4gICAgY29uc3QgZGJpID0gSlNPTi5wYXJzZShqc29uVG9QYXJzZSk7XG4gICAgcmV0dXJuIF8uZ2V0KGRiaSwgJ2RlZmF1bHRCaWQnLCAnJykgfHwgJzEnO1xufVxuXG4vKipcbiAqIEdldCAgcmVxdWVzdGVkIGJ1c2luZXNzSWRzIGZyb20gdGhlIHF1ZXJ5IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBUaGUgbGFtYmRhIGV2ZW50IHBhc3NlZCBpbiBieSBhIHZhbGlkYXRlZCBhcGkgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHthcnJheX0gVGhlIGJ1c2luZXNzSUQgcmVxdWVzdGVkIGJ5IHRoZSBxdWVyeSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0UmVxdWVzdGVkQnVzaW5lc3NJZHMoZXZlbnQpIHtcbiAgICBsZXQgcmVxdWVzdGVkQnVzaW5lc3NJZHMgPSBfLmdldChldmVudCwgJ3F1ZXJ5U3RyaW5nUGFyYW1ldGVycy5idXNpbmVzc0lkcycsIG51bGwpO1xuXG4gICAgcmV0dXJuIHJlcXVlc3RlZEJ1c2luZXNzSWRzID8gcmVxdWVzdGVkQnVzaW5lc3NJZHMuc3BsaXQoJywnKSA6IFtdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYWxsb3dlZCBidXNpbmVzc0lkcyBmb3IgYSB1c2VyIGZyb20gY29nbml0byBjdXN0b206QVIgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IC0gVGhlIGxhbWJkYSBldmVudCBwYXNzZWQgaW4gYnkgYSB2YWxpZGF0ZWQgYXBpIHJlcXVlc3QuXG4gKiBAcGFyYW0gdXNlQ29nbml0b0JpZFxuICogQHJldHVybnMge2FycmF5fSBUaGUgYnVzaW5lc3NJRCByZXF1ZXN0ZWQgYnkgdGhlIHF1ZXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRBbGxvd2VkQnVzaW5lc3NJZHMoZXZlbnQsIHVzZUNvZ25pdG9CaWQpIHtcbiAgICBjb25zdCBidXNpbmVzc2VzID0gZ2V0QnVzaW5lc3Nlc0luZm8oZXZlbnQsIHVzZUNvZ25pdG9CaWQpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhidXNpbmVzc2VzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1c2luZXNzZXNJbmZvKGV2ZW50LCB1c2VDb2duaXRvQmlkKSB7XG4gICAgbGV0IGpzb25Ub1BhcnNlID0gXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5jdXN0b206QVInKSB8fFxuICAgICAgICBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY3VzdG9tOkFSJykgfHxcbiAgICAgICAgJ3t9JztcbiAgICBjb25zdCBhY2Nlc3NSaWdodHMgPSBKU09OLnBhcnNlKGpzb25Ub1BhcnNlKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5CVUlMRF9FTlYgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgaWYgKCFpc0VtcHR5KGFjY2Vzc1JpZ2h0cykpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpZHMgPSBfLmdldChhY2Nlc3NSaWdodHMsICdidXNpbmVzc0lkcycsIHt9KTtcbiAgICAgICAgICAgIGxldCB3aXRoTG9jYWw7XG4gICAgICAgICAgICBpZiAodXNlQ29nbml0b0JpZCkge1xuICAgICAgICAgICAgICAgIHdpdGhMb2NhbCA9IHsgLi4uYmlkcyB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aXRoTG9jYWwgPSB7IC4uLmJpZHMsICcxJzogJ0EnIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF8uc2V0KGFjY2Vzc1JpZ2h0cywgJ2J1c2luZXNzSWRzJywgd2l0aExvY2FsKTtcblxuICAgICAgICAgICAgcmV0dXJuIF8uZ2V0KGFjY2Vzc1JpZ2h0cywgJ2J1c2luZXNzSWRzJywge30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYXIgPSB7ICdidXNpbmVzc0lkcyc6IHsgJzEnOiAnQScgfSB9O1xuICAgICAgICAgICAgcmV0dXJuIF8uZ2V0KGFyLCAnYnVzaW5lc3NJZHMnLCB7fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gXy5nZXQoYWNjZXNzUmlnaHRzLCAnYnVzaW5lc3NJZHMnLCB7fSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBtb2R1bGVzIGxpc3RlZCBpbiBjdXN0b206TU9ELlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCAtIFRoZSBsYW1iZGEgZXZlbnQgcGFzc2VkIGluIGJ5IGEgdmFsaWRhdGVkIGFwaSByZXF1ZXN0LlxuICogQHJldHVybnMge2FycmF5fSBUaGUgTW9kdWxlIGFjY2VzcyBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVJbmZvKGV2ZW50KSB7XG4gICAgbGV0IGpzb25Ub1BhcnNlID1cbiAgICAgICAgXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5jdXN0b206TU9EJykgfHxcbiAgICAgICAgXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmN1c3RvbTpNT0QnKSB8fFxuICAgICAgICBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY2xhaW1zLmN1c3RvbTpBUicpIHx8XG4gICAgICAgIF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jdXN0b206QVInKSB8fFxuXG4gICAgICAgICd7fSc7XG5cbiAgICBjb25zdCBtb2R1bGVSaWdodHMgPSBKU09OLnBhcnNlKGpzb25Ub1BhcnNlKTtcbiAgICByZXR1cm4gXy5nZXQobW9kdWxlUmlnaHRzLCAnbW9kdWxlJywge30pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbW9kdWxlcyBsaXN0ZWQgaW4gY3VzdG9tOk1PRC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlTmFtZSAtIEEgc3RpbmcgbmFtZSBmb3IgYSBtb2R1bGUuXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBUaGUgbGFtYmRhIGV2ZW50IHBhc3NlZCBpbiBieSBhIHZhbGlkYXRlZCBhcGkgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHthcnJheX0gVGhlIE1vZHVsZSBhY2Nlc3MgbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tNb2R1bGUobW9kdWxlTmFtZSwgZXZlbnQpIHtcbiAgICBjb25zdCBtb2R1bGVSaWdodHMgPSBnZXRNb2R1bGVJbmZvKGV2ZW50KTtcbiAgICBsZXQgYWxsb3dBY2Nlc3MgPSBfLmdldChtb2R1bGVSaWdodHMsIG1vZHVsZU5hbWUsIGZhbHNlKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5CVUlMRF9FTlYgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWFsbG93QWNjZXNzKSB7XG4gICAgICAgIHRocm93IGVycm9yTGlzdC51bmF1dGhvcml6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgdXNlclJvbGVzID0ge1xuICAgIGFkbWluOiAnQScsXG4gICAgcmVhZDogJ1InLFxuICAgIHdyaXRlOiAnVydcbn07XG5cbi8qKlxuICogQHBhcmFtIHt7Ym9keTogc3RyaW5nfX0gZXZlbnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGJ1c2luZXNzSWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrV3JpdGVBY2Nlc3MoZXZlbnQpIHtcbiAgICBjb25zdCBldmVudEJvZHkgPSBwYXJzZUJvZHkoZXZlbnQpO1xuICAgIGNvbnN0IGJ1c2luZXNzSWRzID0gYWNjZXNzUmlnaHRzVXRpbHMoZXZlbnQpIHx8IFtdO1xuICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBidXNpbmVzc0lkcy5maW5kKChpZCkgPT4gaWQgPT09IGV2ZW50Qm9keS5idXNpbmVzc0lkKTtcbiAgICBjb25zdCByYXcgPSBnZXRCdXNpbmVzc2VzSW5mbyhldmVudCk7XG4gICAgY29uc3QgdXNlclJpZ2h0ID0gcmF3W2J1c2luZXNzSWRdO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52LkJVSUxEX0VOViA9PT0gJ2xvY2FsJykge1xuICAgICAgICByZXR1cm4gZXZlbnRCb2R5LmJ1c2luZXNzSWQ7XG4gICAgfVxuXG4gICAgaWYgKCh1c2VyUmlnaHQgIT09IHVzZXJSb2xlcy5hZG1pbiAmJiB1c2VyUmlnaHQgIT09IHVzZXJSb2xlcy53cml0ZSkgfHwgKCF1c2VyUmlnaHQpKSB7XG4gICAgICAgIHRocm93IGVycm9yTGlzdC51bmF1dGhvcml6ZWQ7XG4gICAgfVxuICAgIHJldHVybiBidXNpbmVzc0lkO1xufVxuXG4iLCJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IERCIGZyb20gJ3NlcXVlbGl6ZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC9tb21lbnQuanMnO1xuaW1wb3J0IHsgZXJyb3JMaXN0IH0gZnJvbSAnLi4vLi4vLi4vcmVxdWVzdFJlc29uc2UvZXJyb3JDb2Rlcy5qcyc7XG5pbXBvcnQgeyBhY2Nlc3NSaWdodHNVdGlscyB9IGZyb20gJy4vYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZSBzZXF1ZWxpemUgd2hlcmUgY2xhdXNlIGZyb20gcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgYW5kIGRlZmF1bHQgc29ydCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSB0aGUgcXVlcnkgcGFyYW1ldGVycyBmcm9tIHRoZSBldmVudCBwYXNzZWQgYnkgbGFtYmRhXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0RmlsdGVycyAtIHRoZSBkZWZhdWx0IGZpbHRlcnMgb2JqZWN0IGNyZWF0ZWQgYnkgY3JlYXRlRGVmYXVsdEZpbHRlcnNcbiAqIEByZXR1cm5zIHtvYmplY3R9IEFuIHNlcXVlbGl6ZSB3aGVyZSBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZpbHRlcnMgPSBmdW5jdGlvbiAoZXZlbnQsIG9iamVjdEZpbHRlcnMpe1xuICAgIGxldCBxdWVyeSA9IF8uZ2V0KGV2ZW50LCAncXVlcnlTdHJpbmdQYXJhbWV0ZXJzJywge30pIHx8IHt9O1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IF8uZ2V0KHF1ZXJ5LCAnc3RhcnREYXRlJyk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IF8uZ2V0KHF1ZXJ5LCAnZW5kRGF0ZScpO1xuICAgIGNvbnN0IHdoZXJlID0gT2JqZWN0LmtleXMocXVlcnkpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IF8uZ2V0KG9iamVjdEZpbHRlcnMsIGl0ZW0sIG51bGwpO1xuXG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1OYW1lID0gaXRlbS5pbmNsdWRlcygnLicpXG4gICAgICAgICAgICAgICAgPyBgJCR7aXRlbX0kYFxuICAgICAgICAgICAgICAgIDogaXRlbTtcblxuICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXSA9IHt9O1xuICAgICAgICAgICAgaWYgKHZhbC5maWx0ZXJUeXBlID09PSBEQi5PcC5pTGlrZSkge1xuICAgICAgICAgICAgICAgIGFjY1tpdGVtTmFtZV1bdmFsLmZpbHRlclR5cGVdID0gYCUke3F1ZXJ5W2l0ZW1dfSVgO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwuZmlsdGVyVHlwZSA9PT0gREIuT3Aub3IpIHtcbiAgICAgICAgICAgICAgICBhY2NbaXRlbU5hbWVdW3ZhbC5maWx0ZXJUeXBlXSA9IFstMSAqICtxdWVyeVtpdGVtXSwgK3F1ZXJ5W2l0ZW1dXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsLmZpbHRlclR5cGUgPT09IERCLk9wLmluKSB7XG4gICAgICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXVt2YWwuZmlsdGVyVHlwZV0gPSBxdWVyeVtpdGVtXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwuZmlsdGVyVHlwZSA9PT0gREIuT3AuaW4pIHtcbiAgICAgICAgICAgICAgICBhY2NbaXRlbU5hbWVdW3ZhbC5maWx0ZXJUeXBlXSA9IHF1ZXJ5W2l0ZW1dLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWRKc29uO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIEpTT04sIHBhcnNlIGl0XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZEpzb24gPSBKU09OLnBhcnNlKHF1ZXJ5W2l0ZW1dKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIG5vdCBKU09OLCBwYXNzIHRocm91Z2ggYXMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSnNvbiA9IHF1ZXJ5W2l0ZW1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhY2NbaXRlbU5hbWVdW3ZhbC5maWx0ZXJUeXBlXSA9IHBhcnNlZEpzb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwudHlwZSA9PT0gREIuQk9PTEVBTikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5VmFsdWUgPSBfLmdldChxdWVyeSwgaXRlbSwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBib29sZWFuTWFwID0ge1xuICAgICAgICAgICAgICAgICAgICAnZmFsc2UnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgJ251bGwnOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAndHJ1ZSc6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXVt2YWwuZmlsdGVyVHlwZV0gPSBib29sZWFuTWFwW3F1ZXJ5VmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBpZiAob2JqZWN0RmlsdGVycz8uYWN0aXZlICYmICF3aGVyZT8uYWN0aXZlKSB7XG4gICAgICAgIHdoZXJlLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgYnVzaW5lc3NJZHMgPSBhY2Nlc3NSaWdodHNVdGlscyhldmVudCk7XG4gICAgY29uc3QgZmlsdGVyQWRkcyA9IHtcbiAgICAgICAgYnVzaW5lc3NJZDogYnVzaW5lc3NJZHNcbiAgICB9O1xuXG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XG4gICAgICAgIGNvbnN0IHMgPSBtb21lbnQudXRjKHN0YXJ0RGF0ZSk7XG4gICAgICAgIGNvbnN0IGUgPSBtb21lbnQudXRjKGVuZERhdGUpO1xuICAgICAgICBjb25zdCBkYXRlcyA9IHtcbiAgICAgICAgICAgIFtEQi5PcC5iZXR3ZWVuXTogW3MudG9EYXRlKCksIGUudG9EYXRlKCldXG4gICAgICAgIH07XG4gICAgICAgIGlmICghcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRocm93IHsgLi4uZXJyb3JMaXN0LmludmFsaWRTdGFydERhdGUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRocm93IHsgLi4uZXJyb3JMaXN0LmludmFsaWRFbmREYXRlIH07XG4gICAgICAgIH1cblxuICAgICAgICBmaWx0ZXJBZGRzLmNyZWF0ZWRBdCA9IGRhdGVzO1xuICAgIH1cblxuICAgIGNvbnN0IHdpdGhEYXRlID0gT2JqZWN0LmFzc2lnbih3aGVyZSwgZmlsdGVyQWRkcyk7XG5cbiAgICByZXR1cm4gd2l0aERhdGU7XG59O1xuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBDcmVhdGUgc2VxdWVsaXplIG9yZGVyIGNsYXVzZSBmcm9tIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGFuZCBkZWZhdWx0IHNvcnQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IC0gdGhlIGV2ZW50IGNyZWF0ZWQgQVdTIGxhbWJkYSwgaXQgd2lsbCBjb250YWluIHF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB3aXRoIHNvcnQgcHJvcGVydHkgYSBjb21tYSBzZXBlcmF0ZWQgbGlzdCBvZiBzb3J0YWJsZSBmaWVsZHMgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0RmlsdGVycyAtIHRoZSBkZWZhdWx0IGZpbHRlcnMgb2JqZWN0IGNyZWF0ZWQgYnkgY3JlYXRlRGVmYXVsdEZpbHRlcnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZWZhdWx0RmlsdGVyIC0gQSBkZWZhdWx0IGZpbHRlciBvYmplY3QgYXMgYnVpbHQgYnkgY3JlYXRlRGVmYXVsdCBGaWx0ZXJzLCBpZiBpdGVtcyBhcmUgbm90IG9uIHRoZSBzY2hlbWEgdGhleSB3aWxsIG5vdCBiZSBpbiB0aGUgb3JkZXIgYnlcbiAqIEByZXR1cm5zIHtvYmplY3R9ICBBbiBzZXF1ZWxpemUgb3JkZXIgYnkgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVTb3J0ID0gZnVuY3Rpb24gKGV2ZW50LCBkZWZhdWx0RmlsdGVyKSB7XG4gICAgbGV0IGNvcHlPZkRlZmF1bHRGaWx0ZXIgPSBfLmNsb25lKGRlZmF1bHRGaWx0ZXIpO1xuICAgIGxldCBxdWVyeSA9IF8uZ2V0KGV2ZW50LCAncXVlcnlTdHJpbmdQYXJhbWV0ZXJzJywge30pIHx8IHt9O1xuICAgIGxldCBzb3J0ID0gXy5nZXQocXVlcnksICdzb3J0JywgJy11cGRhdGVkQXQnKSB8fCAnLXVwZGF0ZWRBdCc7XG5cbiAgICByZXR1cm4gc29ydC5zcGxpdCgnLCcpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG5cbiAgICAgICAgY29uc3QgdGVzdEl0ZW0gPSBpdGVtLmluZGV4T2YoJy0nKSA9PT0gMCA/IGl0ZW0uc3Vic3RyKDEpIDogaXRlbTtcblxuICAgICAgICBpZiAoXy5nZXQoY29weU9mRGVmYXVsdEZpbHRlciwgdGVzdEl0ZW0sIG51bGwpKSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0SXRlbSA9IFtdO1xuXG4gICAgICAgICAgICB0ZXN0SXRlbS5zcGxpdCgnLicpLmZvckVhY2goKHBhcmVudENoaWxkTGlzdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNvcnRJdGVtLnB1c2gocGFyZW50Q2hpbGRMaXN0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaXRlbS5pbmRleE9mKCctJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzb3J0SXRlbS5wdXNoKCdERVNDJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvcnRJdGVtLnB1c2goJ0FTQycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNjLnB1c2goc29ydEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59O1xuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBEQiBmcm9tICdzZXF1ZWxpemUnO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGZpbHRlcnMgZm9yIGEgZ2l2ZW4gc2VxdWVsaWF6ZSBTY2hlbWEgT2JqZWN0LCBhbmQgc2V0IG9mIHN1YiBzY2hlbWFzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYSAtIHR5cGUgaXMgc2VxdWVsaXplIGRhdGEgdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHN1YlNjaGVtYXMgLSBBbiBvYmplY3Qgd2l0aCBhbGlhcyBhcyB0aGUga2V5IGFuZCBzZXF1ZWxpemUgc2NoZW1hIGFzIHRoZSB2YWx1ZSBodHRwOi8vZG9jcy5zZXF1ZWxpemVqcy5jb20vY2xhc3MvbGliL3NlcXVlbGl6ZS5qc35TZXF1ZWxpemUuaHRtbCNpbnN0YW5jZS1tZXRob2QtZGVmaW5lXG4gKiBzdWIgc2NoZW1hIGNhbiBiZSB7bG9jYXRpb246IGxvY2F0aW9uU2NoZW1hfSBvciB7bG9jYXRpb246IHthczogXCJhc0FsaWFzXCIsIHNjaGVtYTogc2NoZW1hfX1cbiAqIEByZXR1cm5zIHtvYmplY3R9IEFuIE9iamVjdCB3aXRoIGEgZGVmYXVsdCBmaWx0ZXIgZm9yIGVhY2ggZGF0YVR5cGUgQ0hBUiBhbmQgVEVYVCB3aWxsIGdldCBhICRsaWtlIG9wZXJhdG9yLCBJTlRFR0VSLCBERUNJTUFMIGFuZCBCT09MRUFOIHdpbGwgZ2V0IGEgJGVxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEZpbHRlcnMoc2NoZW1hLCBzdWJTY2hlbWFzID0ge30pIHtcbiAgICBzY2hlbWEgPSBfLmNsb25lKHNjaGVtYSk7XG5cbiAgICBjb25zdCBmaWx0ZXJzID0ge307XG5cbiAgICBhZGRGaWx0ZXJzRnJvbVNjaGVtYShzY2hlbWEsIGZpbHRlcnMpO1xuICAgIE9iamVjdC5rZXlzKHN1YlNjaGVtYXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBhZGRGaWx0ZXJzRnJvbVNjaGVtYShzdWJTY2hlbWFzW2tleV0sIGZpbHRlcnMsIGtleSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpbHRlcnNGcm9tU2NoZW1hKHNjaGVtYSwgYWNjdW11bGF0b3IsIGtleVByZWZpeCA9ICcnKSB7XG4gICAgY29uc3QgYXNMaW5rQWxpYXMgPSBfLmdldChzY2hlbWEsICdhcycsIG51bGwpO1xuICAgIHNjaGVtYSA9IF8uZ2V0KHNjaGVtYSwgJ3NjaGVtYScpIHx8IHNjaGVtYTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGxldCBrZXkgPSBpdGVtO1xuXG4gICAgICAgIGlmIChhc0xpbmtBbGlhcykge1xuICAgICAgICAgICAgYWNjW2FzTGlua0FsaWFzXSA9IHsgdHlwZTogREIuU1RSSU5HLCBmaWx0ZXJUeXBlOiBEQi5PcC5lcSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleVByZWZpeCkge1xuICAgICAgICAgICAga2V5ID0gYCR7a2V5UHJlZml4fS4ke2l0ZW19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2hlbWFbaXRlbV0uZmlsdGVyVHlwZSkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IHNjaGVtYVtpdGVtXS5maWx0ZXJUeXBlIH07XG5cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHNjaGVtYVtpdGVtXS50eXBlO1xuXG4gICAgICAgIC8vdG9kbyB0aGVzZSBzaG91bGQgYmUgcmVtb3ZlZCwgdGhlcmUgYXJlIGp1c3QgaGVyZSBmb3Igc29ydCB0ZXN0c1xuICAgICAgICBzd2l0Y2ggKGl0ZW1UeXBlKSB7XG4gICAgICAgICAgICBjYXNlIERCLkNIQVI6XG4gICAgICAgICAgICBjYXNlIERCLlNUUklORzpcbiAgICAgICAgICAgIGNhc2UgREIuVEVYVDpcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IHsgZmlsdGVyVHlwZTogREIuT3AuaUxpa2UgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBEQi5ERUNJTUFMOlxuICAgICAgICAgICAgICAgIGFjY1trZXldID0geyBmaWx0ZXJUeXBlOiBEQi5PcC5vciB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIERCLkJPT0xFQU46XG4gICAgICAgICAgICBjYXNlIERCLkJJR0lOVDpcbiAgICAgICAgICAgIGNhc2UgREIuSU5URUdFUjpcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IHsgdHlwZTogaXRlbVR5cGUsIGZpbHRlclR5cGU6IERCLk9wLmVxIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgREIuREFURTpcbiAgICAgICAgICAgIGNhc2UgREIuREFURU9OTFk6XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IERCLk9wLmx0IH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvL25ldyBzZXF1ZWxpemUgdXNlcyBjbGFzc2VzIGluc3RlYWQgb2Ygb2JqZWN0c1xuICAgICAgICBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5TVFJJTkcpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0geyBmaWx0ZXJUeXBlOiBEQi5PcC5pTGlrZSB9O1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlIGluc3RhbmNlb2YgREIuREVDSU1BTCkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IERCLk9wLm9yIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5JTlRFR0VSKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHsgZmlsdGVyVHlwZTogREIuT3Aub3IgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSBpbnN0YW5jZW9mIERCLkJJR0lOVCkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IERCLk9wLm9yIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5CT09MRUFOKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHsgdHlwZTogaXRlbVR5cGUsIGZpbHRlclR5cGU6IERCLk9wLmVxIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5KU09OQikge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IHR5cGU6IGl0ZW1UeXBlLCBmaWx0ZXJUeXBlOiBEQi5PcC5jb250YWlucyB9O1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlIGluc3RhbmNlb2YgREIuREFURU9OTFkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0geyB0eXBlOiBpdGVtVHlwZSwgZmlsdGVyVHlwZTogREIuT3AuZXEgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGhlc2UgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtb2RlbHMgc28gYWRkIHRoZW0gYWx3YXlzXG4gICAgICAgIGFjY1snY3JlYXRlZEF0J10gPSB7IHR5cGU6IERCLkRBVEUsIGZpbHRlclR5cGU6IERCLk9wLmx0IH07XG4gICAgICAgIGFjY1sndXBkYXRlZEF0J10gPSB7IHR5cGU6IERCLkRBVEUsIGZpbHRlclR5cGU6IERCLk9wLmx0IH07XG4gICAgICAgIGFjY1snaWQnXSA9IHsgdHlwZTogREIuSU5URUdFUiwgZmlsdGVyVHlwZTogREIuT3AuZXEgfTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIGFjY3VtdWxhdG9yKTtcbn1cbiIsIi8qKlxuICogY3JlYXRlIHBhZ2luYXRpb24gb2JqZWN0IGZyb20gU2VxdWVsaXplIGZpbmRBbGxcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXN1bHQgLSBzZXF1ZWxpemUgcmVzdWx0XG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBtYXggbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gcGFnZSBvZmZzZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2luYXRpb25Gcm9tRmluZEFsbChyZXN1bHQsIGxpbWl0LCBvZmZzZXQpIHtcbiAgICByZXN1bHQgPSByZXN1bHQgfHwgW107XG4gICAgbGltaXQgPSBsaW1pdCB8fCAwO1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgY29uc3QgaGFzTW9yZSA9IHJlc3VsdC5sZW5ndGggPiBsaW1pdDtcbiAgICBpZiAoaGFzTW9yZSkge1xuICAgICAgICByZXN1bHQuc3BsaWNlKC0xLCAxKTtcbiAgICB9XG4gICAgY29uc3QgcGFnZU9iamVjdCA9IHtcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgICAgcm93czogcmVzdWx0LFxuICAgICAgICBoYXNNb3JlOiBoYXNNb3JlXG4gICAgfTtcblxuICAgIHJldHVybiBwYWdlT2JqZWN0O1xufVxuXG4vKipcbiAqIHdyYXBwZXIgZm9yIFNlcXVlbGl6ZSBmaW5kQWxsXG4gKiBAcGFyYW0ge29iamVjdH0gbW9kZWwgLSBpbnN0YW5jZSBvZiBTZXF1ZWxpemUgKG11c3QgYmUgaW5pdGlhbGl6ZWQpXG4gKiBAcGFyYW0geyome2luY2x1ZGU6IFt7bW9kZWw6ICp9XSwgd2hlcmU6IHtidXNpbmVzc0lkOiBBcnJheX0sIG9yZGVyOiBbc3RyaW5nW11dfX0gb3B0aW9ucyAtIGluc3RhbmNlIG9mIFNlcXVlbGl6ZSAobXVzdCBiZSBpbml0aWFsaXplZClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBbGwobW9kZWwsIG9wdGlvbnMpIHtcblxuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCB8fCAwO1xuICAgIGNvbnN0IGZpbmRBcmdzID0gT2JqZWN0LmFzc2lnbih7aW5jbHVkZTogeyBhbGw6IHRydWUsIG5lc3RlZDogdHJ1ZSB9fSwgb3B0aW9ucywgeyBsaW1pdDogbGltaXQgKyAxIH0pO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBtb2RlbC5maW5kQWxsKGZpbmRBcmdzKTtcbiAgICByZXR1cm4gZ2V0UGFnaW5hdGlvbkZyb21GaW5kQWxsKHJlc3VsdHMsIGxpbWl0LCBvcHRpb25zLm9mZnNldCk7XG59XG5cbmNvbnN0IGZpbmRVdGlscyA9IHtcbiAgICBmaW5kQWxsXG59O1xuZXhwb3J0IGRlZmF1bHQgZmluZFV0aWxzOyIsImltcG9ydCB7IER5bmFtb0RCRG9jdW1lbnQgfSBmcm9tICdAYXdzLXNkay9saWItZHluYW1vZGInO1xyXG5pbXBvcnQgeyBEeW5hbW9EQiB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1keW5hbW9kYic7XHJcblxyXG5jb25zdCBkeW5hbW9VdGlsID0ge1xyXG4gICAgZ2V0OiAocGFyYW1zKSA9PiBnZXQocGFyYW1zKVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7e1RhYmxlTmFtZTpzdHJpbmcsIEtleTp7a2V5OnN0cmluZ319fSBwYXJhbXNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGdldChwYXJhbXMpIHtcclxuICAgIGNvbnN0IGR5bmFtb0RiID0gRHluYW1vREJEb2N1bWVudC5mcm9tKG5ldyBEeW5hbW9EQigpKTtcclxuICAgIHJldHVybiBkeW5hbW9EYi5nZXQocGFyYW1zKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZHluYW1vVXRpbDsiLCJpbXBvcnQgeyBoYW5kbGVGaWxlIH0gZnJvbSAnLi9oYW5kbGVGaWxlLmpzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFdmVudHMoZXZlbnQsIHRyYW5zZm9ybWVyLCBlcnJvckhhbmRsZXJQZXJGaWxlLCBzaG91bGRTa2lwRmFpbGVkRm9sZGVycyA9IGZhbHNlLCB1c2VySW1wb3J0VHlwZXMpIHtcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5SZWNvcmRzKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzRXJyb3JzID0gZmFsc2U7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5tYXAoZXZlbnQuUmVjb3JkcywgKHJlY29yZCkgPT4ge1xuICAgICAgICBjb25zdCBzbnNJbmZvID0gSlNPTi5wYXJzZShfLmdldChyZWNvcmQsICdTbnMuTWVzc2FnZScsICd7fScpKTtcbiAgICAgICAgY29uc3QgczNCdWNrZXQgPSBzbnNJbmZvLmJ1Y2tldDtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBzbnNJbmZvLmZpbGVzIHx8IFtdO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLm1hcChmaWxlcywgKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGZpbGUpO1xuICAgICAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRmlsZShwYXRoLCBzM0J1Y2tldCwgdHJhbnNmb3JtZXIsIHsgc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMsIHVzZXJJbXBvcnRUeXBlcyB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckhhbmRsZXJQZXJGaWxlICYmICFlcnJvckhhbmRsZXJQZXJGaWxlKGVyciwgcGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgICAgICAgIHRocm93ICdFcnJvcnMgcHJvY2Vzc2luZyBvbmUgb3IgbW9yZSBmaWxlcy4gU2VlIGVycm9yIGxvZ3MgZm9yIGRldGFpbCBvbiBlYWNoIGVycm9yLic7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUzNVdGlsIGZyb20gJy4uL3MzL1MzVXRpbHMuanMvUzNVdGlscy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVGaWxlKHBhdGgsIHMzQnVja2V0LCB0cmFuc2Zvcm1lciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHNob3VsZFNraXBGYWlsZWRGb2xkZXJzID0gXy5nZXQob3B0aW9ucywgJ3Nob3VsZFNraXBGYWlsZWRGb2xkZXJzJyk7XG4gICAgY29uc3QgdXNlckltcG9ydFR5cGVzID0gXy5nZXQob3B0aW9ucywgJ3VzZXJJbXBvcnRUeXBlcycpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgQnVja2V0OiBzM0J1Y2tldCxcbiAgICAgICAgS2V5OiBwYXRoXG4gICAgfTtcbiAgICBsZXQgYm9keSA9ICd7fSdcbiAgICB0cnkge1xuICAgICAgICBib2R5ID0gYXdhaXQgUzNVdGlsLmdldE9iamVjdChwYXJhbXMpO1xuICAgICAgICBjb25zdCBwYXJzZWRCb2R5ID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgICAgY29uc3QgcmV0dXJuZWRWYWx1ZSA9IGF3YWl0IHRyYW5zZm9ybWVyKHBhcnNlZEJvZHkpO1xuICAgICAgICBhd2FpdCBTM1V0aWwuZGVsZXRlT2JqZWN0KHBhcmFtcyk7XG5cbiAgICAgICAgcmV0dXJuIHJldHVybmVkVmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignaGFuZGxlLWZpbGUtZXJyb3InLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdOb1N1Y2hLZXknIHx8ICFib2R5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV3UGF0aCA9ICcnO1xuXG4gICAgICAgIGlmICh1c2VySW1wb3J0VHlwZXMpIHtcbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIGl0ZW1zIGluIHRoZSB1c2VySW1wb3J0VHlwZXNcbiAgICAgICAgICAgIGNvbnN0IHVzZXJzSW1wb3J0cyA9IE9iamVjdC52YWx1ZXModXNlckltcG9ydFR5cGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gcGF0aC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBfLmxhc3QoaXRlbXMpO1xuICAgICAgICAgICAgY29uc3QgZm9sZGVyTmFtZSA9IF8uZmlyc3QoaXRlbXMpO1xuXG4gICAgICAgICAgICBpZiAodXNlcnNJbXBvcnRzLmluZGV4T2YoZm9sZGVyTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTa2lwRmFpbGVkRm9sZGVycykge1xuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoID0gYCR7Zm9sZGVyTmFtZX0vZXJyb3IvJHtmaWxlTmFtZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5zdGFydHNXaXRoKHBhdGgsIGAke2ZvbGRlck5hbWV9L2ZhaWxlZC1vbmNlL2ApKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BhdGggPSBfLnJlcGxhY2UocGF0aCwgYCR7Zm9sZGVyTmFtZX0vZmFpbGVkLW9uY2UvYCwgYCR7Zm9sZGVyTmFtZX0vZmFpbGVkLXR3aWNlL2ApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5zdGFydHNXaXRoKHBhdGgsIGAke2ZvbGRlck5hbWV9L2ZhaWxlZC10d2ljZS9gKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoID0gXy5yZXBsYWNlKHBhdGgsIGAke2ZvbGRlck5hbWV9L2ZhaWxlZC10d2ljZS9gLCBgJHtmb2xkZXJOYW1lfS9lcnJvci9gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoID0gYCR7Zm9sZGVyTmFtZX0vZmFpbGVkLW9uY2UvJHtmaWxlTmFtZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aCA9IGBwYXRoQW5kRXZlbnRNaXNNYXRjaEVycm9yLyR7cGF0aH1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMpIHtcbiAgICAgICAgICAgICAgICBuZXdQYXRoID0gYGVycm9yLyR7cGF0aH1gO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfLnN0YXJ0c1dpdGgocGF0aCwgJ2ZhaWxlZC1vbmNlLycpKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aCA9IF8ucmVwbGFjZShwYXRoLCAnZmFpbGVkLW9uY2UvJywgJ2ZhaWxlZC10d2ljZS8nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5zdGFydHNXaXRoKHBhdGgsICdmYWlsZWQtdHdpY2UvJykpIHtcbiAgICAgICAgICAgICAgICBuZXdQYXRoID0gXy5yZXBsYWNlKHBhdGgsICdmYWlsZWQtdHdpY2UvJywgJ2Vycm9yLycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhwYXRoLCAnZGVsYXlVbnRpbC8nKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gXy5sYXN0KHBhdGguc3BsaXQoJy8nKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV3UGF0aCA9IGBmYWlsZWQtb25jZS8ke3BhdGh9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IHtcbiAgICAgICAgICAgIEJ1Y2tldDogczNCdWNrZXQsXG4gICAgICAgICAgICBLZXk6IG5ld1BhdGgsXG4gICAgICAgICAgICBCb2R5OiBib2R5XG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgUzNVdGlsLnB1dE9iamVjdChuZXdQYXJhbXMpO1xuICAgICAgICBhd2FpdCBTM1V0aWwuZGVsZXRlT2JqZWN0KHBhcmFtcyk7XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBQcm9taXNlIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBTM1V0aWxzIGZyb20gJy4uL3MzL1MzVXRpbHMuanMvUzNVdGlscy5qcyc7XG5pbXBvcnQgU05TVXRpbCBmcm9tICcuLi9zbnMvU05TVXRpbHMuanMnO1xuaW1wb3J0IGR5bmFtb1V0aWwgZnJvbSAnLi4vZHluYW1vL2R5bmFtb1V0aWxzLmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0XG4gKiBAcGFyYW0ge251bWJlcn0gbWF4S2V5c1xuICogQHBhcmFtIHtPYmplY3R9IHVzZXJJbXBvcnRUeXBlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9vcChidWNrZXQsIG1heEtleXMsIHVzZXJJbXBvcnRUeXBlcykge1xuICAgIGxldCBidWNrZXRSZXN1bHQgPSB7fTtcbiAgICBsZXQgZmlsZUxpc3QgPSBbXTtcblxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbW9tZW50KCk7XG5cbiAgICBkbyB7XG4gICAgICAgIGJ1Y2tldFJlc3VsdCA9IGF3YWl0IFMzVXRpbHMubGlzdE9iamVjdHNWMih7XG4gICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICAgIE1heEtleXM6IG1heEtleXMsXG4gICAgICAgICAgICBDb250aW51YXRpb25Ub2tlbjogXy5nZXQoYnVja2V0UmVzdWx0LCAnTmV4dENvbnRpbnVhdGlvblRva2VuJylcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IG5ld0ZpbGVzID0gXy5maWx0ZXIoYnVja2V0UmVzdWx0LkNvbnRlbnRzLCAoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKF8uc3RhcnRzV2l0aChfLmdldChmaWxlLCAnS2V5JyksICdkZWxheVVudGlsLycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZURlbGF5VGltZSA9IF8uZ2V0KGZpbGUsICdLZXknKS5zcGxpdCgnLycpWzFdO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQoZmlsZURlbGF5VGltZSwgJ1lZWVlNTURESEhtbScpLmlzU2FtZU9yQmVmb3JlKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1c2VySW1wb3J0VHlwZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBpdGVtcyBpbiB0aGUgdXNlckltcG9ydFR5cGVzXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcnNJbXBvcnRzID0gT2JqZWN0LnZhbHVlcyh1c2VySW1wb3J0VHlwZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZmlsZS5LZXkuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IF8ubGFzdChpdGVtcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9sZGVyTmFtZSA9IF8uZmlyc3QoaXRlbXMpO1xuICAgICAgICAgICAgICAgIGlmIChfLmlzRW1wdHkoZmlsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlcnNJbXBvcnRzLmluZGV4T2YoZm9sZGVyTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIV8uc3RhcnRzV2l0aChmaWxlLktleSwgYCR7Zm9sZGVyTmFtZX0vZXJyb3JgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhXy5zdGFydHNXaXRoKGZpbGUuS2V5LCAnZXJyb3InKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsZUxpc3QgPSBfLmNvbmNhdChmaWxlTGlzdCwgbmV3RmlsZXMpO1xuICAgIH0gd2hpbGUgKGJ1Y2tldFJlc3VsdC5Jc1RydW5jYXRlZCAmJiBidWNrZXRSZXN1bHQuTmV4dENvbnRpbnVhdGlvblRva2VuICYmIGZpbGVMaXN0Lmxlbmd0aCA8IG1heEtleXMpO1xuXG4gICAgcmV0dXJuIGZpbGVMaXN0O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlZCBTTlMgZXZlbnRzIGF0IGEgc3RlYWR5IHBhY2UgZm9yIGRhdGEgaW4gYSBwYXJ0aWN1bGFyIGJ1Y2tldC4gU2hvdWxkIGJlIGV4ZWN1dGVkIHZpYSBhIGNsb3VkIHdhdGNoIGNyb24gam9iIGFzIGEgcGFydCBvZiBhIG1pY3JvIHNlcnZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnVGFibGUgLSBUaGUgRHluYW1vIERCIHRhYmxlIHdoZXJlIHRvIGdldCB0aGUgY2h1bmstc2l6ZSBhbmQgbWF4TWVzc2FnZSBzaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVLZXkgLSBUaGUga2V5IHRvIHRoZSBpdGVtIGluIHRoZSBEeW5hbW8gREIgdGFibGUgdGhhdCBob2xkcyB0aGUgY2h1bmstc2l6ZSBhbmQgbWF4TWVzc2FnZSBzaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0IC0gVGhlIG5hbWUgb2YgdGhlIHMzIGJ1Y2tldCB0byB3YXRjaCwgd2hlbiB5b3UgZHJvcCBpdGVtcyBpbnRvIHRoaXMgdGFibGUgZXZlbnRzIHdpbGwgYmUgY3JlYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IHNuc1RvcGljIC0gVGhlIG5hbWUgb2YgdGhlIHNuc0V2ZW50IHRvIHB1Ymxpc2hcbiAqIEBwYXJhbSB7b2JqZWN0fSB1c2VySW1wb3J0VHlwZXMgLSBpbXBvcnQgdHlwZXMgdG8gZmlsdGVyIG9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoRXZlbnRzKGNvbmZpZ1RhYmxlLCB0YWJsZUtleSwgYnVja2V0LCBzbnNUb3BpYywgdXNlckltcG9ydFR5cGVzKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBkeW5hbW9VdGlsLmdldCh7XG4gICAgICAgICAgICBUYWJsZU5hbWU6IGNvbmZpZ1RhYmxlLFxuICAgICAgICAgICAgS2V5OiB7IGtleTogdGFibGVLZXkgfVxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBnZXQgY29uZmlnIGZvciBrZXk6ICR7dGFibGVLZXl9IHRhYmxlOiAke2NvbmZpZ1RhYmxlfSBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdHMgb2YgMiBhbmQgMTBgLCBlKTtcbiAgICB9XG4gICAgbGV0IGNodW5rU2l6ZSA9IF8uZ2V0KHJlc3VsdCwgJ0l0ZW0uc25zQ2h1bmtTaXplJywgMik7XG4gICAgbGV0IG1heE1lc3NhZ2VzID0gXy5nZXQocmVzdWx0LCAnSXRlbS5zbnNNYXhNZXNzYWdlcycsIDEwKTtcblxuICAgIGNvbnN0IHNuc0NyZWF0ZVRvcGljUmVzcG9uc2UgPSBhd2FpdCBTTlNVdGlsLmNyZWF0ZVRvcGljKHsgTmFtZTogc25zVG9waWMgfSk7XG4gICAgY29uc3QgdG9waWNBcm4gPSBzbnNDcmVhdGVUb3BpY1Jlc3BvbnNlLlRvcGljQXJuO1xuICAgIGNvbnN0IG1heEtleXMgPSBjaHVua1NpemUgKiBtYXhNZXNzYWdlcztcblxuICAgIGNvbnN0IGZpbGVMaXN0ID0gYXdhaXQgbG9vcChidWNrZXQsIG1heEtleXMsIHVzZXJJbXBvcnRUeXBlcyk7XG5cbiAgICBjb25zdCBtZXNzYWdlTGlzdCA9IF8uY2hhaW4oZmlsZUxpc3QpXG4gICAgICAgIC5tYXAoJ0tleScpXG4gICAgICAgIC5jaHVuayhjaHVua1NpemUpXG4gICAgICAgIC5zbGljZSgwLCBtYXhNZXNzYWdlcylcbiAgICAgICAgLnZhbHVlKClcbiAgICA7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5tYXAobWVzc2FnZUxpc3QsIChmaWxlcykgPT4ge1xuICAgICAgICByZXR1cm4gU05TVXRpbC5wdWJsaXNoKHtcbiAgICAgICAgICAgIE1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBidWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXNcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgVG9waWNBcm46IHRvcGljQXJuXG4gICAgICAgIH0pO1xuICAgIH0pO1xufSIsImltcG9ydCB7IHB1Ymxpc2hFdmVudHMgfSBmcm9tICcuL3B1Ymxpc2hFdmVudHMuanMnO1xuaW1wb3J0IHsgaGFuZGxlRXZlbnRzIH0gZnJvbSAnLi9oYW5kbGVFdmVudHMuanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBidWNrZXQgd2F0Y2hlciB3YXRjaGVzIGEgczMgYnVja2V0IGFuZCBwdWJsaXNoZXMgZXZlbnRzIHRvIGEgc25zIHRvcGljLCB0aGlzIGFsbG93cyB5b3UgdG8gcHJvY2VzcyBmaWxlcyBpbiBzMyB3aXRoIGEgc29tZSB0cmFuc2Zvcm1lciBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igd2F0Y2hCdWNrZXQsIHNlZSBiZWxvd1xuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcy5ldmVudCAtIFRoZSBldmVudCBvZiB0aGUgbGFtYmRhXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmR5bmFtb0NvbmZpZ1RhYmxlIC0gVGhlIER5bmFtbyBEQiB0YWJsZSB3aGVyZSB0byBnZXQgdGhlIGNodW5rU2l6ZSBhbmQgbWF4TWVzc2FnZSBzaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmR5bmFtb0NvbmZpZ0tleSAtIFRoZSBrZXkgdG8gdGhlIGl0ZW0gaW4gdGhlIER5bmFtbyBEQiB0YWJsZSB0aGF0IGhvbGRzIHRoZSBjaHVua1NpemUgYW5kIG1heE1lc3NhZ2Ugc2l6ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zM0J1Y2tldCAtIFRoZSBuYW1lIG9mIHRoZSBzMyBidWNrZXQgdG8gd2F0Y2gsIHdoZW4geW91IGRyb3AgaXRlbXMgaW50byB0aGlzIHRhYmxlIGV2ZW50cyB3aWxsIGJlIGNyZWF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc25zVG9waWMgLSBUaGUgbmFtZSBvZiB0aGUgc25zRXZlbnQgdG8gcHVibGlzaFxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGFyYW1zLnRyYW5zZm9ybWVyIC0gdGhlIGZ1bmN0aW9uIHRvIHJ1biBvbiBlYWNoIGZpbGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtwYXJhbXMuZXJyb3JIYW5kbGVyUGVyRmlsZV0gLSB0aGUgZnVuY3Rpb24gdG8gcnVuIG9uIGFzIGEgY2F0Y2ggb24gZWFjaCBmaWxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbXMuc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnNdIC0gd2hldGhlciB0byB1c2UgdGhlIGZhaWxlZC1vbmNlLCBmYWlsZWQtdHdpY2UsIGVycm9yIG9yIGp1c3QgZXJyb3IgZm9sZGVyc1xuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXMudXNlckltcG9ydFR5cGVzXSAtIHVzZXIgaW1wb3J0IHN1YiBkaXJlY3RvcmllcyBvYmplY3QgbWFwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaEJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbW9Db25maWdUYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1vQ29uZmlnS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzM0J1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25zVG9waWMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJQZXJGaWxlID0gXy5ub29wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRTa2lwRmFpbGVkRm9sZGVycyA9IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW1wb3J0VHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSB7XG4gICAgaWYgKCFldmVudCB8fCAhZHluYW1vQ29uZmlnVGFibGUgfHwgIWR5bmFtb0NvbmZpZ0tleSB8fCAhczNCdWNrZXQgfHwgIXNuc1RvcGljIHx8ICF0cmFuc2Zvcm1lcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycy4gTmVlZCBldmVudCwgZHluYW1vQ29uZmlnVGFibGUsIGR5bmFtb0NvbmZpZ0tleSwgczNCdWNrZXQsIHNuc1RvcGljLCB0cmFuc2Zvcm1lcicpO1xuICAgIH1cblxuICAgIGNvbnN0IEV2ZW50U291cmNlID0gXy5nZXQoZXZlbnQsICdSZWNvcmRzWzBdLkV2ZW50U291cmNlJyk7XG4gICAgaWYgKF8uaXNFcXVhbChFdmVudFNvdXJjZSwgJ2F3czpzbnMnKSkge1xuICAgICAgICByZXR1cm4gaGFuZGxlRXZlbnRzKGV2ZW50LCB0cmFuc2Zvcm1lciwgZXJyb3JIYW5kbGVyUGVyRmlsZSwgc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMsIHVzZXJJbXBvcnRUeXBlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIHJ1biBmcm9tIHRoZSBjcm9uIGpvYiBzbyBwdWJsaXNoIFNOUyBldmVudHNcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hFdmVudHMoZHluYW1vQ29uZmlnVGFibGUsIGR5bmFtb0NvbmZpZ0tleSwgczNCdWNrZXQsIHNuc1RvcGljLCB1c2VySW1wb3J0VHlwZXMpO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjb25zdCBlcnJvckxpc3QgPSB7XG4gICAgaW52YWxpZEludmVudG9yeVJlbGVhc2VSZXF1ZXN0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdOT1QgRU5PVUdIIElOVkVOVE9SWSBUTyBGVUxGSUxMIFJFTEVBU0UnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDEwJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBhbHJlYWR5UmVsZWFzZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0FMUkVBRFkgUkVMRUFTRUQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDExJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBhbHJlYWR5UmVjZWl2ZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1JFQ0VJVkFCTEUgQUxSRUFEWSBSRUNFSVZFRCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMTInLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRJdGVtc1JlcXVlc3Q6IHtcbiAgICAgICAgbWVzc2FnZTogJ1ZBTElEIElURU1TIE1VU1QgQkUgSU5DTFVERUQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDEzJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkSUQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lEIGlzIGludmFsaWQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDE0JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkUmVjZWl2YWJsZToge1xuICAgICAgICBtZXNzYWdlOiAnTVVTVCBDT05UQUlOIEFUIExFQVNUIE9ORSBSRUNFSVZBQkxFJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxNScsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZFJlcXVlc3Q6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgUkVRVUVTVCBEQVRBJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxNicsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZEFQSUtleToge1xuICAgICAgICBtZXNzYWdlOiAnSU5WQUxJRCBSRVFVRVNUIC0gQVBJIE1BWSBLRVkgSU5WQUxJRCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMTcnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIHFiQ3JlYXRpb25FcnJvcjoge1xuICAgICAgICBtZXNzYWdlOiAnUVVJQ0tCT09LUyBFUlJPUiAtIEVSUk9SIENSRUFUSU5HIE9CSkVDVCBJTiBRVUlDS0JPT0tTJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxOCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgY2Fubm90UmVvcGVuOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdDQU5OT1QgUkVPUEVOIC0gVEhFIE9SREVSIEhBUyBBTFJFQURZIEJFRU4gT1BFTkVEJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxOCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZERhdGVGb3JtYXQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgREFURSBGT1JNQVQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDE5JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkU3RhcnREYXRlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdJTlZBTElEIFNUQVJUIERBVEUnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDIwJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkRW5kRGF0ZToge1xuICAgICAgICBtZXNzYWdlOiAnSU5WQUxJRCBFTkQgREFURScsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMjEnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRPcmRlclN0YXR1czoge1xuICAgICAgICBtZXNzYWdlOiAnVU5BQkxFIFRPIEVESVQgT1JERVIgSVRFTVMgVU5MRVNTIFRIRSBPUkRFUiBJUyBJTiBFU1RJTUFURSBTVEFUVVMnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDIyJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkUGF5bWVudFN0YXR1czoge1xuICAgICAgICBtZXNzYWdlOiAnVU5BQkxFIFRPIFVQREFURSBQQVlNRU5UIFNUQVRVUyBQQVlNRU5UIE1VU1QgQkUgT1BFTicsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMjMnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRSZWxlYXNlU3RhdHVzOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVTkFCTEUgVE8gVVBEQVRFIFJFTEVBU0UsIFNUQVRVUyBSRUxFQVNFIE1VU1QgQkUgT1BFTicsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMjQnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRSZWNlaXZhYmxlU3RhdHVzOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVTkFCTEUgVE8gVVBEQVRFIFJFQ0VJVkFCTEUsIFNUQVRVUyBSRUNFSVZBQkxFIE1VU1QgQkUgT1BFTicsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMDI1JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkSnNvbjp7XG4gICAgICAgIG1lc3NhZ2U6ICdJTlZBTElEIEpTT04nLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDA1JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkRmlsdGVyOntcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgRklMVEVSJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAyNicsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZFVzZXJOYW1lVXBkYXRlOntcbiAgICAgICAgbWVzc2FnZTogJ1VOQUJMRSBUTyBVUERBVEUgVVNFUk5BTUUnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDI3JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbWFnZVNpemVMaW1pdDp7XG4gICAgICAgIG1lc3NhZ2U6ICdJTUFHRSBTSVpFIExJTUlUIDEwMEtCIEVYQ0VFREVEJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAyOCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgdW5hdXRob3JpemVkOntcbiAgICAgICAgbWVzc2FnZTogJ1VOQVVUSE9SSVpFRCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQxMTEnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDFcbiAgICB9LFxuICAgIG5vdEZvdW5kOntcbiAgICAgICAgbWVzc2FnZTogJ0lURU0gTk9UIEZPVU5EJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAwNCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwNFxuICAgIH0sXG4gICAgZW1haWxSZXF1aXJlZDp7XG4gICAgICAgIG1lc3NhZ2U6ICdOTyBFTUFJTCBQUk9WSURFRCwgQ0hFQ0sgQ1VTVE9NRVIgRU1BSUwnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDA0JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDA0XG4gICAgfSxcbiAgICBtb2JpbGVQaG9uZVJlcXVpcmVkOntcbiAgICAgICAgbWVzc2FnZTogJ05PIE1PQklMRSBQSE9ORSBQUk9WSURFRCwgQ0hFQ0sgQ1VTVE9NRVIgQ09OVEFDVFMnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDA0JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDA0XG4gICAgfSxcbiAgICBpbnZhbGlkQ2FkZW5jZVR5cGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgQ0FERU5DRSBUWVBFJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNTAwMScsXG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMFxuICAgIH0sXG59OyIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckxpc3QgfSBmcm9tICcuL2Vycm9yQ29kZXMuanMnO1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBib2R5XG4gKiBAcGFyYW0ge3t9fSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWNjZXNzKGJvZHksIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYkNsb3NlID0gXy5nZXQob3B0aW9ucywgJ2RiQ2xvc2UnLCBfLm5vb3ApO1xuICAgIGRiQ2xvc2UoKTtcblxuICAgIHJldHVybiBidWlsZFJlc3BvbnNlKDIwMCwgYm9keSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAqIEBwYXJhbSB7e2RiQ2xvc2U6ZnVuY3Rpb258dW5kZWZpbmVkfX0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3VjY2Vzc0h0bWwoaHRtbCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGRiQ2xvc2UgPSBfLmdldChvcHRpb25zLCAnZGJDbG9zZScsIF8ubm9vcCk7XG5cbiAgICBkYkNsb3NlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcsXG4gICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJzogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBodG1sXG4gICAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAqIEByZXR1cm5zIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJOYW1lRnJvbUNvZ25pdG9FdmVudChldmVudCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBfLmdldChldmVudCwgJ3JlcXVlc3QudXNlckF0dHJpYnV0ZXMnKTtcblxuICAgIHJldHVybiBhdHRyaWJ1dGVzWydjb2duaXRvOmVtYWlsX2FsaWFzJ10gfHwgJ1VOS05PV04gVVNFUic7XG59XG5cbi8qKlxuICogR2V0IHRoZSB1c2VyIGluZm9ybWF0aW9uIGZyb20gdGhlIGV2ZW50IG9iamVjdFxuICpcbiAqIEBwYXJhbSBldmVudCB7T2JqZWN0fSBhbiBldmVudCBvYmplY3RcbiAqIEByZXR1cm5zIHt7dXNlcm5hbWU6IHN0cmluZywgaWQ6IG51bWJlcn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VXNlcihldmVudCkge1xuICAgIGxldCBqc29uVG9QYXJzZSA9IF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jbGFpbXMuY3VzdG9tOlVJRCcpIHx8XG4gICAgICAgIF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jdXN0b206VUlEJykgfHxcbiAgICAgICAgJzAnO1xuXG4gICAgY29uc3QgaWQgPSBKU09OLnBhcnNlKGpzb25Ub1BhcnNlKTtcblxuICAgIGNvbnN0IHVzZXJuYW1lID0gXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5lbWFpbCcpIHx8IF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5lbWFpbCcpIHx8ICdMT0NBTCBURVNUIFVTRVInO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIGlkXG4gICAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmYWlsdXJlIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIGJvZHkge09iamVjdH0gYW4gZXZlbnQgb2JqZWN0XG4gKiBAcGFyYW0gb3B0aW9ucyB7T2JqZWN0fSBhbiBvcHRpb25zIG9iamVjdFxuICogQHJldHVybnMge3tzdGF0dXNDb2RlOm51bWJlciwgaGVhZGVyczpvYmplY3QsIGJvZHk6c3RyaW5nfX0gYSByZXNwb25zZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUoYm9keSA9IHt9LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGJDbG9zZSA9IF8uZ2V0KG9wdGlvbnMsICdkYkNsb3NlJywgXy5ub29wKTtcbiAgICBkYkNsb3NlKCk7XG4gICAgbGV0IGNsZWFuZWRFcnJvckJvZHk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuVVRJTF9MT0cgPT09ICdMT0dfQUxMJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCctLS0tLS0tPlVUSUwgRVJST1I6JywgYm9keSk7XG4gICAgfVxuXG4gICAgY29uc3QgTk9STUFMX0VSUk9SID0geyBzdGF0dXNDb2RlOiA1MDAsIGVycm9yQ29kZTogJzVYWCcsIG1lc3NhZ2U6ICdJTlRFUk5BTCBVVElMIEVSUk9SJyB9O1xuICAgIGNsZWFuZWRFcnJvckJvZHkgPSBib2R5O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChib2R5LmRldGFpbHMpKSB7XG4gICAgICAgIGNsZWFuZWRFcnJvckJvZHkgPSBkZXRlY3RKb3lFcnJvcihib2R5KTtcbiAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQoYm9keS5lcnJvckNvZGUpIHx8IF8uaXNVbmRlZmluZWQoYm9keS5zdGF0dXNDb2RlKSkge1xuICAgICAgICBjbGVhbmVkRXJyb3JCb2R5ID0gZGV0ZWN0U2VxdWVsaXplRXJyb3IoYm9keSk7XG4gICAgfVxuICAgIGlmKF8uZ2V0KGJvZHksICdyZXNwb25zZS5kYXRhLm1lc3NhZ2UnKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCctLS0tLS0tPlVUSUwgRVJST1I6ICcrXy5nZXQoYm9keSwgJ3Jlc3BvbnNlLmRhdGEubWVzc2FnZScpKVxuICAgIH1cblxuICAgIGNvbnN0IG5ld0JvZHkgPSBfLm1lcmdlKE5PUk1BTF9FUlJPUiwgY2xlYW5lZEVycm9yQm9keSk7XG5cbiAgICByZXR1cm4gYnVpbGRSZXNwb25zZShuZXdCb2R5LnN0YXR1c0NvZGUsIG5ld0JvZHkpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZhaWx1cmUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHBhcmFtIHN0YXR1c0NvZGUge051bWJlcn0gYSBzdGF0dXMgY29kZVxuICogQHBhcmFtIGJvZHkge09iamVjdH0gYW4gZXZlbnQgb2JqZWN0XG4gKiBAcmV0dXJucyB7e3N0YXR1c0NvZGU6bnVtYmVyLCBoZWFkZXJzOm9iamVjdCwgYm9keTpzdHJpbmd9fSBhIHJlc3BvbnNlIG9iamVjdFxuICovXG5mdW5jdGlvbiBidWlsZFJlc3BvbnNlKHN0YXR1c0NvZGUsIGJvZHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJzogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIH07XG59XG5cbi8qKlxuICogcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGV2ZW50IG9iamVjdFxuICpcbiAqIEBwYXJhbSByZXF1ZXN0RXZlbnQge3tib2R5OnN0cmluZ319IGFuIGV2ZW50IG9iamVjdFxuICogQHJldHVybnMgZXZlbnQgeyp9IHRoZSBqc29uIG9iamVjdCBvZiB0aGUgYm9keVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCb2R5KHJlcXVlc3RFdmVudCkge1xuXG4gICAgbGV0IGV2ZW50Qm9keSA9IHt9O1xuICAgIGlmIChfLmlzU3RyaW5nKHJlcXVlc3RFdmVudC5ib2R5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZlbnRCb2R5ID0gSlNPTi5wYXJzZShyZXF1ZXN0RXZlbnQuYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgSlNPTlxuICAgICAgICAgICAgZXZlbnRCb2R5ID0gbnVsbDtcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JMaXN0LmludmFsaWRKc29uO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHJlcXVlc3RFdmVudC5ib2R5KSkge1xuICAgICAgICBldmVudEJvZHkgPSByZXF1ZXN0RXZlbnQuYm9keTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnRCb2R5O1xufVxuXG4vKipcbiAqIHBhcnNlIHRoZSBib2R5IG9mIHRoZSBldmVudCBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcmVxdWVzdEV2ZW50IHtzdHJpbmd8b2JqZWN0fSBhbiBldmVudCBvYmplY3RcbiAqIEBwYXJhbSBbY2FsbGJhY2tdIHtmdW5jdGlvbn0gdW5kZWZpbmVkIGEgY2FsbCBiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBldmVudCB7Kn0gdGhlIGpzb24gb2JqZWN0IG9mIHRoZSBib2R5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV2ZW50KHJlcXVlc3RFdmVudCwgY2FsbGJhY2spIHtcbiAgICBsZXQgZXZlbnQgPSB7fTtcbiAgICBpZiAoXy5pc1N0cmluZyhyZXF1ZXN0RXZlbnQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBldmVudCA9IEpTT04ucGFyc2UocmVxdWVzdEV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBKU09OXG4gICAgICAgICAgICBldmVudCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKEVycm9yKGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChyZXF1ZXN0RXZlbnQpKSB7XG4gICAgICAgIGV2ZW50ID0gcmVxdWVzdEV2ZW50O1xuICAgIH1cblxuICAgIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBwYXJzZSB0aGUgYm9keSBvZiB0aGUgZXZlbnQgb2JqZWN0XG4gKiBsb29rIGZvciBzZXF1ZWxpemUgZXJyb3JzIGFuZCByZXR1cm4gYSBtZXNzYWdlXG4gKiBFUlJPUlMgc2hvdWxkIG5vdCBiZSBjYXVnaHQgaGVyZSB0aGlzIGlzIGEgZmFsbGJhY2sgZm9yIHVua25vd24gZGF0YWJhc2UgZXJyb3JzXG4gKlxuICogQHBhcmFtIGJvZHkge29iamVjdH0gcGFydCBvZiBhIGJvZHkgcmVzcG9uc2VcbiAqIEByZXR1cm5zIGVycm9yIG1lc3NhZ2Ugb2JqZWN0IHttZXNzYWdlOnN0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFNlcXVlbGl6ZUVycm9yKGJvZHkpIHtcbiAgICBjb25zdCBlcnJvckJvZHkgPSB7fTtcblxuICAgIGxldCBzZXF1ZWxpemVFcnJvciA9IF8uZ2V0KGJvZHksICdlcnJvcnMnLCBbXSkucmVkdWNlKChhY2MsIGVycikgPT4ge1xuICAgICAgICBhY2MgPSBhY2MgKyAnICcgKyBfLmdldChlcnIsICdtZXNzYWdlJyk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgJycpO1xuICAgIGNvbnN0IHBhcmVudEVycm9yID0gXy5nZXQoYm9keSwgJ3BhcmVudCcsICcnKTtcblxuICAgIHNlcXVlbGl6ZUVycm9yID0gc2VxdWVsaXplRXJyb3IgKyBfLmdldChib2R5LCAnb3JpZ2luYWwuZGV0YWlsJywgJycpICsgXy5nZXQoYm9keSwgJ1R5cGVFcnJvcicsICcnKSArIHBhcmVudEVycm9yO1xuICAgIGVycm9yQm9keS5tZXNzYWdlID0gc2VxdWVsaXplRXJyb3IudHJpbSgpO1xuICAgIHJldHVybiBlcnJvckJvZHk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RKb3lFcnJvcihib2R5KSB7XG4gICAgY29uc3QgZXJyb3JCb2R5ID0ge307XG4gICAgY29uc3Qgam95RXJyb3IgPSBfLmdldChib2R5LCAnZGV0YWlsc1swXScsIHt9KTtcbiAgICBjb25zb2xlLmVycm9yKCdVU0VSIFZBTElEQVRJT04gRVJST1I6JywgYm9keSk7XG5cbiAgICBlcnJvckJvZHkubWVzc2FnZSA9IGpveUVycm9yLm1lc3NhZ2U7XG4gICAgZXJyb3JCb2R5LnN0YXR1c0NvZGUgPSA0MDA7XG4gICAgZXJyb3JCb2R5LmVycm9yQ29kZSA9ICc0MDAwJztcbiAgICByZXR1cm4gZXJyb3JCb2R5O1xufSIsImltcG9ydCB7IFMzIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzM1V0aWxzKGFjdGlvbiwgcGFyYW1zKSB7XHJcbiAgICBjb25zdCBzMyA9IG5ldyBTMygpO1xyXG4gICAgcmV0dXJuIHMzW2FjdGlvbl0ocGFyYW1zKTtcclxufVxyXG5cclxuY29uc3QgUzNVdGlsID0ge1xyXG4gICAgZ2V0T2JqZWN0OiAocGFyYW1zKSA9PiBnZXRTMyhwYXJhbXMpLFxyXG4gICAgZGVsZXRlT2JqZWN0OiAocGFyYW1zKSA9PiBzM1V0aWxzKCdkZWxldGVPYmplY3QnLCBwYXJhbXMpLFxyXG4gICAgcHV0T2JqZWN0OiAocGFyYW1zKSA9PiBzM1V0aWxzKCdwdXRPYmplY3QnLCBwYXJhbXMpLFxyXG4gICAgbGlzdE9iamVjdHNWMjogKHBhcmFtcykgPT4gczNVdGlscygnbGlzdE9iamVjdHNWMicsIHBhcmFtcylcclxufTtcclxuZXhwb3J0IGRlZmF1bHQgUzNVdGlsO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UzMocGFyYW1zKSB7XHJcbiAgICBjb25zdCBzMyA9IG5ldyBTMygpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzMy5nZXRPYmplY3QocGFyYW1zKTtcclxuICAgIHJldHVybiByZXNwb25zZS5Cb2R5LnRyYW5zZm9ybVRvU3RyaW5nKCd1dGYtOCcpO1xyXG59IiwiaW1wb3J0IHsgU05TIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNucyc7XHJcblxyXG5jb25zdCBTTlNVdGlsID0ge1xyXG4gICAgcHVibGlzaDogKHBhcmFtcykgPT4gcHVibGlzaChwYXJhbXMpLFxyXG4gICAgY3JlYXRlVG9waWM6IChwYXJhbXMpID0+IGNyZWF0ZVRvcGljKHBhcmFtcylcclxufTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2gocGFyYW1zKSB7XHJcbiAgICBjb25zdCBzbnMgPSBuZXcgU05TKCk7XHJcbiAgICByZXR1cm4gYXdhaXQgc25zLnB1Ymxpc2gocGFyYW1zKTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVG9waWMocGFyYW1zKSB7XHJcbiAgICBjb25zdCBzbnMgPSBuZXcgU05TKCk7XHJcbiAgICByZXR1cm4gYXdhaXQgc25zLmNyZWF0ZVRvcGljKHBhcmFtcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNOU1V0aWw7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYXdzLXNkay9jbGllbnQtczNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGF3cy1zZGsvY2xpZW50LXNuc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYXdzLXNkay9saWItZHluYW1vZGJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vbWVudFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb21lbnQvbW9tZW50LmpzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInNlcXVlbGl6ZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1bXp1Z1wiKTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiaW1wb3J0IHsgaGFuZGxlRmlsZSBhcyBoYW5kbGVGaWxlSW1wb3J0IH0gZnJvbSAnLi9ldmVudE1hbmFnZXIvaGFuZGxlRmlsZS5qcyc7XG5pbXBvcnQgeyB3YXRjaEJ1Y2tldCBhcyB3YXRjaEJ1Y2tldEltcG9ydCB9IGZyb20gJy4vZXZlbnRNYW5hZ2VyL3dhdGNoQnVja2V0LmpzJztcbmltcG9ydCB7IHB1Ymxpc2hFdmVudHMgYXMgcHVibGlzaEV2ZW50c0ltcG9ydCB9IGZyb20gJy4vZXZlbnRNYW5hZ2VyL3B1Ymxpc2hFdmVudHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlRmlsdGVycyBhcyBjcmVhdGVGaWx0ZXJzSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvY3JlYXRlRmlsdGVycy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTb3J0IGFzIGNyZWF0ZVNvcnRJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9jcmVhdGVTb3J0LmpzJztcbmltcG9ydCB7IGZpbmRBbGwgYXMgZmluZEFsbEltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2ZpbmRBbGwuanMnO1xuaW1wb3J0IHsgY2hlY2tNb2R1bGUgYXMgY2hlY2tNb2R1bGVJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9hY2Nlc3NSaWdodHNVdGlscy5qcyc7XG5pbXBvcnQgeyBmYWlsdXJlIGFzIGZhaWx1cmVJbXBvcnQsIHN1Y2Nlc3MgYXMgc3VjY2Vzc0ltcG9ydCB9IGZyb20gJy4vcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IHJ1bk1pZ3JhdGlvbnMgYXMgcnVuTWlncmF0aW9uc0ltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJTZXR1cC9taWdyYXRpb25zLmpzJztcbmltcG9ydCB7IGdldEN1cnJlbnRVc2VyIGFzIGdldEN1cnJlbnRVc2VySW1wb3J0IH0gZnJvbSAnLi9yZXF1ZXN0UmVzb25zZS9yZXF1ZXN0UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc3VjY2Vzc0h0bWwgYXMgc3VjY2Vzc0h0bWxJbXBvcnQgfSBmcm9tICcuL3JlcXVlc3RSZXNvbnNlL3JlcXVlc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50IGFzIGdldEN1cnJlbnRVc2VyTmFtZUZyb21Db2duaXRvRXZlbnRJbXBvcnQgfSBmcm9tICcuL3JlcXVlc3RSZXNvbnNlL3JlcXVlc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0RmlsdGVycyBhcyBkZWZhdWx0RmlsdGVyc0ltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2RlZmF1bHRGaWx0ZXJzLmpzJztcbmltcG9ydCB7IGFjY2Vzc1JpZ2h0c1V0aWxzIGFzIGFjY2Vzc1JpZ2h0c1V0aWxzSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VCb2R5IGFzIHBhcnNlQm9keUltcG9ydCB9IGZyb20gJy4vcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IHBhcnNlRXZlbnQgYXMgcGFyc2VFdmVudEltcG9ydCB9IGZyb20gJy4vcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IGdldEJ1c2luZXNzZXNJbmZvIGFzIGdldEJ1c2luZXNzZXNJbmZvSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuaW1wb3J0IHsgdXNlckRlZmF1bHRCaWQgYXMgdXNlckRlZmF1bHRCaWRJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9hY2Nlc3NSaWdodHNVdGlscy5qcyc7XG5pbXBvcnQgeyBjaGVja1dyaXRlQWNjZXNzIGFzIGNoZWNrV3JpdGVBY2Nlc3NJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9hY2Nlc3NSaWdodHNVdGlscy5qcyc7XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVGaWxlID0gaGFuZGxlRmlsZUltcG9ydDtcbmV4cG9ydCBjb25zdCB3YXRjaEJ1Y2tldCA9IHdhdGNoQnVja2V0SW1wb3J0O1xuZXhwb3J0IGNvbnN0IHB1Ymxpc2hFdmVudHMgPSBwdWJsaXNoRXZlbnRzSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZpbHRlcnMgPSBjcmVhdGVGaWx0ZXJzSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVNvcnQgPSBjcmVhdGVTb3J0SW1wb3J0O1xuZXhwb3J0IGNvbnN0IGZpbmRBbGwgPSBmaW5kQWxsSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGNoZWNrTW9kdWxlID0gY2hlY2tNb2R1bGVJbXBvcnQ7XG5leHBvcnQgY29uc3QgZmFpbHVyZSA9IGZhaWx1cmVJbXBvcnQ7XG5leHBvcnQgY29uc3Qgc3VjY2VzcyA9IHN1Y2Nlc3NJbXBvcnQ7XG5leHBvcnQgY29uc3QgcnVuTWlncmF0aW9ucyA9IHJ1bk1pZ3JhdGlvbnNJbXBvcnQ7XG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFVzZXIgPSBnZXRDdXJyZW50VXNlckltcG9ydDtcbmV4cG9ydCBjb25zdCBzdWNjZXNzSHRtbCA9IHN1Y2Nlc3NIdG1sSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRVc2VyTmFtZUZyb21Db2duaXRvRXZlbnQgPSBnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50SW1wb3J0O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0gZGVmYXVsdEZpbHRlcnNJbXBvcnQ7XG5leHBvcnQgY29uc3QgYWNjZXNzUmlnaHRzVXRpbHMgPSBhY2Nlc3NSaWdodHNVdGlsc0ltcG9ydDtcbmV4cG9ydCBjb25zdCBwYXJzZUJvZHkgPSBwYXJzZUJvZHlJbXBvcnQ7XG5leHBvcnQgY29uc3QgcGFyc2VFdmVudCA9IHBhcnNlRXZlbnRJbXBvcnQ7XG5leHBvcnQgY29uc3QgZ2V0QnVzaW5lc3Nlc0luZm8gPSBnZXRCdXNpbmVzc2VzSW5mb0ltcG9ydDtcbmV4cG9ydCBjb25zdCB1c2VyRGVmYXVsdEJpZCA9IHVzZXJEZWZhdWx0QmlkSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGNoZWNrV3JpdGVBY2Nlc3MgPSBjaGVja1dyaXRlQWNjZXNzSW1wb3J0O1xuIl0sIm5hbWVzIjpbInJ1bk1pZ3JhdGlvbnMiLCJfbG9kYXNoIiwicmVxdWlyZSIsIl9sb2Rhc2gyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl91bXp1ZyIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiZGF0YWJhc2VOYW1lIiwic2VxdWVsaXplSW5zdGFuY2UiLCJpbml0aWFsaXplTW9kZWxzIiwicGF0aFRvTWlncmF0aW9uRm9sZGVyIiwicHJvY2VzcyIsImVudiIsIlBXRCIsInVtenVnIiwiVW16dWciLCJtaWdyYXRpb25zIiwiZ2xvYiIsImNvbnRleHQiLCJnZXRRdWVyeUludGVyZmFjZSIsInN0b3JhZ2UiLCJTZXF1ZWxpemVTdG9yYWdlIiwic2VxdWVsaXplIiwibG9nZ2VyIiwiY29uc29sZSIsInBlbmRpbmdNaWdyYXRpb25zIiwicGVuZGluZyIsImxvZyIsInVwIiwiY2F0Y2giLCJ1cEVycm9yIiwiZG93biIsIl8iLCJjaGFpbiIsIm1hcCIsInJldmVyc2UiLCJ2YWx1ZSIsInRoZW4iLCJtc2ciLCJlcnJvciIsIkVycm9yIiwiZG93bkVycm9yIiwiYWNjZXNzUmlnaHRzVXRpbHMiLCJleHBvcnRzIiwidXNlckRlZmF1bHRCaWQiLCJnZXRCdXNpbmVzc2VzSW5mbyIsImdldE1vZHVsZUluZm8iLCJjaGVja01vZHVsZSIsImNoZWNrV3JpdGVBY2Nlc3MiLCJfZXJyb3JDb2RlcyIsIl9yZXF1ZXN0UmVzcG9uc2UiLCJldmVudCIsIm9wdGlvbnMiLCJ1c2VDb2duaXRvQmlkIiwiZ2V0IiwicmVxdWVzdGVkQnVzaW5lc3NJZHMiLCJnZXRSZXF1ZXN0ZWRCdXNpbmVzc0lkcyIsImFsbG93ZWRCdXNpbmVzc0lkcyIsImdldEFsbG93ZWRCdXNpbmVzc0lkcyIsImxvY2FsQmlkTGlzdCIsImlzRW1wdHkiLCJCVUlMRF9FTlYiLCJsZW5ndGgiLCJpbnRlcnNlY3Rpb24iLCJqc29uVG9QYXJzZSIsImRiaSIsIkpTT04iLCJwYXJzZSIsInNwbGl0IiwiYnVzaW5lc3NlcyIsIk9iamVjdCIsImtleXMiLCJhY2Nlc3NSaWdodHMiLCJiaWRzIiwid2l0aExvY2FsIiwic2V0IiwiYXIiLCJtb2R1bGVSaWdodHMiLCJtb2R1bGVOYW1lIiwiYWxsb3dBY2Nlc3MiLCJlcnJvckxpc3QiLCJ1bmF1dGhvcml6ZWQiLCJ1c2VyUm9sZXMiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSIsImV2ZW50Qm9keSIsInBhcnNlQm9keSIsImJ1c2luZXNzSWRzIiwiYnVzaW5lc3NJZCIsImZpbmQiLCJpZCIsInJhdyIsInVzZXJSaWdodCIsIl9zZXF1ZWxpemUiLCJfc2VxdWVsaXplMiIsIl9tb21lbnQiLCJfbW9tZW50MiIsIl9hY2Nlc3NSaWdodHNVdGlscyIsImNyZWF0ZUZpbHRlcnMiLCJvYmplY3RGaWx0ZXJzIiwicXVlcnkiLCJzdGFydERhdGUiLCJlbmREYXRlIiwid2hlcmUiLCJyZWR1Y2UiLCJhY2MiLCJpdGVtIiwidmFsIiwiaXRlbU5hbWUiLCJpbmNsdWRlcyIsImZpbHRlclR5cGUiLCJEQiIsIk9wIiwiaUxpa2UiLCJvciIsImluIiwicGFyc2VkSnNvbiIsImUiLCJ0eXBlIiwiQk9PTEVBTiIsInF1ZXJ5VmFsdWUiLCJ0b0xvd2VyQ2FzZSIsImJvb2xlYW5NYXAiLCJhY3RpdmUiLCJmaWx0ZXJBZGRzIiwicyIsIm1vbWVudCIsInV0YyIsImRhdGVzIiwiYmV0d2VlbiIsInRvRGF0ZSIsImlzVmFsaWQiLCJpbnZhbGlkU3RhcnREYXRlIiwiaW52YWxpZEVuZERhdGUiLCJjcmVhdGVkQXQiLCJ3aXRoRGF0ZSIsImFzc2lnbiIsImNyZWF0ZVNvcnQiLCJkZWZhdWx0RmlsdGVyIiwiY29weU9mRGVmYXVsdEZpbHRlciIsImNsb25lIiwic29ydCIsInRlc3RJdGVtIiwiaW5kZXhPZiIsInN1YnN0ciIsInNvcnRJdGVtIiwiZm9yRWFjaCIsInBhcmVudENoaWxkTGlzdCIsInB1c2giLCJkZWZhdWx0RmlsdGVycyIsImFkZEZpbHRlcnNGcm9tU2NoZW1hIiwic2NoZW1hIiwic3ViU2NoZW1hcyIsImZpbHRlcnMiLCJrZXkiLCJhY2N1bXVsYXRvciIsImtleVByZWZpeCIsImFzTGlua0FsaWFzIiwiU1RSSU5HIiwiZXEiLCJpdGVtVHlwZSIsIkNIQVIiLCJURVhUIiwiREVDSU1BTCIsIkJJR0lOVCIsIklOVEVHRVIiLCJEQVRFIiwiREFURU9OTFkiLCJsdCIsIkpTT05CIiwiY29udGFpbnMiLCJnZXRQYWdpbmF0aW9uRnJvbUZpbmRBbGwiLCJmaW5kQWxsIiwicmVzdWx0IiwibGltaXQiLCJvZmZzZXQiLCJoYXNNb3JlIiwic3BsaWNlIiwicGFnZU9iamVjdCIsInJvd3MiLCJtb2RlbCIsImZpbmRBcmdzIiwiaW5jbHVkZSIsImFsbCIsIm5lc3RlZCIsInJlc3VsdHMiLCJmaW5kVXRpbHMiLCJfbGliRHluYW1vZGIiLCJfY2xpZW50RHluYW1vZGIiLCJkeW5hbW9VdGlsIiwicGFyYW1zIiwiZHluYW1vRGIiLCJEeW5hbW9EQkRvY3VtZW50IiwiZnJvbSIsIkR5bmFtb0RCIiwiaGFuZGxlRXZlbnRzIiwiX2hhbmRsZUZpbGUiLCJfYmx1ZWJpcmQiLCJfYmx1ZWJpcmQyIiwidHJhbnNmb3JtZXIiLCJlcnJvckhhbmRsZXJQZXJGaWxlIiwic2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMiLCJ1c2VySW1wb3J0VHlwZXMiLCJSZWNvcmRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJoYXNFcnJvcnMiLCJyZWNvcmQiLCJzbnNJbmZvIiwiczNCdWNrZXQiLCJidWNrZXQiLCJmaWxlcyIsImZpbGUiLCJwYXRoIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaGFuZGxlRmlsZSIsImVyciIsIl9TM1V0aWxzIiwiX1MzVXRpbHMyIiwiQnVja2V0IiwiS2V5IiwiYm9keSIsIlMzVXRpbCIsImdldE9iamVjdCIsInBhcnNlZEJvZHkiLCJyZXR1cm5lZFZhbHVlIiwiZGVsZXRlT2JqZWN0IiwiY29kZSIsIm5ld1BhdGgiLCJ1c2Vyc0ltcG9ydHMiLCJ2YWx1ZXMiLCJpdGVtcyIsImZpbGVOYW1lIiwibGFzdCIsImZvbGRlck5hbWUiLCJmaXJzdCIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwibmV3UGFyYW1zIiwiQm9keSIsInB1dE9iamVjdCIsImxvb3AiLCJwdWJsaXNoRXZlbnRzIiwiX1NOU1V0aWxzIiwiX1NOU1V0aWxzMiIsIl9keW5hbW9VdGlscyIsIl9keW5hbW9VdGlsczIiLCJtYXhLZXlzIiwiYnVja2V0UmVzdWx0IiwiZmlsZUxpc3QiLCJjdXJyZW50VGltZSIsIlMzVXRpbHMiLCJsaXN0T2JqZWN0c1YyIiwiTWF4S2V5cyIsIkNvbnRpbnVhdGlvblRva2VuIiwibmV3RmlsZXMiLCJmaWx0ZXIiLCJDb250ZW50cyIsImZpbGVEZWxheVRpbWUiLCJpc1NhbWVPckJlZm9yZSIsImNvbmNhdCIsIklzVHJ1bmNhdGVkIiwiTmV4dENvbnRpbnVhdGlvblRva2VuIiwiY29uZmlnVGFibGUiLCJ0YWJsZUtleSIsInNuc1RvcGljIiwiVGFibGVOYW1lIiwiY2h1bmtTaXplIiwibWF4TWVzc2FnZXMiLCJzbnNDcmVhdGVUb3BpY1Jlc3BvbnNlIiwiU05TVXRpbCIsImNyZWF0ZVRvcGljIiwiTmFtZSIsInRvcGljQXJuIiwiVG9waWNBcm4iLCJtZXNzYWdlTGlzdCIsImNodW5rIiwic2xpY2UiLCJwdWJsaXNoIiwiTWVzc2FnZSIsInN0cmluZ2lmeSIsIndhdGNoQnVja2V0IiwiX3B1Ymxpc2hFdmVudHMiLCJfaGFuZGxlRXZlbnRzIiwiZHluYW1vQ29uZmlnVGFibGUiLCJkeW5hbW9Db25maWdLZXkiLCJub29wIiwiRXZlbnRTb3VyY2UiLCJpc0VxdWFsIiwiaW52YWxpZEludmVudG9yeVJlbGVhc2VSZXF1ZXN0IiwibWVzc2FnZSIsImVycm9yQ29kZSIsInN0YXR1c0NvZGUiLCJhbHJlYWR5UmVsZWFzZWQiLCJhbHJlYWR5UmVjZWl2ZWQiLCJpbnZhbGlkSXRlbXNSZXF1ZXN0IiwiaW52YWxpZElEIiwiaW52YWxpZFJlY2VpdmFibGUiLCJpbnZhbGlkUmVxdWVzdCIsImludmFsaWRBUElLZXkiLCJxYkNyZWF0aW9uRXJyb3IiLCJjYW5ub3RSZW9wZW4iLCJpbnZhbGlkRGF0ZUZvcm1hdCIsImludmFsaWRPcmRlclN0YXR1cyIsImludmFsaWRQYXltZW50U3RhdHVzIiwiaW52YWxpZFJlbGVhc2VTdGF0dXMiLCJpbnZhbGlkUmVjZWl2YWJsZVN0YXR1cyIsImludmFsaWRKc29uIiwiaW52YWxpZEZpbHRlciIsImludmFsaWRVc2VyTmFtZVVwZGF0ZSIsImltYWdlU2l6ZUxpbWl0Iiwibm90Rm91bmQiLCJlbWFpbFJlcXVpcmVkIiwibW9iaWxlUGhvbmVSZXF1aXJlZCIsImludmFsaWRDYWRlbmNlVHlwZSIsInN1Y2Nlc3MiLCJzdWNjZXNzSHRtbCIsImdldEN1cnJlbnRVc2VyTmFtZUZyb21Db2duaXRvRXZlbnQiLCJnZXRDdXJyZW50VXNlciIsImZhaWx1cmUiLCJwYXJzZUV2ZW50IiwiZGV0ZWN0U2VxdWVsaXplRXJyb3IiLCJkZXRlY3RKb3lFcnJvciIsImRiQ2xvc2UiLCJidWlsZFJlc3BvbnNlIiwiaHRtbCIsImhlYWRlcnMiLCJhdHRyaWJ1dGVzIiwidXNlcm5hbWUiLCJjbGVhbmVkRXJyb3JCb2R5IiwiVVRJTF9MT0ciLCJOT1JNQUxfRVJST1IiLCJpc1VuZGVmaW5lZCIsImRldGFpbHMiLCJuZXdCb2R5IiwibWVyZ2UiLCJyZXF1ZXN0RXZlbnQiLCJpc1N0cmluZyIsImlzT2JqZWN0IiwiY2FsbGJhY2siLCJlcnJvckJvZHkiLCJzZXF1ZWxpemVFcnJvciIsInBhcmVudEVycm9yIiwidHJpbSIsImpveUVycm9yIiwiczNVdGlscyIsIl9jbGllbnRTIiwiYWN0aW9uIiwiczMiLCJTMyIsImdldFMzIiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1Ub1N0cmluZyIsIl9jbGllbnRTbnMiLCJzbnMiLCJTTlMiLCJfd2F0Y2hCdWNrZXQiLCJfY3JlYXRlRmlsdGVycyIsIl9jcmVhdGVTb3J0IiwiX2ZpbmRBbGwiLCJfbWlncmF0aW9ucyIsIl9kZWZhdWx0RmlsdGVycyIsImhhbmRsZUZpbGVJbXBvcnQiLCJ3YXRjaEJ1Y2tldEltcG9ydCIsInB1Ymxpc2hFdmVudHNJbXBvcnQiLCJjcmVhdGVGaWx0ZXJzSW1wb3J0IiwiY3JlYXRlU29ydEltcG9ydCIsImZpbmRBbGxJbXBvcnQiLCJjaGVja01vZHVsZUltcG9ydCIsImZhaWx1cmVJbXBvcnQiLCJzdWNjZXNzSW1wb3J0IiwicnVuTWlncmF0aW9uc0ltcG9ydCIsImdldEN1cnJlbnRVc2VySW1wb3J0Iiwic3VjY2Vzc0h0bWxJbXBvcnQiLCJnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50SW1wb3J0IiwiZGVmYXVsdEZpbHRlcnNJbXBvcnQiLCJhY2Nlc3NSaWdodHNVdGlsc0ltcG9ydCIsInBhcnNlQm9keUltcG9ydCIsInBhcnNlRXZlbnRJbXBvcnQiLCJnZXRCdXNpbmVzc2VzSW5mb0ltcG9ydCIsInVzZXJEZWZhdWx0QmlkSW1wb3J0IiwiY2hlY2tXcml0ZUFjY2Vzc0ltcG9ydCJdLCJzb3VyY2VSb290IjoiIn0=
|
package/package.json
CHANGED
|
@@ -6,11 +6,13 @@ import { parseBody } from '../../../requestResonse/requestResponse.js';
|
|
|
6
6
|
* Get the allowed businessIds for a user from the lambda event, compare it to businessIds, return what user has access to.
|
|
7
7
|
*
|
|
8
8
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
9
|
+
* @param {{useCognitoBid:boolean}} [options] - An object with options, useCognitoBid prefers the businessId set in cognito if set and does not return the local bid of 1 if a bid is in the claim.
|
|
9
10
|
* @returns {array} A list of businessIds that have been requested and are allowed to for some user.
|
|
10
11
|
*/
|
|
11
|
-
export function accessRightsUtils(event) {
|
|
12
|
+
export function accessRightsUtils(event, options) {
|
|
13
|
+
const useCognitoBid = _.get(options, 'useCognitoBid', false);
|
|
12
14
|
const requestedBusinessIds = getRequestedBusinessIds(event);
|
|
13
|
-
const allowedBusinessIds = getAllowedBusinessIds(event);
|
|
15
|
+
const allowedBusinessIds = getAllowedBusinessIds(event, useCognitoBid);
|
|
14
16
|
const localBidList = ['1'];
|
|
15
17
|
|
|
16
18
|
// if we are on local return for all bids in access rights
|
|
@@ -62,14 +64,15 @@ function getRequestedBusinessIds(event) {
|
|
|
62
64
|
* Get the allowed businessIds for a user from cognito custom:AR property.
|
|
63
65
|
*
|
|
64
66
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
67
|
+
* @param useCognitoBid
|
|
65
68
|
* @returns {array} The businessID requested by the query string
|
|
66
69
|
*/
|
|
67
|
-
function getAllowedBusinessIds(event) {
|
|
68
|
-
const businesses = getBusinessesInfo(event);
|
|
70
|
+
function getAllowedBusinessIds(event, useCognitoBid) {
|
|
71
|
+
const businesses = getBusinessesInfo(event, useCognitoBid);
|
|
69
72
|
return Object.keys(businesses);
|
|
70
73
|
}
|
|
71
74
|
|
|
72
|
-
export function getBusinessesInfo(event) {
|
|
75
|
+
export function getBusinessesInfo(event, useCognitoBid) {
|
|
73
76
|
let jsonToParse = _.get(event, 'requestContext.authorizer.claims.custom:AR') ||
|
|
74
77
|
_.get(event, 'requestContext.authorizer.custom:AR') ||
|
|
75
78
|
'{}';
|
|
@@ -78,7 +81,13 @@ export function getBusinessesInfo(event) {
|
|
|
78
81
|
if (process.env.BUILD_ENV === 'local') {
|
|
79
82
|
if (!isEmpty(accessRights)) {
|
|
80
83
|
const bids = _.get(accessRights, 'businessIds', {});
|
|
81
|
-
|
|
84
|
+
let withLocal;
|
|
85
|
+
if (useCognitoBid) {
|
|
86
|
+
withLocal = { ...bids };
|
|
87
|
+
} else {
|
|
88
|
+
withLocal = { ...bids, '1': 'A' };
|
|
89
|
+
}
|
|
90
|
+
|
|
82
91
|
_.set(accessRights, 'businessIds', withLocal);
|
|
83
92
|
|
|
84
93
|
return _.get(accessRights, 'businessIds', {});
|
|
@@ -82,19 +82,12 @@ export const mock3 = {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
},
|
|
85
|
-
body: { businessId: 'ABC'
|
|
85
|
+
body: { businessId: 'ABC' }
|
|
86
86
|
};
|
|
87
87
|
|
|
88
88
|
describe('accessRightsUtils', () => {
|
|
89
|
-
describe('getBusinessesInfo', () => {
|
|
90
|
-
it('should handle local', () => {
|
|
91
|
-
process.env.BUILD_ENV = 'local';
|
|
92
|
-
const result = getBusinessesInfo(mock);
|
|
93
|
-
expect(result).toEqual({ '1': 'A', ABC: 'A', XYZ: 'A' });
|
|
94
|
-
})
|
|
95
|
-
});
|
|
96
89
|
describe('accessRightsUtils', () => {
|
|
97
|
-
it('should return localBidList', () => {
|
|
90
|
+
it('should return localBidList no options', () => {
|
|
98
91
|
const event = {
|
|
99
92
|
requestContext: {
|
|
100
93
|
authorizer: {
|
|
@@ -108,7 +101,7 @@ describe('accessRightsUtils', () => {
|
|
|
108
101
|
const result = accessRightsUtils(event);
|
|
109
102
|
expect(result).toEqual(['1']);
|
|
110
103
|
});
|
|
111
|
-
it('should return access', () => {
|
|
104
|
+
it('should return access of request query stings if they are granted in JWT', () => {
|
|
112
105
|
const result = accessRightsUtils(mock);
|
|
113
106
|
expect(result).toEqual(['ABC']);
|
|
114
107
|
});
|
|
@@ -120,7 +113,7 @@ describe('accessRightsUtils', () => {
|
|
|
120
113
|
const result = accessRightsUtils(mockNOAccess);
|
|
121
114
|
expect(result).toEqual([]);
|
|
122
115
|
});
|
|
123
|
-
it('should return access for all if
|
|
116
|
+
it('should return access for all if not requested in list', () => {
|
|
124
117
|
const result = accessRightsUtils(mockNoneRequested);
|
|
125
118
|
expect(result).toEqual(['ABC']);
|
|
126
119
|
});
|
|
@@ -181,4 +174,43 @@ describe('accessRightsUtils', () => {
|
|
|
181
174
|
}
|
|
182
175
|
});
|
|
183
176
|
});
|
|
184
|
-
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
describe('special env cases', () => {
|
|
180
|
+
beforeEach(() => {
|
|
181
|
+
process.env.BUILD_ENV = 'local';
|
|
182
|
+
});
|
|
183
|
+
afterEach(() => {
|
|
184
|
+
process.env.BUILD_ENV = 'test';
|
|
185
|
+
})
|
|
186
|
+
it('should return localBidList and support use cognito bid option', () => {
|
|
187
|
+
const event = {
|
|
188
|
+
requestContext: {
|
|
189
|
+
authorizer: {
|
|
190
|
+
claims: {
|
|
191
|
+
'custom:AR': JSON.stringify({ businessIds: { 'ABC': 'A', 'XYZ': 'A' } }),
|
|
192
|
+
},
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
const result = accessRightsUtils(event, { useCognitoBid: true });
|
|
197
|
+
expect(result).toEqual([ 'ABC', 'XYZ' ]);
|
|
198
|
+
});
|
|
199
|
+
it('should return localBidList if no claims and support use cognito bid option', () => {
|
|
200
|
+
const event = {
|
|
201
|
+
requestContext: {
|
|
202
|
+
authorizer: {
|
|
203
|
+
claims: {},
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
const result = accessRightsUtils(event, { useCognitoBid: true });
|
|
208
|
+
expect(result).toEqual([ '1']);
|
|
209
|
+
});
|
|
210
|
+
describe('getBusinessesInfo', () => {
|
|
211
|
+
it('should handle local', () => {
|
|
212
|
+
const result = getBusinessesInfo(mock);
|
|
213
|
+
expect(result).toEqual({ '1': 'A', ABC: 'A', XYZ: 'A' });
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
})
|
package/src/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { handleFile as handleFileImport } from './eventManager/handleFile.js';
|
|
2
2
|
import { watchBucket as watchBucketImport } from './eventManager/watchBucket.js';
|
|
3
3
|
import { publishEvents as publishEventsImport } from './eventManager/publishEvents.js';
|
|
4
|
+
import { createIncludes as createIncludesImport } from './database/dbUtils/queryStringUtils/createIncludes.js';
|
|
4
5
|
import { createFilters as createFiltersImport } from './database/dbUtils/queryStringUtils/createFilters.js';
|
|
5
6
|
import { createSort as createSortImport } from './database/dbUtils/queryStringUtils/createSort.js';
|
|
6
7
|
import { findAll as findAllImport } from './database/dbUtils/queryStringUtils/findAll.js';
|
|
@@ -22,6 +23,7 @@ export const handleFile = handleFileImport;
|
|
|
22
23
|
export const watchBucket = watchBucketImport;
|
|
23
24
|
export const publishEvents = publishEventsImport;
|
|
24
25
|
export const createFilters = createFiltersImport;
|
|
26
|
+
export const createIncludes = createIncludesImport;
|
|
25
27
|
export const createSort = createSortImport;
|
|
26
28
|
export const findAll = findAllImport;
|
|
27
29
|
export const checkModule = checkModuleImport;
|