@beiguancyc/parse-server 9.10.0-ruixiang.4 → 9.10.6-ruixiang.1

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.
Files changed (39) hide show
  1. package/README.md +5 -0
  2. package/lib/Adapters/Auth/AuthAdapter.js +3 -3
  3. package/lib/Adapters/Auth/index.js +83 -23
  4. package/lib/Adapters/Auth/ldap.js +13 -2
  5. package/lib/Adapters/Auth/mfa.js +4 -3
  6. package/lib/Adapters/Cache/LRUCache.js +26 -2
  7. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +9 -2
  8. package/lib/Adapters/Storage/Mongo/MongoTransform.js +6 -3
  9. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +6 -4
  10. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  11. package/lib/Auth.js +16 -7
  12. package/lib/Config.js +14 -5
  13. package/lib/Controllers/DatabaseController.js +74 -23
  14. package/lib/Controllers/FilesController.js +28 -24
  15. package/lib/Controllers/SchemaController.js +8 -2
  16. package/lib/Controllers/UserController.js +52 -37
  17. package/lib/Deprecator/Deprecations.js +5 -1
  18. package/lib/GraphQL/ParseGraphQLSchema.js +4 -4
  19. package/lib/GraphQL/ParseGraphQLServer.js +83 -22
  20. package/lib/LiveQuery/ParseLiveQueryServer.js +108 -7
  21. package/lib/LiveQuery/QueryTools.js +31 -60
  22. package/lib/Options/Definitions.js +14 -8
  23. package/lib/Options/docs.js +9 -8
  24. package/lib/Options/index.js +1 -1
  25. package/lib/ParseServer.js +2 -1
  26. package/lib/PromiseRouter.js +2 -19
  27. package/lib/RestQuery.js +28 -5
  28. package/lib/RestWrite.js +628 -57
  29. package/lib/Routers/SessionsRouter.js +5 -1
  30. package/lib/Routers/UsersRouter.js +9 -2
  31. package/lib/SharedRest.js +7 -1
  32. package/lib/Utils.js +17 -1
  33. package/lib/batch.js +3 -2
  34. package/lib/cloud-code/Parse.Cloud.js +4 -2
  35. package/lib/middlewares.js +36 -3
  36. package/lib/triggers.js +7 -7
  37. package/package.json +20 -33
  38. package/types/Options/index.d.ts +1 -0
  39. package/lib/ClientSDK.js +0 -39
@@ -9,6 +9,7 @@ exports.allowDoubleForwardSlash = allowDoubleForwardSlash;
9
9
  exports.allowMethodOverride = allowMethodOverride;
10
10
  exports.checkIp = void 0;
11
11
  exports.enforceMasterKeyAccess = enforceMasterKeyAccess;
12
+ exports.enforceParsedBody = enforceParsedBody;
12
13
  exports.enforceRouteAllowList = enforceRouteAllowList;
13
14
  exports.handleParseAuth = handleParseAuth;
14
15
  exports.handleParseErrors = handleParseErrors;
@@ -196,6 +197,9 @@ async function handleParseHeaders(req, res, next) {
196
197
  }
197
198
  }
198
199
  delete req.body._context;
200
+ } else if (req.body._context === null) {
201
+ // null context is equivalent to no context
202
+ delete req.body._context;
199
203
  }
200
204
  if (req.body._ContentType) {
201
205
  if (typeof req.body._ContentType !== 'string') {
@@ -295,7 +299,7 @@ const handleRateLimit = async (req, res, next) => {
295
299
  try {
296
300
  await Promise.all(rateLimits.map(async limit => {
297
301
  const pathExp = limit.path.regexp || limit.path;
298
- if (pathExp.test(req.path)) {
302
+ if (pathExp.test(req.path) || req._graphQLPath && pathExp.test(req._graphQLPath)) {
299
303
  await limit.handler(req, res, err => {
300
304
  if (err) {
301
305
  if (err.code === _node.default.Error.CONNECTION_FAILED) {
@@ -409,6 +413,21 @@ function allowCrossDomain(appId) {
409
413
  }
410
414
  };
411
415
  }
416
+
417
+ /**
418
+ * body-parser silently skips a request whose socket is no longer readable when the parser runs,
419
+ * e.g. the client closed the connection while an async middleware before it was pending, which
420
+ * leaves `req.body` undefined. Such a request must not continue, otherwise a query sent as `POST`
421
+ * with `_method: 'GET'` in the body would be routed as the creation of an empty object.
422
+ */
423
+ function enforceParsedBody(req, res, next) {
424
+ const hasBody = req.headers['transfer-encoding'] !== undefined || Number(req.headers['content-length']) > 0;
425
+ // Multipart bodies are intentionally not parsed by the JSON body parser
426
+ if (req.body === undefined && hasBody && !req.is('multipart/form-data')) {
427
+ return next(new _node.default.Error(_node.default.Error.INVALID_JSON, 'Request body could not be read.'));
428
+ }
429
+ next();
430
+ }
412
431
  function allowMethodOverride(req, res, next) {
413
432
  if (req.method === 'POST' && req.body?._method) {
414
433
  if (typeof req.body._method === 'string') {
@@ -644,6 +663,20 @@ function promiseEnforceMasterKeyAccess(request) {
644
663
  }
645
664
  return Promise.resolve();
646
665
  }
666
+
667
+ /**
668
+ * Determines whether a request is an internal request, i.e. one that originates from the same host
669
+ * without passing through a proxy, such as a Cloud Code request that is routed via HTTP when the
670
+ * Parse Server option `directAccess` is `false`. Only the raw socket peer address is consulted,
671
+ * never `request.ip`: under a permissive `trustProxy` setting Express resolves `request.ip` from
672
+ * the client-supplied `X-Forwarded-For` header, so a remote client could otherwise pose as an
673
+ * internal request. A request that carries an `X-Forwarded-For` header, even an empty one, has been
674
+ * forwarded by a proxy or crafted by a client and is therefore never internal, even if it arrives
675
+ * over a loopback socket.
676
+ * @param {Object} request The request to evaluate.
677
+ * @returns {Boolean} Whether the request is internal.
678
+ */
679
+ const isInternalRequest = request => request.socket?.remoteAddress === '127.0.0.1' && request.headers?.['x-forwarded-for'] === undefined;
647
680
  const addRateLimit = (route, config, cloud) => {
648
681
  if (typeof config === 'string') {
649
682
  config = _Config.default.get(config);
@@ -709,7 +742,7 @@ const addRateLimit = (route, config, cloud) => {
709
742
  };
710
743
  },
711
744
  skip: request => {
712
- if (request.ip === '127.0.0.1' && !route.includeInternalRequests) {
745
+ if (!route.includeInternalRequests && isInternalRequest(request)) {
713
746
  return true;
714
747
  }
715
748
  if (route.includeMasterKey) {
@@ -832,4 +865,4 @@ function allowDoubleForwardSlash(req, res, next) {
832
865
  req.url = req.url.startsWith('//') ? req.url.substring(1) : req.url;
833
866
  next();
834
867
  }
835
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2FjaGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9VdGlscyIsIl9ub2RlIiwiX0F1dGgiLCJfQ29uZmlnIiwiX2xvZ2dlciIsIl9yZXN0IiwiX01vbmdvU3RvcmFnZUFkYXB0ZXIiLCJfUG9zdGdyZXNTdG9yYWdlQWRhcHRlciIsIl9leHByZXNzUmF0ZUxpbWl0IiwiX0RlZmluaXRpb25zIiwiX3BhdGhUb1JlZ2V4cCIsIl9yYXRlTGltaXRSZWRpcyIsIl9yZWRpcyIsIl9uZXQiLCJfRXJyb3IiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJERUZBVUxUX0FMTE9XRURfSEVBREVSUyIsImV4cG9ydHMiLCJnZXRNb3VudEZvclJlcXVlc3QiLCJyZXEiLCJtb3VudFBhdGhMZW5ndGgiLCJvcmlnaW5hbFVybCIsImxlbmd0aCIsInVybCIsIm1vdW50UGF0aCIsInNsaWNlIiwicHJvdG9jb2wiLCJnZXQiLCJnZXRCbG9ja0xpc3QiLCJpcFJhbmdlTGlzdCIsInN0b3JlIiwiYmxvY2tMaXN0IiwiQmxvY2tMaXN0IiwiZm9yRWFjaCIsImZ1bGxJcCIsInNldCIsImlwIiwibWFzayIsInNwbGl0IiwiYWRkQWRkcmVzcyIsImlzSVB2NCIsImFkZFN1Ym5ldCIsIk51bWJlciIsImNoZWNrSXAiLCJpbmNvbWluZ0lwSXNWNCIsInJlc3VsdCIsImNoZWNrIiwiaW5jbHVkZXMiLCJoYW5kbGVQYXJzZUhlYWRlcnMiLCJyZXMiLCJuZXh0IiwibW91bnQiLCJjb250ZXh0IiwiSlNPTiIsInBhcnNlIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibWFsZm9ybWVkQ29udGV4dCIsImluZm8iLCJhcHBJZCIsInNlc3Npb25Ub2tlbiIsIm1hc3RlcktleSIsIm1haW50ZW5hbmNlS2V5IiwiaW5zdGFsbGF0aW9uSWQiLCJjbGllbnRLZXkiLCJqYXZhc2NyaXB0S2V5IiwiZG90TmV0S2V5IiwicmVzdEFQSUtleSIsImJhc2ljQXV0aCIsImh0dHBBdXRoIiwiYmFzaWNBdXRoQXBwSWQiLCJBcHBDYWNoZSIsImJvZHkiLCJfbm9Cb2R5IiwiZmlsZVZpYUpTT04iLCJCdWZmZXIiLCJpc0J1ZmZlciIsImludmFsaWRSZXF1ZXN0IiwiX1Jldm9jYWJsZVNlc3Npb24iLCJfQXBwbGljYXRpb25JZCIsIl9KYXZhU2NyaXB0S2V5IiwiX0NsaWVudFZlcnNpb24iLCJfSW5zdGFsbGF0aW9uSWQiLCJfU2Vzc2lvblRva2VuIiwiX01hc3RlcktleSIsIl9jb250ZXh0IiwiVXRpbHMiLCJpc09iamVjdCIsIl9Db250ZW50VHlwZSIsImhlYWRlcnMiLCJiYXNlNjQiLCJmaWxlRGF0YSIsImZyb20iLCJjbGllbnRJcCIsImdldENsaWVudElwIiwiY29uZmlnIiwiQ29uZmlnIiwic3RhdGUiLCJzdGF0dXMiLCJqc29uIiwiY29kZSIsIlBhcnNlIiwiRXJyb3IiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJlcnJvciIsImxvYWRLZXlzIiwiYXBwIiwiYXV0aCIsImlzTWFzdGVyIiwiaXNNYWludGVuYW5jZSIsInJlc29sdmVkIiwicmVzb2x2ZUtleUF1dGgiLCJrZXlWYWx1ZSIsIm1haW50ZW5hbmNlS2V5VmFsdWUiLCJoYW5kbGVSYXRlTGltaXQiLCJrZXlzIiwib25lS2V5Q29uZmlndXJlZCIsInNvbWUiLCJrZXkiLCJ1bmRlZmluZWQiLCJvbmVLZXlNYXRjaGVzIiwibWF0Y2hlc0V4YWN0Um91dGUiLCJwYXRoIiwidXNlckZyb21KV1QiLCJBdXRoIiwidXNlciIsInJhdGVMaW1pdHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwibGltaXQiLCJwYXRoRXhwIiwicmVnZXhwIiwidGVzdCIsImhhbmRsZXIiLCJlcnIiLCJDT05ORUNUSU9OX0ZBSUxFRCIsImxvZ2dlckNvbnRyb2xsZXIiLCJtZXNzYWdlIiwiaGFuZGxlUGFyc2VTZXNzaW9uIiwibWV0aG9kIiwicmVxdWVzdEF1dGgiLCJpbmRleE9mIiwiZ2V0QXV0aEZvckxlZ2FjeVNlc3Npb25Ub2tlbiIsImdldEF1dGhGb3JTZXNzaW9uVG9rZW4iLCJVTktOT1dOX0VSUk9SIiwiYXV0aG9yaXphdGlvbiIsImhlYWRlciIsImF1dGhQcmVmaXgiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwiZW5jb2RlZEF1dGgiLCJzdWJzdHJpbmciLCJjcmVkZW50aWFscyIsImRlY29kZUJhc2U2NCIsImpzS2V5UHJlZml4IiwibWF0Y2hLZXkiLCJzdHIiLCJhbGxvd0Nyb3NzRG9tYWluIiwiYWxsb3dIZWFkZXJzIiwiam9pbiIsImJhc2VPcmlnaW5zIiwiYWxsb3dPcmlnaW4iLCJyZXF1ZXN0T3JpZ2luIiwib3JpZ2luIiwiYWxsb3dPcmlnaW5zIiwic2VuZFN0YXR1cyIsImFsbG93TWV0aG9kT3ZlcnJpZGUiLCJfbWV0aG9kIiwib3JpZ2luYWxNZXRob2QiLCJ0b1VwcGVyQ2FzZSIsIm1haW50ZW5hbmNlS2V5SXBzIiwibWFpbnRlbmFuY2VLZXlJcHNTdG9yZSIsImxvZyIsImRlZmF1bHRMb2dnZXIiLCJsb2FkTWFzdGVyS2V5IiwibWFzdGVyS2V5SXBzIiwibWFzdGVyS2V5SXBzU3RvcmUiLCJyZWFkT25seU1hc3RlcktleSIsInJlYWRPbmx5TWFzdGVyS2V5SXBzIiwicmVhZE9ubHlNYXN0ZXJLZXlJcHNTdG9yZSIsImlzUmVhZE9ubHkiLCJoYW5kbGVQYXJzZUF1dGgiLCJoYW5kbGVQYXJzZUhlYWx0aCIsIm9wdGlvbnMiLCJub3JtYWxpemVSb3V0ZUFsbG93TGlzdFBhdGgiLCJub3JtYWxpemVkIiwiVVJMIiwicGF0aG5hbWUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJxdWVyeUluZGV4IiwiZXhhY3RSb3V0ZVJlZ2V4cENhY2hlIiwiY3JlYXRlIiwicm91dGUiLCJwYXRoVG9SZWdleHAiLCJpc1JvdXRlQWxsb3dlZCIsInJvdXRlQWxsb3dMaXN0IiwicmVnZXhlcyIsIl9yb3V0ZUFsbG93TGlzdFJlZ2V4IiwicmVnZXgiLCJlbmZvcmNlUm91dGVBbGxvd0xpc3QiLCJjcmVhdGVTYW5pdGl6ZWRFcnJvciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJoYW5kbGVQYXJzZUVycm9ycyIsImVuYWJsZUV4cHJlc3NFcnJvckhhbmRsZXIiLCJzaWdudXBVc2VybmFtZVRha2VuTGV2ZWwiLCJsb2dMZXZlbHMiLCJzaWdudXBVc2VybmFtZVRha2VuIiwiaHR0cFN0YXR1cyIsIk9CSkVDVF9OT1RfRk9VTkQiLCJVU0VSTkFNRV9UQUtFTiIsImxvZ2dlck1ldGhvZCIsImJpbmQiLCJwcm9jZXNzIiwiZW52IiwiVEVTVElORyIsInN0YWNrIiwiZW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImNyZWF0ZVNhbml0aXplZEh0dHBFcnJvciIsImVuZCIsInByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzIiwicmVxdWVzdCIsInJlc29sdmUiLCJhZGRSYXRlTGltaXQiLCJjbG91ZCIsIlJhdGVMaW1pdE9wdGlvbnMiLCJyZWRpc1N0b3JlIiwiY29ubmVjdGlvblByb21pc2UiLCJyZWRpc1VybCIsImNsaWVudCIsImNyZWF0ZUNsaWVudCIsIm9uIiwiaXNPcGVuIiwiY29ubmVjdCIsIlJlZGlzU3RvcmUiLCJzZW5kQ29tbWFuZCIsImFyZ3MiLCJwdXNoIiwicmVxdWVzdFBhdGgiLCJyZXF1ZXN0Q291bnQiLCJyZXF1ZXN0TWV0aG9kcyIsImluY2x1ZGVNYXN0ZXJLZXkiLCJpbmNsdWRlSW50ZXJuYWxSZXF1ZXN0cyIsImVycm9yUmVzcG9uc2VNZXNzYWdlIiwicmF0ZUxpbWl0Iiwid2luZG93TXMiLCJyZXF1ZXN0VGltZVdpbmRvdyIsIm1heCIsInJlc3BvbnNlIiwic2tpcCIsIm1ldGhvZHNUb0NoZWNrIiwiU2V0IiwiX2JhdGNoT3JpZ2luYWxNZXRob2QiLCJhZGQiLCJBcnJheSIsImlzQXJyYXkiLCJtIiwiaGFzIiwicmVnRXhwIiwiUmVnRXhwIiwia2V5R2VuZXJhdG9yIiwiem9uZSIsIlNlcnZlciIsIlJhdGVMaW1pdFpvbmUiLCJnbG9iYWwiLCJ0b2tlbiIsInNlc3Npb24iLCJpZCIsInB1dCIsInByb21pc2VFbnN1cmVJZGVtcG90ZW5jeSIsImRhdGFiYXNlIiwiYWRhcHRlciIsIk1vbmdvU3RvcmFnZUFkYXB0ZXIiLCJQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyIiwicmVxdWVzdElkIiwicGF0aHMiLCJ0dGwiLCJpZGVtcG90ZW5jeU9wdGlvbnMiLCJyZXFQYXRoIiwicmVwbGFjZSIsImNoYXJBdCIsImV4cGlyeURhdGUiLCJEYXRlIiwic2V0U2Vjb25kcyIsImdldFNlY29uZHMiLCJyZXN0IiwibWFzdGVyIiwicmVxSWQiLCJleHBpcmUiLCJfZW5jb2RlIiwiY2F0Y2giLCJEVVBMSUNBVEVfVkFMVUUiLCJEVVBMSUNBVEVfUkVRVUVTVCIsIklOVkFMSURfSlNPTiIsImFsbG93RG91YmxlRm9yd2FyZFNsYXNoIl0sInNvdXJjZXMiOlsiLi4vc3JjL21pZGRsZXdhcmVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBcHBDYWNoZSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCBhdXRoIGZyb20gJy4vQXV0aCc7XG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vQ29uZmlnJztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCByZXN0IGZyb20gJy4vcmVzdCc7XG5pbXBvcnQgTW9uZ29TdG9yYWdlQWRhcHRlciBmcm9tICcuL0FkYXB0ZXJzL1N0b3JhZ2UvTW9uZ28vTW9uZ29TdG9yYWdlQWRhcHRlcic7XG5pbXBvcnQgUG9zdGdyZXNTdG9yYWdlQWRhcHRlciBmcm9tICcuL0FkYXB0ZXJzL1N0b3JhZ2UvUG9zdGdyZXMvUG9zdGdyZXNTdG9yYWdlQWRhcHRlcic7XG5pbXBvcnQgcmF0ZUxpbWl0IGZyb20gJ2V4cHJlc3MtcmF0ZS1saW1pdCc7XG5pbXBvcnQgeyBSYXRlTGltaXRPcHRpb25zIH0gZnJvbSAnLi9PcHRpb25zL0RlZmluaXRpb25zJztcbmltcG9ydCB7IHBhdGhUb1JlZ2V4cCB9IGZyb20gJ3BhdGgtdG8tcmVnZXhwJztcbmltcG9ydCBSZWRpc1N0b3JlIGZyb20gJ3JhdGUtbGltaXQtcmVkaXMnO1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSAncmVkaXMnO1xuaW1wb3J0IHsgQmxvY2tMaXN0LCBpc0lQdjQgfSBmcm9tICduZXQnO1xuaW1wb3J0IHsgY3JlYXRlU2FuaXRpemVkSHR0cEVycm9yLCBjcmVhdGVTYW5pdGl6ZWRFcnJvciB9IGZyb20gJy4vRXJyb3InO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTExPV0VEX0hFQURFUlMgPVxuICAnWC1QYXJzZS1NYXN0ZXItS2V5LCBYLVBhcnNlLVJFU1QtQVBJLUtleSwgWC1QYXJzZS1KYXZhc2NyaXB0LUtleSwgWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCwgWC1QYXJzZS1DbGllbnQtVmVyc2lvbiwgWC1QYXJzZS1TZXNzaW9uLVRva2VuLCBYLVJlcXVlc3RlZC1XaXRoLCBYLVBhcnNlLVJldm9jYWJsZS1TZXNzaW9uLCBYLVBhcnNlLVJlcXVlc3QtSWQsIENvbnRlbnQtVHlwZSwgUHJhZ21hLCBDYWNoZS1Db250cm9sJztcblxuY29uc3QgZ2V0TW91bnRGb3JSZXF1ZXN0ID0gZnVuY3Rpb24gKHJlcSkge1xuICBjb25zdCBtb3VudFBhdGhMZW5ndGggPSByZXEub3JpZ2luYWxVcmwubGVuZ3RoIC0gcmVxLnVybC5sZW5ndGg7XG4gIGNvbnN0IG1vdW50UGF0aCA9IHJlcS5vcmlnaW5hbFVybC5zbGljZSgwLCBtb3VudFBhdGhMZW5ndGgpO1xuICByZXR1cm4gcmVxLnByb3RvY29sICsgJzovLycgKyByZXEuZ2V0KCdob3N0JykgKyBtb3VudFBhdGg7XG59O1xuXG5jb25zdCBnZXRCbG9ja0xpc3QgPSAoaXBSYW5nZUxpc3QsIHN0b3JlKSA9PiB7XG4gIGlmIChzdG9yZS5nZXQoJ2Jsb2NrTGlzdCcpKSB7IHJldHVybiBzdG9yZS5nZXQoJ2Jsb2NrTGlzdCcpOyB9XG4gIGNvbnN0IGJsb2NrTGlzdCA9IG5ldyBCbG9ja0xpc3QoKTtcbiAgaXBSYW5nZUxpc3QuZm9yRWFjaChmdWxsSXAgPT4ge1xuICAgIGlmIChmdWxsSXAgPT09ICc6Oi8wJyB8fCBmdWxsSXAgPT09ICc6OicgfHwgZnVsbElwID09PSAnOjowJykge1xuICAgICAgc3RvcmUuc2V0KCdhbGxvd0FsbElwdjYnLCB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZ1bGxJcCA9PT0gJzAuMC4wLjAvMCcgfHwgZnVsbElwID09PSAnMC4wLjAuMCcpIHtcbiAgICAgIHN0b3JlLnNldCgnYWxsb3dBbGxJcHY0JywgdHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtpcCwgbWFza10gPSBmdWxsSXAuc3BsaXQoJy8nKTtcbiAgICBpZiAoIW1hc2spIHtcbiAgICAgIGJsb2NrTGlzdC5hZGRBZGRyZXNzKGlwLCBpc0lQdjQoaXApID8gJ2lwdjQnIDogJ2lwdjYnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmxvY2tMaXN0LmFkZFN1Ym5ldChpcCwgTnVtYmVyKG1hc2spLCBpc0lQdjQoaXApID8gJ2lwdjQnIDogJ2lwdjYnKTtcbiAgICB9XG4gIH0pO1xuICBzdG9yZS5zZXQoJ2Jsb2NrTGlzdCcsIGJsb2NrTGlzdCk7XG4gIHJldHVybiBibG9ja0xpc3Q7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tJcCA9IChpcCwgaXBSYW5nZUxpc3QsIHN0b3JlKSA9PiB7XG4gIGNvbnN0IGluY29taW5nSXBJc1Y0ID0gaXNJUHY0KGlwKTtcbiAgY29uc3QgYmxvY2tMaXN0ID0gZ2V0QmxvY2tMaXN0KGlwUmFuZ2VMaXN0LCBzdG9yZSk7XG5cbiAgaWYgKHN0b3JlLmdldChpcCkpIHsgcmV0dXJuIHRydWU7IH1cbiAgaWYgKHN0b3JlLmdldCgnYWxsb3dBbGxJcHY0JykgJiYgaW5jb21pbmdJcElzVjQpIHsgcmV0dXJuIHRydWU7IH1cbiAgaWYgKHN0b3JlLmdldCgnYWxsb3dBbGxJcHY2JykgJiYgIWluY29taW5nSXBJc1Y0KSB7IHJldHVybiB0cnVlOyB9XG4gIGNvbnN0IHJlc3VsdCA9IGJsb2NrTGlzdC5jaGVjayhpcCwgaW5jb21pbmdJcElzVjQgPyAnaXB2NCcgOiAnaXB2NicpO1xuXG4gIC8vIElmIHRoZSBpcCBpcyBpbiB0aGUgbGlzdCwgd2Ugc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUgc3RvcmVcbiAgLy8gc28gd2UgaGF2ZSBhIG9wdGltaXplZCBwYXRoIGZvciB0aGUgbmV4dCByZXF1ZXN0XG4gIGlmIChpcFJhbmdlTGlzdC5pbmNsdWRlcyhpcCkgJiYgcmVzdWx0KSB7XG4gICAgc3RvcmUuc2V0KGlwLCByZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBDaGVja3MgdGhhdCB0aGUgcmVxdWVzdCBpcyBhdXRob3JpemVkIGZvciB0aGlzIGFwcCBhbmQgY2hlY2tzIHVzZXJcbi8vIGF1dGggdG9vLlxuLy8gVGhlIGJvZHlwYXJzZXIgc2hvdWxkIHJ1biBiZWZvcmUgdGhpcyBtaWRkbGV3YXJlLlxuLy8gQWRkcyBpbmZvIHRvIHRoZSByZXF1ZXN0OlxuLy8gcmVxLmNvbmZpZyAtIHRoZSBDb25maWcgZm9yIHRoaXMgYXBwXG4vLyByZXEuYXV0aCAtIHRoZSBBdXRoIGZvciB0aGlzIHJlcXVlc3RcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVQYXJzZUhlYWRlcnMocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIG1vdW50ID0gZ2V0TW91bnRGb3JSZXF1ZXN0KHJlcSk7XG5cbiAgbGV0IGNvbnRleHQgPSB7fTtcbiAgaWYgKHJlcS5nZXQoJ1gtUGFyc2UtQ2xvdWQtQ29udGV4dCcpICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgY29udGV4dCA9IEpTT04ucGFyc2UocmVxLmdldCgnWC1QYXJzZS1DbG91ZC1Db250ZXh0JykpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjb250ZXh0KSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgdGhyb3cgJ0NvbnRleHQgaXMgbm90IGFuIG9iamVjdCc7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbWFsZm9ybWVkQ29udGV4dChyZXEsIHJlcyk7XG4gICAgfVxuICB9XG4gIHZhciBpbmZvID0ge1xuICAgIGFwcElkOiByZXEuZ2V0KCdYLVBhcnNlLUFwcGxpY2F0aW9uLUlkJyksXG4gICAgc2Vzc2lvblRva2VuOiByZXEuZ2V0KCdYLVBhcnNlLVNlc3Npb24tVG9rZW4nKSxcbiAgICBtYXN0ZXJLZXk6IHJlcS5nZXQoJ1gtUGFyc2UtTWFzdGVyLUtleScpLFxuICAgIG1haW50ZW5hbmNlS2V5OiByZXEuZ2V0KCdYLVBhcnNlLU1haW50ZW5hbmNlLUtleScpLFxuICAgIGluc3RhbGxhdGlvbklkOiByZXEuZ2V0KCdYLVBhcnNlLUluc3RhbGxhdGlvbi1JZCcpLFxuICAgIGNsaWVudEtleTogcmVxLmdldCgnWC1QYXJzZS1DbGllbnQtS2V5JyksXG4gICAgamF2YXNjcmlwdEtleTogcmVxLmdldCgnWC1QYXJzZS1KYXZhc2NyaXB0LUtleScpLFxuICAgIGRvdE5ldEtleTogcmVxLmdldCgnWC1QYXJzZS1XaW5kb3dzLUtleScpLFxuICAgIHJlc3RBUElLZXk6IHJlcS5nZXQoJ1gtUGFyc2UtUkVTVC1BUEktS2V5JyksXG4gICAgY29udGV4dDogY29udGV4dCxcbiAgfTtcblxuICB2YXIgYmFzaWNBdXRoID0gaHR0cEF1dGgocmVxKTtcblxuICBpZiAoYmFzaWNBdXRoKSB7XG4gICAgdmFyIGJhc2ljQXV0aEFwcElkID0gYmFzaWNBdXRoLmFwcElkO1xuICAgIGlmIChBcHBDYWNoZS5nZXQoYmFzaWNBdXRoQXBwSWQpKSB7XG4gICAgICBpbmZvLmFwcElkID0gYmFzaWNBdXRoQXBwSWQ7XG4gICAgICBpbmZvLm1hc3RlcktleSA9IGJhc2ljQXV0aC5tYXN0ZXJLZXkgfHwgaW5mby5tYXN0ZXJLZXk7XG4gICAgICBpbmZvLmphdmFzY3JpcHRLZXkgPSBiYXNpY0F1dGguamF2YXNjcmlwdEtleSB8fCBpbmZvLmphdmFzY3JpcHRLZXk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlcS5ib2R5KSB7XG4gICAgLy8gVW5pdHkgU0RLIHNlbmRzIGEgX25vQm9keSBrZXkgd2hpY2ggbmVlZHMgdG8gYmUgcmVtb3ZlZC5cbiAgICAvLyBVbmNsZWFyIGF0IHRoaXMgcG9pbnQgaWYgYWN0aW9uIG5lZWRzIHRvIGJlIHRha2VuLlxuICAgIGRlbGV0ZSByZXEuYm9keS5fbm9Cb2R5O1xuICB9XG5cbiAgdmFyIGZpbGVWaWFKU09OID0gZmFsc2U7XG5cbiAgaWYgKCFpbmZvLmFwcElkIHx8ICFBcHBDYWNoZS5nZXQoaW5mby5hcHBJZCkpIHtcbiAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgdGhlIGFwcCBpZCBvbiB0aGUgYm9keS5cbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHJlcS5ib2R5KSkge1xuICAgICAgLy8gVGhlIG9ubHkgY2hhbmNlIHRvIGZpbmQgdGhlIGFwcCBpZCBpcyBpZiB0aGlzIGlzIGEgZmlsZVxuICAgICAgLy8gdXBsb2FkIHRoYXQgYWN0dWFsbHkgaXMgYSBKU09OIGJvZHkuIFNvIHRyeSB0byBwYXJzZSBpdC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJzZS1jb21tdW5pdHkvcGFyc2Utc2VydmVyL2lzc3Vlcy82NTg5XG4gICAgICAvLyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBpcyB0cnlpbmcgdG8gdXBsb2FkIGEgZmlsZSBidXQgZm9yZ290XG4gICAgICAvLyB0byBwcm92aWRlIHgtcGFyc2UtYXBwLWlkIGluIGhlYWRlciBhbmQgcGFyc2UgYSBiaW5hcnkgZmlsZSB3aWxsIGZhaWxcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcS5ib2R5ID0gSlNPTi5wYXJzZShyZXEuYm9keSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKTtcbiAgICAgIH1cbiAgICAgIGZpbGVWaWFKU09OID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVxLmJvZHkpIHtcbiAgICAgIGRlbGV0ZSByZXEuYm9keS5fUmV2b2NhYmxlU2Vzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICByZXEuYm9keSAmJlxuICAgICAgcmVxLmJvZHkuX0FwcGxpY2F0aW9uSWQgJiZcbiAgICAgIEFwcENhY2hlLmdldChyZXEuYm9keS5fQXBwbGljYXRpb25JZCkgJiZcbiAgICAgICghaW5mby5tYXN0ZXJLZXkgfHwgQXBwQ2FjaGUuZ2V0KHJlcS5ib2R5Ll9BcHBsaWNhdGlvbklkKS5tYXN0ZXJLZXkgPT09IGluZm8ubWFzdGVyS2V5KVxuICAgICkge1xuICAgICAgaW5mby5hcHBJZCA9IHJlcS5ib2R5Ll9BcHBsaWNhdGlvbklkO1xuICAgICAgaW5mby5qYXZhc2NyaXB0S2V5ID0gcmVxLmJvZHkuX0phdmFTY3JpcHRLZXkgfHwgJyc7XG4gICAgICBkZWxldGUgcmVxLmJvZHkuX0FwcGxpY2F0aW9uSWQ7XG4gICAgICBkZWxldGUgcmVxLmJvZHkuX0phdmFTY3JpcHRLZXk7XG4gICAgICAvLyBUT0RPOiB0ZXN0IHRoYXQgdGhlIFJFU1QgQVBJIGZvcm1hdHMgZ2VuZXJhdGVkIGJ5IHRoZSBvdGhlclxuICAgICAgLy8gU0RLcyBhcmUgaGFuZGxlZCBva1xuICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9DbGllbnRWZXJzaW9uO1xuICAgICAgaWYgKHJlcS5ib2R5Ll9JbnN0YWxsYXRpb25JZCkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcS5ib2R5Ll9JbnN0YWxsYXRpb25JZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFJlcXVlc3QocmVxLCByZXMpO1xuICAgICAgICB9XG4gICAgICAgIGluZm8uaW5zdGFsbGF0aW9uSWQgPSByZXEuYm9keS5fSW5zdGFsbGF0aW9uSWQ7XG4gICAgICAgIGRlbGV0ZSByZXEuYm9keS5fSW5zdGFsbGF0aW9uSWQ7XG4gICAgICB9XG4gICAgICBpZiAocmVxLmJvZHkuX1Nlc3Npb25Ub2tlbikge1xuICAgICAgICBpZiAodHlwZW9mIHJlcS5ib2R5Ll9TZXNzaW9uVG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLnNlc3Npb25Ub2tlbiA9IHJlcS5ib2R5Ll9TZXNzaW9uVG9rZW47XG4gICAgICAgIGRlbGV0ZSByZXEuYm9keS5fU2Vzc2lvblRva2VuO1xuICAgICAgfVxuICAgICAgaWYgKHJlcS5ib2R5Ll9NYXN0ZXJLZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXEuYm9keS5fTWFzdGVyS2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBpbnZhbGlkUmVxdWVzdChyZXEsIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5tYXN0ZXJLZXkgPSByZXEuYm9keS5fTWFzdGVyS2V5O1xuICAgICAgICBkZWxldGUgcmVxLmJvZHkuX01hc3RlcktleTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXEuYm9keS5fY29udGV4dCkge1xuICAgICAgICBpZiAoVXRpbHMuaXNPYmplY3QocmVxLmJvZHkuX2NvbnRleHQpKSB7XG4gICAgICAgICAgaW5mby5jb250ZXh0ID0gcmVxLmJvZHkuX2NvbnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluZm8uY29udGV4dCA9IEpTT04ucGFyc2UocmVxLmJvZHkuX2NvbnRleHQpO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbmZvLmNvbnRleHQpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgICAgICB0aHJvdyAnQ29udGV4dCBpcyBub3QgYW4gb2JqZWN0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBtYWxmb3JtZWRDb250ZXh0KHJlcSwgcmVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9jb250ZXh0O1xuICAgICAgfVxuICAgICAgaWYgKHJlcS5ib2R5Ll9Db250ZW50VHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcS5ib2R5Ll9Db250ZW50VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFJlcXVlc3QocmVxLCByZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IHJlcS5ib2R5Ll9Db250ZW50VHlwZTtcbiAgICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9Db250ZW50VHlwZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5mby5zZXNzaW9uVG9rZW4gJiYgdHlwZW9mIGluZm8uc2Vzc2lvblRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBpbnZhbGlkUmVxdWVzdChyZXEsIHJlcyk7XG4gIH1cblxuICBpZiAoZmlsZVZpYUpTT04gJiYgcmVxLmJvZHkpIHtcbiAgICBpZiAocmVxLmJvZHkuYmFzZTY0ICYmIHR5cGVvZiByZXEuYm9keS5iYXNlNjQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gaW52YWxpZFJlcXVlc3QocmVxLCByZXMpO1xuICAgIH1cbiAgICByZXEuZmlsZURhdGEgPSByZXEuYm9keS5maWxlRGF0YTtcbiAgICAvLyBXZSBuZWVkIHRvIHJlcG9wdWxhdGUgcmVxLmJvZHkgd2l0aCBhIGJ1ZmZlclxuICAgIHZhciBiYXNlNjQgPSByZXEuYm9keS5iYXNlNjQ7XG4gICAgcmVxLmJvZHkgPSBCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKTtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudElwID0gZ2V0Q2xpZW50SXAocmVxKTtcbiAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZyB8fCBDb25maWcuZ2V0KGluZm8uYXBwSWQsIG1vdW50KTtcbiAgaWYgKGNvbmZpZy5zdGF0ZSAmJiBjb25maWcuc3RhdGUgIT09ICdvaycpIHtcbiAgICByZXMuc3RhdHVzKDUwMCk7XG4gICAgcmVzLmpzb24oe1xuICAgICAgY29kZTogUGFyc2UuRXJyb3IuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgZXJyb3I6IGBJbnZhbGlkIHNlcnZlciBzdGF0ZTogJHtjb25maWcuc3RhdGV9YCxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFyZXEuY29uZmlnKSB7XG4gICAgYXdhaXQgY29uZmlnLmxvYWRLZXlzKCk7XG4gIH1cblxuICBpbmZvLmFwcCA9IEFwcENhY2hlLmdldChpbmZvLmFwcElkKTtcbiAgcmVxLmNvbmZpZyA9IGNvbmZpZztcbiAgcmVxLmNvbmZpZy5oZWFkZXJzID0gcmVxLmhlYWRlcnMgfHwge307XG4gIHJlcS5jb25maWcuaXAgPSBjbGllbnRJcDtcbiAgcmVxLmluZm8gPSBpbmZvO1xuXG4gIC8vIFNraXAga2V5IGRldGVjdGlvbiBpZiBhbHJlYWR5IHJlc29sdmVkIGJ5IGhhbmRsZVBhcnNlQXV0aCAoaGVhZGVyLWJhc2VkKS5cbiAgLy8gT25seSByZXNvbHZlIGhlcmUgZm9yIGJvZHktYmFzZWQgX01hc3RlcktleSAoaW5mby5tYXN0ZXJLZXkgbWF5IGNvbWUgZnJvbSBib2R5KS5cbiAgaWYgKCFyZXEuYXV0aCB8fCAoIXJlcS5hdXRoLmlzTWFzdGVyICYmICFyZXEuYXV0aC5pc01haW50ZW5hbmNlKSkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZUtleUF1dGgoe1xuICAgICAgY29uZmlnOiByZXEuY29uZmlnLFxuICAgICAga2V5VmFsdWU6IGluZm8ubWFzdGVyS2V5LFxuICAgICAgbWFpbnRlbmFuY2VLZXlWYWx1ZTogaW5mby5tYWludGVuYW5jZUtleSxcbiAgICAgIGluc3RhbGxhdGlvbklkOiBpbmZvLmluc3RhbGxhdGlvbklkLFxuICAgICAgY2xpZW50SXAsXG4gICAgfSk7XG4gICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICByZXEuYXV0aCA9IHJlc29sdmVkO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXEuYXV0aCAmJiAocmVxLmF1dGguaXNNYXN0ZXIgfHwgcmVxLmF1dGguaXNNYWludGVuYW5jZSkpIHtcbiAgICByZXR1cm4gaGFuZGxlUmF0ZUxpbWl0KHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8vIENsaWVudCBrZXlzIGFyZSBub3QgcmVxdWlyZWQgaW4gcGFyc2Utc2VydmVyLCBidXQgaWYgYW55IGhhdmUgYmVlbiBjb25maWd1cmVkIGluIHRoZSBzZXJ2ZXIsIHZhbGlkYXRlIHRoZW1cbiAgLy8gIHRvIHByZXNlcnZlIG9yaWdpbmFsIGJlaGF2aW9yLlxuICBjb25zdCBrZXlzID0gWydjbGllbnRLZXknLCAnamF2YXNjcmlwdEtleScsICdkb3ROZXRLZXknLCAncmVzdEFQSUtleSddO1xuICBjb25zdCBvbmVLZXlDb25maWd1cmVkID0ga2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gcmVxLmNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQ7XG4gIH0pO1xuICBjb25zdCBvbmVLZXlNYXRjaGVzID0ga2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gcmVxLmNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQgJiYgaW5mb1trZXldID09PSByZXEuY29uZmlnW2tleV07XG4gIH0pO1xuXG4gIGlmIChvbmVLZXlDb25maWd1cmVkICYmICFvbmVLZXlNYXRjaGVzKSB7XG4gICAgcmV0dXJuIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKTtcbiAgfVxuXG4gIGlmIChtYXRjaGVzRXhhY3RSb3V0ZShyZXEucGF0aCwgJy9sb2dpbicpKSB7XG4gICAgZGVsZXRlIGluZm8uc2Vzc2lvblRva2VuO1xuICB9XG5cbiAgaWYgKHJlcS51c2VyRnJvbUpXVCkge1xuICAgIHJlcS5hdXRoID0gbmV3IGF1dGguQXV0aCh7XG4gICAgICBjb25maWc6IHJlcS5jb25maWcsXG4gICAgICBpbnN0YWxsYXRpb25JZDogaW5mby5pbnN0YWxsYXRpb25JZCxcbiAgICAgIGlzTWFzdGVyOiBmYWxzZSxcbiAgICAgIHVzZXI6IHJlcS51c2VyRnJvbUpXVCxcbiAgICB9KTtcbiAgICByZXR1cm4gaGFuZGxlUmF0ZUxpbWl0KHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGlmICghaW5mby5zZXNzaW9uVG9rZW4pIHtcbiAgICByZXEuYXV0aCA9IG5ldyBhdXRoLkF1dGgoe1xuICAgICAgY29uZmlnOiByZXEuY29uZmlnLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IGluZm8uaW5zdGFsbGF0aW9uSWQsXG4gICAgICBpc01hc3RlcjogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlUmF0ZUxpbWl0KHJlcSwgcmVzLCBuZXh0KTtcbn1cblxuY29uc3QgaGFuZGxlUmF0ZUxpbWl0ID0gYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gIGNvbnN0IHJhdGVMaW1pdHMgPSByZXEuY29uZmlnLnJhdGVMaW1pdHMgfHwgW107XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByYXRlTGltaXRzLm1hcChhc3luYyBsaW1pdCA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGhFeHAgPSBsaW1pdC5wYXRoLnJlZ2V4cCB8fCBsaW1pdC5wYXRoO1xuICAgICAgICBpZiAocGF0aEV4cC50ZXN0KHJlcS5wYXRoKSkge1xuICAgICAgICAgIGF3YWl0IGxpbWl0LmhhbmRsZXIocmVxLCByZXMsIGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PT0gUGFyc2UuRXJyb3IuQ09OTkVDVElPTl9GQUlMRUQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVxLmNvbmZpZy5sb2dnZXJDb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgICAgICdBbiB1bmtub3duIGVycm9yIG9jY3VyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIGFwcGx5IHRoZSByYXRlIGxpbWl0ZXI6ICcsXG4gICAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXMuc3RhdHVzKDQyOSk7XG4gICAgcmVzLmpzb24oeyBjb2RlOiBQYXJzZS5FcnJvci5DT05ORUNUSU9OX0ZBSUxFRCwgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIG5leHQoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVQYXJzZVNlc3Npb24gPSBhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpbmZvID0gcmVxLmluZm87XG4gICAgaWYgKHJlcS5hdXRoIHx8IChtYXRjaGVzRXhhY3RSb3V0ZShyZXEucGF0aCwgJy9zZXNzaW9ucy9tZScpICYmIHJlcS5tZXRob2QgPT09ICdHRVQnKSkge1xuICAgICAgbmV4dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdEF1dGggPSBudWxsO1xuICAgIGlmIChcbiAgICAgIGluZm8uc2Vzc2lvblRva2VuICYmXG4gICAgICBtYXRjaGVzRXhhY3RSb3V0ZShyZXEucGF0aCwgJy91cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uJykgJiZcbiAgICAgIGluZm8uc2Vzc2lvblRva2VuLmluZGV4T2YoJ3I6JykgIT0gMFxuICAgICkge1xuICAgICAgcmVxdWVzdEF1dGggPSBhd2FpdCBhdXRoLmdldEF1dGhGb3JMZWdhY3lTZXNzaW9uVG9rZW4oe1xuICAgICAgICBjb25maWc6IHJlcS5jb25maWcsXG4gICAgICAgIGluc3RhbGxhdGlvbklkOiBpbmZvLmluc3RhbGxhdGlvbklkLFxuICAgICAgICBzZXNzaW9uVG9rZW46IGluZm8uc2Vzc2lvblRva2VuLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3RBdXRoID0gYXdhaXQgYXV0aC5nZXRBdXRoRm9yU2Vzc2lvblRva2VuKHtcbiAgICAgICAgY29uZmlnOiByZXEuY29uZmlnLFxuICAgICAgICBpbnN0YWxsYXRpb25JZDogaW5mby5pbnN0YWxsYXRpb25JZCxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBpbmZvLnNlc3Npb25Ub2tlbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXEuYXV0aCA9IHJlcXVlc3RBdXRoO1xuICAgIG5leHQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBQYXJzZS5FcnJvcikge1xuICAgICAgbmV4dChlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIExvZyBmdWxsIGVycm9yIGRldGFpbHMgaW50ZXJuYWxseSwgYnV0IGRvbid0IGV4cG9zZSB0byBjbGllbnRcbiAgICByZXEuY29uZmlnLmxvZ2dlckNvbnRyb2xsZXIuZXJyb3IoJ2Vycm9yIGdldHRpbmcgYXV0aCBmb3Igc2Vzc2lvblRva2VuJywgZXJyb3IpO1xuICAgIG5leHQobmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlVOS05PV05fRVJST1IsICdVbmtub3duIGVycm9yJykpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRDbGllbnRJcChyZXEpIHtcbiAgcmV0dXJuIHJlcS5pcDtcbn1cblxuZnVuY3Rpb24gaHR0cEF1dGgocmVxKSB7XG4gIGlmICghKHJlcS5yZXEgfHwgcmVxKS5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHsgcmV0dXJuOyB9XG5cbiAgdmFyIGhlYWRlciA9IChyZXEucmVxIHx8IHJlcSkuaGVhZGVycy5hdXRob3JpemF0aW9uO1xuICB2YXIgYXBwSWQsIG1hc3RlcktleSwgamF2YXNjcmlwdEtleTtcblxuICAvLyBwYXJzZSBoZWFkZXJcbiAgdmFyIGF1dGhQcmVmaXggPSAnYmFzaWMgJztcblxuICB2YXIgbWF0Y2ggPSBoZWFkZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKGF1dGhQcmVmaXgpO1xuXG4gIGlmIChtYXRjaCA9PSAwKSB7XG4gICAgdmFyIGVuY29kZWRBdXRoID0gaGVhZGVyLnN1YnN0cmluZyhhdXRoUHJlZml4Lmxlbmd0aCwgaGVhZGVyLmxlbmd0aCk7XG4gICAgdmFyIGNyZWRlbnRpYWxzID0gZGVjb2RlQmFzZTY0KGVuY29kZWRBdXRoKS5zcGxpdCgnOicpO1xuXG4gICAgaWYgKGNyZWRlbnRpYWxzLmxlbmd0aCA9PSAyKSB7XG4gICAgICBhcHBJZCA9IGNyZWRlbnRpYWxzWzBdO1xuICAgICAgdmFyIGtleSA9IGNyZWRlbnRpYWxzWzFdO1xuXG4gICAgICB2YXIganNLZXlQcmVmaXggPSAnamF2YXNjcmlwdC1rZXk9JztcblxuICAgICAgdmFyIG1hdGNoS2V5ID0ga2V5LmluZGV4T2YoanNLZXlQcmVmaXgpO1xuICAgICAgaWYgKG1hdGNoS2V5ID09IDApIHtcbiAgICAgICAgamF2YXNjcmlwdEtleSA9IGtleS5zdWJzdHJpbmcoanNLZXlQcmVmaXgubGVuZ3RoLCBrZXkubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hc3RlcktleSA9IGtleTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBhcHBJZDogYXBwSWQsIG1hc3RlcktleTogbWFzdGVyS2V5LCBqYXZhc2NyaXB0S2V5OiBqYXZhc2NyaXB0S2V5IH07XG59XG5cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NChzdHIpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0ciwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd0Nyb3NzRG9tYWluKGFwcElkKSB7XG4gIHJldHVybiAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KGFwcElkLCBnZXRNb3VudEZvclJlcXVlc3QocmVxKSk7XG4gICAgbGV0IGFsbG93SGVhZGVycyA9IERFRkFVTFRfQUxMT1dFRF9IRUFERVJTO1xuICAgIGlmIChjb25maWcgJiYgY29uZmlnLmFsbG93SGVhZGVycykge1xuICAgICAgYWxsb3dIZWFkZXJzICs9IGAsICR7Y29uZmlnLmFsbG93SGVhZGVycy5qb2luKCcsICcpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZU9yaWdpbnMgPVxuICAgICAgdHlwZW9mIGNvbmZpZz8uYWxsb3dPcmlnaW4gPT09ICdzdHJpbmcnID8gW2NvbmZpZy5hbGxvd09yaWdpbl0gOiBjb25maWc/LmFsbG93T3JpZ2luID8/IFsnKiddO1xuICAgIGNvbnN0IHJlcXVlc3RPcmlnaW4gPSByZXEuaGVhZGVycy5vcmlnaW47XG4gICAgY29uc3QgYWxsb3dPcmlnaW5zID1cbiAgICAgIHJlcXVlc3RPcmlnaW4gJiYgYmFzZU9yaWdpbnMuaW5jbHVkZXMocmVxdWVzdE9yaWdpbikgPyByZXF1ZXN0T3JpZ2luIDogYmFzZU9yaWdpbnNbMF07XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgYWxsb3dPcmlnaW5zKTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJywgJ0dFVCxQVVQsUE9TVCxERUxFVEUsT1BUSU9OUycpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLCBhbGxvd0hlYWRlcnMpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzJywgJ1gtUGFyc2UtSm9iLVN0YXR1cy1JZCwgWC1QYXJzZS1QdXNoLVN0YXR1cy1JZCcpO1xuICAgIC8vIGludGVyY2VwdCBPUFRJT05TIG1ldGhvZFxuICAgIGlmICgnT1BUSU9OUycgPT0gcmVxLm1ldGhvZCkge1xuICAgICAgcmVzLnNlbmRTdGF0dXMoMjAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93TWV0aG9kT3ZlcnJpZGUocmVxLCByZXMsIG5leHQpIHtcbiAgaWYgKHJlcS5tZXRob2QgPT09ICdQT1NUJyAmJiByZXEuYm9keT8uX21ldGhvZCkge1xuICAgIGlmICh0eXBlb2YgcmVxLmJvZHkuX21ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcS5vcmlnaW5hbE1ldGhvZCA9IHJlcS5tZXRob2Q7XG4gICAgICByZXEubWV0aG9kID0gcmVxLmJvZHkuX21ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICBkZWxldGUgcmVxLmJvZHkuX21ldGhvZDtcbiAgfVxuICBuZXh0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVLZXlBdXRoKHsgY29uZmlnLCBrZXlWYWx1ZSwgbWFpbnRlbmFuY2VLZXlWYWx1ZSwgaW5zdGFsbGF0aW9uSWQsIGNsaWVudElwIH0pIHtcbiAgaWYgKG1haW50ZW5hbmNlS2V5VmFsdWUgJiYgbWFpbnRlbmFuY2VLZXlWYWx1ZSA9PT0gY29uZmlnLm1haW50ZW5hbmNlS2V5KSB7XG4gICAgaWYgKGNoZWNrSXAoY2xpZW50SXAsIGNvbmZpZy5tYWludGVuYW5jZUtleUlwcyB8fCBbXSwgY29uZmlnLm1haW50ZW5hbmNlS2V5SXBzU3RvcmUpKSB7XG4gICAgICByZXR1cm4gbmV3IGF1dGguQXV0aCh7IGNvbmZpZywgaW5zdGFsbGF0aW9uSWQsIGlzTWFpbnRlbmFuY2U6IHRydWUgfSk7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IGNvbmZpZy5sb2dnZXJDb250cm9sbGVyIHx8IGRlZmF1bHRMb2dnZXI7XG4gICAgbG9nLmVycm9yKFxuICAgICAgYFJlcXVlc3QgdXNpbmcgbWFpbnRlbmFuY2Uga2V5IHJlamVjdGVkIGFzIHRoZSByZXF1ZXN0IElQIGFkZHJlc3MgJyR7Y2xpZW50SXB9JyBpcyBub3Qgc2V0IGluIFBhcnNlIFNlcnZlciBvcHRpb24gJ21haW50ZW5hbmNlS2V5SXBzJy5gXG4gICAgKTtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLnN0YXR1cyA9IDQwMztcbiAgICBlcnJvci5tZXNzYWdlID0gJ3VuYXV0aG9yaXplZCc7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgY29uZmlnLmxvYWRNYXN0ZXJLZXkoKTtcbiAgaWYgKGtleVZhbHVlID09PSBtYXN0ZXJLZXkpIHtcbiAgICBpZiAoY2hlY2tJcChjbGllbnRJcCwgY29uZmlnLm1hc3RlcktleUlwcyB8fCBbXSwgY29uZmlnLm1hc3RlcktleUlwc1N0b3JlKSkge1xuICAgICAgcmV0dXJuIG5ldyBhdXRoLkF1dGgoeyBjb25maWcsIGluc3RhbGxhdGlvbklkLCBpc01hc3RlcjogdHJ1ZSB9KTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gY29uZmlnLmxvZ2dlckNvbnRyb2xsZXIgfHwgZGVmYXVsdExvZ2dlcjtcbiAgICBsb2cuZXJyb3IoXG4gICAgICBgUmVxdWVzdCB1c2luZyBtYXN0ZXIga2V5IHJlamVjdGVkIGFzIHRoZSByZXF1ZXN0IElQIGFkZHJlc3MgJyR7Y2xpZW50SXB9JyBpcyBub3Qgc2V0IGluIFBhcnNlIFNlcnZlciBvcHRpb24gJ21hc3RlcktleUlwcycuYFxuICAgICk7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvci5zdGF0dXMgPSA0MDM7XG4gICAgZXJyb3IubWVzc2FnZSA9ICd1bmF1dGhvcml6ZWQnO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIGlmIChcbiAgICBrZXlWYWx1ZSAmJlxuICAgIHR5cGVvZiBjb25maWcucmVhZE9ubHlNYXN0ZXJLZXkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgY29uZmlnLnJlYWRPbmx5TWFzdGVyS2V5ICYmXG4gICAga2V5VmFsdWUgPT09IGNvbmZpZy5yZWFkT25seU1hc3RlcktleVxuICApIHtcbiAgICBpZiAoY2hlY2tJcChjbGllbnRJcCwgY29uZmlnLnJlYWRPbmx5TWFzdGVyS2V5SXBzIHx8IFtdLCBjb25maWcucmVhZE9ubHlNYXN0ZXJLZXlJcHNTdG9yZSkpIHtcbiAgICAgIHJldHVybiBuZXcgYXV0aC5BdXRoKHsgY29uZmlnLCBpbnN0YWxsYXRpb25JZCwgaXNNYXN0ZXI6IHRydWUsIGlzUmVhZE9ubHk6IHRydWUgfSk7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IGNvbmZpZy5sb2dnZXJDb250cm9sbGVyIHx8IGRlZmF1bHRMb2dnZXI7XG4gICAgbG9nLmVycm9yKFxuICAgICAgYFJlcXVlc3QgdXNpbmcgcmVhZC1vbmx5IG1hc3RlciBrZXkgcmVqZWN0ZWQgYXMgdGhlIHJlcXVlc3QgSVAgYWRkcmVzcyAnJHtjbGllbnRJcH0nIGlzIG5vdCBzZXQgaW4gUGFyc2UgU2VydmVyIG9wdGlvbiAncmVhZE9ubHlNYXN0ZXJLZXlJcHMnLmBcbiAgICApO1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3Iuc3RhdHVzID0gNDAzO1xuICAgIGVycm9yLm1lc3NhZ2UgPSAndW5hdXRob3JpemVkJztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhcnNlQXV0aChhcHBJZCkge1xuICByZXR1cm4gYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgbW91bnQgPSBnZXRNb3VudEZvclJlcXVlc3QocmVxKTtcbiAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KGFwcElkLCBtb3VudCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuICAgIHJlcS5jb25maWcgPSBjb25maWc7XG4gICAgY29uc3QgY2xpZW50SXAgPSBnZXRDbGllbnRJcChyZXEpO1xuICAgIHJlcS5jb25maWcuaXAgPSBjbGllbnRJcDtcbiAgICBhd2FpdCBjb25maWcubG9hZEtleXMoKTtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVLZXlBdXRoKHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGtleVZhbHVlOiByZXEuZ2V0KCdYLVBhcnNlLU1hc3Rlci1LZXknKSB8fCBudWxsLFxuICAgICAgbWFpbnRlbmFuY2VLZXlWYWx1ZTogcmVxLmdldCgnWC1QYXJzZS1NYWludGVuYW5jZS1LZXknKSB8fCBudWxsLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IHJlcS5nZXQoJ1gtUGFyc2UtSW5zdGFsbGF0aW9uLUlkJykgfHwgJ2Nsb3VkJyxcbiAgICAgIGNsaWVudElwLFxuICAgIH0pO1xuICAgIGlmIChyZXNvbHZlZCkge1xuICAgICAgcmVxLmF1dGggPSByZXNvbHZlZDtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhcnNlSGVhbHRoKG9wdGlvbnMpIHtcbiAgcmV0dXJuIChyZXEsIHJlcykgPT4ge1xuICAgIHJlcy5zdGF0dXMob3B0aW9ucy5zdGF0ZSA9PT0gJ29rJyA/IDIwMCA6IDUwMyk7XG4gICAgaWYgKG9wdGlvbnMuc3RhdGUgPT09ICdzdGFydGluZycpIHtcbiAgICAgIHJlcy5zZXQoJ1JldHJ5LUFmdGVyJywgMSk7XG4gICAgfVxuICAgIHJlcy5qc29uKHtcbiAgICAgIHN0YXR1czogb3B0aW9ucy5zdGF0ZSxcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUm91dGVBbGxvd0xpc3RQYXRoKHBhdGgsIG1vdW50KSB7XG4gIGxldCBub3JtYWxpemVkID0gcGF0aDtcbiAgaWYgKG1vdW50KSB7XG4gICAgY29uc3QgbW91bnRQYXRoID0gbmV3IFVSTChtb3VudCkucGF0aG5hbWU7XG4gICAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChtb3VudFBhdGgpKSB7XG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcobW91bnRQYXRoLmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygxKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZC5lbmRzV2l0aCgnLycpKSB7XG4gICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIG5vcm1hbGl6ZWQubGVuZ3RoIC0gMSk7XG4gIH1cbiAgY29uc3QgcXVlcnlJbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZignPycpO1xuICBpZiAocXVlcnlJbmRleCAhPT0gLTEpIHtcbiAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgcXVlcnlJbmRleCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8vIENhY2hlIG9mIGNvbXBpbGVkIGV4YWN0LXJvdXRlIG1hdGNoZXJzLCBrZXllZCBieSByb3V0ZS4gTWlycm9ycyBob3cgYGFkZFJhdGVMaW1pdGAgY29tcGlsZXMgYVxuLy8gcm91dGUncyBgcGF0aFRvUmVnZXhwYCBvbmNlIGFuZCByZXVzZXMgaXQsIGF2b2lkaW5nIHJlY29tcGlsYXRpb24gb24gZXZlcnkgcmVxdWVzdC5cbmNvbnN0IGV4YWN0Um91dGVSZWdleHBDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGBwYXRoYCByZXNvbHZlcyB0byB0aGUgZ2l2ZW4gZXhhY3Qgc3RhdGljIGByb3V0ZWAsIHVzaW5nIHRoZSBzYW1lXG4gKiBgcGF0aC10by1yZWdleHBgIG1hdGNoaW5nIHRoYXQgdGhlIEV4cHJlc3Mgcm91dGVyIGFuZCB0aGUgcmF0ZSBsaW1pdGVyIHVzZSAoY2FzZS1pbnNlbnNpdGl2ZVxuICogYW5kIHRyYWlsaW5nLXNsYXNoLXRvbGVyYW50IGJ5IGRlZmF1bHQpLiBQYXRoLWxpdGVyYWwgY2hlY2tzIOKAlCBzdWNoIGFzIGRldGVjdGluZyBgL2xvZ2luYCB0b1xuICogZHJvcCB0aGUgaW5ib3VuZCBzZXNzaW9uIHRva2VuIOKAlCBtdXN0IHVzZSB0aGlzIHNvIHRoZXkgc3RheSBjb25zaXN0ZW50IHdpdGggaG93IHRoZSByb3V0ZXJcbiAqIGFjdHVhbGx5IGRpc3BhdGNoZXMgdGhlIHJlcXVlc3QsIGluc3RlYWQgb2YgcmUtZGVyaXZpbmcgdGhlIG1hdGNoaW5nIHJ1bGVzIGJ5IGhhbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcmVxdWVzdCBwYXRoIChlLmcuIGByZXEucGF0aGAgb3IgYSBiYXRjaCBzdWItcmVxdWVzdCByb3V0YWJsZSBwYXRoKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByb3V0ZSBUaGUgZXhhY3Qgc3RhdGljIHJvdXRlIHRvIG1hdGNoIChlLmcuIGAvbG9naW5gKS5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc0V4YWN0Um91dGUocGF0aCwgcm91dGUpIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIWV4YWN0Um91dGVSZWdleHBDYWNoZVtyb3V0ZV0pIHtcbiAgICBleGFjdFJvdXRlUmVnZXhwQ2FjaGVbcm91dGVdID0gcGF0aFRvUmVnZXhwKHJvdXRlKS5yZWdleHA7XG4gIH1cbiAgcmV0dXJuIGV4YWN0Um91dGVSZWdleHBDYWNoZVtyb3V0ZV0udGVzdChwYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUm91dGVBbGxvd2VkKHBhdGgsIGNvbmZpZywgYXV0aCkge1xuICBpZiAoIWNvbmZpZyB8fCBjb25maWcucm91dGVBbGxvd0xpc3QgPT09IHVuZGVmaW5lZCB8fCBjb25maWcucm91dGVBbGxvd0xpc3QgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYXV0aCAmJiAoYXV0aC5pc01hc3RlciB8fCBhdXRoLmlzTWFpbnRlbmFuY2UpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVJvdXRlQWxsb3dMaXN0UGF0aChwYXRoLCBjb25maWcubW91bnQpO1xuICBjb25zdCByZWdleGVzID0gY29uZmlnLl9yb3V0ZUFsbG93TGlzdFJlZ2V4IHx8IFtdO1xuICBmb3IgKGNvbnN0IHJlZ2V4IG9mIHJlZ2V4ZXMpIHtcbiAgICBpZiAocmVnZXgudGVzdChub3JtYWxpemVkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuZm9yY2VSb3V0ZUFsbG93TGlzdChyZXEsIHJlcywgbmV4dCkge1xuICBpZiAoaXNSb3V0ZUFsbG93ZWQocmVxLm9yaWdpbmFsVXJsLCByZXEuY29uZmlnLCByZXEuYXV0aCkpIHtcbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG4gIGNvbnN0IHBhdGggPSBub3JtYWxpemVSb3V0ZUFsbG93TGlzdFBhdGgocmVxLm9yaWdpbmFsVXJsLCByZXEuY29uZmlnPy5tb3VudCk7XG4gIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgYFJvdXRlIG5vdCBhbGxvd2VkIGJ5IHJvdXRlQWxsb3dMaXN0OiAke3JlcS5tZXRob2R9ICR7cGF0aH1gLFxuICAgIHJlcS5jb25maWdcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhcnNlRXJyb3JzKGVyciwgcmVxLCByZXMsIG5leHQpIHtcbiAgY29uc3QgbG9nID0gKHJlcS5jb25maWcgJiYgcmVxLmNvbmZpZy5sb2dnZXJDb250cm9sbGVyKSB8fCBkZWZhdWx0TG9nZ2VyO1xuICBpZiAoZXJyIGluc3RhbmNlb2YgUGFyc2UuRXJyb3IpIHtcbiAgICBpZiAocmVxLmNvbmZpZyAmJiByZXEuY29uZmlnLmVuYWJsZUV4cHJlc3NFcnJvckhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBuZXh0KGVycik7XG4gICAgfVxuICAgIGNvbnN0IHNpZ251cFVzZXJuYW1lVGFrZW5MZXZlbCA9XG4gICAgICByZXEuY29uZmlnPy5sb2dMZXZlbHM/LnNpZ251cFVzZXJuYW1lVGFrZW4gfHwgJ2luZm8nO1xuICAgIGxldCBodHRwU3RhdHVzO1xuICAgIC8vIFRPRE86IGZpbGwgb3V0IHRoaXMgbWFwcGluZ1xuICAgIHN3aXRjaCAoZXJyLmNvZGUpIHtcbiAgICAgIGNhc2UgUGFyc2UuRXJyb3IuSU5URVJOQUxfU0VSVkVSX0VSUk9SOlxuICAgICAgICBodHRwU3RhdHVzID0gNTAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORDpcbiAgICAgICAgaHR0cFN0YXR1cyA9IDQwNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBodHRwU3RhdHVzID0gNDAwO1xuICAgIH1cbiAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpO1xuICAgIHJlcy5qc29uKHsgY29kZTogZXJyLmNvZGUsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICBpZiAoZXJyLmNvZGUgPT09IFBhcnNlLkVycm9yLlVTRVJOQU1FX1RBS0VOKSB7XG4gICAgICBpZiAoc2lnbnVwVXNlcm5hbWVUYWtlbkxldmVsICE9PSAnc2lsZW50Jykge1xuICAgICAgICBjb25zdCBsb2dnZXJNZXRob2QgPVxuICAgICAgICAgIHR5cGVvZiBsb2dbc2lnbnVwVXNlcm5hbWVUYWtlbkxldmVsXSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBsb2dbc2lnbnVwVXNlcm5hbWVUYWtlbkxldmVsXS5iaW5kKGxvZylcbiAgICAgICAgICAgIDogbG9nLmVycm9yLmJpbmQobG9nKTtcbiAgICAgICAgbG9nZ2VyTWV0aG9kKCdQYXJzZSBlcnJvcjogJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmVycm9yKCdQYXJzZSBlcnJvcjogJywgZXJyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXJyLnN0YXR1cyAmJiBlcnIubWVzc2FnZSkge1xuICAgIHJlcy5zdGF0dXMoZXJyLnN0YXR1cyk7XG4gICAgcmVzLmpzb24oeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgaWYgKCEocHJvY2VzcyAmJiBwcm9jZXNzLmVudi5URVNUSU5HKSkge1xuICAgICAgbmV4dChlcnIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2cuZXJyb3IoJ1VuY2F1Z2h0IGludGVybmFsIHNlcnZlciBlcnJvci4nLCBlcnIsIGVyci5zdGFjayk7XG4gICAgcmVzLnN0YXR1cyg1MDApO1xuICAgIHJlcy5qc29uKHtcbiAgICAgIGNvZGU6IFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgIG1lc3NhZ2U6ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IuJyxcbiAgICB9KTtcbiAgICBpZiAoIShwcm9jZXNzICYmIHByb2Nlc3MuZW52LlRFU1RJTkcpKSB7XG4gICAgICBuZXh0KGVycik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmZvcmNlTWFzdGVyS2V5QWNjZXNzKHJlcSwgcmVzLCBuZXh0KSB7XG4gIGlmICghcmVxLmF1dGguaXNNYXN0ZXIpIHtcbiAgICBjb25zdCBlcnJvciA9IGNyZWF0ZVNhbml0aXplZEh0dHBFcnJvcig0MDMsICd1bmF1dGhvcml6ZWQ6IG1hc3RlciBrZXkgaXMgcmVxdWlyZWQnLCByZXEuY29uZmlnKTtcbiAgICByZXMuc3RhdHVzKGVycm9yLnN0YXR1cyk7XG4gICAgcmVzLmVuZChge1wiZXJyb3JcIjpcIiR7ZXJyb3IubWVzc2FnZX1cIn1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbmV4dCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MocmVxdWVzdCkge1xuICBpZiAoIXJlcXVlc3QuYXV0aC5pc01hc3Rlcikge1xuICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEh0dHBFcnJvcig0MDMsICd1bmF1dGhvcml6ZWQ6IG1hc3RlciBrZXkgaXMgcmVxdWlyZWQnLCByZXF1ZXN0LmNvbmZpZyk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5leHBvcnQgY29uc3QgYWRkUmF0ZUxpbWl0ID0gKHJvdXRlLCBjb25maWcsIGNsb3VkKSA9PiB7XG4gIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgIGNvbmZpZyA9IENvbmZpZy5nZXQoY29uZmlnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiByb3V0ZSkge1xuICAgIGlmICghUmF0ZUxpbWl0T3B0aW9uc1trZXldKSB7XG4gICAgICB0aHJvdyBgSW52YWxpZCByYXRlIGxpbWl0IG9wdGlvbiBcIiR7a2V5fVwiYDtcbiAgICB9XG4gIH1cbiAgaWYgKCFjb25maWcucmF0ZUxpbWl0cykge1xuICAgIGNvbmZpZy5yYXRlTGltaXRzID0gW107XG4gIH1cbiAgY29uc3QgcmVkaXNTdG9yZSA9IHtcbiAgICBjb25uZWN0aW9uUHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgc3RvcmU6IG51bGwsXG4gIH07XG4gIGlmIChyb3V0ZS5yZWRpc1VybCkge1xuICAgIGNvbnN0IGxvZyA9IGNvbmZpZz8ubG9nZ2VyQ29udHJvbGxlciB8fCBkZWZhdWx0TG9nZ2VyO1xuICAgIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUNsaWVudCh7XG4gICAgICB1cmw6IHJvdXRlLnJlZGlzVXJsLFxuICAgIH0pO1xuICAgIGNsaWVudC5vbignZXJyb3InLCBlcnIgPT4geyBsb2cuZXJyb3IoJ01pZGRsZXdhcmVzIGFkZFJhdGVMaW1pdCBSZWRpcyBjbGllbnQgZXJyb3InLCB7IGVycm9yOiBlcnIgfSkgfSk7XG4gICAgY2xpZW50Lm9uKCdjb25uZWN0JywgKCkgPT4geyB9KTtcbiAgICBjbGllbnQub24oJ3JlY29ubmVjdGluZycsICgpID0+IHsgfSk7XG4gICAgY2xpZW50Lm9uKCdyZWFkeScsICgpID0+IHsgfSk7XG4gICAgcmVkaXNTdG9yZS5jb25uZWN0aW9uUHJvbWlzZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChjbGllbnQuaXNPcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5lcnJvcihgQ291bGQgbm90IGNvbm5lY3QgdG8gcmVkaXNVUkwgaW4gcmF0ZSBsaW1pdDogJHtlfWApO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVkaXNTdG9yZS5jb25uZWN0aW9uUHJvbWlzZSgpO1xuICAgIHJlZGlzU3RvcmUuc3RvcmUgPSBuZXcgUmVkaXNTdG9yZSh7XG4gICAgICBzZW5kQ29tbWFuZDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgYXdhaXQgcmVkaXNTdG9yZS5jb25uZWN0aW9uUHJvbWlzZSgpO1xuICAgICAgICByZXR1cm4gY2xpZW50LnNlbmRDb21tYW5kKGFyZ3MpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBjb25maWcucmF0ZUxpbWl0cy5wdXNoKHtcbiAgICBwYXRoOiBwYXRoVG9SZWdleHAocm91dGUucmVxdWVzdFBhdGgpLFxuICAgIHJlcXVlc3RDb3VudDogcm91dGUucmVxdWVzdENvdW50LFxuICAgIHJlcXVlc3RNZXRob2RzOiByb3V0ZS5yZXF1ZXN0TWV0aG9kcyxcbiAgICBpbmNsdWRlTWFzdGVyS2V5OiByb3V0ZS5pbmNsdWRlTWFzdGVyS2V5LFxuICAgIGluY2x1ZGVJbnRlcm5hbFJlcXVlc3RzOiByb3V0ZS5pbmNsdWRlSW50ZXJuYWxSZXF1ZXN0cyxcbiAgICBlcnJvclJlc3BvbnNlTWVzc2FnZTogcm91dGUuZXJyb3JSZXNwb25zZU1lc3NhZ2UgfHwgUmF0ZUxpbWl0T3B0aW9ucy5lcnJvclJlc3BvbnNlTWVzc2FnZS5kZWZhdWx0LFxuICAgIGhhbmRsZXI6IHJhdGVMaW1pdCh7XG4gICAgICB3aW5kb3dNczogcm91dGUucmVxdWVzdFRpbWVXaW5kb3csXG4gICAgICBtYXg6IHJvdXRlLnJlcXVlc3RDb3VudCxcbiAgICAgIG1lc3NhZ2U6IHJvdXRlLmVycm9yUmVzcG9uc2VNZXNzYWdlIHx8IFJhdGVMaW1pdE9wdGlvbnMuZXJyb3JSZXNwb25zZU1lc3NhZ2UuZGVmYXVsdCxcbiAgICAgIGhhbmRsZXI6IChyZXF1ZXN0LCByZXNwb25zZSwgbmV4dCwgb3B0aW9ucykgPT4ge1xuICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuQ09OTkVDVElPTl9GQUlMRUQsXG4gICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHNraXA6IHJlcXVlc3QgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5pcCA9PT0gJzEyNy4wLjAuMScgJiYgIXJvdXRlLmluY2x1ZGVJbnRlcm5hbFJlcXVlc3RzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlLmluY2x1ZGVNYXN0ZXJLZXkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlLnJlcXVlc3RNZXRob2RzKSB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kc1RvQ2hlY2sgPSBuZXcgU2V0KFtyZXF1ZXN0Lm1ldGhvZF0pO1xuICAgICAgICAgIGlmIChyZXF1ZXN0Ll9iYXRjaE9yaWdpbmFsTWV0aG9kKSB7XG4gICAgICAgICAgICBtZXRob2RzVG9DaGVjay5hZGQocmVxdWVzdC5fYmF0Y2hPcmlnaW5hbE1ldGhvZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvdXRlLnJlcXVlc3RNZXRob2RzKSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZS5yZXF1ZXN0TWV0aG9kcy5zb21lKG0gPT4gbWV0aG9kc1RvQ2hlY2suaGFzKG0pKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChyb3V0ZS5yZXF1ZXN0TWV0aG9kcyk7XG4gICAgICAgICAgICBpZiAoIVsuLi5tZXRob2RzVG9DaGVja10uc29tZShtID0+IHJlZ0V4cC50ZXN0KG0pKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QuYXV0aD8uaXNNYXN0ZXI7XG4gICAgICB9LFxuICAgICAga2V5R2VuZXJhdG9yOiBhc3luYyByZXF1ZXN0ID0+IHtcbiAgICAgICAgaWYgKHJvdXRlLnpvbmUgPT09IFBhcnNlLlNlcnZlci5SYXRlTGltaXRab25lLmdsb2JhbCkge1xuICAgICAgICAgIHJldHVybiByZXF1ZXN0LmNvbmZpZy5hcHBJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbiA9IHJlcXVlc3QuaW5mby5zZXNzaW9uVG9rZW47XG4gICAgICAgIGlmIChyb3V0ZS56b25lID09PSBQYXJzZS5TZXJ2ZXIuUmF0ZUxpbWl0Wm9uZS5zZXNzaW9uICYmIHRva2VuKSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZS56b25lID09PSBQYXJzZS5TZXJ2ZXIuUmF0ZUxpbWl0Wm9uZS51c2VyICYmIHRva2VuKSB7XG4gICAgICAgICAgaWYgKCFyZXF1ZXN0LmF1dGgpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gaGFuZGxlUGFyc2VTZXNzaW9uKHJlcXVlc3QsIG51bGwsIHJlc29sdmUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcXVlc3QuYXV0aD8udXNlcj8uaWQgJiYgcm91dGUuem9uZSA9PT0gJ3VzZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5hdXRoLnVzZXIuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0LmNvbmZpZy5pcDtcbiAgICAgIH0sXG4gICAgICBzdG9yZTogcmVkaXNTdG9yZS5zdG9yZSxcbiAgICB9KSxcbiAgICBjbG91ZCxcbiAgfSk7XG4gIENvbmZpZy5wdXQoY29uZmlnKTtcbn07XG5cbi8qKlxuICogRGVkdXBsaWNhdGVzIGEgcmVxdWVzdCB0byBlbnN1cmUgaWRlbXBvdGVuY3kuIER1cGxpY2F0ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIHJlcXVlc3QgSURcbiAqIGluIHRoZSByZXF1ZXN0IGhlYWRlci4gSWYgYSByZXF1ZXN0IGhhcyBubyByZXF1ZXN0IElELCBpdCBpcyBleGVjdXRlZCBhbnl3YXkuXG4gKiBAcGFyYW0geyp9IHJlcSBUaGUgcmVxdWVzdCB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIFByb21pc2U8e30+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlRW5zdXJlSWRlbXBvdGVuY3kocmVxKSB7XG4gIC8vIEVuYWJsZSBmZWF0dXJlIG9ubHkgZm9yIE1vbmdvREJcbiAgaWYgKFxuICAgICEoXG4gICAgICByZXEuY29uZmlnLmRhdGFiYXNlLmFkYXB0ZXIgaW5zdGFuY2VvZiBNb25nb1N0b3JhZ2VBZGFwdGVyIHx8XG4gICAgICByZXEuY29uZmlnLmRhdGFiYXNlLmFkYXB0ZXIgaW5zdGFuY2VvZiBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gR2V0IHBhcmFtZXRlcnNcbiAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZztcbiAgY29uc3QgcmVxdWVzdElkID0gKChyZXEgfHwge30pLmhlYWRlcnMgfHwge30pWyd4LXBhcnNlLXJlcXVlc3QtaWQnXTtcbiAgY29uc3QgeyBwYXRocywgdHRsIH0gPSBjb25maWcuaWRlbXBvdGVuY3lPcHRpb25zO1xuICBpZiAoIXJlcXVlc3RJZCB8fCAhY29uZmlnLmlkZW1wb3RlbmN5T3B0aW9ucykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvLyBSZXF1ZXN0IHBhdGggbWF5IGNvbnRhaW4gdHJhaWxpbmcgc2xhc2hlcywgZGVwZW5kaW5nIG9uIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBzbyByZW1vdmVcbiAgLy8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyB0byBtYWtlIGl0IGVhc2llciB0byBzcGVjaWZ5IHBhdGhzIGluIHRoZSBjb25maWd1cmF0aW9uXG4gIGNvbnN0IHJlcVBhdGggPSByZXEucGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvLCAnJyk7XG4gIC8vIERldGVybWluZSB3aGV0aGVyIGlkZW1wb3RlbmN5IGlzIGVuYWJsZWQgZm9yIGN1cnJlbnQgcmVxdWVzdCBwYXRoXG4gIGxldCBtYXRjaCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBBc3N1bWUgb25lIHdhbnRzIGEgcGF0aCB0byBhbHdheXMgbWF0Y2ggZnJvbSB0aGUgYmVnaW5uaW5nIHRvIHByZXZlbnQgYW55IG1pc3Rha2VzXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdGguY2hhckF0KDApID09PSAnXicgPyBwYXRoIDogJ14nICsgcGF0aCk7XG4gICAgaWYgKHJlcVBhdGgubWF0Y2gocmVnZXgpKSB7XG4gICAgICBtYXRjaCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvLyBUcnkgdG8gc3RvcmUgcmVxdWVzdFxuICBjb25zdCBleHBpcnlEYXRlID0gbmV3IERhdGUobmV3IERhdGUoKS5zZXRTZWNvbmRzKG5ldyBEYXRlKCkuZ2V0U2Vjb25kcygpICsgdHRsKSk7XG4gIHJldHVybiByZXN0XG4gICAgLmNyZWF0ZShjb25maWcsIGF1dGgubWFzdGVyKGNvbmZpZyksICdfSWRlbXBvdGVuY3knLCB7XG4gICAgICByZXFJZDogcmVxdWVzdElkLFxuICAgICAgZXhwaXJlOiBQYXJzZS5fZW5jb2RlKGV4cGlyeURhdGUpLFxuICAgIH0pXG4gICAgLmNhdGNoKGUgPT4ge1xuICAgICAgaWYgKGUuY29kZSA9PSBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkRVUExJQ0FURV9SRVFVRVNULCAnRHVwbGljYXRlIHJlcXVlc3QnKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKSB7XG4gIHJlcy5zdGF0dXMoNDAzKTtcbiAgcmVzLmVuZCgne1wiZXJyb3JcIjpcInVuYXV0aG9yaXplZFwifScpO1xufVxuXG5mdW5jdGlvbiBtYWxmb3JtZWRDb250ZXh0KHJlcSwgcmVzKSB7XG4gIHJlcy5zdGF0dXMoNDAwKTtcbiAgcmVzLmpzb24oeyBjb2RlOiBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGVycm9yOiAnSW52YWxpZCBvYmplY3QgZm9yIGNvbnRleHQuJyB9KTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIDQgYWxsb3dlZCBhIGRvdWJsZSBmb3J3YXJkIHNsYXNoIGJldHdlZW4gYSByb3V0ZSBhbmQgcm91dGVyLiBBbHRob3VnaFxuICogdGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBhbnRpLXBhdHRlcm4sIHdlIG5lZWQgdG8gc3VwcG9ydCBpdCBmb3IgYmFja3dhcmRzXG4gKiBjb21wYXRpYmlsaXR5LlxuICpcbiAqIFRlY2huaWNhbGx5IHZhbGlkIFVSTCB3aXRoIGRvdWJsZSBmb3Jvd2FyZCBzbGFzaDpcbiAqIGh0dHA6Ly9sb2NhbGhvc3Q6MTMzNy9wYXJzZS8vZnVuY3Rpb25zL3Rlc3RGdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dEb3VibGVGb3J3YXJkU2xhc2gocmVxLCByZXMsIG5leHQpIHtcbiAgcmVxLnVybCA9IHJlcS51cmwuc3RhcnRzV2l0aCgnLy8nKSA/IHJlcS51cmwuc3Vic3RyaW5nKDEpIDogcmVxLnVybDtcbiAgbmV4dCgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxLQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxLQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxvQkFBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsdUJBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLGlCQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxZQUFBLEdBQUFWLE9BQUE7QUFDQSxJQUFBVyxhQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxlQUFBLEdBQUFiLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBYSxNQUFBLEdBQUFiLE9BQUE7QUFDQSxJQUFBYyxJQUFBLEdBQUFkLE9BQUE7QUFDQSxJQUFBZSxNQUFBLEdBQUFmLE9BQUE7QUFBeUUsU0FBQUQsdUJBQUFpQixDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRWxFLE1BQU1HLHVCQUF1QixHQUFB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QUFVLENBQUMsSUFBSUQsSUFBSSxDQUFDLENBQUMsQ0FBQ0UsVUFBVSxDQUFDLENBQUMsR0FBR1IsR0FBRyxDQUFDLENBQUM7RUFDakYsT0FBT1MsYUFBSSxDQUNSN0YsTUFBTSxDQUFDbEcsTUFBTSxFQUFFWSxhQUFJLENBQUNvTCxNQUFNLENBQUNoTSxNQUFNLENBQUMsRUFBRSxjQUFjLEVBQUU7SUFDbkRpTSxLQUFLLEVBQUViLFNBQVM7SUFDaEJjLE1BQU0sRUFBRTVMLGFBQUssQ0FBQzZMLE9BQU8sQ0FBQ1IsVUFBVTtFQUNsQyxDQUFDLENBQUMsQ0FDRFMsS0FBSyxDQUFDeFIsQ0FBQyxJQUFJO0lBQ1YsSUFBSUEsQ0FBQyxDQUFDeUYsSUFBSSxJQUFJQyxhQUFLLENBQUNDLEtBQUssQ0FBQzhMLGVBQWUsRUFBRTtNQUN6QyxNQUFNLElBQUkvTCxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUMrTCxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQztJQUMzRTtJQUNBLE1BQU0xUixDQUFDO0VBQ1QsQ0FBQyxDQUFDO0FBQ047QUFFQSxTQUFTa0UsY0FBY0EsQ0FBQzVELEdBQUcsRUFBRThCLEdBQUcsRUFBRTtFQUNoQ0EsR0FBRyxDQUFDbUQsTUFBTSxDQUFDLEdBQUcsQ0FBQztFQUNmbkQsR0FBRyxDQUFDNkssR0FBRyxDQUFDLDBCQUEwQixDQUFDO0FBQ3JDO0FBRUEsU0FBU25LLGdCQUFnQkEsQ0FBQ3hDLEdBQUcsRUFBRThCLEdBQUcsRUFBRTtFQUNsQ0EsR0FBRyxDQUFDbUQsTUFBTSxDQUFDLEdBQUcsQ0FBQztFQUNmbkQsR0FBRyxDQUFDb0QsSUFBSSxDQUFDO0lBQUVDLElBQUksRUFBRUMsYUFBSyxDQUFDQyxLQUFLLENBQUNnTSxZQUFZO0lBQUU5TCxLQUFLLEVBQUU7RUFBOEIsQ0FBQyxDQUFDO0FBQ3BGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTK0wsdUJBQXVCQSxDQUFDdFIsR0FBRyxFQUFFOEIsR0FBRyxFQUFFQyxJQUFJLEVBQUU7RUFDdEQvQixHQUFHLENBQUNJLEdBQUcsR0FBR0osR0FBRyxDQUFDSSxHQUFHLENBQUN3SyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUc1SyxHQUFHLENBQUNJLEdBQUcsQ0FBQ21JLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBR3ZJLEdBQUcsQ0FBQ0ksR0FBRztFQUNuRTJCLElBQUksQ0FBQyxDQUFDO0FBQ1IiLCJpZ25vcmVMaXN0IjpbXX0=
868
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2FjaGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9VdGlscyIsIl9ub2RlIiwiX0F1dGgiLCJfQ29uZmlnIiwiX2xvZ2dlciIsIl9yZXN0IiwiX01vbmdvU3RvcmFnZUFkYXB0ZXIiLCJfUG9zdGdyZXNTdG9yYWdlQWRhcHRlciIsIl9leHByZXNzUmF0ZUxpbWl0IiwiX0RlZmluaXRpb25zIiwiX3BhdGhUb1JlZ2V4cCIsIl9yYXRlTGltaXRSZWRpcyIsIl9yZWRpcyIsIl9uZXQiLCJfRXJyb3IiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJERUZBVUxUX0FMTE9XRURfSEVBREVSUyIsImV4cG9ydHMiLCJnZXRNb3VudEZvclJlcXVlc3QiLCJyZXEiLCJtb3VudFBhdGhMZW5ndGgiLCJvcmlnaW5hbFVybCIsImxlbmd0aCIsInVybCIsIm1vdW50UGF0aCIsInNsaWNlIiwicHJvdG9jb2wiLCJnZXQiLCJnZXRCbG9ja0xpc3QiLCJpcFJhbmdlTGlzdCIsInN0b3JlIiwiYmxvY2tMaXN0IiwiQmxvY2tMaXN0IiwiZm9yRWFjaCIsImZ1bGxJcCIsInNldCIsImlwIiwibWFzayIsInNwbGl0IiwiYWRkQWRkcmVzcyIsImlzSVB2NCIsImFkZFN1Ym5ldCIsIk51bWJlciIsImNoZWNrSXAiLCJpbmNvbWluZ0lwSXNWNCIsInJlc3VsdCIsImNoZWNrIiwiaW5jbHVkZXMiLCJoYW5kbGVQYXJzZUhlYWRlcnMiLCJyZXMiLCJuZXh0IiwibW91bnQiLCJjb250ZXh0IiwiSlNPTiIsInBhcnNlIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibWFsZm9ybWVkQ29udGV4dCIsImluZm8iLCJhcHBJZCIsInNlc3Npb25Ub2tlbiIsIm1hc3RlcktleSIsIm1haW50ZW5hbmNlS2V5IiwiaW5zdGFsbGF0aW9uSWQiLCJjbGllbnRLZXkiLCJqYXZhc2NyaXB0S2V5IiwiZG90TmV0S2V5IiwicmVzdEFQSUtleSIsImJhc2ljQXV0aCIsImh0dHBBdXRoIiwiYmFzaWNBdXRoQXBwSWQiLCJBcHBDYWNoZSIsImJvZHkiLCJfbm9Cb2R5IiwiZmlsZVZpYUpTT04iLCJCdWZmZXIiLCJpc0J1ZmZlciIsImludmFsaWRSZXF1ZXN0IiwiX1Jldm9jYWJsZVNlc3Npb24iLCJfQXBwbGljYXRpb25JZCIsIl9KYXZhU2NyaXB0S2V5IiwiX0NsaWVudFZlcnNpb24iLCJfSW5zdGFsbGF0aW9uSWQiLCJfU2Vzc2lvblRva2VuIiwiX01hc3RlcktleSIsIl9jb250ZXh0IiwiVXRpbHMiLCJpc09iamVjdCIsIl9Db250ZW50VHlwZSIsImhlYWRlcnMiLCJiYXNlNjQiLCJmaWxlRGF0YSIsImZyb20iLCJjbGllbnRJcCIsImdldENsaWVudElwIiwiY29uZmlnIiwiQ29uZmlnIiwic3RhdGUiLCJzdGF0dXMiLCJqc29uIiwiY29kZSIsIlBhcnNlIiwiRXJyb3IiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJlcnJvciIsImxvYWRLZXlzIiwiYXBwIiwiYXV0aCIsImlzTWFzdGVyIiwiaXNNYWludGVuYW5jZSIsInJlc29sdmVkIiwicmVzb2x2ZUtleUF1dGgiLCJrZXlWYWx1ZSIsIm1haW50ZW5hbmNlS2V5VmFsdWUiLCJoYW5kbGVSYXRlTGltaXQiLCJrZXlzIiwib25lS2V5Q29uZmlndXJlZCIsInNvbWUiLCJrZXkiLCJ1bmRlZmluZWQiLCJvbmVLZXlNYXRjaGVzIiwibWF0Y2hlc0V4YWN0Um91dGUiLCJwYXRoIiwidXNlckZyb21KV1QiLCJBdXRoIiwidXNlciIsInJhdGVMaW1pdHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwibGltaXQiLCJwYXRoRXhwIiwicmVnZXhwIiwidGVzdCIsIl9ncmFwaFFMUGF0aCIsImhhbmRsZXIiLCJlcnIiLCJDT05ORUNUSU9OX0ZBSUxFRCIsImxvZ2dlckNvbnRyb2xsZXIiLCJtZXNzYWdlIiwiaGFuZGxlUGFyc2VTZXNzaW9uIiwibWV0aG9kIiwicmVxdWVzdEF1dGgiLCJpbmRleE9mIiwiZ2V0QXV0aEZvckxlZ2FjeVNlc3Npb25Ub2tlbiIsImdldEF1dGhGb3JTZXNzaW9uVG9rZW4iLCJVTktOT1dOX0VSUk9SIiwiYXV0aG9yaXphdGlvbiIsImhlYWRlciIsImF1dGhQcmVmaXgiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwiZW5jb2RlZEF1dGgiLCJzdWJzdHJpbmciLCJjcmVkZW50aWFscyIsImRlY29kZUJhc2U2NCIsImpzS2V5UHJlZml4IiwibWF0Y2hLZXkiLCJzdHIiLCJhbGxvd0Nyb3NzRG9tYWluIiwiYWxsb3dIZWFkZXJzIiwiam9pbiIsImJhc2VPcmlnaW5zIiwiYWxsb3dPcmlnaW4iLCJyZXF1ZXN0T3JpZ2luIiwib3JpZ2luIiwiYWxsb3dPcmlnaW5zIiwic2VuZFN0YXR1cyIsImVuZm9yY2VQYXJzZWRCb2R5IiwiaGFzQm9keSIsImlzIiwiSU5WQUxJRF9KU09OIiwiYWxsb3dNZXRob2RPdmVycmlkZSIsIl9tZXRob2QiLCJvcmlnaW5hbE1ldGhvZCIsInRvVXBwZXJDYXNlIiwibWFpbnRlbmFuY2VLZXlJcHMiLCJtYWludGVuYW5jZUtleUlwc1N0b3JlIiwibG9nIiwiZGVmYXVsdExvZ2dlciIsImxvYWRNYXN0ZXJLZXkiLCJtYXN0ZXJLZXlJcHMiLCJtYXN0ZXJLZXlJcHNTdG9yZSIsInJlYWRPbmx5TWFzdGVyS2V5IiwicmVhZE9ubHlNYXN0ZXJLZXlJcHMiLCJyZWFkT25seU1hc3RlcktleUlwc1N0b3JlIiwiaXNSZWFkT25seSIsImhhbmRsZVBhcnNlQXV0aCIsImhhbmRsZVBhcnNlSGVhbHRoIiwib3B0aW9ucyIsIm5vcm1hbGl6ZVJvdXRlQWxsb3dMaXN0UGF0aCIsIm5vcm1hbGl6ZWQiLCJVUkwiLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsInF1ZXJ5SW5kZXgiLCJleGFjdFJvdXRlUmVnZXhwQ2FjaGUiLCJjcmVhdGUiLCJyb3V0ZSIsInBhdGhUb1JlZ2V4cCIsImlzUm91dGVBbGxvd2VkIiwicm91dGVBbGxvd0xpc3QiLCJyZWdleGVzIiwiX3JvdXRlQWxsb3dMaXN0UmVnZXgiLCJyZWdleCIsImVuZm9yY2VSb3V0ZUFsbG93TGlzdCIsImNyZWF0ZVNhbml0aXplZEVycm9yIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsImhhbmRsZVBhcnNlRXJyb3JzIiwiZW5hYmxlRXhwcmVzc0Vycm9ySGFuZGxlciIsInNpZ251cFVzZXJuYW1lVGFrZW5MZXZlbCIsImxvZ0xldmVscyIsInNpZ251cFVzZXJuYW1lVGFrZW4iLCJodHRwU3RhdHVzIiwiT0JKRUNUX05PVF9GT1VORCIsIlVTRVJOQU1FX1RBS0VOIiwibG9nZ2VyTWV0aG9kIiwiYmluZCIsInByb2Nlc3MiLCJlbnYiLCJURVNUSU5HIiwic3RhY2siLCJlbmZvcmNlTWFzdGVyS2V5QWNjZXNzIiwiY3JlYXRlU2FuaXRpemVkSHR0cEVycm9yIiwiZW5kIiwicHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MiLCJyZXF1ZXN0IiwicmVzb2x2ZSIsImlzSW50ZXJuYWxSZXF1ZXN0Iiwic29ja2V0IiwicmVtb3RlQWRkcmVzcyIsImFkZFJhdGVMaW1pdCIsImNsb3VkIiwiUmF0ZUxpbWl0T3B0aW9ucyIsInJlZGlzU3RvcmUiLCJjb25uZWN0aW9uUHJvbWlzZSIsInJlZGlzVXJsIiwiY2xpZW50IiwiY3JlYXRlQ2xpZW50Iiwib24iLCJpc09wZW4iLCJjb25uZWN0IiwiUmVkaXNTdG9yZSIsInNlbmRDb21tYW5kIiwiYXJncyIsInB1c2giLCJyZXF1ZXN0UGF0aCIsInJlcXVlc3RDb3VudCIsInJlcXVlc3RNZXRob2RzIiwiaW5jbHVkZU1hc3RlcktleSIsImluY2x1ZGVJbnRlcm5hbFJlcXVlc3RzIiwiZXJyb3JSZXNwb25zZU1lc3NhZ2UiLCJyYXRlTGltaXQiLCJ3aW5kb3dNcyIsInJlcXVlc3RUaW1lV2luZG93IiwibWF4IiwicmVzcG9uc2UiLCJza2lwIiwibWV0aG9kc1RvQ2hlY2siLCJTZXQiLCJfYmF0Y2hPcmlnaW5hbE1ldGhvZCIsImFkZCIsIkFycmF5IiwiaXNBcnJheSIsIm0iLCJoYXMiLCJyZWdFeHAiLCJSZWdFeHAiLCJrZXlHZW5lcmF0b3IiLCJ6b25lIiwiU2VydmVyIiwiUmF0ZUxpbWl0Wm9uZSIsImdsb2JhbCIsInRva2VuIiwic2Vzc2lvbiIsImlkIiwicHV0IiwicHJvbWlzZUVuc3VyZUlkZW1wb3RlbmN5IiwiZGF0YWJhc2UiLCJhZGFwdGVyIiwiTW9uZ29TdG9yYWdlQWRhcHRlciIsIlBvc3RncmVzU3RvcmFnZUFkYXB0ZXIiLCJyZXF1ZXN0SWQiLCJwYXRocyIsInR0bCIsImlkZW1wb3RlbmN5T3B0aW9ucyIsInJlcVBhdGgiLCJyZXBsYWNlIiwiY2hhckF0IiwiZXhwaXJ5RGF0ZSIsIkRhdGUiLCJzZXRTZWNvbmRzIiwiZ2V0U2Vjb25kcyIsInJlc3QiLCJtYXN0ZXIiLCJyZXFJZCIsImV4cGlyZSIsIl9lbmNvZGUiLCJjYXRjaCIsIkRVUExJQ0FURV9WQUxVRSIsIkRVUExJQ0FURV9SRVFVRVNUIiwiYWxsb3dEb3VibGVGb3J3YXJkU2xhc2giXSwic291cmNlcyI6WyIuLi9zcmMvbWlkZGxld2FyZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFwcENhY2hlIGZyb20gJy4vY2FjaGUnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vVXRpbHMnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IGF1dGggZnJvbSAnLi9BdXRoJztcbmltcG9ydCBDb25maWcgZnJvbSAnLi9Db25maWcnO1xuaW1wb3J0IGRlZmF1bHRMb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHJlc3QgZnJvbSAnLi9yZXN0JztcbmltcG9ydCBNb25nb1N0b3JhZ2VBZGFwdGVyIGZyb20gJy4vQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb1N0b3JhZ2VBZGFwdGVyJztcbmltcG9ydCBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyIGZyb20gJy4vQWRhcHRlcnMvU3RvcmFnZS9Qb3N0Z3Jlcy9Qb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyJztcbmltcG9ydCByYXRlTGltaXQgZnJvbSAnZXhwcmVzcy1yYXRlLWxpbWl0JztcbmltcG9ydCB7IFJhdGVMaW1pdE9wdGlvbnMgfSBmcm9tICcuL09wdGlvbnMvRGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgcGF0aFRvUmVnZXhwIH0gZnJvbSAncGF0aC10by1yZWdleHAnO1xuaW1wb3J0IFJlZGlzU3RvcmUgZnJvbSAncmF0ZS1saW1pdC1yZWRpcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnQgfSBmcm9tICdyZWRpcyc7XG5pbXBvcnQgeyBCbG9ja0xpc3QsIGlzSVB2NCB9IGZyb20gJ25ldCc7XG5pbXBvcnQgeyBjcmVhdGVTYW5pdGl6ZWRIdHRwRXJyb3IsIGNyZWF0ZVNhbml0aXplZEVycm9yIH0gZnJvbSAnLi9FcnJvcic7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FMTE9XRURfSEVBREVSUyA9XG4gICdYLVBhcnNlLU1hc3Rlci1LZXksIFgtUGFyc2UtUkVTVC1BUEktS2V5LCBYLVBhcnNlLUphdmFzY3JpcHQtS2V5LCBYLVBhcnNlLUFwcGxpY2F0aW9uLUlkLCBYLVBhcnNlLUNsaWVudC1WZXJzaW9uLCBYLVBhcnNlLVNlc3Npb24tVG9rZW4sIFgtUmVxdWVzdGVkLVdpdGgsIFgtUGFyc2UtUmV2b2NhYmxlLVNlc3Npb24sIFgtUGFyc2UtUmVxdWVzdC1JZCwgQ29udGVudC1UeXBlLCBQcmFnbWEsIENhY2hlLUNvbnRyb2wnO1xuXG5jb25zdCBnZXRNb3VudEZvclJlcXVlc3QgPSBmdW5jdGlvbiAocmVxKSB7XG4gIGNvbnN0IG1vdW50UGF0aExlbmd0aCA9IHJlcS5vcmlnaW5hbFVybC5sZW5ndGggLSByZXEudXJsLmxlbmd0aDtcbiAgY29uc3QgbW91bnRQYXRoID0gcmVxLm9yaWdpbmFsVXJsLnNsaWNlKDAsIG1vdW50UGF0aExlbmd0aCk7XG4gIHJldHVybiByZXEucHJvdG9jb2wgKyAnOi8vJyArIHJlcS5nZXQoJ2hvc3QnKSArIG1vdW50UGF0aDtcbn07XG5cbmNvbnN0IGdldEJsb2NrTGlzdCA9IChpcFJhbmdlTGlzdCwgc3RvcmUpID0+IHtcbiAgaWYgKHN0b3JlLmdldCgnYmxvY2tMaXN0JykpIHsgcmV0dXJuIHN0b3JlLmdldCgnYmxvY2tMaXN0Jyk7IH1cbiAgY29uc3QgYmxvY2tMaXN0ID0gbmV3IEJsb2NrTGlzdCgpO1xuICBpcFJhbmdlTGlzdC5mb3JFYWNoKGZ1bGxJcCA9PiB7XG4gICAgaWYgKGZ1bGxJcCA9PT0gJzo6LzAnIHx8IGZ1bGxJcCA9PT0gJzo6JyB8fCBmdWxsSXAgPT09ICc6OjAnKSB7XG4gICAgICBzdG9yZS5zZXQoJ2FsbG93QWxsSXB2NicsIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZnVsbElwID09PSAnMC4wLjAuMC8wJyB8fCBmdWxsSXAgPT09ICcwLjAuMC4wJykge1xuICAgICAgc3RvcmUuc2V0KCdhbGxvd0FsbElwdjQnLCB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW2lwLCBtYXNrXSA9IGZ1bGxJcC5zcGxpdCgnLycpO1xuICAgIGlmICghbWFzaykge1xuICAgICAgYmxvY2tMaXN0LmFkZEFkZHJlc3MoaXAsIGlzSVB2NChpcCkgPyAnaXB2NCcgOiAnaXB2NicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja0xpc3QuYWRkU3VibmV0KGlwLCBOdW1iZXIobWFzayksIGlzSVB2NChpcCkgPyAnaXB2NCcgOiAnaXB2NicpO1xuICAgIH1cbiAgfSk7XG4gIHN0b3JlLnNldCgnYmxvY2tMaXN0JywgYmxvY2tMaXN0KTtcbiAgcmV0dXJuIGJsb2NrTGlzdDtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja0lwID0gKGlwLCBpcFJhbmdlTGlzdCwgc3RvcmUpID0+IHtcbiAgY29uc3QgaW5jb21pbmdJcElzVjQgPSBpc0lQdjQoaXApO1xuICBjb25zdCBibG9ja0xpc3QgPSBnZXRCbG9ja0xpc3QoaXBSYW5nZUxpc3QsIHN0b3JlKTtcblxuICBpZiAoc3RvcmUuZ2V0KGlwKSkgeyByZXR1cm4gdHJ1ZTsgfVxuICBpZiAoc3RvcmUuZ2V0KCdhbGxvd0FsbElwdjQnKSAmJiBpbmNvbWluZ0lwSXNWNCkgeyByZXR1cm4gdHJ1ZTsgfVxuICBpZiAoc3RvcmUuZ2V0KCdhbGxvd0FsbElwdjYnKSAmJiAhaW5jb21pbmdJcElzVjQpIHsgcmV0dXJuIHRydWU7IH1cbiAgY29uc3QgcmVzdWx0ID0gYmxvY2tMaXN0LmNoZWNrKGlwLCBpbmNvbWluZ0lwSXNWNCA/ICdpcHY0JyA6ICdpcHY2Jyk7XG5cbiAgLy8gSWYgdGhlIGlwIGlzIGluIHRoZSBsaXN0LCB3ZSBzdG9yZSB0aGUgcmVzdWx0IGluIHRoZSBzdG9yZVxuICAvLyBzbyB3ZSBoYXZlIGEgb3B0aW1pemVkIHBhdGggZm9yIHRoZSBuZXh0IHJlcXVlc3RcbiAgaWYgKGlwUmFuZ2VMaXN0LmluY2x1ZGVzKGlwKSAmJiByZXN1bHQpIHtcbiAgICBzdG9yZS5zZXQoaXAsIHJlc3VsdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIENoZWNrcyB0aGF0IHRoZSByZXF1ZXN0IGlzIGF1dGhvcml6ZWQgZm9yIHRoaXMgYXBwIGFuZCBjaGVja3MgdXNlclxuLy8gYXV0aCB0b28uXG4vLyBUaGUgYm9keXBhcnNlciBzaG91bGQgcnVuIGJlZm9yZSB0aGlzIG1pZGRsZXdhcmUuXG4vLyBBZGRzIGluZm8gdG8gdGhlIHJlcXVlc3Q6XG4vLyByZXEuY29uZmlnIC0gdGhlIENvbmZpZyBmb3IgdGhpcyBhcHBcbi8vIHJlcS5hdXRoIC0gdGhlIEF1dGggZm9yIHRoaXMgcmVxdWVzdFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVBhcnNlSGVhZGVycyhyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgbW91bnQgPSBnZXRNb3VudEZvclJlcXVlc3QocmVxKTtcblxuICBsZXQgY29udGV4dCA9IHt9O1xuICBpZiAocmVxLmdldCgnWC1QYXJzZS1DbG91ZC1Db250ZXh0JykgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBjb250ZXh0ID0gSlNPTi5wYXJzZShyZXEuZ2V0KCdYLVBhcnNlLUNsb3VkLUNvbnRleHQnKSk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNvbnRleHQpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICB0aHJvdyAnQ29udGV4dCBpcyBub3QgYW4gb2JqZWN0JztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBtYWxmb3JtZWRDb250ZXh0KHJlcSwgcmVzKTtcbiAgICB9XG4gIH1cbiAgdmFyIGluZm8gPSB7XG4gICAgYXBwSWQ6IHJlcS5nZXQoJ1gtUGFyc2UtQXBwbGljYXRpb24tSWQnKSxcbiAgICBzZXNzaW9uVG9rZW46IHJlcS5nZXQoJ1gtUGFyc2UtU2Vzc2lvbi1Ub2tlbicpLFxuICAgIG1hc3RlcktleTogcmVxLmdldCgnWC1QYXJzZS1NYXN0ZXItS2V5JyksXG4gICAgbWFpbnRlbmFuY2VLZXk6IHJlcS5nZXQoJ1gtUGFyc2UtTWFpbnRlbmFuY2UtS2V5JyksXG4gICAgaW5zdGFsbGF0aW9uSWQ6IHJlcS5nZXQoJ1gtUGFyc2UtSW5zdGFsbGF0aW9uLUlkJyksXG4gICAgY2xpZW50S2V5OiByZXEuZ2V0KCdYLVBhcnNlLUNsaWVudC1LZXknKSxcbiAgICBqYXZhc2NyaXB0S2V5OiByZXEuZ2V0KCdYLVBhcnNlLUphdmFzY3JpcHQtS2V5JyksXG4gICAgZG90TmV0S2V5OiByZXEuZ2V0KCdYLVBhcnNlLVdpbmRvd3MtS2V5JyksXG4gICAgcmVzdEFQSUtleTogcmVxLmdldCgnWC1QYXJzZS1SRVNULUFQSS1LZXknKSxcbiAgICBjb250ZXh0OiBjb250ZXh0LFxuICB9O1xuXG4gIHZhciBiYXNpY0F1dGggPSBodHRwQXV0aChyZXEpO1xuXG4gIGlmIChiYXNpY0F1dGgpIHtcbiAgICB2YXIgYmFzaWNBdXRoQXBwSWQgPSBiYXNpY0F1dGguYXBwSWQ7XG4gICAgaWYgKEFwcENhY2hlLmdldChiYXNpY0F1dGhBcHBJZCkpIHtcbiAgICAgIGluZm8uYXBwSWQgPSBiYXNpY0F1dGhBcHBJZDtcbiAgICAgIGluZm8ubWFzdGVyS2V5ID0gYmFzaWNBdXRoLm1hc3RlcktleSB8fCBpbmZvLm1hc3RlcktleTtcbiAgICAgIGluZm8uamF2YXNjcmlwdEtleSA9IGJhc2ljQXV0aC5qYXZhc2NyaXB0S2V5IHx8IGluZm8uamF2YXNjcmlwdEtleTtcbiAgICB9XG4gIH1cblxuICBpZiAocmVxLmJvZHkpIHtcbiAgICAvLyBVbml0eSBTREsgc2VuZHMgYSBfbm9Cb2R5IGtleSB3aGljaCBuZWVkcyB0byBiZSByZW1vdmVkLlxuICAgIC8vIFVuY2xlYXIgYXQgdGhpcyBwb2ludCBpZiBhY3Rpb24gbmVlZHMgdG8gYmUgdGFrZW4uXG4gICAgZGVsZXRlIHJlcS5ib2R5Ll9ub0JvZHk7XG4gIH1cblxuICB2YXIgZmlsZVZpYUpTT04gPSBmYWxzZTtcblxuICBpZiAoIWluZm8uYXBwSWQgfHwgIUFwcENhY2hlLmdldChpbmZvLmFwcElkKSkge1xuICAgIC8vIFNlZSBpZiB3ZSBjYW4gZmluZCB0aGUgYXBwIGlkIG9uIHRoZSBib2R5LlxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIocmVxLmJvZHkpKSB7XG4gICAgICAvLyBUaGUgb25seSBjaGFuY2UgdG8gZmluZCB0aGUgYXBwIGlkIGlzIGlmIHRoaXMgaXMgYSBmaWxlXG4gICAgICAvLyB1cGxvYWQgdGhhdCBhY3R1YWxseSBpcyBhIEpTT04gYm9keS4gU28gdHJ5IHRvIHBhcnNlIGl0LlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BhcnNlLWNvbW11bml0eS9wYXJzZS1zZXJ2ZXIvaXNzdWVzLzY1ODlcbiAgICAgIC8vIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB0aGUgY2xpZW50IGlzIHRyeWluZyB0byB1cGxvYWQgYSBmaWxlIGJ1dCBmb3Jnb3RcbiAgICAgIC8vIHRvIHByb3ZpZGUgeC1wYXJzZS1hcHAtaWQgaW4gaGVhZGVyIGFuZCBwYXJzZSBhIGJpbmFyeSBmaWxlIHdpbGwgZmFpbFxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxLmJvZHkgPSBKU09OLnBhcnNlKHJlcS5ib2R5KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gaW52YWxpZFJlcXVlc3QocmVxLCByZXMpO1xuICAgICAgfVxuICAgICAgZmlsZVZpYUpTT04gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyZXEuYm9keSkge1xuICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9SZXZvY2FibGVTZXNzaW9uO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHJlcS5ib2R5ICYmXG4gICAgICByZXEuYm9keS5fQXBwbGljYXRpb25JZCAmJlxuICAgICAgQXBwQ2FjaGUuZ2V0KHJlcS5ib2R5Ll9BcHBsaWNhdGlvbklkKSAmJlxuICAgICAgKCFpbmZvLm1hc3RlcktleSB8fCBBcHBDYWNoZS5nZXQocmVxLmJvZHkuX0FwcGxpY2F0aW9uSWQpLm1hc3RlcktleSA9PT0gaW5mby5tYXN0ZXJLZXkpXG4gICAgKSB7XG4gICAgICBpbmZvLmFwcElkID0gcmVxLmJvZHkuX0FwcGxpY2F0aW9uSWQ7XG4gICAgICBpbmZvLmphdmFzY3JpcHRLZXkgPSByZXEuYm9keS5fSmF2YVNjcmlwdEtleSB8fCAnJztcbiAgICAgIGRlbGV0ZSByZXEuYm9keS5fQXBwbGljYXRpb25JZDtcbiAgICAgIGRlbGV0ZSByZXEuYm9keS5fSmF2YVNjcmlwdEtleTtcbiAgICAgIC8vIFRPRE86IHRlc3QgdGhhdCB0aGUgUkVTVCBBUEkgZm9ybWF0cyBnZW5lcmF0ZWQgYnkgdGhlIG90aGVyXG4gICAgICAvLyBTREtzIGFyZSBoYW5kbGVkIG9rXG4gICAgICBkZWxldGUgcmVxLmJvZHkuX0NsaWVudFZlcnNpb247XG4gICAgICBpZiAocmVxLmJvZHkuX0luc3RhbGxhdGlvbklkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxLmJvZHkuX0luc3RhbGxhdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBpbnZhbGlkUmVxdWVzdChyZXEsIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5pbnN0YWxsYXRpb25JZCA9IHJlcS5ib2R5Ll9JbnN0YWxsYXRpb25JZDtcbiAgICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9JbnN0YWxsYXRpb25JZDtcbiAgICAgIH1cbiAgICAgIGlmIChyZXEuYm9keS5fU2Vzc2lvblRva2VuKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxLmJvZHkuX1Nlc3Npb25Ub2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFJlcXVlc3QocmVxLCByZXMpO1xuICAgICAgICB9XG4gICAgICAgIGluZm8uc2Vzc2lvblRva2VuID0gcmVxLmJvZHkuX1Nlc3Npb25Ub2tlbjtcbiAgICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9TZXNzaW9uVG9rZW47XG4gICAgICB9XG4gICAgICBpZiAocmVxLmJvZHkuX01hc3RlcktleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcS5ib2R5Ll9NYXN0ZXJLZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLm1hc3RlcktleSA9IHJlcS5ib2R5Ll9NYXN0ZXJLZXk7XG4gICAgICAgIGRlbGV0ZSByZXEuYm9keS5fTWFzdGVyS2V5O1xuICAgICAgfVxuICAgICAgaWYgKHJlcS5ib2R5Ll9jb250ZXh0KSB7XG4gICAgICAgIGlmIChVdGlscy5pc09iamVjdChyZXEuYm9keS5fY29udGV4dCkpIHtcbiAgICAgICAgICBpbmZvLmNvbnRleHQgPSByZXEuYm9keS5fY29udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5mby5jb250ZXh0ID0gSlNPTi5wYXJzZShyZXEuYm9keS5fY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGluZm8uY29udGV4dCkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgICAgICAgIHRocm93ICdDb250ZXh0IGlzIG5vdCBhbiBvYmplY3QnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG1hbGZvcm1lZENvbnRleHQocmVxLCByZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgcmVxLmJvZHkuX2NvbnRleHQ7XG4gICAgICB9IGVsc2UgaWYgKHJlcS5ib2R5Ll9jb250ZXh0ID09PSBudWxsKSB7XG4gICAgICAgIC8vIG51bGwgY29udGV4dCBpcyBlcXVpdmFsZW50IHRvIG5vIGNvbnRleHRcbiAgICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9jb250ZXh0O1xuICAgICAgfVxuICAgICAgaWYgKHJlcS5ib2R5Ll9Db250ZW50VHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcS5ib2R5Ll9Db250ZW50VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFJlcXVlc3QocmVxLCByZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IHJlcS5ib2R5Ll9Db250ZW50VHlwZTtcbiAgICAgICAgZGVsZXRlIHJlcS5ib2R5Ll9Db250ZW50VHlwZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5mby5zZXNzaW9uVG9rZW4gJiYgdHlwZW9mIGluZm8uc2Vzc2lvblRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBpbnZhbGlkUmVxdWVzdChyZXEsIHJlcyk7XG4gIH1cblxuICBpZiAoZmlsZVZpYUpTT04gJiYgcmVxLmJvZHkpIHtcbiAgICBpZiAocmVxLmJvZHkuYmFzZTY0ICYmIHR5cGVvZiByZXEuYm9keS5iYXNlNjQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gaW52YWxpZFJlcXVlc3QocmVxLCByZXMpO1xuICAgIH1cbiAgICByZXEuZmlsZURhdGEgPSByZXEuYm9keS5maWxlRGF0YTtcbiAgICAvLyBXZSBuZWVkIHRvIHJlcG9wdWxhdGUgcmVxLmJvZHkgd2l0aCBhIGJ1ZmZlclxuICAgIHZhciBiYXNlNjQgPSByZXEuYm9keS5iYXNlNjQ7XG4gICAgcmVxLmJvZHkgPSBCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKTtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudElwID0gZ2V0Q2xpZW50SXAocmVxKTtcbiAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZyB8fCBDb25maWcuZ2V0KGluZm8uYXBwSWQsIG1vdW50KTtcbiAgaWYgKGNvbmZpZy5zdGF0ZSAmJiBjb25maWcuc3RhdGUgIT09ICdvaycpIHtcbiAgICByZXMuc3RhdHVzKDUwMCk7XG4gICAgcmVzLmpzb24oe1xuICAgICAgY29kZTogUGFyc2UuRXJyb3IuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgZXJyb3I6IGBJbnZhbGlkIHNlcnZlciBzdGF0ZTogJHtjb25maWcuc3RhdGV9YCxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFyZXEuY29uZmlnKSB7XG4gICAgYXdhaXQgY29uZmlnLmxvYWRLZXlzKCk7XG4gIH1cblxuICBpbmZvLmFwcCA9IEFwcENhY2hlLmdldChpbmZvLmFwcElkKTtcbiAgcmVxLmNvbmZpZyA9IGNvbmZpZztcbiAgcmVxLmNvbmZpZy5oZWFkZXJzID0gcmVxLmhlYWRlcnMgfHwge307XG4gIHJlcS5jb25maWcuaXAgPSBjbGllbnRJcDtcbiAgcmVxLmluZm8gPSBpbmZvO1xuXG4gIC8vIFNraXAga2V5IGRldGVjdGlvbiBpZiBhbHJlYWR5IHJlc29sdmVkIGJ5IGhhbmRsZVBhcnNlQXV0aCAoaGVhZGVyLWJhc2VkKS5cbiAgLy8gT25seSByZXNvbHZlIGhlcmUgZm9yIGJvZHktYmFzZWQgX01hc3RlcktleSAoaW5mby5tYXN0ZXJLZXkgbWF5IGNvbWUgZnJvbSBib2R5KS5cbiAgaWYgKCFyZXEuYXV0aCB8fCAoIXJlcS5hdXRoLmlzTWFzdGVyICYmICFyZXEuYXV0aC5pc01haW50ZW5hbmNlKSkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZUtleUF1dGgoe1xuICAgICAgY29uZmlnOiByZXEuY29uZmlnLFxuICAgICAga2V5VmFsdWU6IGluZm8ubWFzdGVyS2V5LFxuICAgICAgbWFpbnRlbmFuY2VLZXlWYWx1ZTogaW5mby5tYWludGVuYW5jZUtleSxcbiAgICAgIGluc3RhbGxhdGlvbklkOiBpbmZvLmluc3RhbGxhdGlvbklkLFxuICAgICAgY2xpZW50SXAsXG4gICAgfSk7XG4gICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICByZXEuYXV0aCA9IHJlc29sdmVkO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXEuYXV0aCAmJiAocmVxLmF1dGguaXNNYXN0ZXIgfHwgcmVxLmF1dGguaXNNYWludGVuYW5jZSkpIHtcbiAgICByZXR1cm4gaGFuZGxlUmF0ZUxpbWl0KHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8vIENsaWVudCBrZXlzIGFyZSBub3QgcmVxdWlyZWQgaW4gcGFyc2Utc2VydmVyLCBidXQgaWYgYW55IGhhdmUgYmVlbiBjb25maWd1cmVkIGluIHRoZSBzZXJ2ZXIsIHZhbGlkYXRlIHRoZW1cbiAgLy8gIHRvIHByZXNlcnZlIG9yaWdpbmFsIGJlaGF2aW9yLlxuICBjb25zdCBrZXlzID0gWydjbGllbnRLZXknLCAnamF2YXNjcmlwdEtleScsICdkb3ROZXRLZXknLCAncmVzdEFQSUtleSddO1xuICBjb25zdCBvbmVLZXlDb25maWd1cmVkID0ga2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gcmVxLmNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQ7XG4gIH0pO1xuICBjb25zdCBvbmVLZXlNYXRjaGVzID0ga2V5cy5zb21lKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gcmVxLmNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQgJiYgaW5mb1trZXldID09PSByZXEuY29uZmlnW2tleV07XG4gIH0pO1xuXG4gIGlmIChvbmVLZXlDb25maWd1cmVkICYmICFvbmVLZXlNYXRjaGVzKSB7XG4gICAgcmV0dXJuIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKTtcbiAgfVxuXG4gIGlmIChtYXRjaGVzRXhhY3RSb3V0ZShyZXEucGF0aCwgJy9sb2dpbicpKSB7XG4gICAgZGVsZXRlIGluZm8uc2Vzc2lvblRva2VuO1xuICB9XG5cbiAgaWYgKHJlcS51c2VyRnJvbUpXVCkge1xuICAgIHJlcS5hdXRoID0gbmV3IGF1dGguQXV0aCh7XG4gICAgICBjb25maWc6IHJlcS5jb25maWcsXG4gICAgICBpbnN0YWxsYXRpb25JZDogaW5mby5pbnN0YWxsYXRpb25JZCxcbiAgICAgIGlzTWFzdGVyOiBmYWxzZSxcbiAgICAgIHVzZXI6IHJlcS51c2VyRnJvbUpXVCxcbiAgICB9KTtcbiAgICByZXR1cm4gaGFuZGxlUmF0ZUxpbWl0KHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGlmICghaW5mby5zZXNzaW9uVG9rZW4pIHtcbiAgICByZXEuYXV0aCA9IG5ldyBhdXRoLkF1dGgoe1xuICAgICAgY29uZmlnOiByZXEuY29uZmlnLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IGluZm8uaW5zdGFsbGF0aW9uSWQsXG4gICAgICBpc01hc3RlcjogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlUmF0ZUxpbWl0KHJlcSwgcmVzLCBuZXh0KTtcbn1cblxuY29uc3QgaGFuZGxlUmF0ZUxpbWl0ID0gYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gIGNvbnN0IHJhdGVMaW1pdHMgPSByZXEuY29uZmlnLnJhdGVMaW1pdHMgfHwgW107XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByYXRlTGltaXRzLm1hcChhc3luYyBsaW1pdCA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGhFeHAgPSBsaW1pdC5wYXRoLnJlZ2V4cCB8fCBsaW1pdC5wYXRoO1xuICAgICAgICBpZiAocGF0aEV4cC50ZXN0KHJlcS5wYXRoKSB8fCAocmVxLl9ncmFwaFFMUGF0aCAmJiBwYXRoRXhwLnRlc3QocmVxLl9ncmFwaFFMUGF0aCkpKSB7XG4gICAgICAgICAgYXdhaXQgbGltaXQuaGFuZGxlcihyZXEsIHJlcywgZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgaWYgKGVyci5jb2RlID09PSBQYXJzZS5FcnJvci5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXEuY29uZmlnLmxvZ2dlckNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ0FuIHVua25vd24gZXJyb3Igb2NjdXJlZCB3aGVuIGF0dGVtcHRpbmcgdG8gYXBwbHkgdGhlIHJhdGUgbGltaXRlcjogJyxcbiAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcy5zdGF0dXMoNDI5KTtcbiAgICByZXMuanNvbih7IGNvZGU6IFBhcnNlLkVycm9yLkNPTk5FQ1RJT05fRkFJTEVELCBlcnJvcjogZXJyb3IubWVzc2FnZSB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgbmV4dCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZVBhcnNlU2Vzc2lvbiA9IGFzeW5jIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGluZm8gPSByZXEuaW5mbztcbiAgICBpZiAocmVxLmF1dGggfHwgKG1hdGNoZXNFeGFjdFJvdXRlKHJlcS5wYXRoLCAnL3Nlc3Npb25zL21lJykgJiYgcmVxLm1ldGhvZCA9PT0gJ0dFVCcpKSB7XG4gICAgICBuZXh0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCByZXF1ZXN0QXV0aCA9IG51bGw7XG4gICAgaWYgKFxuICAgICAgaW5mby5zZXNzaW9uVG9rZW4gJiZcbiAgICAgIG1hdGNoZXNFeGFjdFJvdXRlKHJlcS5wYXRoLCAnL3VwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24nKSAmJlxuICAgICAgaW5mby5zZXNzaW9uVG9rZW4uaW5kZXhPZigncjonKSAhPSAwXG4gICAgKSB7XG4gICAgICByZXF1ZXN0QXV0aCA9IGF3YWl0IGF1dGguZ2V0QXV0aEZvckxlZ2FjeVNlc3Npb25Ub2tlbih7XG4gICAgICAgIGNvbmZpZzogcmVxLmNvbmZpZyxcbiAgICAgICAgaW5zdGFsbGF0aW9uSWQ6IGluZm8uaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgIHNlc3Npb25Ub2tlbjogaW5mby5zZXNzaW9uVG9rZW4sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdEF1dGggPSBhd2FpdCBhdXRoLmdldEF1dGhGb3JTZXNzaW9uVG9rZW4oe1xuICAgICAgICBjb25maWc6IHJlcS5jb25maWcsXG4gICAgICAgIGluc3RhbGxhdGlvbklkOiBpbmZvLmluc3RhbGxhdGlvbklkLFxuICAgICAgICBzZXNzaW9uVG9rZW46IGluZm8uc2Vzc2lvblRva2VuLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcS5hdXRoID0gcmVxdWVzdEF1dGg7XG4gICAgbmV4dCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFBhcnNlLkVycm9yKSB7XG4gICAgICBuZXh0KGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTG9nIGZ1bGwgZXJyb3IgZGV0YWlscyBpbnRlcm5hbGx5LCBidXQgZG9uJ3QgZXhwb3NlIHRvIGNsaWVudFxuICAgIHJlcS5jb25maWcubG9nZ2VyQ29udHJvbGxlci5lcnJvcignZXJyb3IgZ2V0dGluZyBhdXRoIGZvciBzZXNzaW9uVG9rZW4nLCBlcnJvcik7XG4gICAgbmV4dChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVU5LTk9XTl9FUlJPUiwgJ1Vua25vd24gZXJyb3InKSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldENsaWVudElwKHJlcSkge1xuICByZXR1cm4gcmVxLmlwO1xufVxuXG5mdW5jdGlvbiBodHRwQXV0aChyZXEpIHtcbiAgaWYgKCEocmVxLnJlcSB8fCByZXEpLmhlYWRlcnMuYXV0aG9yaXphdGlvbikgeyByZXR1cm47IH1cblxuICB2YXIgaGVhZGVyID0gKHJlcS5yZXEgfHwgcmVxKS5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gIHZhciBhcHBJZCwgbWFzdGVyS2V5LCBqYXZhc2NyaXB0S2V5O1xuXG4gIC8vIHBhcnNlIGhlYWRlclxuICB2YXIgYXV0aFByZWZpeCA9ICdiYXNpYyAnO1xuXG4gIHZhciBtYXRjaCA9IGhlYWRlci50b0xvd2VyQ2FzZSgpLmluZGV4T2YoYXV0aFByZWZpeCk7XG5cbiAgaWYgKG1hdGNoID09IDApIHtcbiAgICB2YXIgZW5jb2RlZEF1dGggPSBoZWFkZXIuc3Vic3RyaW5nKGF1dGhQcmVmaXgubGVuZ3RoLCBoZWFkZXIubGVuZ3RoKTtcbiAgICB2YXIgY3JlZGVudGlhbHMgPSBkZWNvZGVCYXNlNjQoZW5jb2RlZEF1dGgpLnNwbGl0KCc6Jyk7XG5cbiAgICBpZiAoY3JlZGVudGlhbHMubGVuZ3RoID09IDIpIHtcbiAgICAgIGFwcElkID0gY3JlZGVudGlhbHNbMF07XG4gICAgICB2YXIga2V5ID0gY3JlZGVudGlhbHNbMV07XG5cbiAgICAgIHZhciBqc0tleVByZWZpeCA9ICdqYXZhc2NyaXB0LWtleT0nO1xuXG4gICAgICB2YXIgbWF0Y2hLZXkgPSBrZXkuaW5kZXhPZihqc0tleVByZWZpeCk7XG4gICAgICBpZiAobWF0Y2hLZXkgPT0gMCkge1xuICAgICAgICBqYXZhc2NyaXB0S2V5ID0ga2V5LnN1YnN0cmluZyhqc0tleVByZWZpeC5sZW5ndGgsIGtleS5sZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFzdGVyS2V5ID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFwcElkOiBhcHBJZCwgbWFzdGVyS2V5OiBtYXN0ZXJLZXksIGphdmFzY3JpcHRLZXk6IGphdmFzY3JpcHRLZXkgfTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlQmFzZTY0KHN0cikge1xuICByZXR1cm4gQnVmZmVyLmZyb20oc3RyLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93Q3Jvc3NEb21haW4oYXBwSWQpIHtcbiAgcmV0dXJuIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IENvbmZpZy5nZXQoYXBwSWQsIGdldE1vdW50Rm9yUmVxdWVzdChyZXEpKTtcbiAgICBsZXQgYWxsb3dIZWFkZXJzID0gREVGQVVMVF9BTExPV0VEX0hFQURFUlM7XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuYWxsb3dIZWFkZXJzKSB7XG4gICAgICBhbGxvd0hlYWRlcnMgKz0gYCwgJHtjb25maWcuYWxsb3dIZWFkZXJzLmpvaW4oJywgJyl9YDtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlT3JpZ2lucyA9XG4gICAgICB0eXBlb2YgY29uZmlnPy5hbGxvd09yaWdpbiA9PT0gJ3N0cmluZycgPyBbY29uZmlnLmFsbG93T3JpZ2luXSA6IGNvbmZpZz8uYWxsb3dPcmlnaW4gPz8gWycqJ107XG4gICAgY29uc3QgcmVxdWVzdE9yaWdpbiA9IHJlcS5oZWFkZXJzLm9yaWdpbjtcbiAgICBjb25zdCBhbGxvd09yaWdpbnMgPVxuICAgICAgcmVxdWVzdE9yaWdpbiAmJiBiYXNlT3JpZ2lucy5pbmNsdWRlcyhyZXF1ZXN0T3JpZ2luKSA/IHJlcXVlc3RPcmlnaW4gOiBiYXNlT3JpZ2luc1swXTtcbiAgICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCBhbGxvd09yaWdpbnMpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnLCAnR0VULFBVVCxQT1NULERFTEVURSxPUFRJT05TJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycycsIGFsbG93SGVhZGVycyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMnLCAnWC1QYXJzZS1Kb2ItU3RhdHVzLUlkLCBYLVBhcnNlLVB1c2gtU3RhdHVzLUlkJyk7XG4gICAgLy8gaW50ZXJjZXB0IE9QVElPTlMgbWV0aG9kXG4gICAgaWYgKCdPUFRJT05TJyA9PSByZXEubWV0aG9kKSB7XG4gICAgICByZXMuc2VuZFN0YXR1cygyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIGJvZHktcGFyc2VyIHNpbGVudGx5IHNraXBzIGEgcmVxdWVzdCB3aG9zZSBzb2NrZXQgaXMgbm8gbG9uZ2VyIHJlYWRhYmxlIHdoZW4gdGhlIHBhcnNlciBydW5zLFxuICogZS5nLiB0aGUgY2xpZW50IGNsb3NlZCB0aGUgY29ubmVjdGlvbiB3aGlsZSBhbiBhc3luYyBtaWRkbGV3YXJlIGJlZm9yZSBpdCB3YXMgcGVuZGluZywgd2hpY2hcbiAqIGxlYXZlcyBgcmVxLmJvZHlgIHVuZGVmaW5lZC4gU3VjaCBhIHJlcXVlc3QgbXVzdCBub3QgY29udGludWUsIG90aGVyd2lzZSBhIHF1ZXJ5IHNlbnQgYXMgYFBPU1RgXG4gKiB3aXRoIGBfbWV0aG9kOiAnR0VUJ2AgaW4gdGhlIGJvZHkgd291bGQgYmUgcm91dGVkIGFzIHRoZSBjcmVhdGlvbiBvZiBhbiBlbXB0eSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmZvcmNlUGFyc2VkQm9keShyZXEsIHJlcywgbmV4dCkge1xuICBjb25zdCBoYXNCb2R5ID1cbiAgICByZXEuaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXSAhPT0gdW5kZWZpbmVkIHx8IE51bWJlcihyZXEuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSkgPiAwO1xuICAvLyBNdWx0aXBhcnQgYm9kaWVzIGFyZSBpbnRlbnRpb25hbGx5IG5vdCBwYXJzZWQgYnkgdGhlIEpTT04gYm9keSBwYXJzZXJcbiAgaWYgKHJlcS5ib2R5ID09PSB1bmRlZmluZWQgJiYgaGFzQm9keSAmJiAhcmVxLmlzKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykpIHtcbiAgICByZXR1cm4gbmV4dChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnUmVxdWVzdCBib2R5IGNvdWxkIG5vdCBiZSByZWFkLicpKTtcbiAgfVxuICBuZXh0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd01ldGhvZE92ZXJyaWRlKHJlcSwgcmVzLCBuZXh0KSB7XG4gIGlmIChyZXEubWV0aG9kID09PSAnUE9TVCcgJiYgcmVxLmJvZHk/Ll9tZXRob2QpIHtcbiAgICBpZiAodHlwZW9mIHJlcS5ib2R5Ll9tZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXEub3JpZ2luYWxNZXRob2QgPSByZXEubWV0aG9kO1xuICAgICAgcmVxLm1ldGhvZCA9IHJlcS5ib2R5Ll9tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgZGVsZXRlIHJlcS5ib2R5Ll9tZXRob2Q7XG4gIH1cbiAgbmV4dCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlS2V5QXV0aCh7IGNvbmZpZywga2V5VmFsdWUsIG1haW50ZW5hbmNlS2V5VmFsdWUsIGluc3RhbGxhdGlvbklkLCBjbGllbnRJcCB9KSB7XG4gIGlmIChtYWludGVuYW5jZUtleVZhbHVlICYmIG1haW50ZW5hbmNlS2V5VmFsdWUgPT09IGNvbmZpZy5tYWludGVuYW5jZUtleSkge1xuICAgIGlmIChjaGVja0lwKGNsaWVudElwLCBjb25maWcubWFpbnRlbmFuY2VLZXlJcHMgfHwgW10sIGNvbmZpZy5tYWludGVuYW5jZUtleUlwc1N0b3JlKSkge1xuICAgICAgcmV0dXJuIG5ldyBhdXRoLkF1dGgoeyBjb25maWcsIGluc3RhbGxhdGlvbklkLCBpc01haW50ZW5hbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBjb25zdCBsb2cgPSBjb25maWcubG9nZ2VyQ29udHJvbGxlciB8fCBkZWZhdWx0TG9nZ2VyO1xuICAgIGxvZy5lcnJvcihcbiAgICAgIGBSZXF1ZXN0IHVzaW5nIG1haW50ZW5hbmNlIGtleSByZWplY3RlZCBhcyB0aGUgcmVxdWVzdCBJUCBhZGRyZXNzICcke2NsaWVudElwfScgaXMgbm90IHNldCBpbiBQYXJzZSBTZXJ2ZXIgb3B0aW9uICdtYWludGVuYW5jZUtleUlwcycuYFxuICAgICk7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvci5zdGF0dXMgPSA0MDM7XG4gICAgZXJyb3IubWVzc2FnZSA9ICd1bmF1dGhvcml6ZWQnO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIGNvbnN0IG1hc3RlcktleSA9IGF3YWl0IGNvbmZpZy5sb2FkTWFzdGVyS2V5KCk7XG4gIGlmIChrZXlWYWx1ZSA9PT0gbWFzdGVyS2V5KSB7XG4gICAgaWYgKGNoZWNrSXAoY2xpZW50SXAsIGNvbmZpZy5tYXN0ZXJLZXlJcHMgfHwgW10sIGNvbmZpZy5tYXN0ZXJLZXlJcHNTdG9yZSkpIHtcbiAgICAgIHJldHVybiBuZXcgYXV0aC5BdXRoKHsgY29uZmlnLCBpbnN0YWxsYXRpb25JZCwgaXNNYXN0ZXI6IHRydWUgfSk7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IGNvbmZpZy5sb2dnZXJDb250cm9sbGVyIHx8IGRlZmF1bHRMb2dnZXI7XG4gICAgbG9nLmVycm9yKFxuICAgICAgYFJlcXVlc3QgdXNpbmcgbWFzdGVyIGtleSByZWplY3RlZCBhcyB0aGUgcmVxdWVzdCBJUCBhZGRyZXNzICcke2NsaWVudElwfScgaXMgbm90IHNldCBpbiBQYXJzZSBTZXJ2ZXIgb3B0aW9uICdtYXN0ZXJLZXlJcHMnLmBcbiAgICApO1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgZXJyb3Iuc3RhdHVzID0gNDAzO1xuICAgIGVycm9yLm1lc3NhZ2UgPSAndW5hdXRob3JpemVkJztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBpZiAoXG4gICAga2V5VmFsdWUgJiZcbiAgICB0eXBlb2YgY29uZmlnLnJlYWRPbmx5TWFzdGVyS2V5ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIGNvbmZpZy5yZWFkT25seU1hc3RlcktleSAmJlxuICAgIGtleVZhbHVlID09PSBjb25maWcucmVhZE9ubHlNYXN0ZXJLZXlcbiAgKSB7XG4gICAgaWYgKGNoZWNrSXAoY2xpZW50SXAsIGNvbmZpZy5yZWFkT25seU1hc3RlcktleUlwcyB8fCBbXSwgY29uZmlnLnJlYWRPbmx5TWFzdGVyS2V5SXBzU3RvcmUpKSB7XG4gICAgICByZXR1cm4gbmV3IGF1dGguQXV0aCh7IGNvbmZpZywgaW5zdGFsbGF0aW9uSWQsIGlzTWFzdGVyOiB0cnVlLCBpc1JlYWRPbmx5OiB0cnVlIH0pO1xuICAgIH1cbiAgICBjb25zdCBsb2cgPSBjb25maWcubG9nZ2VyQ29udHJvbGxlciB8fCBkZWZhdWx0TG9nZ2VyO1xuICAgIGxvZy5lcnJvcihcbiAgICAgIGBSZXF1ZXN0IHVzaW5nIHJlYWQtb25seSBtYXN0ZXIga2V5IHJlamVjdGVkIGFzIHRoZSByZXF1ZXN0IElQIGFkZHJlc3MgJyR7Y2xpZW50SXB9JyBpcyBub3Qgc2V0IGluIFBhcnNlIFNlcnZlciBvcHRpb24gJ3JlYWRPbmx5TWFzdGVyS2V5SXBzJy5gXG4gICAgKTtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgIGVycm9yLnN0YXR1cyA9IDQwMztcbiAgICBlcnJvci5tZXNzYWdlID0gJ3VuYXV0aG9yaXplZCc7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXJzZUF1dGgoYXBwSWQpIHtcbiAgcmV0dXJuIGFzeW5jIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIGNvbnN0IG1vdW50ID0gZ2V0TW91bnRGb3JSZXF1ZXN0KHJlcSk7XG4gICAgY29uc3QgY29uZmlnID0gQ29uZmlnLmdldChhcHBJZCwgbW91bnQpO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cbiAgICByZXEuY29uZmlnID0gY29uZmlnO1xuICAgIGNvbnN0IGNsaWVudElwID0gZ2V0Q2xpZW50SXAocmVxKTtcbiAgICByZXEuY29uZmlnLmlwID0gY2xpZW50SXA7XG4gICAgYXdhaXQgY29uZmlnLmxvYWRLZXlzKCk7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlS2V5QXV0aCh7XG4gICAgICBjb25maWcsXG4gICAgICBrZXlWYWx1ZTogcmVxLmdldCgnWC1QYXJzZS1NYXN0ZXItS2V5JykgfHwgbnVsbCxcbiAgICAgIG1haW50ZW5hbmNlS2V5VmFsdWU6IHJlcS5nZXQoJ1gtUGFyc2UtTWFpbnRlbmFuY2UtS2V5JykgfHwgbnVsbCxcbiAgICAgIGluc3RhbGxhdGlvbklkOiByZXEuZ2V0KCdYLVBhcnNlLUluc3RhbGxhdGlvbi1JZCcpIHx8ICdjbG91ZCcsXG4gICAgICBjbGllbnRJcCxcbiAgICB9KTtcbiAgICBpZiAocmVzb2x2ZWQpIHtcbiAgICAgIHJlcS5hdXRoID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KCk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXJzZUhlYWx0aChvcHRpb25zKSB7XG4gIHJldHVybiAocmVxLCByZXMpID0+IHtcbiAgICByZXMuc3RhdHVzKG9wdGlvbnMuc3RhdGUgPT09ICdvaycgPyAyMDAgOiA1MDMpO1xuICAgIGlmIChvcHRpb25zLnN0YXRlID09PSAnc3RhcnRpbmcnKSB7XG4gICAgICByZXMuc2V0KCdSZXRyeS1BZnRlcicsIDEpO1xuICAgIH1cbiAgICByZXMuanNvbih7XG4gICAgICBzdGF0dXM6IG9wdGlvbnMuc3RhdGUsXG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlQWxsb3dMaXN0UGF0aChwYXRoLCBtb3VudCkge1xuICBsZXQgbm9ybWFsaXplZCA9IHBhdGg7XG4gIGlmIChtb3VudCkge1xuICAgIGNvbnN0IG1vdW50UGF0aCA9IG5ldyBVUkwobW91bnQpLnBhdGhuYW1lO1xuICAgIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgobW91bnRQYXRoKSkge1xuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKG1vdW50UGF0aC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMSk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWQuZW5kc1dpdGgoJy8nKSkge1xuICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygwLCBub3JtYWxpemVkLmxlbmd0aCAtIDEpO1xuICB9XG4gIGNvbnN0IHF1ZXJ5SW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoJz8nKTtcbiAgaWYgKHF1ZXJ5SW5kZXggIT09IC0xKSB7XG4gICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIHF1ZXJ5SW5kZXgpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyBDYWNoZSBvZiBjb21waWxlZCBleGFjdC1yb3V0ZSBtYXRjaGVycywga2V5ZWQgYnkgcm91dGUuIE1pcnJvcnMgaG93IGBhZGRSYXRlTGltaXRgIGNvbXBpbGVzIGFcbi8vIHJvdXRlJ3MgYHBhdGhUb1JlZ2V4cGAgb25jZSBhbmQgcmV1c2VzIGl0LCBhdm9pZGluZyByZWNvbXBpbGF0aW9uIG9uIGV2ZXJ5IHJlcXVlc3QuXG5jb25zdCBleGFjdFJvdXRlUmVnZXhwQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgcGF0aGAgcmVzb2x2ZXMgdG8gdGhlIGdpdmVuIGV4YWN0IHN0YXRpYyBgcm91dGVgLCB1c2luZyB0aGUgc2FtZVxuICogYHBhdGgtdG8tcmVnZXhwYCBtYXRjaGluZyB0aGF0IHRoZSBFeHByZXNzIHJvdXRlciBhbmQgdGhlIHJhdGUgbGltaXRlciB1c2UgKGNhc2UtaW5zZW5zaXRpdmVcbiAqIGFuZCB0cmFpbGluZy1zbGFzaC10b2xlcmFudCBieSBkZWZhdWx0KS4gUGF0aC1saXRlcmFsIGNoZWNrcyDigJQgc3VjaCBhcyBkZXRlY3RpbmcgYC9sb2dpbmAgdG9cbiAqIGRyb3AgdGhlIGluYm91bmQgc2Vzc2lvbiB0b2tlbiDigJQgbXVzdCB1c2UgdGhpcyBzbyB0aGV5IHN0YXkgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUgcm91dGVyXG4gKiBhY3R1YWxseSBkaXNwYXRjaGVzIHRoZSByZXF1ZXN0LCBpbnN0ZWFkIG9mIHJlLWRlcml2aW5nIHRoZSBtYXRjaGluZyBydWxlcyBieSBoYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHJlcXVlc3QgcGF0aCAoZS5nLiBgcmVxLnBhdGhgIG9yIGEgYmF0Y2ggc3ViLXJlcXVlc3Qgcm91dGFibGUgcGF0aCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm91dGUgVGhlIGV4YWN0IHN0YXRpYyByb3V0ZSB0byBtYXRjaCAoZS5nLiBgL2xvZ2luYCkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNFeGFjdFJvdXRlKHBhdGgsIHJvdXRlKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFleGFjdFJvdXRlUmVnZXhwQ2FjaGVbcm91dGVdKSB7XG4gICAgZXhhY3RSb3V0ZVJlZ2V4cENhY2hlW3JvdXRlXSA9IHBhdGhUb1JlZ2V4cChyb3V0ZSkucmVnZXhwO1xuICB9XG4gIHJldHVybiBleGFjdFJvdXRlUmVnZXhwQ2FjaGVbcm91dGVdLnRlc3QocGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JvdXRlQWxsb3dlZChwYXRoLCBjb25maWcsIGF1dGgpIHtcbiAgaWYgKCFjb25maWcgfHwgY29uZmlnLnJvdXRlQWxsb3dMaXN0ID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnJvdXRlQWxsb3dMaXN0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGF1dGggJiYgKGF1dGguaXNNYXN0ZXIgfHwgYXV0aC5pc01haW50ZW5hbmNlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVSb3V0ZUFsbG93TGlzdFBhdGgocGF0aCwgY29uZmlnLm1vdW50KTtcbiAgY29uc3QgcmVnZXhlcyA9IGNvbmZpZy5fcm91dGVBbGxvd0xpc3RSZWdleCB8fCBbXTtcbiAgZm9yIChjb25zdCByZWdleCBvZiByZWdleGVzKSB7XG4gICAgaWYgKHJlZ2V4LnRlc3Qobm9ybWFsaXplZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmZvcmNlUm91dGVBbGxvd0xpc3QocmVxLCByZXMsIG5leHQpIHtcbiAgaWYgKGlzUm91dGVBbGxvd2VkKHJlcS5vcmlnaW5hbFVybCwgcmVxLmNvbmZpZywgcmVxLmF1dGgpKSB7XG4gICAgcmV0dXJuIG5leHQoKTtcbiAgfVxuICBjb25zdCBwYXRoID0gbm9ybWFsaXplUm91dGVBbGxvd0xpc3RQYXRoKHJlcS5vcmlnaW5hbFVybCwgcmVxLmNvbmZpZz8ubW91bnQpO1xuICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgIGBSb3V0ZSBub3QgYWxsb3dlZCBieSByb3V0ZUFsbG93TGlzdDogJHtyZXEubWV0aG9kfSAke3BhdGh9YCxcbiAgICByZXEuY29uZmlnXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXJzZUVycm9ycyhlcnIsIHJlcSwgcmVzLCBuZXh0KSB7XG4gIGNvbnN0IGxvZyA9IChyZXEuY29uZmlnICYmIHJlcS5jb25maWcubG9nZ2VyQ29udHJvbGxlcikgfHwgZGVmYXVsdExvZ2dlcjtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIFBhcnNlLkVycm9yKSB7XG4gICAgaWYgKHJlcS5jb25maWcgJiYgcmVxLmNvbmZpZy5lbmFibGVFeHByZXNzRXJyb3JIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gbmV4dChlcnIpO1xuICAgIH1cbiAgICBjb25zdCBzaWdudXBVc2VybmFtZVRha2VuTGV2ZWwgPVxuICAgICAgcmVxLmNvbmZpZz8ubG9nTGV2ZWxzPy5zaWdudXBVc2VybmFtZVRha2VuIHx8ICdpbmZvJztcbiAgICBsZXQgaHR0cFN0YXR1cztcbiAgICAvLyBUT0RPOiBmaWxsIG91dCB0aGlzIG1hcHBpbmdcbiAgICBzd2l0Y2ggKGVyci5jb2RlKSB7XG4gICAgICBjYXNlIFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUjpcbiAgICAgICAgaHR0cFN0YXR1cyA9IDUwMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQ6XG4gICAgICAgIGh0dHBTdGF0dXMgPSA0MDQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaHR0cFN0YXR1cyA9IDQwMDtcbiAgICB9XG4gICAgcmVzLnN0YXR1cyhodHRwU3RhdHVzKTtcbiAgICByZXMuanNvbih7IGNvZGU6IGVyci5jb2RlLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgaWYgKGVyci5jb2RlID09PSBQYXJzZS5FcnJvci5VU0VSTkFNRV9UQUtFTikge1xuICAgICAgaWYgKHNpZ251cFVzZXJuYW1lVGFrZW5MZXZlbCAhPT0gJ3NpbGVudCcpIHtcbiAgICAgICAgY29uc3QgbG9nZ2VyTWV0aG9kID1cbiAgICAgICAgICB0eXBlb2YgbG9nW3NpZ251cFVzZXJuYW1lVGFrZW5MZXZlbF0gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gbG9nW3NpZ251cFVzZXJuYW1lVGFrZW5MZXZlbF0uYmluZChsb2cpXG4gICAgICAgICAgICA6IGxvZy5lcnJvci5iaW5kKGxvZyk7XG4gICAgICAgIGxvZ2dlck1ldGhvZCgnUGFyc2UgZXJyb3I6ICcsIGVycik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5lcnJvcignUGFyc2UgZXJyb3I6ICcsIGVycik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGVyci5zdGF0dXMgJiYgZXJyLm1lc3NhZ2UpIHtcbiAgICByZXMuc3RhdHVzKGVyci5zdGF0dXMpO1xuICAgIHJlcy5qc29uKHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgIGlmICghKHByb2Nlc3MgJiYgcHJvY2Vzcy5lbnYuVEVTVElORykpIHtcbiAgICAgIG5leHQoZXJyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9nLmVycm9yKCdVbmNhdWdodCBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IuJywgZXJyLCBlcnIuc3RhY2spO1xuICAgIHJlcy5zdGF0dXMoNTAwKTtcbiAgICByZXMuanNvbih7XG4gICAgICBjb2RlOiBQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICBtZXNzYWdlOiAnSW50ZXJuYWwgc2VydmVyIGVycm9yLicsXG4gICAgfSk7XG4gICAgaWYgKCEocHJvY2VzcyAmJiBwcm9jZXNzLmVudi5URVNUSU5HKSkge1xuICAgICAgbmV4dChlcnIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5mb3JjZU1hc3RlcktleUFjY2VzcyhyZXEsIHJlcywgbmV4dCkge1xuICBpZiAoIXJlcS5hdXRoLmlzTWFzdGVyKSB7XG4gICAgY29uc3QgZXJyb3IgPSBjcmVhdGVTYW5pdGl6ZWRIdHRwRXJyb3IoNDAzLCAndW5hdXRob3JpemVkOiBtYXN0ZXIga2V5IGlzIHJlcXVpcmVkJywgcmVxLmNvbmZpZyk7XG4gICAgcmVzLnN0YXR1cyhlcnJvci5zdGF0dXMpO1xuICAgIHJlcy5lbmQoYHtcImVycm9yXCI6XCIke2Vycm9yLm1lc3NhZ2V9XCJ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIG5leHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzKHJlcXVlc3QpIHtcbiAgaWYgKCFyZXF1ZXN0LmF1dGguaXNNYXN0ZXIpIHtcbiAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRIdHRwRXJyb3IoNDAzLCAndW5hdXRob3JpemVkOiBtYXN0ZXIga2V5IGlzIHJlcXVpcmVkJywgcmVxdWVzdC5jb25maWcpO1xuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByZXF1ZXN0IGlzIGFuIGludGVybmFsIHJlcXVlc3QsIGkuZS4gb25lIHRoYXQgb3JpZ2luYXRlcyBmcm9tIHRoZSBzYW1lIGhvc3RcbiAqIHdpdGhvdXQgcGFzc2luZyB0aHJvdWdoIGEgcHJveHksIHN1Y2ggYXMgYSBDbG91ZCBDb2RlIHJlcXVlc3QgdGhhdCBpcyByb3V0ZWQgdmlhIEhUVFAgd2hlbiB0aGVcbiAqIFBhcnNlIFNlcnZlciBvcHRpb24gYGRpcmVjdEFjY2Vzc2AgaXMgYGZhbHNlYC4gT25seSB0aGUgcmF3IHNvY2tldCBwZWVyIGFkZHJlc3MgaXMgY29uc3VsdGVkLFxuICogbmV2ZXIgYHJlcXVlc3QuaXBgOiB1bmRlciBhIHBlcm1pc3NpdmUgYHRydXN0UHJveHlgIHNldHRpbmcgRXhwcmVzcyByZXNvbHZlcyBgcmVxdWVzdC5pcGAgZnJvbVxuICogdGhlIGNsaWVudC1zdXBwbGllZCBgWC1Gb3J3YXJkZWQtRm9yYCBoZWFkZXIsIHNvIGEgcmVtb3RlIGNsaWVudCBjb3VsZCBvdGhlcndpc2UgcG9zZSBhcyBhblxuICogaW50ZXJuYWwgcmVxdWVzdC4gQSByZXF1ZXN0IHRoYXQgY2FycmllcyBhbiBgWC1Gb3J3YXJkZWQtRm9yYCBoZWFkZXIsIGV2ZW4gYW4gZW1wdHkgb25lLCBoYXMgYmVlblxuICogZm9yd2FyZGVkIGJ5IGEgcHJveHkgb3IgY3JhZnRlZCBieSBhIGNsaWVudCBhbmQgaXMgdGhlcmVmb3JlIG5ldmVyIGludGVybmFsLCBldmVuIGlmIGl0IGFycml2ZXNcbiAqIG92ZXIgYSBsb29wYmFjayBzb2NrZXQuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBUaGUgcmVxdWVzdCB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGludGVybmFsLlxuICovXG5jb25zdCBpc0ludGVybmFsUmVxdWVzdCA9IHJlcXVlc3QgPT5cbiAgcmVxdWVzdC5zb2NrZXQ/LnJlbW90ZUFkZHJlc3MgPT09ICcxMjcuMC4wLjEnICYmXG4gIHJlcXVlc3QuaGVhZGVycz8uWyd4LWZvcndhcmRlZC1mb3InXSA9PT0gdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3QgYWRkUmF0ZUxpbWl0ID0gKHJvdXRlLCBjb25maWcsIGNsb3VkKSA9PiB7XG4gIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgIGNvbmZpZyA9IENvbmZpZy5nZXQoY29uZmlnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiByb3V0ZSkge1xuICAgIGlmICghUmF0ZUxpbWl0T3B0aW9uc1trZXldKSB7XG4gICAgICB0aHJvdyBgSW52YWxpZCByYXRlIGxpbWl0IG9wdGlvbiBcIiR7a2V5fVwiYDtcbiAgICB9XG4gIH1cbiAgaWYgKCFjb25maWcucmF0ZUxpbWl0cykge1xuICAgIGNvbmZpZy5yYXRlTGltaXRzID0gW107XG4gIH1cbiAgY29uc3QgcmVkaXNTdG9yZSA9IHtcbiAgICBjb25uZWN0aW9uUHJvbWlzZTogUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgc3RvcmU6IG51bGwsXG4gIH07XG4gIGlmIChyb3V0ZS5yZWRpc1VybCkge1xuICAgIGNvbnN0IGxvZyA9IGNvbmZpZz8ubG9nZ2VyQ29udHJvbGxlciB8fCBkZWZhdWx0TG9nZ2VyO1xuICAgIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUNsaWVudCh7XG4gICAgICB1cmw6IHJvdXRlLnJlZGlzVXJsLFxuICAgIH0pO1xuICAgIGNsaWVudC5vbignZXJyb3InLCBlcnIgPT4geyBsb2cuZXJyb3IoJ01pZGRsZXdhcmVzIGFkZFJhdGVMaW1pdCBSZWRpcyBjbGllbnQgZXJyb3InLCB7IGVycm9yOiBlcnIgfSkgfSk7XG4gICAgY2xpZW50Lm9uKCdjb25uZWN0JywgKCkgPT4geyB9KTtcbiAgICBjbGllbnQub24oJ3JlY29ubmVjdGluZycsICgpID0+IHsgfSk7XG4gICAgY2xpZW50Lm9uKCdyZWFkeScsICgpID0+IHsgfSk7XG4gICAgcmVkaXNTdG9yZS5jb25uZWN0aW9uUHJvbWlzZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChjbGllbnQuaXNPcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5lcnJvcihgQ291bGQgbm90IGNvbm5lY3QgdG8gcmVkaXNVUkwgaW4gcmF0ZSBsaW1pdDogJHtlfWApO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVkaXNTdG9yZS5jb25uZWN0aW9uUHJvbWlzZSgpO1xuICAgIHJlZGlzU3RvcmUuc3RvcmUgPSBuZXcgUmVkaXNTdG9yZSh7XG4gICAgICBzZW5kQ29tbWFuZDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgYXdhaXQgcmVkaXNTdG9yZS5jb25uZWN0aW9uUHJvbWlzZSgpO1xuICAgICAgICByZXR1cm4gY2xpZW50LnNlbmRDb21tYW5kKGFyZ3MpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBjb25maWcucmF0ZUxpbWl0cy5wdXNoKHtcbiAgICBwYXRoOiBwYXRoVG9SZWdleHAocm91dGUucmVxdWVzdFBhdGgpLFxuICAgIHJlcXVlc3RDb3VudDogcm91dGUucmVxdWVzdENvdW50LFxuICAgIHJlcXVlc3RNZXRob2RzOiByb3V0ZS5yZXF1ZXN0TWV0aG9kcyxcbiAgICBpbmNsdWRlTWFzdGVyS2V5OiByb3V0ZS5pbmNsdWRlTWFzdGVyS2V5LFxuICAgIGluY2x1ZGVJbnRlcm5hbFJlcXVlc3RzOiByb3V0ZS5pbmNsdWRlSW50ZXJuYWxSZXF1ZXN0cyxcbiAgICBlcnJvclJlc3BvbnNlTWVzc2FnZTogcm91dGUuZXJyb3JSZXNwb25zZU1lc3NhZ2UgfHwgUmF0ZUxpbWl0T3B0aW9ucy5lcnJvclJlc3BvbnNlTWVzc2FnZS5kZWZhdWx0LFxuICAgIGhhbmRsZXI6IHJhdGVMaW1pdCh7XG4gICAgICB3aW5kb3dNczogcm91dGUucmVxdWVzdFRpbWVXaW5kb3csXG4gICAgICBtYXg6IHJvdXRlLnJlcXVlc3RDb3VudCxcbiAgICAgIG1lc3NhZ2U6IHJvdXRlLmVycm9yUmVzcG9uc2VNZXNzYWdlIHx8IFJhdGVMaW1pdE9wdGlvbnMuZXJyb3JSZXNwb25zZU1lc3NhZ2UuZGVmYXVsdCxcbiAgICAgIGhhbmRsZXI6IChyZXF1ZXN0LCByZXNwb25zZSwgbmV4dCwgb3B0aW9ucykgPT4ge1xuICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgY29kZTogUGFyc2UuRXJyb3IuQ09OTkVDVElPTl9GQUlMRUQsXG4gICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHNraXA6IHJlcXVlc3QgPT4ge1xuICAgICAgICBpZiAoIXJvdXRlLmluY2x1ZGVJbnRlcm5hbFJlcXVlc3RzICYmIGlzSW50ZXJuYWxSZXF1ZXN0KHJlcXVlc3QpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlLmluY2x1ZGVNYXN0ZXJLZXkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlLnJlcXVlc3RNZXRob2RzKSB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kc1RvQ2hlY2sgPSBuZXcgU2V0KFtyZXF1ZXN0Lm1ldGhvZF0pO1xuICAgICAgICAgIGlmIChyZXF1ZXN0Ll9iYXRjaE9yaWdpbmFsTWV0aG9kKSB7XG4gICAgICAgICAgICBtZXRob2RzVG9DaGVjay5hZGQocmVxdWVzdC5fYmF0Y2hPcmlnaW5hbE1ldGhvZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvdXRlLnJlcXVlc3RNZXRob2RzKSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZS5yZXF1ZXN0TWV0aG9kcy5zb21lKG0gPT4gbWV0aG9kc1RvQ2hlY2suaGFzKG0pKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChyb3V0ZS5yZXF1ZXN0TWV0aG9kcyk7XG4gICAgICAgICAgICBpZiAoIVsuLi5tZXRob2RzVG9DaGVja10uc29tZShtID0+IHJlZ0V4cC50ZXN0KG0pKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QuYXV0aD8uaXNNYXN0ZXI7XG4gICAgICB9LFxuICAgICAga2V5R2VuZXJhdG9yOiBhc3luYyByZXF1ZXN0ID0+IHtcbiAgICAgICAgaWYgKHJvdXRlLnpvbmUgPT09IFBhcnNlLlNlcnZlci5SYXRlTGltaXRab25lLmdsb2JhbCkge1xuICAgICAgICAgIHJldHVybiByZXF1ZXN0LmNvbmZpZy5hcHBJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbiA9IHJlcXVlc3QuaW5mby5zZXNzaW9uVG9rZW47XG4gICAgICAgIGlmIChyb3V0ZS56b25lID09PSBQYXJzZS5TZXJ2ZXIuUmF0ZUxpbWl0Wm9uZS5zZXNzaW9uICYmIHRva2VuKSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZS56b25lID09PSBQYXJzZS5TZXJ2ZXIuUmF0ZUxpbWl0Wm9uZS51c2VyICYmIHRva2VuKSB7XG4gICAgICAgICAgaWYgKCFyZXF1ZXN0LmF1dGgpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gaGFuZGxlUGFyc2VTZXNzaW9uKHJlcXVlc3QsIG51bGwsIHJlc29sdmUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcXVlc3QuYXV0aD8udXNlcj8uaWQgJiYgcm91dGUuem9uZSA9PT0gJ3VzZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5hdXRoLnVzZXIuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0LmNvbmZpZy5pcDtcbiAgICAgIH0sXG4gICAgICBzdG9yZTogcmVkaXNTdG9yZS5zdG9yZSxcbiAgICB9KSxcbiAgICBjbG91ZCxcbiAgfSk7XG4gIENvbmZpZy5wdXQoY29uZmlnKTtcbn07XG5cbi8qKlxuICogRGVkdXBsaWNhdGVzIGEgcmVxdWVzdCB0byBlbnN1cmUgaWRlbXBvdGVuY3kuIER1cGxpY2F0ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIHJlcXVlc3QgSURcbiAqIGluIHRoZSByZXF1ZXN0IGhlYWRlci4gSWYgYSByZXF1ZXN0IGhhcyBubyByZXF1ZXN0IElELCBpdCBpcyBleGVjdXRlZCBhbnl3YXkuXG4gKiBAcGFyYW0geyp9IHJlcSBUaGUgcmVxdWVzdCB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIFByb21pc2U8e30+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlRW5zdXJlSWRlbXBvdGVuY3kocmVxKSB7XG4gIC8vIEVuYWJsZSBmZWF0dXJlIG9ubHkgZm9yIE1vbmdvREJcbiAgaWYgKFxuICAgICEoXG4gICAgICByZXEuY29uZmlnLmRhdGFiYXNlLmFkYXB0ZXIgaW5zdGFuY2VvZiBNb25nb1N0b3JhZ2VBZGFwdGVyIHx8XG4gICAgICByZXEuY29uZmlnLmRhdGFiYXNlLmFkYXB0ZXIgaW5zdGFuY2VvZiBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gR2V0IHBhcmFtZXRlcnNcbiAgY29uc3QgY29uZmlnID0gcmVxLmNvbmZpZztcbiAgY29uc3QgcmVxdWVzdElkID0gKChyZXEgfHwge30pLmhlYWRlcnMgfHwge30pWyd4LXBhcnNlLXJlcXVlc3QtaWQnXTtcbiAgY29uc3QgeyBwYXRocywgdHRsIH0gPSBjb25maWcuaWRlbXBvdGVuY3lPcHRpb25zO1xuICBpZiAoIXJlcXVlc3RJZCB8fCAhY29uZmlnLmlkZW1wb3RlbmN5T3B0aW9ucykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvLyBSZXF1ZXN0IHBhdGggbWF5IGNvbnRhaW4gdHJhaWxpbmcgc2xhc2hlcywgZGVwZW5kaW5nIG9uIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCBzbyByZW1vdmVcbiAgLy8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyB0byBtYWtlIGl0IGVhc2llciB0byBzcGVjaWZ5IHBhdGhzIGluIHRoZSBjb25maWd1cmF0aW9uXG4gIGNvbnN0IHJlcVBhdGggPSByZXEucGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvLCAnJyk7XG4gIC8vIERldGVybWluZSB3aGV0aGVyIGlkZW1wb3RlbmN5IGlzIGVuYWJsZWQgZm9yIGN1cnJlbnQgcmVxdWVzdCBwYXRoXG4gIGxldCBtYXRjaCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBBc3N1bWUgb25lIHdhbnRzIGEgcGF0aCB0byBhbHdheXMgbWF0Y2ggZnJvbSB0aGUgYmVnaW5uaW5nIHRvIHByZXZlbnQgYW55IG1pc3Rha2VzXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdGguY2hhckF0KDApID09PSAnXicgPyBwYXRoIDogJ14nICsgcGF0aCk7XG4gICAgaWYgKHJlcVBhdGgubWF0Y2gocmVnZXgpKSB7XG4gICAgICBtYXRjaCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvLyBUcnkgdG8gc3RvcmUgcmVxdWVzdFxuICBjb25zdCBleHBpcnlEYXRlID0gbmV3IERhdGUobmV3IERhdGUoKS5zZXRTZWNvbmRzKG5ldyBEYXRlKCkuZ2V0U2Vjb25kcygpICsgdHRsKSk7XG4gIHJldHVybiByZXN0XG4gICAgLmNyZWF0ZShjb25maWcsIGF1dGgubWFzdGVyKGNvbmZpZyksICdfSWRlbXBvdGVuY3knLCB7XG4gICAgICByZXFJZDogcmVxdWVzdElkLFxuICAgICAgZXhwaXJlOiBQYXJzZS5fZW5jb2RlKGV4cGlyeURhdGUpLFxuICAgIH0pXG4gICAgLmNhdGNoKGUgPT4ge1xuICAgICAgaWYgKGUuY29kZSA9PSBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkRVUExJQ0FURV9SRVFVRVNULCAnRHVwbGljYXRlIHJlcXVlc3QnKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGludmFsaWRSZXF1ZXN0KHJlcSwgcmVzKSB7XG4gIHJlcy5zdGF0dXMoNDAzKTtcbiAgcmVzLmVuZCgne1wiZXJyb3JcIjpcInVuYXV0aG9yaXplZFwifScpO1xufVxuXG5mdW5jdGlvbiBtYWxmb3JtZWRDb250ZXh0KHJlcSwgcmVzKSB7XG4gIHJlcy5zdGF0dXMoNDAwKTtcbiAgcmVzLmpzb24oeyBjb2RlOiBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGVycm9yOiAnSW52YWxpZCBvYmplY3QgZm9yIGNvbnRleHQuJyB9KTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIDQgYWxsb3dlZCBhIGRvdWJsZSBmb3J3YXJkIHNsYXNoIGJldHdlZW4gYSByb3V0ZSBhbmQgcm91dGVyLiBBbHRob3VnaFxuICogdGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBhbnRpLXBhdHRlcm4sIHdlIG5lZWQgdG8gc3VwcG9ydCBpdCBmb3IgYmFja3dhcmRzXG4gKiBjb21wYXRpYmlsaXR5LlxuICpcbiAqIFRlY2huaWNhbGx5IHZhbGlkIFVSTCB3aXRoIGRvdWJsZSBmb3Jvd2FyZCBzbGFzaDpcbiAqIGh0dHA6Ly9sb2NhbGhvc3Q6MTMzNy9wYXJzZS8vZnVuY3Rpb25zL3Rlc3RGdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dEb3VibGVGb3J3YXJkU2xhc2gocmVxLCByZXMsIG5leHQpIHtcbiAgcmVxLnVybCA9IHJlcS51cmwuc3RhcnRzV2l0aCgnLy8nKSA/IHJlcS51cmwuc3Vic3RyaW5nKDEpIDogcmVxLnVybDtcbiAgbmV4dCgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsS0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sS0FBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sb0JBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLHVCQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxpQkFB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