serverless-spy 0.0.29 → 0.0.32

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.
@@ -15,13 +15,13 @@ async function createServerlessSpyListener(params) {
15
15
  connectionOpenResolve = resolve;
16
16
  });
17
17
  ws.on('open', () => {
18
- console.log('connected ' + new Date().toISOString());
18
+ //console.log('connected ' + new Date().toISOString());
19
19
  connectionOpenResolve(undefined);
20
20
  });
21
21
  ws.on('message', (data) => {
22
22
  if (closed)
23
23
  return;
24
- console.log(`From server: ${data}`);
24
+ //console.log(`From server: ${data}`);
25
25
  const message = JSON.parse(data.toString());
26
26
  message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');
27
27
  if (message.serviceKey.startsWith('Function')) {
@@ -129,9 +129,11 @@ async function createServerlessSpyListener(params) {
129
129
  tracker.functionContextAwsRequestId ===
130
130
  message.functionContextAwsRequestId) ||
131
131
  !tracker.functionContextAwsRequestId;
132
- if (tracker.functionContextAwsRequestId) {
133
- console.log(`${tracker.functionContextAwsRequestId} - ${message.functionContextAwsRequestId}`);
134
- }
132
+ // if (tracker.functionContextAwsRequestId) {
133
+ // console.log(
134
+ // `${tracker.functionContextAwsRequestId} - ${message.functionContextAwsRequestId}`
135
+ // );
136
+ // }
135
137
  return matchCondition && matchRequestId;
136
138
  }
137
139
  function createWaitForXXXFunc(serviceKeyForFunction, paramsW, functionContextAwsRequestId) {
@@ -151,7 +153,7 @@ async function createServerlessSpyListener(params) {
151
153
  if (tracker.finished)
152
154
  return;
153
155
  tracker.finished = true;
154
- tracker.promiseReject(new Error(`Timeout waiting for Serverless Spy message ${serviceKeyForFunction}`));
156
+ tracker.promiseReject(new Error(`Timeout waiting for Serverless Spy message ${serviceKeyForFunction}. Received messages so far:\n ${JSON.stringify(messages, null, 2)}`));
155
157
  }, paramsW?.timoutMs || 10000);
156
158
  promise.finally(() => {
157
159
  clearTimeout(timer);
@@ -164,4 +166,4 @@ async function createServerlessSpyListener(params) {
164
166
  }
165
167
  }
166
168
  exports.createServerlessSpyListener = createServerlessSpyListener;
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGlzdGVuZXIvY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJCQUErQjtBQUMvQiwrREFBNEQ7QUFXckQsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxNQUFtQztJQUVuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsaUNBQWUsRUFDckMsTUFBTSxDQUFDLGtCQUFrQixFQUN6QixNQUFNLENBQUMsV0FBVyxDQUNuQixDQUFDO0lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQXdCLEVBQUUsQ0FBQztJQUN6QyxJQUFJLFFBQVEsR0FBYyxFQUFFLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQztJQUNqQyxJQUFJLHFCQUErQyxDQUFDO0lBRXBELElBQUksaUJBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM5QyxxQkFBcUIsR0FBRyxPQUFPLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QixJQUFJLE1BQU07WUFBRSxPQUFPO1FBRW5CLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdC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QUM7WUFFSCxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDeEI7WUFFRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQXhPRCxrRUF3T0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcmVkZW50aWFscyB9IGZyb20gJ0Bhd3Mtc2RrL3R5cGVzJztcbmltcG9ydCB7IFdlYlNvY2tldCB9IGZyb20gJ3dzJztcbmltcG9ydCB7IGdldFdlYlNvY2tldFVybCB9IGZyb20gJy4uL2NvbW1vbi9nZXRXZWJTb2NrZXRVcmwnO1xuaW1wb3J0IHsgRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnQgfSBmcm9tICcuLi9jb21tb24vc3B5RXZlbnRzL0Z1bmN0aW9uUmVxdWVzdFNweUV2ZW50JztcbmltcG9ydCB7IFNweUV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9TcHlFdmVudCc7XG5pbXBvcnQgeyBTcHlNZXNzYWdlIH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9TcHlNZXNzYWdlJztcbmltcG9ydCB7IFNweUxpc3RlbmVyIH0gZnJvbSAnLi9TcHlMaXN0ZW5lcic7XG5cbnR5cGUgU2VydmVybGVzc1NweUxpc3RlbmVyUGFyYW1zID0ge1xuICBzZXJ2ZXJsZXNzU3B5V3NVcmw6IHN0cmluZztcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXJ2ZXJsZXNzU3B5TGlzdGVuZXI8VFNweUV2ZW50cz4oXG4gIHBhcmFtczogU2VydmVybGVzc1NweUxpc3RlbmVyUGFyYW1zXG4pIHtcbiAgY29uc3QgdXJsU2lnbmVkID0gYXdhaXQgZ2V0V2ViU29ja2V0VXJsKFxuICAgIHBhcmFtcy5zZXJ2ZXJsZXNzU3B5V3NVcmwsXG4gICAgcGFyYW1zLmNyZWRlbnRpYWxzXG4gICk7XG4gIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmxTaWduZWQpO1xuICBjb25zdCBtZXNzYWdlczogU3B5TWVzc2FnZVN0b3JhZ2VbXSA9IFtdO1xuICBsZXQgdHJhY2tlcnM6IFRyYWNrZXJbXSA9IFtdO1xuICBsZXQgY2xvc2VkID0gZmFsc2U7XG4gIGNvbnN0IGZ1bmN0aW9uUHJlZml4ID0gJ3dhaXRGb3InO1xuICBsZXQgY29ubmVjdGlvbk9wZW5SZXNvbHZlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQ7XG5cbiAgbGV0IHdhaXRGb3JDb25uZWN0aW9uID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25uZWN0aW9uT3BlblJlc29sdmUgPSByZXNvbHZlO1xuICB9KTtcblxuICB3cy5vbignb3BlbicsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnY29ubmVjdGVkICcgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICAgIGNvbm5lY3Rpb25PcGVuUmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9KTtcbiAgd3Mub24oJ21lc3NhZ2UnLCAoZGF0YSkgPT4ge1xuICAgIGlmIChjbG9zZWQpIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKGBGcm9tIHNlcnZlcjogJHtkYXRhfWApO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpKSBhcyBTcHlNZXNzYWdlU3RvcmFnZTtcblxuICAgIG1lc3NhZ2Uuc2VydmljZUtleUZvckZ1bmN0aW9uID0gbWVzc2FnZS5zZXJ2aWNlS2V5LnJlcGxhY2UoLyMvZywgJycpO1xuXG4gICAgaWYgKG1lc3NhZ2Uuc2VydmljZUtleS5zdGFydHNXaXRoKCdGdW5jdGlvbicpKSB7XG4gICAgICBtZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCA9IChcbiAgICAgICAgbWVzc2FnZS5kYXRhIGFzIEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50XG4gICAgICApLmNvbnRleHQuYXdzUmVxdWVzdElkO1xuICAgIH1cblxuICAgIG1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgcmVzb2x2ZU9sZFRyYWNrZXJXaXRoTmV3TWVzc2FnZShtZXNzYWdlKTtcbiAgfSk7XG4gIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBjbG9zZWQgPSB0cnVlO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZGlzY29ubmVjdGVkIFwiICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcbiAgfSk7XG5cbiAgY29uc3QgdHJhY2tlck1hdGNoTWVzc2FnZSA9IChcbiAgICB0cmFja2VyOiBUcmFja2VyLFxuICAgIG1lc3NhZ2U6IFNweU1lc3NhZ2VTdG9yYWdlXG4gICkgPT4ge1xuICAgIGlmICh0cmFja2VyLmZpbmlzaGVkKSByZXR1cm47XG5cbiAgICBpZiAoXG4gICAgICAodHJhY2tlci5zZXJ2aWNlS2V5ICYmIHRyYWNrZXIuc2VydmljZUtleSA9PT0gbWVzc2FnZS5zZXJ2aWNlS2V5KSB8fFxuICAgICAgKHRyYWNrZXIuc2VydmljZUtleUZvckZ1bmN0aW9uICYmXG4gICAgICAgIHRyYWNrZXIuc2VydmljZUtleUZvckZ1bmN0aW9uID09PSBtZXNzYWdlLnNlcnZpY2VLZXlGb3JGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIGlmICh0cmFja2VyTWF0Y2hDb25kaXRpb24odHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgdHJhY2tlci5maW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc3B5QW5kSmVzdE1hdGNoZXJzOiBhbnkgPSB7XG4gICAgICAgICAgZ2V0RGF0YTogKCkgPT4gbWVzc2FnZS5kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9IHRyYWNrZXIuc2VydmljZUtleUZvckZ1bmN0aW9uO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uICYmXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uLnN0YXJ0c1dpdGgoJ0Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAoc2VydmljZUtleUZvckZ1bmN0aW9uLmVuZHNXaXRoKCdSZXF1ZXN0JykgfHxcbiAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5lbmRzV2l0aCgnQ29uc29sZScpKVxuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgPSBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb247XG5cbiAgICAgICAgICBpZiAoc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UuZW5kc1dpdGgoJ1JlcXVlc3QnKSkge1xuICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgPVxuICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5sZW5ndGggLSAnUmVxdWVzdCcubGVuZ3RoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5lbmRzV2l0aCgnQ29uc29sZScpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSA9XG4gICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmxlbmd0aCAtICdDb25zb2xlJy5sZW5ndGhcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSArPSAnUmVzcG9uc2UnO1xuXG4gICAgICAgICAgc3B5QW5kSmVzdE1hdGNoZXJzLmZvbGxvd2VkQnlSZXNwb25zZSA9IChwYXJhbXNXOiBXYWl0Rm9yUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlV2FpdEZvclhYWEZ1bmMoXG4gICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLFxuICAgICAgICAgICAgICBwYXJhbXNXLFxuICAgICAgICAgICAgICAobWVzc2FnZS5kYXRhIGFzIEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50KS5jb250ZXh0LmF3c1JlcXVlc3RJZFxuICAgICAgICAgICAgKSgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShzcHlBbmRKZXN0TWF0Y2hlcnMsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICh0YXJnZXQ6IGFueSwgb2JqZWN0S2V5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkob2JqZWN0S2V5KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W29iamVjdEtleV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdEtleSAhPT0gJ3RoZW4nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgamVzdEZ1bmN0aW9uVG9FeGVjdXRlID0gKGV4cGVjdChtZXNzYWdlLmRhdGEpIGFzIGFueSlbXG4gICAgICAgICAgICAgICAgICBvYmplY3RLZXlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGplc3RGdW5jdGlvblRvRXhlY3V0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyYWNrZXIucHJvbWlzZVJlc29sdmUocHJveHkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHJlc29sdmVUcmFja2VySW5PbGRNZXNzYWdlcyA9ICh0cmFja2VyOiBUcmFja2VyKSA9PiB7XG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgICBpZiAodHJhY2tlck1hdGNoTWVzc2FnZSh0cmFja2VyLCBtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZU9sZFRyYWNrZXJXaXRoTmV3TWVzc2FnZSA9IChtZXNzYWdlOiBTcHlNZXNzYWdlU3RvcmFnZSkgPT4ge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja2Vycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRyYWNrZXIgPSB0cmFja2Vyc1tpbmRleF07XG4gICAgICBpZiAodHJhY2tlck1hdGNoTWVzc2FnZSh0cmFja2VyLCBtZXNzYWdlKSkge1xuICAgICAgICB0cmFja2VycyA9IHRyYWNrZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBzcHlMaXN0ZW5lciA9IHt9IGFzIFNweUxpc3RlbmVyPFRTcHlFdmVudHM+O1xuXG4gIHNweUxpc3RlbmVyLnN0b3AgPSAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICB3cy5jbG9zZSgpO1xuICB9O1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHNweUxpc3RlbmVyLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIG9iamVjdEtleTogc3RyaW5nKSB7XG4gICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KG9iamVjdEtleSkpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtvYmplY3RLZXldO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIG9iamVjdEtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgb2JqZWN0S2V5LnN0YXJ0c1dpdGgoZnVuY3Rpb25QcmVmaXgpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcGFyYW1zVyA9IGFyZ3VtZW50c1swXSBhcyBXYWl0Rm9yUGFyYW1zO1xuICAgICAgICBjb25zdCBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSBvYmplY3RLZXkuc3Vic3RyaW5nKFxuICAgICAgICAgIGZ1bmN0aW9uUHJlZml4Lmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVXYWl0Rm9yWFhYRnVuYyhzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24sIHBhcmFtc1cpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIGF3YWl0IHdhaXRGb3JDb25uZWN0aW9uO1xuXG4gIHJldHVybiBwcm94eSBhcyBTcHlMaXN0ZW5lcjxUU3B5RXZlbnRzPjtcblxuICBmdW5jdGlvbiB0cmFja2VyTWF0Y2hDb25kaXRpb24odHJhY2tlcjogVHJhY2tlciwgbWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpIHtcbiAgICBjb25zdCBtYXRjaENvbmRpdGlvbiA9XG4gICAgICAodHJhY2tlci5jb25kaXRpb24gJiYgdHJhY2tlci5jb25kaXRpb24obWVzc2FnZS5kYXRhKSkgfHxcbiAgICAgICF0cmFja2VyLmNvbmRpdGlvbjtcblxuICAgIGNvbnN0IG1hdGNoUmVxdWVzdElkID1cbiAgICAgICh0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCAmJlxuICAgICAgICB0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCA9PT1cbiAgICAgICAgICBtZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCkgfHxcbiAgICAgICF0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZDtcblxuICAgIGlmICh0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGAke3RyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkfSAtICR7bWVzc2FnZS5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hDb25kaXRpb24gJiYgbWF0Y2hSZXF1ZXN0SWQ7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVXYWl0Rm9yWFhYRnVuYyhcbiAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb246IHN0cmluZyxcbiAgICBwYXJhbXNXOiBXYWl0Rm9yUGFyYW1zPFNweUV2ZW50PixcbiAgICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IHRyYWNrZXI6IFRyYWNrZXI7XG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJhY2tlciA9IHtcbiAgICAgICAgZmluaXNoZWQ6IGZhbHNlLFxuICAgICAgICBwcm9taXNlUmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgcHJvbWlzZVJlamVjdDogcmVqZWN0LFxuICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24sXG4gICAgICAgIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gd2FpdEZvclhYWEZ1bmMoKSB7XG4gICAgICB0cmFja2VyLmNvbmRpdGlvbiA9IHBhcmFtc1c/LmNvbmRpdGlvbjtcblxuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRyYWNrZXIuZmluaXNoZWQpIHJldHVybjtcbiAgICAgICAgdHJhY2tlci5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHRyYWNrZXIucHJvbWlzZVJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGltZW91dCB3YWl0aW5nIGZvciBTZXJ2ZXJsZXNzIFNweSBtZXNzYWdlICR7c2VydmljZUtleUZvckZ1bmN0aW9ufWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9LCBwYXJhbXNXPy50aW1vdXRNcyB8fCAxMDAwMCk7XG5cbiAgICAgIHByb21pc2UuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNvbHZlVHJhY2tlckluT2xkTWVzc2FnZXModHJhY2tlcikpIHtcbiAgICAgICAgdHJhY2tlcnMucHVzaCh0cmFja2VyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRGb3JQYXJhbXM8VFNweUV2ZW50IGV4dGVuZHMgU3B5RXZlbnQgPSBTcHlFdmVudD4ge1xuICBjb25kaXRpb24/OiAoZXZlbnQ6IFRTcHlFdmVudCkgPT4gYm9vbGVhbjtcbiAgdGltb3V0TXM/OiBudW1iZXI7XG59XG5cbnR5cGUgVHJhY2tlciA9IHtcbiAgcHJvbWlzZVJlc29sdmU6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gIHByb21pc2VSZWplY3Q6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gIGZpbmlzaGVkOiBib29sZWFuO1xuICBzZXJ2aWNlS2V5Pzogc3RyaW5nO1xuICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24/OiBzdHJpbmc7XG4gIGNvbmRpdGlvbj86IChkYXRhOiBhbnkpID0+IGJvb2xlYW47XG4gIHRpbW91dE1zPzogbnVtYmVyO1xuICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG59O1xuXG50eXBlIFNweU1lc3NhZ2VTdG9yYWdlID0gU3B5TWVzc2FnZSAmIHtcbiAgc2VydmljZUtleUZvckZ1bmN0aW9uOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZD86IHN0cmluZztcbn07XG4iXX0=
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGlzdGVuZXIvY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJCQUErQjtBQUMvQiwrREFBNEQ7QUFXckQsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxNQUFtQztJQUVuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsaUNBQWUsRUFDckMsTUFBTSxDQUFDLGtCQUFrQixFQUN6QixNQUFNLENBQUMsV0FBVyxDQUNuQixDQUFDO0lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQXdCLEVBQUUsQ0FBQztJQUN6QyxJQUFJLFFBQVEsR0FBYyxFQUFFLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQztJQUNqQyxJQUFJLHFCQUErQyxDQUFDO0lBRXBELElBQUksaUJBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM5QyxxQkFBcUIsR0FBRyxPQUFPLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDakIsdURBQXVEO1FBQ3ZELHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QixJQUFJLE1BQU07WUFBRSxPQUFPO1FBRW5CLHNDQUFzQztRQUV0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBc0IsQ0FBQztRQUVqRSxPQUFP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QUM7UUFDakIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUE1T0Qsa0VBNE9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3JlZGVudGlhbHMgfSBmcm9tICdAYXdzLXNkay90eXBlcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXQgfSBmcm9tICd3cyc7XG5pbXBvcnQgeyBnZXRXZWJTb2NrZXRVcmwgfSBmcm9tICcuLi9jb21tb24vZ2V0V2ViU29ja2V0VXJsJztcbmltcG9ydCB7IEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9GdW5jdGlvblJlcXVlc3RTcHlFdmVudCc7XG5pbXBvcnQgeyBTcHlFdmVudCB9IGZyb20gJy4uL2NvbW1vbi9zcHlFdmVudHMvU3B5RXZlbnQnO1xuaW1wb3J0IHsgU3B5TWVzc2FnZSB9IGZyb20gJy4uL2NvbW1vbi9zcHlFdmVudHMvU3B5TWVzc2FnZSc7XG5pbXBvcnQgeyBTcHlMaXN0ZW5lciB9IGZyb20gJy4vU3B5TGlzdGVuZXInO1xuXG50eXBlIFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtcyA9IHtcbiAgc2VydmVybGVzc1NweVdzVXJsOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHM7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyPFRTcHlFdmVudHM+KFxuICBwYXJhbXM6IFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtc1xuKSB7XG4gIGNvbnN0IHVybFNpZ25lZCA9IGF3YWl0IGdldFdlYlNvY2tldFVybChcbiAgICBwYXJhbXMuc2VydmVybGVzc1NweVdzVXJsLFxuICAgIHBhcmFtcy5jcmVkZW50aWFsc1xuICApO1xuICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodXJsU2lnbmVkKTtcbiAgY29uc3QgbWVzc2FnZXM6IFNweU1lc3NhZ2VTdG9yYWdlW10gPSBbXTtcbiAgbGV0IHRyYWNrZXJzOiBUcmFja2VyW10gPSBbXTtcbiAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICBjb25zdCBmdW5jdGlvblByZWZpeCA9ICd3YWl0Rm9yJztcbiAgbGV0IGNvbm5lY3Rpb25PcGVuUmVzb2x2ZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuXG4gIGxldCB3YWl0Rm9yQ29ubmVjdGlvbiA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29ubmVjdGlvbk9wZW5SZXNvbHZlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgd3Mub24oJ29wZW4nLCAoKSA9PiB7XG4gICAgLy9jb25zb2xlLmxvZygnY29ubmVjdGVkICcgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICAgIGNvbm5lY3Rpb25PcGVuUmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9KTtcbiAgd3Mub24oJ21lc3NhZ2UnLCAoZGF0YSkgPT4ge1xuICAgIGlmIChjbG9zZWQpIHJldHVybjtcblxuICAgIC8vY29uc29sZS5sb2coYEZyb20gc2VydmVyOiAke2RhdGF9YCk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShkYXRhLnRvU3RyaW5nKCkpIGFzIFNweU1lc3NhZ2VTdG9yYWdlO1xuXG4gICAgbWVzc2FnZS5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSBtZXNzYWdlLnNlcnZpY2VLZXkucmVwbGFjZSgvIy9nLCAnJyk7XG5cbiAgICBpZiAobWVzc2FnZS5zZXJ2aWNlS2V5LnN0YXJ0c1dpdGgoJ0Z1bmN0aW9uJykpIHtcbiAgICAgIG1lc3NhZ2UuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkID0gKFxuICAgICAgICBtZXNzYWdlLmRhdGEgYXMgRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnRcbiAgICAgICkuY29udGV4dC5hd3NSZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgbWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICByZXNvbHZlT2xkVHJhY2tlcldpdGhOZXdNZXNzYWdlKG1lc3NhZ2UpO1xuICB9KTtcbiAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gICAgLy8gY29uc29sZS5sb2coXCJkaXNjb25uZWN0ZWQgXCIgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICB9KTtcblxuICBjb25zdCB0cmFja2VyTWF0Y2hNZXNzYWdlID0gKFxuICAgIHRyYWNrZXI6IFRyYWNrZXIsXG4gICAgbWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2VcbiAgKSA9PiB7XG4gICAgaWYgKHRyYWNrZXIuZmluaXNoZWQpIHJldHVybjtcblxuICAgIGlmIChcbiAgICAgICh0cmFja2VyLnNlcnZpY2VLZXkgJiYgdHJhY2tlci5zZXJ2aWNlS2V5ID09PSBtZXNzYWdlLnNlcnZpY2VLZXkpIHx8XG4gICAgICAodHJhY2tlci5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gJiZcbiAgICAgICAgdHJhY2tlci5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPT09IG1lc3NhZ2Uuc2VydmljZUtleUZvckZ1bmN0aW9uKVxuICAgICkge1xuICAgICAgaWYgKHRyYWNrZXJNYXRjaENvbmRpdGlvbih0cmFja2VyLCBtZXNzYWdlKSkge1xuICAgICAgICB0cmFja2VyLmZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBzcHlBbmRKZXN0TWF0Y2hlcnM6IGFueSA9IHtcbiAgICAgICAgICBnZXREYXRhOiAoKSA9PiBtZXNzYWdlLmRhdGEsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2VydmljZUtleUZvckZ1bmN0aW9uID0gdHJhY2tlci5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb247XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gJiZcbiAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24uc3RhcnRzV2l0aCgnRnVuY3Rpb24nKSAmJlxuICAgICAgICAgIChzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24uZW5kc1dpdGgoJ1JlcXVlc3QnKSB8fFxuICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uLmVuZHNXaXRoKCdDb25zb2xlJykpXG4gICAgICAgICkge1xuICAgICAgICAgIGxldCBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSA9IHNlcnZpY2VLZXlGb3JGdW5jdGlvbjtcblxuICAgICAgICAgIGlmIChzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5lbmRzV2l0aCgnUmVxdWVzdCcpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSA9XG4gICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmxlbmd0aCAtICdSZXF1ZXN0Jy5sZW5ndGhcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmVuZHNXaXRoKCdDb25zb2xlJykpIHtcbiAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlID1cbiAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2Uuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UubGVuZ3RoIC0gJ0NvbnNvbGUnLmxlbmd0aFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlICs9ICdSZXNwb25zZSc7XG5cbiAgICAgICAgICBzcHlBbmRKZXN0TWF0Y2hlcnMuZm9sbG93ZWRCeVJlc3BvbnNlID0gKHBhcmFtc1c6IFdhaXRGb3JQYXJhbXMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVXYWl0Rm9yWFhYRnVuYyhcbiAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UsXG4gICAgICAgICAgICAgIHBhcmFtc1csXG4gICAgICAgICAgICAgIChtZXNzYWdlLmRhdGEgYXMgRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnQpLmNvbnRleHQuYXdzUmVxdWVzdElkXG4gICAgICAgICAgICApKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHNweUFuZEplc3RNYXRjaGVycywge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKHRhcmdldDogYW55LCBvYmplY3RLZXk6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShvYmplY3RLZXkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbb2JqZWN0S2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0S2V5ICE9PSAndGhlbicpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqZXN0RnVuY3Rpb25Ub0V4ZWN1dGUgPSAoZXhwZWN0KG1lc3NhZ2UuZGF0YSkgYXMgYW55KVtcbiAgICAgICAgICAgICAgICAgIG9iamVjdEtleVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgamVzdEZ1bmN0aW9uVG9FeGVjdXRlLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhY2tlci5wcm9taXNlUmVzb2x2ZShwcm94eSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzID0gKHRyYWNrZXI6IFRyYWNrZXIpID0+IHtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICAgIGlmICh0cmFja2VyTWF0Y2hNZXNzYWdlKHRyYWNrZXIsIG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCByZXNvbHZlT2xkVHJhY2tlcldpdGhOZXdNZXNzYWdlID0gKG1lc3NhZ2U6IFNweU1lc3NhZ2VTdG9yYWdlKSA9PiB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgdHJhY2tlciA9IHRyYWNrZXJzW2luZGV4XTtcbiAgICAgIGlmICh0cmFja2VyTWF0Y2hNZXNzYWdlKHRyYWNrZXIsIG1lc3NhZ2UpKSB7XG4gICAgICAgIHRyYWNrZXJzID0gdHJhY2tlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHNweUxpc3RlbmVyID0ge30gYXMgU3B5TGlzdGVuZXI8VFNweUV2ZW50cz47XG5cbiAgc3B5TGlzdGVuZXIuc3RvcCA9ICgpID0+IHtcbiAgICBjbG9zZWQgPSB0cnVlO1xuICAgIHdzLmNsb3NlKCk7XG4gIH07XG5cbiAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoc3B5TGlzdGVuZXIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICh0YXJnZXQ6IGFueSwgb2JqZWN0S2V5OiBzdHJpbmcpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkob2JqZWN0S2V5KSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0W29iamVjdEtleV07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2Ygb2JqZWN0S2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBvYmplY3RLZXkuc3RhcnRzV2l0aChmdW5jdGlvblByZWZpeClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwYXJhbXNXID0gYXJndW1lbnRzWzBdIGFzIFdhaXRGb3JQYXJhbXM7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9IG9iamVjdEtleS5zdWJzdHJpbmcoXG4gICAgICAgICAgZnVuY3Rpb25QcmVmaXgubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZVdhaXRGb3JYWFhGdW5jKHNlcnZpY2VLZXlGb3JGdW5jdGlvbiwgcGFyYW1zVyk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgYXdhaXQgd2FpdEZvckNvbm5lY3Rpb247XG5cbiAgcmV0dXJuIHByb3h5IGFzIFNweUxpc3RlbmVyPFRTcHlFdmVudHM+O1xuXG4gIGZ1bmN0aW9uIHRyYWNrZXJNYXRjaENvbmRpdGlvbih0cmFja2VyOiBUcmFja2VyLCBtZXNzYWdlOiBTcHlNZXNzYWdlU3RvcmFnZSkge1xuICAgIGNvbnN0IG1hdGNoQ29uZGl0aW9uID1cbiAgICAgICh0cmFja2VyLmNvbmRpdGlvbiAmJiB0cmFja2VyLmNvbmRpdGlvbihtZXNzYWdlLmRhdGEpKSB8fFxuICAgICAgIXRyYWNrZXIuY29uZGl0aW9uO1xuXG4gICAgY29uc3QgbWF0Y2hSZXF1ZXN0SWQgPVxuICAgICAgKHRyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkICYmXG4gICAgICAgIHRyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkID09PVxuICAgICAgICAgIG1lc3NhZ2UuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkKSB8fFxuICAgICAgIXRyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkO1xuXG4gICAgLy8gaWYgKHRyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAvLyAgICAgYCR7dHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWR9IC0gJHttZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZH1gXG4gICAgLy8gICApO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBtYXRjaENvbmRpdGlvbiAmJiBtYXRjaFJlcXVlc3RJZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdhaXRGb3JYWFhGdW5jKFxuICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbjogc3RyaW5nLFxuICAgIHBhcmFtc1c6IFdhaXRGb3JQYXJhbXM8U3B5RXZlbnQ+LFxuICAgIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZD86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgdHJhY2tlcjogVHJhY2tlcjtcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cmFja2VyID0ge1xuICAgICAgICBmaW5pc2hlZDogZmFsc2UsXG4gICAgICAgIHByb21pc2VSZXNvbHZlOiByZXNvbHZlLFxuICAgICAgICBwcm9taXNlUmVqZWN0OiByZWplY3QsXG4gICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbixcbiAgICAgICAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiB3YWl0Rm9yWFhYRnVuYygpIHtcbiAgICAgIHRyYWNrZXIuY29uZGl0aW9uID0gcGFyYW1zVz8uY29uZGl0aW9uO1xuXG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodHJhY2tlci5maW5pc2hlZCkgcmV0dXJuO1xuICAgICAgICB0cmFja2VyLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgdHJhY2tlci5wcm9taXNlUmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaW1lb3V0IHdhaXRpbmcgZm9yIFNlcnZlcmxlc3MgU3B5IG1lc3NhZ2UgJHtzZXJ2aWNlS2V5Rm9yRnVuY3Rpb259LiBSZWNlaXZlZCBtZXNzYWdlcyBzbyBmYXI6XFxuICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIG1lc3NhZ2VzLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9LCBwYXJhbXNXPy50aW1vdXRNcyB8fCAxMDAwMCk7XG5cbiAgICAgIHByb21pc2UuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNvbHZlVHJhY2tlckluT2xkTWVzc2FnZXModHJhY2tlcikpIHtcbiAgICAgICAgdHJhY2tlcnMucHVzaCh0cmFja2VyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRGb3JQYXJhbXM8VFNweUV2ZW50IGV4dGVuZHMgU3B5RXZlbnQgPSBTcHlFdmVudD4ge1xuICBjb25kaXRpb24/OiAoZXZlbnQ6IFRTcHlFdmVudCkgPT4gYm9vbGVhbjtcbiAgdGltb3V0TXM/OiBudW1iZXI7XG59XG5cbnR5cGUgVHJhY2tlciA9IHtcbiAgcHJvbWlzZVJlc29sdmU6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gIHByb21pc2VSZWplY3Q6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG4gIGZpbmlzaGVkOiBib29sZWFuO1xuICBzZXJ2aWNlS2V5Pzogc3RyaW5nO1xuICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24/OiBzdHJpbmc7XG4gIGNvbmRpdGlvbj86IChkYXRhOiBhbnkpID0+IGJvb2xlYW47XG4gIHRpbW91dE1zPzogbnVtYmVyO1xuICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG59O1xuXG50eXBlIFNweU1lc3NhZ2VTdG9yYWdlID0gU3B5TWVzc2FnZSAmIHtcbiAgc2VydmljZUtleUZvckZ1bmN0aW9uOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZD86IHN0cmluZztcbn07XG4iXX0=
@@ -12,13 +12,13 @@ export async function createServerlessSpyListener(params) {
12
12
  connectionOpenResolve = resolve;
13
13
  });
14
14
  ws.on('open', () => {
15
- console.log('connected ' + new Date().toISOString());
15
+ //console.log('connected ' + new Date().toISOString());
16
16
  connectionOpenResolve(undefined);
17
17
  });
18
18
  ws.on('message', (data) => {
19
19
  if (closed)
20
20
  return;
21
- console.log(`From server: ${data}`);
21
+ //console.log(`From server: ${data}`);
22
22
  const message = JSON.parse(data.toString());
23
23
  message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');
24
24
  if (message.serviceKey.startsWith('Function')) {
@@ -126,9 +126,11 @@ export async function createServerlessSpyListener(params) {
126
126
  tracker.functionContextAwsRequestId ===
127
127
  message.functionContextAwsRequestId) ||
128
128
  !tracker.functionContextAwsRequestId;
129
- if (tracker.functionContextAwsRequestId) {
130
- console.log(`${tracker.functionContextAwsRequestId} - ${message.functionContextAwsRequestId}`);
131
- }
129
+ // if (tracker.functionContextAwsRequestId) {
130
+ // console.log(
131
+ // `${tracker.functionContextAwsRequestId} - ${message.functionContextAwsRequestId}`
132
+ // );
133
+ // }
132
134
  return matchCondition && matchRequestId;
133
135
  }
134
136
  function createWaitForXXXFunc(serviceKeyForFunction, paramsW, functionContextAwsRequestId) {
@@ -148,7 +150,7 @@ export async function createServerlessSpyListener(params) {
148
150
  if (tracker.finished)
149
151
  return;
150
152
  tracker.finished = true;
151
- tracker.promiseReject(new Error(`Timeout waiting for Serverless Spy message ${serviceKeyForFunction}`));
153
+ tracker.promiseReject(new Error(`Timeout waiting for Serverless Spy message ${serviceKeyForFunction}. Received messages so far:\n ${JSON.stringify(messages, null, 2)}`));
152
154
  }, paramsW?.timoutMs || 10000);
153
155
  promise.finally(() => {
154
156
  clearTimeout(timer);
@@ -160,4 +162,4 @@ export async function createServerlessSpyListener(params) {
160
162
  };
161
163
  }
162
164
  }
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGlzdGVuZXIvY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBVzVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsMkJBQTJCLENBQy9DLE1BQW1DO0lBRW5DLE1BQU0sU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUNyQyxNQUFNLENBQUMsa0JBQWtCLEVBQ3pCLE1BQU0sQ0FBQyxXQUFXLENBQ25CLENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO0lBQ3pDLElBQUksUUFBUSxHQUFjLEVBQUUsQ0FBQztJQUM3QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDbkIsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLElBQUkscUJBQStDLENBQUM7SUFFcEQsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzlDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDckQscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFF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QUFHLEVBQUU7Z0JBQ25CLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4QjtZQUVELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3JlZGVudGlhbHMgfSBmcm9tICdAYXdzLXNkay90eXBlcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXQgfSBmcm9tICd3cyc7XG5pbXBvcnQgeyBnZXRXZWJTb2NrZXRVcmwgfSBmcm9tICcuLi9jb21tb24vZ2V0V2ViU29ja2V0VXJsJztcbmltcG9ydCB7IEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3NweUV2ZW50cy9GdW5jdGlvblJlcXVlc3RTcHlFdmVudCc7XG5pbXBvcnQgeyBTcHlFdmVudCB9IGZyb20gJy4uL2NvbW1vbi9zcHlFdmVudHMvU3B5RXZlbnQnO1xuaW1wb3J0IHsgU3B5TWVzc2FnZSB9IGZyb20gJy4uL2NvbW1vbi9zcHlFdmVudHMvU3B5TWVzc2FnZSc7XG5pbXBvcnQgeyBTcHlMaXN0ZW5lciB9IGZyb20gJy4vU3B5TGlzdGVuZXInO1xuXG50eXBlIFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtcyA9IHtcbiAgc2VydmVybGVzc1NweVdzVXJsOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHM7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyPFRTcHlFdmVudHM+KFxuICBwYXJhbXM6IFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtc1xuKSB7XG4gIGNvbnN0IHVybFNpZ25lZCA9IGF3YWl0IGdldFdlYlNvY2tldFVybChcbiAgICBwYXJhbXMuc2VydmVybGVzc1NweVdzVXJsLFxuICAgIHBhcmFtcy5jcmVkZW50aWFsc1xuICApO1xuICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodXJsU2lnbmVkKTtcbiAgY29uc3QgbWVzc2FnZXM6IFNweU1lc3NhZ2VTdG9yYWdlW10gPSBbXTtcbiAgbGV0IHRyYWNrZXJzOiBUcmFja2VyW10gPSBbXTtcbiAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICBjb25zdCBmdW5jdGlvblByZWZpeCA9ICd3YWl0Rm9yJztcbiAgbGV0IGNvbm5lY3Rpb25PcGVuUmVzb2x2ZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuXG4gIGxldCB3YWl0Rm9yQ29ubmVjdGlvbiA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29ubmVjdGlvbk9wZW5SZXNvbHZlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgd3Mub24oJ29wZW4nLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ2Nvbm5lY3RlZCAnICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcbiAgICBjb25uZWN0aW9uT3BlblJlc29sdmUodW5kZWZpbmVkKTtcbiAgfSk7XG4gIHdzLm9uKCdtZXNzYWdlJywgKGRhdGEpID0+IHtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmxvZyhgRnJvbSBzZXJ2ZXI6ICR7ZGF0YX1gKTtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSkgYXMgU3B5TWVzc2FnZVN0b3JhZ2U7XG5cbiAgICBtZXNzYWdlLnNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9IG1lc3NhZ2Uuc2VydmljZUtleS5yZXBsYWNlKC8jL2csICcnKTtcblxuICAgIGlmIChtZXNzYWdlLnNlcnZpY2VLZXkuc3RhcnRzV2l0aCgnRnVuY3Rpb24nKSkge1xuICAgICAgbWVzc2FnZS5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQgPSAoXG4gICAgICAgIG1lc3NhZ2UuZGF0YSBhcyBGdW5jdGlvblJlcXVlc3RTcHlFdmVudFxuICAgICAgKS5jb250ZXh0LmF3c1JlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBtZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVPbGRUcmFja2VyV2l0aE5ld01lc3NhZ2UobWVzc2FnZSk7XG4gIH0pO1xuICB3cy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAvLyBjb25zb2xlLmxvZyhcImRpc2Nvbm5lY3RlZCBcIiArIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSk7XG4gIH0pO1xuXG4gIGNvbnN0IHRyYWNrZXJNYXRjaE1lc3NhZ2UgPSAoXG4gICAgdHJhY2tlcjogVHJhY2tlcixcbiAgICBtZXNzYWdlOiBTcHlNZXNzYWdlU3RvcmFnZVxuICApID0+IHtcbiAgICBpZiAodHJhY2tlci5maW5pc2hlZCkgcmV0dXJuO1xuXG4gICAgaWYgKFxuICAgICAgKHRyYWNrZXIuc2VydmljZUtleSAmJiB0cmFja2VyLnNlcnZpY2VLZXkgPT09IG1lc3NhZ2Uuc2VydmljZUtleSkgfHxcbiAgICAgICh0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbiAmJlxuICAgICAgICB0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9PT0gbWVzc2FnZS5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICBpZiAodHJhY2tlck1hdGNoQ29uZGl0aW9uKHRyYWNrZXIsIG1lc3NhZ2UpKSB7XG4gICAgICAgIHRyYWNrZXIuZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHNweUFuZEplc3RNYXRjaGVyczogYW55ID0ge1xuICAgICAgICAgIGdldERhdGE6ICgpID0+IG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSB0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbiAmJlxuICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5zdGFydHNXaXRoKCdGdW5jdGlvbicpICYmXG4gICAgICAgICAgKHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5lbmRzV2l0aCgnUmVxdWVzdCcpIHx8XG4gICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24uZW5kc1dpdGgoJ0NvbnNvbGUnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlID0gc2VydmljZUtleUZvckZ1bmN0aW9uO1xuXG4gICAgICAgICAgaWYgKHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmVuZHNXaXRoKCdSZXF1ZXN0JykpIHtcbiAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlID1cbiAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2Uuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UubGVuZ3RoIC0gJ1JlcXVlc3QnLmxlbmd0aFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UuZW5kc1dpdGgoJ0NvbnNvbGUnKSkge1xuICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgPVxuICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5sZW5ndGggLSAnQ29uc29sZScubGVuZ3RoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgKz0gJ1Jlc3BvbnNlJztcblxuICAgICAgICAgIHNweUFuZEplc3RNYXRjaGVycy5mb2xsb3dlZEJ5UmVzcG9uc2UgPSAocGFyYW1zVzogV2FpdEZvclBhcmFtcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdhaXRGb3JYWFhGdW5jKFxuICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSxcbiAgICAgICAgICAgICAgcGFyYW1zVyxcbiAgICAgICAgICAgICAgKG1lc3NhZ2UuZGF0YSBhcyBGdW5jdGlvblJlcXVlc3RTcHlFdmVudCkuY29udGV4dC5hd3NSZXF1ZXN0SWRcbiAgICAgICAgICAgICkoKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoc3B5QW5kSmVzdE1hdGNoZXJzLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIG9iamVjdEtleTogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KG9iamVjdEtleSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtvYmplY3RLZXldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3RLZXkgIT09ICd0aGVuJykge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGplc3RGdW5jdGlvblRvRXhlY3V0ZSA9IChleHBlY3QobWVzc2FnZS5kYXRhKSBhcyBhbnkpW1xuICAgICAgICAgICAgICAgICAgb2JqZWN0S2V5XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBqZXN0RnVuY3Rpb25Ub0V4ZWN1dGUuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0cmFja2VyLnByb21pc2VSZXNvbHZlKHByb3h5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCByZXNvbHZlVHJhY2tlckluT2xkTWVzc2FnZXMgPSAodHJhY2tlcjogVHJhY2tlcikgPT4ge1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgaWYgKHRyYWNrZXJNYXRjaE1lc3NhZ2UodHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHJlc29sdmVPbGRUcmFja2VyV2l0aE5ld01lc3NhZ2UgPSAobWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpID0+IHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCB0cmFja2VyID0gdHJhY2tlcnNbaW5kZXhdO1xuICAgICAgaWYgKHRyYWNrZXJNYXRjaE1lc3NhZ2UodHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgdHJhY2tlcnMgPSB0cmFja2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3Qgc3B5TGlzdGVuZXIgPSB7fSBhcyBTcHlMaXN0ZW5lcjxUU3B5RXZlbnRzPjtcblxuICBzcHlMaXN0ZW5lci5zdG9wID0gKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gICAgd3MuY2xvc2UoKTtcbiAgfTtcblxuICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShzcHlMaXN0ZW5lciwge1xuICAgIGdldDogZnVuY3Rpb24gKHRhcmdldDogYW55LCBvYmplY3RLZXk6IHN0cmluZykge1xuICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShvYmplY3RLZXkpKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRbb2JqZWN0S2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiBvYmplY3RLZXkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIG9iamVjdEtleS5zdGFydHNXaXRoKGZ1bmN0aW9uUHJlZml4KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtc1cgPSBhcmd1bWVudHNbMF0gYXMgV2FpdEZvclBhcmFtcztcbiAgICAgICAgY29uc3Qgc2VydmljZUtleUZvckZ1bmN0aW9uID0gb2JqZWN0S2V5LnN1YnN0cmluZyhcbiAgICAgICAgICBmdW5jdGlvblByZWZpeC5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlV2FpdEZvclhYWEZ1bmMoc2VydmljZUtleUZvckZ1bmN0aW9uLCBwYXJhbXNXKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICBhd2FpdCB3YWl0Rm9yQ29ubmVjdGlvbjtcblxuICByZXR1cm4gcHJveHkgYXMgU3B5TGlzdGVuZXI8VFNweUV2ZW50cz47XG5cbiAgZnVuY3Rpb24gdHJhY2tlck1hdGNoQ29uZGl0aW9uKHRyYWNrZXI6IFRyYWNrZXIsIG1lc3NhZ2U6IFNweU1lc3NhZ2VTdG9yYWdlKSB7XG4gICAgY29uc3QgbWF0Y2hDb25kaXRpb24gPVxuICAgICAgKHRyYWNrZXIuY29uZGl0aW9uICYmIHRyYWNrZXIuY29uZGl0aW9uKG1lc3NhZ2UuZGF0YSkpIHx8XG4gICAgICAhdHJhY2tlci5jb25kaXRpb247XG5cbiAgICBjb25zdCBtYXRjaFJlcXVlc3RJZCA9XG4gICAgICAodHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQgJiZcbiAgICAgICAgdHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQgPT09XG4gICAgICAgICAgbWVzc2FnZS5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQpIHx8XG4gICAgICAhdHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ7XG5cbiAgICBpZiAodHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgJHt0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZH0gLSAke21lc3NhZ2UuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoQ29uZGl0aW9uICYmIG1hdGNoUmVxdWVzdElkO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlV2FpdEZvclhYWEZ1bmMoXG4gICAgc2VydmljZUtleUZvckZ1bmN0aW9uOiBzdHJpbmcsXG4gICAgcGFyYW1zVzogV2FpdEZvclBhcmFtczxTcHlFdmVudD4sXG4gICAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkPzogc3RyaW5nXG4gICkge1xuICAgIGxldCB0cmFja2VyOiBUcmFja2VyO1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyYWNrZXIgPSB7XG4gICAgICAgIGZpbmlzaGVkOiBmYWxzZSxcbiAgICAgICAgcHJvbWlzZVJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgIHByb21pc2VSZWplY3Q6IHJlamVjdCxcbiAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uLFxuICAgICAgICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHdhaXRGb3JYWFhGdW5jKCkge1xuICAgICAgdHJhY2tlci5jb25kaXRpb24gPSBwYXJhbXNXPy5jb25kaXRpb247XG5cbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0cmFja2VyLmZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgIHRyYWNrZXIuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB0cmFja2VyLnByb21pc2VSZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRpbWVvdXQgd2FpdGluZyBmb3IgU2VydmVybGVzcyBTcHkgbWVzc2FnZSAke3NlcnZpY2VLZXlGb3JGdW5jdGlvbn1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSwgcGFyYW1zVz8udGltb3V0TXMgfHwgMTAwMDApO1xuXG4gICAgICBwcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzKHRyYWNrZXIpKSB7XG4gICAgICAgIHRyYWNrZXJzLnB1c2godHJhY2tlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBXYWl0Rm9yUGFyYW1zPFRTcHlFdmVudCBleHRlbmRzIFNweUV2ZW50ID0gU3B5RXZlbnQ+IHtcbiAgY29uZGl0aW9uPzogKGV2ZW50OiBUU3B5RXZlbnQpID0+IGJvb2xlYW47XG4gIHRpbW91dE1zPzogbnVtYmVyO1xufVxuXG50eXBlIFRyYWNrZXIgPSB7XG4gIHByb21pc2VSZXNvbHZlOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICBwcm9taXNlUmVqZWN0OiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICBmaW5pc2hlZDogYm9vbGVhbjtcbiAgc2VydmljZUtleT86IHN0cmluZztcbiAgc2VydmljZUtleUZvckZ1bmN0aW9uPzogc3RyaW5nO1xuICBjb25kaXRpb24/OiAoZGF0YTogYW55KSA9PiBib29sZWFuO1xuICB0aW1vdXRNcz86IG51bWJlcjtcbiAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkPzogc3RyaW5nO1xufTtcblxudHlwZSBTcHlNZXNzYWdlU3RvcmFnZSA9IFNweU1lc3NhZ2UgJiB7XG4gIHNlcnZpY2VLZXlGb3JGdW5jdGlvbjogc3RyaW5nO1xuICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG59O1xuIl19
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGlzdGVuZXIvY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBVzVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsMkJBQTJCLENBQy9DLE1BQW1DO0lBRW5DLE1BQU0sU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUNyQyxNQUFNLENBQUMsa0JBQWtCLEVBQ3pCLE1BQU0sQ0FBQyxXQUFXLENBQ25CLENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO0lBQ3pDLElBQUksUUFBUSxHQUFjLEVBQUUsQ0FBQztJQUM3QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDbkIsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLElBQUkscUJBQStDLENBQUM7SUFFcEQsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzlDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUNqQix1REFBdUQ7UUFDdkQscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3hCLElBQUksTUFBTTtZQUFFLE9BQU87UUFFbkIsc0NBQXNDO1FBRXRDLE1BQU0sT0FBTyxHQUFHLElB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LFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDeEI7WUFFRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyZWRlbnRpYWxzIH0gZnJvbSAnQGF3cy1zZGsvdHlwZXMnO1xuaW1wb3J0IHsgV2ViU29ja2V0IH0gZnJvbSAnd3MnO1xuaW1wb3J0IHsgZ2V0V2ViU29ja2V0VXJsIH0gZnJvbSAnLi4vY29tbW9uL2dldFdlYlNvY2tldFVybCc7XG5pbXBvcnQgeyBGdW5jdGlvblJlcXVlc3RTcHlFdmVudCB9IGZyb20gJy4uL2NvbW1vbi9zcHlFdmVudHMvRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnQnO1xuaW1wb3J0IHsgU3B5RXZlbnQgfSBmcm9tICcuLi9jb21tb24vc3B5RXZlbnRzL1NweUV2ZW50JztcbmltcG9ydCB7IFNweU1lc3NhZ2UgfSBmcm9tICcuLi9jb21tb24vc3B5RXZlbnRzL1NweU1lc3NhZ2UnO1xuaW1wb3J0IHsgU3B5TGlzdGVuZXIgfSBmcm9tICcuL1NweUxpc3RlbmVyJztcblxudHlwZSBTZXJ2ZXJsZXNzU3B5TGlzdGVuZXJQYXJhbXMgPSB7XG4gIHNlcnZlcmxlc3NTcHlXc1VybDogc3RyaW5nO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcmxlc3NTcHlMaXN0ZW5lcjxUU3B5RXZlbnRzPihcbiAgcGFyYW1zOiBTZXJ2ZXJsZXNzU3B5TGlzdGVuZXJQYXJhbXNcbikge1xuICBjb25zdCB1cmxTaWduZWQgPSBhd2FpdCBnZXRXZWJTb2NrZXRVcmwoXG4gICAgcGFyYW1zLnNlcnZlcmxlc3NTcHlXc1VybCxcbiAgICBwYXJhbXMuY3JlZGVudGlhbHNcbiAgKTtcbiAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHVybFNpZ25lZCk7XG4gIGNvbnN0IG1lc3NhZ2VzOiBTcHlNZXNzYWdlU3RvcmFnZVtdID0gW107XG4gIGxldCB0cmFja2VyczogVHJhY2tlcltdID0gW107XG4gIGxldCBjbG9zZWQgPSBmYWxzZTtcbiAgY29uc3QgZnVuY3Rpb25QcmVmaXggPSAnd2FpdEZvcic7XG4gIGxldCBjb25uZWN0aW9uT3BlblJlc29sdmU6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZDtcblxuICBsZXQgd2FpdEZvckNvbm5lY3Rpb24gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbm5lY3Rpb25PcGVuUmVzb2x2ZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIHdzLm9uKCdvcGVuJywgKCkgPT4ge1xuICAgIC8vY29uc29sZS5sb2coJ2Nvbm5lY3RlZCAnICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcbiAgICBjb25uZWN0aW9uT3BlblJlc29sdmUodW5kZWZpbmVkKTtcbiAgfSk7XG4gIHdzLm9uKCdtZXNzYWdlJywgKGRhdGEpID0+IHtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG5cbiAgICAvL2NvbnNvbGUubG9nKGBGcm9tIHNlcnZlcjogJHtkYXRhfWApO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpKSBhcyBTcHlNZXNzYWdlU3RvcmFnZTtcblxuICAgIG1lc3NhZ2Uuc2VydmljZUtleUZvckZ1bmN0aW9uID0gbWVzc2FnZS5zZXJ2aWNlS2V5LnJlcGxhY2UoLyMvZywgJycpO1xuXG4gICAgaWYgKG1lc3NhZ2Uuc2VydmljZUtleS5zdGFydHNXaXRoKCdGdW5jdGlvbicpKSB7XG4gICAgICBtZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCA9IChcbiAgICAgICAgbWVzc2FnZS5kYXRhIGFzIEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50XG4gICAgICApLmNvbnRleHQuYXdzUmVxdWVzdElkO1xuICAgIH1cblxuICAgIG1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgcmVzb2x2ZU9sZFRyYWNrZXJXaXRoTmV3TWVzc2FnZShtZXNzYWdlKTtcbiAgfSk7XG4gIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBjbG9zZWQgPSB0cnVlO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZGlzY29ubmVjdGVkIFwiICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcbiAgfSk7XG5cbiAgY29uc3QgdHJhY2tlck1hdGNoTWVzc2FnZSA9IChcbiAgICB0cmFja2VyOiBUcmFja2VyLFxuICAgIG1lc3NhZ2U6IFNweU1lc3NhZ2VTdG9yYWdlXG4gICkgPT4ge1xuICAgIGlmICh0cmFja2VyLmZpbmlzaGVkKSByZXR1cm47XG5cbiAgICBpZiAoXG4gICAgICAodHJhY2tlci5zZXJ2aWNlS2V5ICYmIHRyYWNrZXIuc2VydmljZUtleSA9PT0gbWVzc2FnZS5zZXJ2aWNlS2V5KSB8fFxuICAgICAgKHRyYWNrZXIuc2VydmljZUtleUZvckZ1bmN0aW9uICYmXG4gICAgICAgIHRyYWNrZXIuc2VydmljZUtleUZvckZ1bmN0aW9uID09PSBtZXNzYWdlLnNlcnZpY2VLZXlGb3JGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIGlmICh0cmFja2VyTWF0Y2hDb25kaXRpb24odHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgdHJhY2tlci5maW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc3B5QW5kSmVzdE1hdGNoZXJzOiBhbnkgPSB7XG4gICAgICAgICAgZ2V0RGF0YTogKCkgPT4gbWVzc2FnZS5kYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9IHRyYWNrZXIuc2VydmljZUtleUZvckZ1bmN0aW9uO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uICYmXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uLnN0YXJ0c1dpdGgoJ0Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAoc2VydmljZUtleUZvckZ1bmN0aW9uLmVuZHNXaXRoKCdSZXF1ZXN0JykgfHxcbiAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5lbmRzV2l0aCgnQ29uc29sZScpKVxuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgPSBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb247XG5cbiAgICAgICAgICBpZiAoc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UuZW5kc1dpdGgoJ1JlcXVlc3QnKSkge1xuICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgPVxuICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5sZW5ndGggLSAnUmVxdWVzdCcubGVuZ3RoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5lbmRzV2l0aCgnQ29uc29sZScpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSA9XG4gICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmxlbmd0aCAtICdDb25zb2xlJy5sZW5ndGhcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSArPSAnUmVzcG9uc2UnO1xuXG4gICAgICAgICAgc3B5QW5kSmVzdE1hdGNoZXJzLmZvbGxvd2VkQnlSZXNwb25zZSA9IChwYXJhbXNXOiBXYWl0Rm9yUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlV2FpdEZvclhYWEZ1bmMoXG4gICAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLFxuICAgICAgICAgICAgICBwYXJhbXNXLFxuICAgICAgICAgICAgICAobWVzc2FnZS5kYXRhIGFzIEZ1bmN0aW9uUmVxdWVzdFNweUV2ZW50KS5jb250ZXh0LmF3c1JlcXVlc3RJZFxuICAgICAgICAgICAgKSgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShzcHlBbmRKZXN0TWF0Y2hlcnMsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICh0YXJnZXQ6IGFueSwgb2JqZWN0S2V5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkob2JqZWN0S2V5KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W29iamVjdEtleV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdEtleSAhPT0gJ3RoZW4nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgamVzdEZ1bmN0aW9uVG9FeGVjdXRlID0gKGV4cGVjdChtZXNzYWdlLmRhdGEpIGFzIGFueSlbXG4gICAgICAgICAgICAgICAgICBvYmplY3RLZXlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGplc3RGdW5jdGlvblRvRXhlY3V0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyYWNrZXIucHJvbWlzZVJlc29sdmUocHJveHkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHJlc29sdmVUcmFja2VySW5PbGRNZXNzYWdlcyA9ICh0cmFja2VyOiBUcmFja2VyKSA9PiB7XG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgICBpZiAodHJhY2tlck1hdGNoTWVzc2FnZSh0cmFja2VyLCBtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZU9sZFRyYWNrZXJXaXRoTmV3TWVzc2FnZSA9IChtZXNzYWdlOiBTcHlNZXNzYWdlU3RvcmFnZSkgPT4ge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja2Vycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRyYWNrZXIgPSB0cmFja2Vyc1tpbmRleF07XG4gICAgICBpZiAodHJhY2tlck1hdGNoTWVzc2FnZSh0cmFja2VyLCBtZXNzYWdlKSkge1xuICAgICAgICB0cmFja2VycyA9IHRyYWNrZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBzcHlMaXN0ZW5lciA9IHt9IGFzIFNweUxpc3RlbmVyPFRTcHlFdmVudHM+O1xuXG4gIHNweUxpc3RlbmVyLnN0b3AgPSAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICB3cy5jbG9zZSgpO1xuICB9O1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHNweUxpc3RlbmVyLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIG9iamVjdEtleTogc3RyaW5nKSB7XG4gICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KG9iamVjdEtleSkpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtvYmplY3RLZXldO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIG9iamVjdEtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgb2JqZWN0S2V5LnN0YXJ0c1dpdGgoZnVuY3Rpb25QcmVmaXgpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcGFyYW1zVyA9IGFyZ3VtZW50c1swXSBhcyBXYWl0Rm9yUGFyYW1zO1xuICAgICAgICBjb25zdCBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSBvYmplY3RLZXkuc3Vic3RyaW5nKFxuICAgICAgICAgIGZ1bmN0aW9uUHJlZml4Lmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVXYWl0Rm9yWFhYRnVuYyhzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24sIHBhcmFtc1cpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIGF3YWl0IHdhaXRGb3JDb25uZWN0aW9uO1xuXG4gIHJldHVybiBwcm94eSBhcyBTcHlMaXN0ZW5lcjxUU3B5RXZlbnRzPjtcblxuICBmdW5jdGlvbiB0cmFja2VyTWF0Y2hDb25kaXRpb24odHJhY2tlcjogVHJhY2tlciwgbWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpIHtcbiAgICBjb25zdCBtYXRjaENvbmRpdGlvbiA9XG4gICAgICAodHJhY2tlci5jb25kaXRpb24gJiYgdHJhY2tlci5jb25kaXRpb24obWVzc2FnZS5kYXRhKSkgfHxcbiAgICAgICF0cmFja2VyLmNvbmRpdGlvbjtcblxuICAgIGNvbnN0IG1hdGNoUmVxdWVzdElkID1cbiAgICAgICh0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCAmJlxuICAgICAgICB0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCA9PT1cbiAgICAgICAgICBtZXNzYWdlLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCkgfHxcbiAgICAgICF0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZDtcblxuICAgIC8vIGlmICh0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCkge1xuICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgLy8gICAgIGAke3RyYWNrZXIuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkfSAtICR7bWVzc2FnZS5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWR9YFxuICAgIC8vICAgKTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gbWF0Y2hDb25kaXRpb24gJiYgbWF0Y2hSZXF1ZXN0SWQ7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVXYWl0Rm9yWFhYRnVuYyhcbiAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb246IHN0cmluZyxcbiAgICBwYXJhbXNXOiBXYWl0Rm9yUGFyYW1zPFNweUV2ZW50PixcbiAgICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IHRyYWNrZXI6IFRyYWNrZXI7XG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJhY2tlciA9IHtcbiAgICAgICAgZmluaXNoZWQ6IGZhbHNlLFxuICAgICAgICBwcm9taXNlUmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgcHJvbWlzZVJlamVjdDogcmVqZWN0LFxuICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24sXG4gICAgICAgIGZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gd2FpdEZvclhYWEZ1bmMoKSB7XG4gICAgICB0cmFja2VyLmNvbmRpdGlvbiA9IHBhcmFtc1c/LmNvbmRpdGlvbjtcblxuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRyYWNrZXIuZmluaXNoZWQpIHJldHVybjtcbiAgICAgICAgdHJhY2tlci5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHRyYWNrZXIucHJvbWlzZVJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGltZW91dCB3YWl0aW5nIGZvciBTZXJ2ZXJsZXNzIFNweSBtZXNzYWdlICR7c2VydmljZUtleUZvckZ1bmN0aW9ufS4gUmVjZWl2ZWQgbWVzc2FnZXMgc28gZmFyOlxcbiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSwgcGFyYW1zVz8udGltb3V0TXMgfHwgMTAwMDApO1xuXG4gICAgICBwcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzKHRyYWNrZXIpKSB7XG4gICAgICAgIHRyYWNrZXJzLnB1c2godHJhY2tlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBXYWl0Rm9yUGFyYW1zPFRTcHlFdmVudCBleHRlbmRzIFNweUV2ZW50ID0gU3B5RXZlbnQ+IHtcbiAgY29uZGl0aW9uPzogKGV2ZW50OiBUU3B5RXZlbnQpID0+IGJvb2xlYW47XG4gIHRpbW91dE1zPzogbnVtYmVyO1xufVxuXG50eXBlIFRyYWNrZXIgPSB7XG4gIHByb21pc2VSZXNvbHZlOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICBwcm9taXNlUmVqZWN0OiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICBmaW5pc2hlZDogYm9vbGVhbjtcbiAgc2VydmljZUtleT86IHN0cmluZztcbiAgc2VydmljZUtleUZvckZ1bmN0aW9uPzogc3RyaW5nO1xuICBjb25kaXRpb24/OiAoZGF0YTogYW55KSA9PiBib29sZWFuO1xuICB0aW1vdXRNcz86IG51bWJlcjtcbiAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkPzogc3RyaW5nO1xufTtcblxudHlwZSBTcHlNZXNzYWdlU3RvcmFnZSA9IFNweU1lc3NhZ2UgJiB7XG4gIHNlcnZpY2VLZXlGb3JGdW5jdGlvbjogc3RyaW5nO1xuICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG59O1xuIl19
@@ -1,4 +1,7 @@
1
1
  import { Construct, IConstruct } from 'constructs';
2
+ export interface ServerlessSpyProps {
3
+ readonly generateSpyEventsFileLocation?: string;
4
+ }
2
5
  export declare class ServerlessSpy extends Construct {
3
6
  private extensionLayer;
4
7
  private table;
@@ -7,8 +10,10 @@ export declare class ServerlessSpy extends Construct {
7
10
  private functionSubscriptionPool;
8
11
  private functionSubscriptionMain;
9
12
  private webSocketStage;
13
+ serviceKeys: string[];
10
14
  wsUrl: string;
11
- constructor(scope: Construct, id: string);
15
+ constructor(scope: Construct, id: string, props?: ServerlessSpyProps);
16
+ private writeSpyEventsClass;
12
17
  private iterateAllElements;
13
18
  private interceptSqs;
14
19
  private createFunctionForSubscription;
@@ -21,13 +21,20 @@ const snsSubs = require("aws-cdk-lib/aws-sns-subscriptions");
21
21
  const sqs = require("aws-cdk-lib/aws-sqs");
22
22
  const constructs_1 = require("constructs");
23
23
  class ServerlessSpy extends constructs_1.Construct {
24
- constructor(scope, id) {
24
+ constructor(scope, id, props) {
25
25
  super(scope, id);
26
26
  this.ownContructs = [];
27
27
  this.functionSubscriptionPool = [];
28
- const extensionAssetLocation = path.join(__dirname, '../extension/dist/layer');
28
+ this.serviceKeys = [];
29
+ let extensionAssetLocation = path.join(__dirname, '../extension/dist/layer');
30
+ const extensionAssetLocationAlt = path.join(__dirname, '../lib/extension/dist/layer');
29
31
  if (!fs.existsSync(extensionAssetLocation)) {
30
- throw new Error(`Folder with assets for extension does not exists ${extensionAssetLocation}`);
32
+ if (!fs.existsSync(extensionAssetLocationAlt)) {
33
+ throw new Error(`Folder with assets for extension does not exists at ${extensionAssetLocation} or at ${extensionAssetLocationAlt} `);
34
+ }
35
+ else {
36
+ extensionAssetLocation = extensionAssetLocationAlt;
37
+ }
31
38
  }
32
39
  const extensionAssetLocationWraper = path.join(extensionAssetLocation, 'spy-wrapper');
33
40
  if (!fs.existsSync(extensionAssetLocationWraper)) {
@@ -102,15 +109,24 @@ class ServerlessSpy extends constructs_1.Construct {
102
109
  for (const func of this.functionSubscriptionPool) {
103
110
  func.function.addEnvironment('INFRA_MAPPING', JSON.stringify(func.mapping));
104
111
  }
105
- // new CfnOutput(this, "API_URL", {
106
- // value: `wss://${this.webSocketApi.apiId}.execute-api.${
107
- // Stack.of(scope).region
108
- // }.amazonaws.com/${this.webSocketStage.stageName}`,
109
- // });
110
112
  this.wsUrl = `wss://${this.webSocketApi.apiId}.execute-api.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com/${this.webSocketStage.stageName}`;
113
+ new aws_cdk_lib_1.CfnOutput(aws_cdk_lib_1.Stack.of(this), 'ServerlessSpyWsUrl', {
114
+ value: this.wsUrl,
115
+ });
111
116
  // new CfnOutput(this, "API_URL", {
112
117
  // value: this.wsUrl,
113
118
  // });
119
+ if (props?.generateSpyEventsFileLocation) {
120
+ this.writeSpyEventsClass(props?.generateSpyEventsFileLocation);
121
+ }
122
+ }
123
+ writeSpyEventsClass(fileLocation) {
124
+ fs.mkdirSync(path.dirname(fileLocation), { recursive: true });
125
+ const properties = this.serviceKeys
126
+ .map((sk) => ` ${sk.replace(/#/g, '')}: '${sk}' = '${sk}';\n`)
127
+ .join('');
128
+ const code = `/* eslint-disable */\nexport class ServerlessSpyEvents {\n${properties}}\n`;
129
+ fs.writeFileSync(fileLocation, code);
114
130
  }
115
131
  iterateAllElements(parent) {
116
132
  for (const node of parent.node.children) {
@@ -120,7 +136,6 @@ class ServerlessSpy extends constructs_1.Construct {
120
136
  if (this.functionSubscriptionPool.find((s) => s.function === node)) {
121
137
  continue;
122
138
  }
123
- console.log('NODE', node.constructor.name);
124
139
  if (node instanceof lambda.Function) {
125
140
  this.interceptFunction(node);
126
141
  }
@@ -159,7 +174,9 @@ class ServerlessSpy extends constructs_1.Construct {
159
174
  n.functionName === node.functionName);
160
175
  if (queue && func) {
161
176
  const queueName = this.getConstructName(queue);
162
- this.functionSubscriptionMain.mapping[queue.queueArn] = `Sqs#${queueName}`;
177
+ const serviceKey = `Sqs#${queueName}`;
178
+ this.functionSubscriptionMain.mapping[queue.queueArn] = serviceKey;
179
+ this.serviceKeys.push(serviceKey);
163
180
  func.addEnvironment('FLUENT_TEST_SUBSCRIBED_TO_SQS', 'true');
164
181
  }
165
182
  }
@@ -183,7 +200,9 @@ class ServerlessSpy extends constructs_1.Construct {
183
200
  interceptS3(s3Bucket) {
184
201
  s3Bucket.addEventNotification(s3.EventType.OBJECT_CREATED_PUT, new s3notif.LambdaDestination(this.functionSubscriptionMain.function));
185
202
  const name = this.getConstructName(s3Bucket);
186
- this.functionSubscriptionMain.mapping[s3Bucket.bucketArn] = `S3#${name}`;
203
+ const serviceKey = `S3#${name}`;
204
+ this.functionSubscriptionMain.mapping[s3Bucket.bucketArn] = serviceKey;
205
+ this.serviceKeys.push(serviceKey);
187
206
  }
188
207
  interceptDynamodb(table) {
189
208
  // enable DynamoDB streams with a hack
@@ -197,7 +216,9 @@ class ServerlessSpy extends constructs_1.Construct {
197
216
  retryAttempts: 0,
198
217
  }));
199
218
  const name = this.getConstructName(table);
200
- this.functionSubscriptionMain.mapping[table.tableArn] = `DynamoDB#${name}`;
219
+ const serviceKey = `DynamoDB#${name}`;
220
+ this.functionSubscriptionMain.mapping[table.tableArn] = serviceKey;
221
+ this.serviceKeys.push(serviceKey);
201
222
  }
202
223
  interceptEventBusRule(rule) {
203
224
  const { eventBusName } = rule.node.defaultChild;
@@ -210,7 +231,9 @@ class ServerlessSpy extends constructs_1.Construct {
210
231
  rule.addTarget(new targets.LambdaFunction(functionSubscription.function));
211
232
  const bridgeName = this.getConstructName(eventBridge);
212
233
  const ruleName = this.getConstructName(rule);
213
- functionSubscription.mapping.eventBridge = `EventBridgeRule#${bridgeName}#${ruleName}`;
234
+ const serviceKey = `EventBridgeRule#${bridgeName}#${ruleName}`;
235
+ functionSubscription.mapping.eventBridge = serviceKey;
236
+ this.serviceKeys.push(serviceKey);
214
237
  }
215
238
  interceptEventBus(eventBus) {
216
239
  const functionSubscription = this.provideFunctionForSubscription((s) => !s.usedForEventBridge);
@@ -222,13 +245,17 @@ class ServerlessSpy extends constructs_1.Construct {
222
245
  targets: [new targets.LambdaFunction(functionSubscription.function)],
223
246
  });
224
247
  this.ownContructs.push(rule);
225
- functionSubscription.mapping.eventBridge = `EventBridge#${bridgeName}`;
248
+ const serviceKey = `EventBridge#${bridgeName}`;
249
+ functionSubscription.mapping.eventBridge = serviceKey;
250
+ this.serviceKeys.push(serviceKey);
226
251
  }
227
252
  interceptSnsTopic(topic) {
228
253
  const functionSubscription = this.provideFunctionForSubscription((s) => !s.subsribedTopics.includes(topic));
229
254
  topic.addSubscription(new snsSubs.LambdaSubscription(functionSubscription.function));
230
255
  const topicName = this.getConstructName(topic);
231
- functionSubscription.mapping[topic.topicArn] = `SnsTopic#${topicName}`;
256
+ const serviceKey = `SnsTopic#${topicName}`;
257
+ functionSubscription.mapping[topic.topicArn] = serviceKey;
258
+ this.serviceKeys.push(serviceKey);
232
259
  functionSubscription.subsribedTopics.push(topic);
233
260
  }
234
261
  interceptSnsSubscription(subscription) {
@@ -249,7 +276,9 @@ class ServerlessSpy extends constructs_1.Construct {
249
276
  const topicName = this.getConstructName(topic);
250
277
  const targetName = this.getConstructName(subscription.node.scope);
251
278
  functionSubscription.subsribedTopics.push(topic);
252
- functionSubscription.mapping[topic.topicArn] = `SnsSubscription#${topicName}#${targetName}`;
279
+ const serviceKey = `SnsSubscription#${topicName}#${targetName}`;
280
+ functionSubscription.mapping[topic.topicArn] = serviceKey;
281
+ this.serviceKeys.push(serviceKey);
253
282
  }
254
283
  provideFunctionForSubscription(filterFunction) {
255
284
  let functionSubscription;
@@ -277,6 +306,10 @@ class ServerlessSpy extends constructs_1.Construct {
277
306
  func.addEnvironment('FUNCTION_NAME', functionName);
278
307
  func.addEnvironment('AWS_LAMBDA_EXEC_WRAPPER', '/opt/spy-wrapper');
279
308
  func.addEnvironment('FLUENT_TEST_SEND_FUNCTION_NAME', this.functionSubscriptionMain.function.functionName);
309
+ this.serviceKeys.push(`Function#${functionName}#Request`);
310
+ this.serviceKeys.push(`Function#${functionName}#Error`);
311
+ this.serviceKeys.push(`Function#${functionName}#Console`);
312
+ this.serviceKeys.push(`Function#${functionName}#Response`);
280
313
  }
281
314
  getConstructName(construct) {
282
315
  let functionName = construct.node.path;
@@ -310,7 +343,7 @@ class ServerlessSpy extends constructs_1.Construct {
310
343
  }
311
344
  exports.ServerlessSpy = ServerlessSpy;
312
345
  _a = JSII_RTTI_SYMBOL_1;
313
- ServerlessSpy[_a] = { fqn: "serverless-spy.ServerlessSpy", version: "0.0.29" };
346
+ ServerlessSpy[_a] = { fqn: "serverless-spy.ServerlessSpy", version: "0.0.32" };
314
347
  function getAssetLocation(location) {
315
348
  const loc = path.join(__dirname, '../' + location);
316
349
  if (fs.existsSync(loc)) {
@@ -322,4 +355,4 @@ function getAssetLocation(location) {
322
355
  }
323
356
  throw new Error(`Location ${loc} and ${loc2} does not exists.`);
324
357
  }
325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBMkQ7QUFDM0QsMkVBQTJFO0FBQzNFLDZDQUE4QztBQUU5QyxxREFBcUQ7QUFDckQsaURBQWlEO0FBQ2pELDBEQUEwRDtBQUMxRCxpREFBaUQ7QUFDakQsdUVBQXVFO0FBQ3ZFLDREQUE0RDtBQUM1RCx5Q0FBeUM7QUFDekMsNERBQTREO0FBQzVELDJDQUEyQztBQUMzQyw2REFBNkQ7QUFDN0QsMkNBQTJDO0FBQzNDLDJDQUFtRDtBQUVuRCxNQUFhLGFBQWMsU0FBUSxzQkFBUztJQWlCMUMsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQVhYLGlCQUFZLEdBQWlCLEVBQUUsQ0FBQztRQUVoQyw2QkFBd0IsR0FBMkIsRUFBRSxDQUFDO1FBVzVELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdEMsU0FBUyxFQUNULHlCQUF5QixDQUMxQixDQUFDO1FBRUYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUNiLG9EQUFvRCxzQkFBc0IsRUFBRSxDQUM3RSxDQUFDO1NBQ0g7UUFFRCxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQzVDLHNCQUFzQixFQUN0QixhQUFhLENBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLDRCQUE0QixDQUFDLEVBQUU7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FDYiwrQ0FBK0Msc0JBQXNCLEVBQUUsQ0FDeEUsQ0FBQztTQUNIO1FBRUQsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsSUFBSSxD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LHNDQW1jQzs7O0FBU0QsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFnQjtJQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFFbkQsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFFdkQsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksR0FBRyxRQUFRLElBQUksbUJBQW1CLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGFwaUd3VjIgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1hbHBoYSc7XG5pbXBvcnQgKiBhcyBhcGlHd1YySW50IGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zLWFscGhhJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFndyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGR5bmFtb0RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYlN0cmVhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgczNub3RpZiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzbnNTdWJzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIGV4dGVuc2lvbkxheWVyOiBsYW1iZGEuTGF5ZXJWZXJzaW9uO1xuXG4gIHByaXZhdGUgdGFibGU6IGR5bmFtb0RiLlRhYmxlO1xuXG4gIHByaXZhdGUgd2ViU29ja2V0QXBpOiBhcGlHd1YyLldlYlNvY2tldEFwaTtcblxuICBwcml2YXRlIG93bkNvbnRydWN0czogSUNvbnN0cnVjdFtdID0gW107XG5cbiAgcHJpdmF0ZSBmdW5jdGlvblN1YnNjcmlwdGlvblBvb2w6IEZ1bmN0aW9uU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIGZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbjogRnVuY3Rpb25TdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSB3ZWJTb2NrZXRTdGFnZTogYXBpR3dWMi5XZWJTb2NrZXRTdGFnZTtcblxuICB3c1VybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbiA9IHBhdGguam9pbihcbiAgICAgIF9fZGlybmFtZSxcbiAgICAgICcuLi9leHRlbnNpb24vZGlzdC9sYXllcidcbiAgICApO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGV4dGVuc2lvbkFzc2V0TG9jYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGb2xkZXIgd2l0aCBhc3NldHMgZm9yIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdHMgJHtleHRlbnNpb25Bc3NldExvY2F0aW9ufWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbldyYXBlciA9IHBhdGguam9pbihcbiAgICAgIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24sXG4gICAgICAnc3B5LXdyYXBwZXInXG4gICAgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbldyYXBlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdyYXBlciBzY3JpcHQgZm9yIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdHMgJHtleHRlbnNpb25Bc3NldExvY2F0aW9ufWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkNvZGUgPSBwYXRoLmpvaW4oXG4gICAgICBleHRlbnNpb25Bc3NldExvY2F0aW9uLFxuICAgICAgJ25vZGVqcy9ub2RlX21vZHVsZXMvaW50ZXJjZXB0b3IuanMnXG4gICAgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkNvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb2RlIGZvciBleHRlbnNpb24gZG9lcyBub3QgZXhpc3RzICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkNvZGV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4dGVuc2lvbkxheWVyID0gbmV3IGxhbWJkYS5MYXllclZlcnNpb24odGhpcywgJ0V4dGVuc2lvbicsIHtcbiAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW1xuICAgICAgICBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTJfWCxcbiAgICAgICAgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgXSxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChleHRlbnNpb25Bc3NldExvY2F0aW9uKSxcbiAgICB9KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMuZXh0ZW5zaW9uTGF5ZXIpO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBkeW5hbW9EYi5UYWJsZSh0aGlzLCAnV2ViU29ja2V0Jywge1xuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0aW9uSWQnLFxuICAgICAgICB0eXBlOiBkeW5hbW9EYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgICBiaWxsaW5nTW9kZTogZHluYW1vRGIuQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgIH0pO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy50YWJsZSk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk9uQ29ubmVjdCA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdPbkNvbm5lY3QnLCB7XG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICBlbnRyeTogZ2V0QXNzZXRMb2NhdGlvbignZnVuY3Rpb25zL29uQ29ubmVjdC50cycpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVEFCTEVfTkFNRTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuY3Rpb25PbkNvbm5lY3QpO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2goZnVuY3Rpb25PbkNvbm5lY3QpO1xuXG4gICAgY29uc3QgZnVuY3Rpb25PbkRpc2Nvbm5lY3QgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICAnT25EaXNjb25uZWN0JyxcbiAgICAgIHtcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgICBlbnRyeTogZ2V0QXNzZXRMb2NhdGlvbignZnVuY3Rpb25zL29uRGlzY29ubmVjdC50cycpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIFRBQkxFX05BTUU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50YWJsZS5ncmFudFdyaXRlRGF0YShmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaChmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaSA9IG5ldyBhcGlHd1YyLldlYlNvY2tldEFwaSh0aGlzLCAnQXBpR3dXZWJTb2NrZXQnKTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMud2ViU29ja2V0QXBpKTtcbiAgICB0aGlzLndlYlNvY2tldFN0YWdlID0gbmV3IGFwaUd3VjIuV2ViU29ja2V0U3RhZ2UoXG4gICAgICB0aGlzLFxuICAgICAgJ0FwaUd3V2ViU29ja2V0U3RhZ2UnLFxuICAgICAge1xuICAgICAgICB3ZWJTb2NrZXRBcGk6IHRoaXMud2ViU29ja2V0QXBpLFxuICAgICAgICBzdGFnZU5hbWU6ICdwcm9kJyxcbiAgICAgICAgYXV0b0RlcGxveTogdHJ1ZSxcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy53ZWJTb2NrZXRTdGFnZSk7XG4gICAgY29uc3Qgd2ViU29ja2V0QXBpUm91dGUgPSB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnJGNvbm5lY3QnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICckY29ubmVjdCcsXG4gICAgICAgIGZ1bmN0aW9uT25Db25uZWN0XG4gICAgICApLFxuICAgIH0pO1xuICAgICh3ZWJTb2NrZXRBcGlSb3V0ZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhZ3cuQ2ZuUm91dGUpLmF1dGhvcml6YXRpb25UeXBlID1cbiAgICAgICdBV1NfSUFNJztcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCckZGlzY29ubmVjdCcsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJyRkaXNjb25uZWN0JyxcbiAgICAgICAgZnVuY3Rpb25PbkRpc2Nvbm5lY3RcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKCk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnc2VuZG1lc3NhZ2UnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICdTZW5kTWVzc2FnZScsXG4gICAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uXG4gICAgICApLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pdGVyYXRlQWxsRWxlbWVudHMoU3RhY2sub2YodGhpcykpO1xuXG4gICAgZm9yIChjb25zdCBmdW5jIG9mIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sKSB7XG4gICAgICBmdW5jLmZ1bmN0aW9uLmFkZEVudmlyb25tZW50KFxuICAgICAgICAnSU5GUkFfTUFQUElORycsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZ1bmMubWFwcGluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gbmV3IENmbk91dHB1dCh0aGlzLCBcIkFQSV9VUkxcIiwge1xuICAgIC8vICAgdmFsdWU6IGB3c3M6Ly8ke3RoaXMud2ViU29ja2V0QXBpLmFwaUlkfS5leGVjdXRlLWFwaS4ke1xuICAgIC8vICAgICBTdGFjay5vZihzY29wZSkucmVnaW9uXG4gICAgLy8gICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gLFxuICAgIC8vIH0pO1xuXG4gICAgdGhpcy53c1VybCA9IGB3c3M6Ly8ke3RoaXMud2ViU29ja2V0QXBpLmFwaUlkfS5leGVjdXRlLWFwaS4ke1xuICAgICAgU3RhY2sub2YodGhpcykucmVnaW9uXG4gICAgfS5hbWF6b25hd3MuY29tLyR7dGhpcy53ZWJTb2NrZXRTdGFnZS5zdGFnZU5hbWV9YDtcblxuICAgIC8vIG5ldyBDZm5PdXRwdXQodGhpcywgXCJBUElfVVJMXCIsIHtcbiAgICAvLyAgIHZhbHVlOiB0aGlzLndzVXJsLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpdGVyYXRlQWxsRWxlbWVudHMocGFyZW50OiBJQ29uc3RydWN0KSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIHBhcmVudC5ub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAodGhpcy5vd25Db250cnVjdHMuaW5jbHVkZXMobm9kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5maW5kKChzKSA9PiBzLmZ1bmN0aW9uID09PSBub2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ05PREUnLCBub2RlLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG4gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5GdW5jdGlvbikge1xuICAgICAgICB0aGlzLmludGVyY2VwdEZ1bmN0aW9uKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2Ygc25zLlRvcGljKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbnRlcmNlcHRTbnNUb3BpYycpO1xuICAgICAgICB0aGlzLmludGVyY2VwdFNuc1RvcGljKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2Ygc25zLlN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLmludGVyY2VwdFNuc1N1YnNjcmlwdGlvbihub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHMzLkJ1Y2tldCkge1xuICAgICAgICB0aGlzLmludGVyY2VwdFMzKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgZHluYW1vRGIuVGFibGUpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHREeW5hbW9kYihub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGV2ZW50cy5FdmVudEJ1cykge1xuICAgICAgICB0aGlzLmludGVyY2VwdEV2ZW50QnVzKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgZXZlbnRzLlJ1bGUpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRFdmVudEJ1c1J1bGUobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuQ2ZuRXZlbnRTb3VyY2VNYXBwaW5nKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0U3FzKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ05PIE1BVENIJywgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXRlcmF0ZUFsbEVsZW1lbnRzKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0U3FzKG5vZGU6IGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMuZmluZEVsZW1lbnQ8c3FzLlF1ZXVlPihcbiAgICAgIChuOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBuIGluc3RhbmNlb2Ygc3FzLlF1ZXVlICYmXG4gICAgICAgIChuIGFzIHNxcy5RdWV1ZSkucXVldWVBcm4gPT09IG5vZGUuZXZlbnRTb3VyY2VBcm5cbiAgICApO1xuXG4gICAgY29uc3QgZnVuYyA9IHRoaXMuZmluZEVsZW1lbnQ8bGFtYmRhLkZ1bmN0aW9uPihcbiAgICAgIChuOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBuIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uICYmXG4gICAgICAgIChuIGFzIGxhbWJkYS5GdW5jdGlvbikuZnVuY3Rpb25OYW1lID09PSBub2RlLmZ1bmN0aW9uTmFtZVxuICAgICk7XG5cbiAgICBpZiAocXVldWUgJiYgZnVuYykge1xuICAgICAgY29uc3QgcXVldWVOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHF1ZXVlKTtcbiAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLm1hcHBpbmdbXG4gICAgICAgIHF1ZXVlLnF1ZXVlQXJuXG4gICAgICBdID0gYFNxcyMke3F1ZXVlTmFtZX1gO1xuICAgICAgZnVuYy5hZGRFbnZpcm9ubWVudCgnRkxVRU5UX1RFU1RfU1VCU0NSSUJFRF9UT19TUVMnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGZ1bmMgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbih0aGlzLCBgU3Vic2NyaXB0aW9uJHtpbmRleH1gLCB7XG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICBlbnRyeTogZ2V0QXNzZXRMb2NhdGlvbignZnVuY3Rpb25zL3NlbmRNZXNzYWdlLnRzJyksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBUQUJMRV9OQU1FOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmMpO1xuICAgIHRoaXMudGFibGUuZ3JhbnRSZWFkRGF0YShmdW5jKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KFxuICAgICAgJ1dTX0VORFBPSU5UJyxcbiAgICAgIGBodHRwczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnJlZ2lvblxuICAgICAgfS5hbWF6b25hd3MuY29tLyR7dGhpcy53ZWJTb2NrZXRTdGFnZS5zdGFnZU5hbWV9YFxuICAgICk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5ncmFudE1hbmFnZUNvbm5lY3Rpb25zKGZ1bmMpO1xuICAgIHJldHVybiBmdW5jO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRTMyhzM0J1Y2tldDogczMuQnVja2V0KSB7XG4gICAgczNCdWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURURfUFVULFxuICAgICAgbmV3IHMzbm90aWYuTGFtYmRhRGVzdGluYXRpb24odGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24pXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoczNCdWNrZXQpO1xuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLm1hcHBpbmdbczNCdWNrZXQuYnVja2V0QXJuXSA9IGBTMyMke25hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RHluYW1vZGIodGFibGU6IGR5bmFtb0RiLlRhYmxlKSB7XG4gICAgLy8gZW5hYmxlIER5bmFtb0RCIHN0cmVhbXMgd2l0aCBhIGhhY2tcbiAgICAodGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZHluYW1vRGIuQ2ZuVGFibGUpLnN0cmVhbVNwZWNpZmljYXRpb24gPSB7XG4gICAgICBzdHJlYW1WaWV3VHlwZTogZHluYW1vRGIuU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgIH07XG4gICAgKHRhYmxlIGFzIGFueSkudGFibGVTdHJlYW1Bcm4gPSAoXG4gICAgICB0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBkeW5hbW9EYi5DZm5UYWJsZVxuICAgICkuYXR0clN0cmVhbUFybjtcblxuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uLmFkZEV2ZW50U291cmNlKFxuICAgICAgbmV3IGR5bmFtb0RiU3RyZWFtLkR5bmFtb0V2ZW50U291cmNlKHRhYmxlLCB7XG4gICAgICAgIHN0YXJ0aW5nUG9zaXRpb246IGxhbWJkYS5TdGFydGluZ1Bvc2l0aW9uLkxBVEVTVCxcbiAgICAgICAgYmF0Y2hTaXplOiAxLFxuICAgICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZSh0YWJsZSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3RhYmxlLnRhYmxlQXJuXSA9IGBEeW5hbW9EQiMke25hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RXZlbnRCdXNSdWxlKHJ1bGU6IGV2ZW50cy5SdWxlKSB7XG4gICAgY29uc3QgeyBldmVudEJ1c05hbWUgfSA9IHJ1bGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZXZlbnRzLkNmblJ1bGU7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmdldEV2ZW50QnJpZGdlKFxuICAgICAgKHJ1bGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYW55KS5ldmVudEJ1c05hbWVcbiAgICApO1xuXG4gICAgaWYgKCFldmVudEJyaWRnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGZpbmQgRXZlbnRCcmlkZ2Ugd2l0aCBuYW1lIFwiJHtldmVudEJ1c05hbWV9XCJgKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnVzZWRGb3JFdmVudEJyaWRnZVxuICAgICk7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24udXNlZEZvckV2ZW50QnJpZGdlID0gdHJ1ZTtcblxuICAgIHJ1bGUuYWRkVGFyZ2V0KG5ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKSk7XG5cbiAgICBjb25zdCBicmlkZ2VOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGV2ZW50QnJpZGdlKTtcbiAgICBjb25zdCBydWxlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShydWxlKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nLmV2ZW50QnJpZGdlID0gYEV2ZW50QnJpZGdlUnVsZSMke2JyaWRnZU5hbWV9IyR7cnVsZU5hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RXZlbnRCdXMoZXZlbnRCdXM6IGV2ZW50cy5FdmVudEJ1cykge1xuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgY29uc3QgYnJpZGdlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShldmVudEJ1cyk7XG4gICAgY29uc3QgcnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCBgUnVsZUFsbCR7YnJpZGdlTmFtZX1gLCB7XG4gICAgICBldmVudEJ1cyxcbiAgICAgIGV2ZW50UGF0dGVybjogeyB2ZXJzaW9uOiBbJzAnXSB9LFxuICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHJ1bGUpO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmcuZXZlbnRCcmlkZ2UgPSBgRXZlbnRCcmlkZ2UjJHticmlkZ2VOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdFNuc1RvcGljKHRvcGljOiBzbnMuVG9waWMpIHtcbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgdG9waWMuYWRkU3Vic2NyaXB0aW9uKFxuICAgICAgbmV3IHNuc1N1YnMuTGFtYmRhU3Vic2NyaXB0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKVxuICAgICk7XG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW3RvcGljLnRvcGljQXJuXSA9IGBTbnNUb3BpYyMke3RvcGljTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0U25zU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbjogc25zLlN1YnNjcmlwdGlvbikge1xuICAgIGlmICghc3Vic2NyaXB0aW9uLm5vZGUuc2NvcGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0b3BpYyA9IHRoaXMuZ2V0VG9waWMoXG4gICAgICAoc3Vic2NyaXB0aW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb24pLnRvcGljQXJuXG4gICAgKTtcblxuICAgIGlmICghdG9waWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBmaW5kIFRvcGljJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy5zdWJzcmliZWRUb3BpY3MuaW5jbHVkZXModG9waWMpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgZmlsdGVyUG9saWN5IH0gPSBzdWJzY3JpcHRpb24ubm9kZVxuICAgICAgLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uQ2xvbmUgPSB0b3BpYy5hZGRTdWJzY3JpcHRpb24oXG4gICAgICBuZXcgc25zU3Vicy5MYW1iZGFTdWJzY3JpcHRpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pXG4gICAgKTtcbiAgICAoc3Vic2NyaXB0aW9uQ2xvbmUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbikuZmlsdGVyUG9saWN5ID1cbiAgICAgIGZpbHRlclBvbGljeTtcblxuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2goc3Vic2NyaXB0aW9uQ2xvbmUpO1xuXG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHN1YnNjcmlwdGlvbi5ub2RlLnNjb3BlKTtcblxuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW1xuICAgICAgdG9waWMudG9waWNBcm5cbiAgICBdID0gYFNuc1N1YnNjcmlwdGlvbiMke3RvcGljTmFtZX0jJHt0YXJnZXROYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIHByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICBmaWx0ZXJGdW5jdGlvbj86IChzdWJzY3JpcHRpb246IEZ1bmN0aW9uU3Vic2NyaXB0aW9uKSA9PiBib29sZWFuXG4gICkge1xuICAgIGxldCBmdW5jdGlvblN1YnNjcmlwdGlvbjogRnVuY3Rpb25TdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wuZmluZChmaWx0ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sWzBdO1xuICAgIH1cblxuICAgIGlmICghZnVuY3Rpb25TdWJzY3JpcHRpb24pIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0ge1xuICAgICAgICBzdWJzcmliZWRUb3BpY3M6IFtdLFxuICAgICAgICB1c2VkRm9yRXZlbnRCcmlkZ2U6IGZhbHNlLFxuICAgICAgICBtYXBwaW5nOiB7fSxcbiAgICAgICAgZnVuY3Rpb246IHRoaXMuY3JlYXRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wubGVuZ3RoXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wucHVzaChmdW5jdGlvblN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvblN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RnVuY3Rpb24oZnVuYzogbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgZnVuYy5hZGRMYXllcnModGhpcy5leHRlbnNpb25MYXllcik7XG4gICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uZ3JhbnRJbnZva2UoZnVuYyk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZnVuYyk7XG5cbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdGVU5DVElPTl9OQU1FJywgZnVuY3Rpb25OYW1lKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUicsICcvb3B0L3NweS13cmFwcGVyJyk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChcbiAgICAgICdGTFVFTlRfVEVTVF9TRU5EX0ZVTkNUSU9OX05BTUUnLFxuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uZnVuY3Rpb25OYW1lXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25zdHJ1Y3ROYW1lKGNvbnN0cnVjdDogSUNvbnN0cnVjdCkge1xuICAgIGxldCBmdW5jdGlvbk5hbWUgPSBjb25zdHJ1Y3Qubm9kZS5wYXRoO1xuICAgIGNvbnN0IHsgc3RhY2tOYW1lIH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgIGlmIChmdW5jdGlvbk5hbWUuc3RhcnRzV2l0aChzdGFja05hbWUpKSB7XG4gICAgICBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWUuc3Vic3RyaW5nKHN0YWNrTmFtZS5sZW5ndGggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9waWModG9waWNBcm46IHN0cmluZyk6IHNucy5Ub3BpYyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdG9waWMgPSB0aGlzLmZpbmRFbGVtZW50PHNucy5Ub3BpYz4oXG4gICAgICAobm9kZTogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIHNucy5Ub3BpYyAmJiAobm9kZSBhcyBzbnMuVG9waWMpLnRvcGljQXJuID09PSB0b3BpY0FyblxuICAgICk7XG5cbiAgICByZXR1cm4gdG9waWM7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50QnJpZGdlKGV2ZW50QnVzTmFtZTogc3RyaW5nKTogZXZlbnRzLkV2ZW50QnVzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBldmVudEJyaWRnZSA9IHRoaXMuZmluZEVsZW1lbnQ8ZXZlbnRzLkV2ZW50QnVzPihcbiAgICAgIChub2RlOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzICYmXG4gICAgICAgIChub2RlIGFzIGV2ZW50cy5FdmVudEJ1cykuZXZlbnRCdXNOYW1lID09PSBldmVudEJ1c05hbWVcbiAgICApO1xuXG4gICAgcmV0dXJuIGV2ZW50QnJpZGdlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRWxlbWVudDxUIGV4dGVuZHMgSUNvbnN0cnVjdCA9IElDb25zdHJ1Y3Q+KFxuICAgIGZpbHRlckZ1bmM6IChub2RlOiBJQ29uc3RydWN0KSA9PiBib29sZWFuLFxuICAgIHBhcmVudD86IElDb25zdHJ1Y3RcbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHBhcmVudCA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwYXJlbnQubm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKGZpbHRlckZ1bmMobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgYXMgVDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmluZEVsZW1lbnQ8VD4oZmlsdGVyRnVuYywgbm9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG50eXBlIEZ1bmN0aW9uU3Vic2NyaXB0aW9uID0ge1xuICBzdWJzcmliZWRUb3BpY3M6IHNucy5Ub3BpY1tdO1xuICB1c2VkRm9yRXZlbnRCcmlkZ2U6IGJvb2xlYW47XG4gIGZ1bmN0aW9uOiBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uO1xuICBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuZnVuY3Rpb24gZ2V0QXNzZXRMb2NhdGlvbihsb2NhdGlvbjogc3RyaW5nKSB7XG4gIGNvbnN0IGxvYyA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8nICsgbG9jYXRpb24pO1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGxvYykpIHtcbiAgICByZXR1cm4gbG9jO1xuICB9XG5cbiAgY29uc3QgbG9jMiA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi8nICsgbG9jYXRpb24pO1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGxvYzIpKSB7XG4gICAgcmV0dXJuIGxvYzI7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYExvY2F0aW9uICR7bG9jfSBhbmQgJHtsb2MyfSBkb2VzIG5vdCBleGlzdHMuYCk7XG59XG4iXX0=
358
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBMkQ7QUFDM0QsMkVBQTJFO0FBQzNFLDZDQUF5RDtBQUV6RCxxREFBcUQ7QUFDckQsaURBQWlEO0FBQ2pELDBEQUEwRDtBQUMxRCxpREFBaUQ7QUFDakQsdUVBQXVFO0FBQ3ZFLDREQUE0RDtBQUM1RCx5Q0FBeUM7QUFDekMsNERBQTREO0FBQzVELDJDQUEyQztBQUMzQyw2REFBNkQ7QUFDN0QsMkNBQTJDO0FBQzNDLDJDQUFtRDtBQU1uRCxNQUFhLGFBQWMsU0FBUSxzQkFBUztJQW1CMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBYlgsaUJBQVksR0FBaUIsRUFBRSxDQUFDO1FBRWhDLDZCQUF3QixHQUEyQixFQUFFLENBQUM7UUFNdkQsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFPaEMsSUFBSSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUNwQyxTQUFTLEVBQ1QseUJBQXlCLENBQzFCLENBQUM7UUFFRixNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQ3pDLFNBQVMsRUFDVCw2QkFBNkIsQ0FDOUIsQ0FBQztRQUVGLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsRUFBRTtnQkFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDYix1REFBdUQsc0JBQXNCLFVBQVUseUJBQXlCLEdBQUcsQ0FDcEgsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLHNCQUFzQixHQUFHLHlCQUF5QixDQUFDO2FBQ3BEO1NBQ0Y7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QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdkIsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxHQUFHLFFBQVEsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgYXBpR3dWMiBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWFscGhhJztcbmltcG9ydCAqIGFzIGFwaUd3VjJJbnQgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnMtYWxwaGEnO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBhZ3cgZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mic7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgZHluYW1vRGJTdHJlYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ldmVudC1zb3VyY2VzJztcbmltcG9ydCAqIGFzIGxhbWJkYU5vZGUgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzbm90aWYgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLW5vdGlmaWNhdGlvbnMnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0ICogYXMgc25zU3VicyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zLXN1YnNjcmlwdGlvbnMnO1xuaW1wb3J0ICogYXMgc3FzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zcXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVybGVzc1NweVByb3BzIHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVTcHlFdmVudHNGaWxlTG9jYXRpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJsZXNzU3B5IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSBleHRlbnNpb25MYXllcjogbGFtYmRhLkxheWVyVmVyc2lvbjtcblxuICBwcml2YXRlIHRhYmxlOiBkeW5hbW9EYi5UYWJsZTtcblxuICBwcml2YXRlIHdlYlNvY2tldEFwaTogYXBpR3dWMi5XZWJTb2NrZXRBcGk7XG5cbiAgcHJpdmF0ZSBvd25Db250cnVjdHM6IElDb25zdHJ1Y3RbXSA9IFtdO1xuXG4gIHByaXZhdGUgZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sOiBGdW5jdGlvblN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgcHJpdmF0ZSBmdW5jdGlvblN1YnNjcmlwdGlvbk1haW46IEZ1bmN0aW9uU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgd2ViU29ja2V0U3RhZ2U6IGFwaUd3VjIuV2ViU29ja2V0U3RhZ2U7XG5cbiAgcHVibGljIHNlcnZpY2VLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHdzVXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBTZXJ2ZXJsZXNzU3B5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbGV0IGV4dGVuc2lvbkFzc2V0TG9jYXRpb24gPSBwYXRoLmpvaW4oXG4gICAgICBfX2Rpcm5hbWUsXG4gICAgICAnLi4vZXh0ZW5zaW9uL2Rpc3QvbGF5ZXInXG4gICAgKTtcblxuICAgIGNvbnN0IGV4dGVuc2lvbkFzc2V0TG9jYXRpb25BbHQgPSBwYXRoLmpvaW4oXG4gICAgICBfX2Rpcm5hbWUsXG4gICAgICAnLi4vbGliL2V4dGVuc2lvbi9kaXN0L2xheWVyJ1xuICAgICk7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbikpIHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhleHRlbnNpb25Bc3NldExvY2F0aW9uQWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZvbGRlciB3aXRoIGFzc2V0cyBmb3IgZXh0ZW5zaW9uIGRvZXMgbm90IGV4aXN0cyBhdCAke2V4dGVuc2lvbkFzc2V0TG9jYXRpb259IG9yIGF0ICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkFsdH0gYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbiA9IGV4dGVuc2lvbkFzc2V0TG9jYXRpb25BbHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbldyYXBlciA9IHBhdGguam9pbihcbiAgICAgIGV4dGVuc2lvbkFzc2V0TG9jYXRpb24sXG4gICAgICAnc3B5LXdyYXBwZXInXG4gICAgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbldyYXBlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdyYXBlciBzY3JpcHQgZm9yIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdHMgJHtleHRlbnNpb25Bc3NldExvY2F0aW9ufWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkNvZGUgPSBwYXRoLmpvaW4oXG4gICAgICBleHRlbnNpb25Bc3NldExvY2F0aW9uLFxuICAgICAgJ25vZGVqcy9ub2RlX21vZHVsZXMvaW50ZXJjZXB0b3IuanMnXG4gICAgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkNvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb2RlIGZvciBleHRlbnNpb24gZG9lcyBub3QgZXhpc3RzICR7ZXh0ZW5zaW9uQXNzZXRMb2NhdGlvbkNvZGV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4dGVuc2lvbkxheWVyID0gbmV3IGxhbWJkYS5MYXllclZlcnNpb24odGhpcywgJ0V4dGVuc2lvbicsIHtcbiAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW1xuICAgICAgICBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTJfWCxcbiAgICAgICAgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgXSxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChleHRlbnNpb25Bc3NldExvY2F0aW9uKSxcbiAgICB9KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMuZXh0ZW5zaW9uTGF5ZXIpO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBkeW5hbW9EYi5UYWJsZSh0aGlzLCAnV2ViU29ja2V0Jywge1xuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0aW9uSWQnLFxuICAgICAgICB0eXBlOiBkeW5hbW9EYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgICBiaWxsaW5nTW9kZTogZHluYW1vRGIuQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgIH0pO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy50YWJsZSk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk9uQ29ubmVjdCA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdPbkNvbm5lY3QnLCB7XG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICBlbnRyeTogZ2V0QXNzZXRMb2NhdGlvbignZnVuY3Rpb25zL29uQ29ubmVjdC50cycpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVEFCTEVfTkFNRTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZnVuY3Rpb25PbkNvbm5lY3QpO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2goZnVuY3Rpb25PbkNvbm5lY3QpO1xuXG4gICAgY29uc3QgZnVuY3Rpb25PbkRpc2Nvbm5lY3QgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICAnT25EaXNjb25uZWN0JyxcbiAgICAgIHtcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgICBlbnRyeTogZ2V0QXNzZXRMb2NhdGlvbignZnVuY3Rpb25zL29uRGlzY29ubmVjdC50cycpLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIFRBQkxFX05BTUU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy50YWJsZS5ncmFudFdyaXRlRGF0YShmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaChmdW5jdGlvbk9uRGlzY29ubmVjdCk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaSA9IG5ldyBhcGlHd1YyLldlYlNvY2tldEFwaSh0aGlzLCAnQXBpR3dXZWJTb2NrZXQnKTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMud2ViU29ja2V0QXBpKTtcbiAgICB0aGlzLndlYlNvY2tldFN0YWdlID0gbmV3IGFwaUd3VjIuV2ViU29ja2V0U3RhZ2UoXG4gICAgICB0aGlzLFxuICAgICAgJ0FwaUd3V2ViU29ja2V0U3RhZ2UnLFxuICAgICAge1xuICAgICAgICB3ZWJTb2NrZXRBcGk6IHRoaXMud2ViU29ja2V0QXBpLFxuICAgICAgICBzdGFnZU5hbWU6ICdwcm9kJyxcbiAgICAgICAgYXV0b0RlcGxveTogdHJ1ZSxcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy53ZWJTb2NrZXRTdGFnZSk7XG4gICAgY29uc3Qgd2ViU29ja2V0QXBpUm91dGUgPSB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnJGNvbm5lY3QnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICckY29ubmVjdCcsXG4gICAgICAgIGZ1bmN0aW9uT25Db25uZWN0XG4gICAgICApLFxuICAgIH0pO1xuICAgICh3ZWJTb2NrZXRBcGlSb3V0ZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhZ3cuQ2ZuUm91dGUpLmF1dGhvcml6YXRpb25UeXBlID1cbiAgICAgICdBV1NfSUFNJztcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCckZGlzY29ubmVjdCcsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJyRkaXNjb25uZWN0JyxcbiAgICAgICAgZnVuY3Rpb25PbkRpc2Nvbm5lY3RcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKCk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5hZGRSb3V0ZSgnc2VuZG1lc3NhZ2UnLCB7XG4gICAgICBpbnRlZ3JhdGlvbjogbmV3IGFwaUd3VjJJbnQuV2ViU29ja2V0TGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICdTZW5kTWVzc2FnZScsXG4gICAgICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uXG4gICAgICApLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pdGVyYXRlQWxsRWxlbWVudHMoU3RhY2sub2YodGhpcykpO1xuXG4gICAgZm9yIChjb25zdCBmdW5jIG9mIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sKSB7XG4gICAgICBmdW5jLmZ1bmN0aW9uLmFkZEVudmlyb25tZW50KFxuICAgICAgICAnSU5GUkFfTUFQUElORycsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZ1bmMubWFwcGluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy53c1VybCA9IGB3c3M6Ly8ke3RoaXMud2ViU29ja2V0QXBpLmFwaUlkfS5leGVjdXRlLWFwaS4ke1xuICAgICAgU3RhY2sub2YodGhpcykucmVnaW9uXG4gICAgfS5hbWF6b25hd3MuY29tLyR7dGhpcy53ZWJTb2NrZXRTdGFnZS5zdGFnZU5hbWV9YDtcblxuICAgIG5ldyBDZm5PdXRwdXQoU3RhY2sub2YodGhpcyksICdTZXJ2ZXJsZXNzU3B5V3NVcmwnLCB7XG4gICAgICB2YWx1ZTogdGhpcy53c1VybCxcbiAgICB9KTtcblxuICAgIC8vIG5ldyBDZm5PdXRwdXQodGhpcywgXCJBUElfVVJMXCIsIHtcbiAgICAvLyAgIHZhbHVlOiB0aGlzLndzVXJsLFxuICAgIC8vIH0pO1xuXG4gICAgaWYgKHByb3BzPy5nZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbikge1xuICAgICAgdGhpcy53cml0ZVNweUV2ZW50c0NsYXNzKHByb3BzPy5nZW5lcmF0ZVNweUV2ZW50c0ZpbGVMb2NhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3cml0ZVNweUV2ZW50c0NsYXNzKGZpbGVMb2NhdGlvbjogc3RyaW5nKSB7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlTG9jYXRpb24pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnNlcnZpY2VLZXlzXG4gICAgICAubWFwKChzaykgPT4gYCAgJHtzay5yZXBsYWNlKC8jL2csICcnKX06ICcke3NrfScgPSAnJHtza30nO1xcbmApXG4gICAgICAuam9pbignJyk7XG5cbiAgICBjb25zdCBjb2RlID0gYC8qIGVzbGludC1kaXNhYmxlICovXFxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHlFdmVudHMge1xcbiR7cHJvcGVydGllc319XFxuYDtcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZUxvY2F0aW9uLCBjb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgaXRlcmF0ZUFsbEVsZW1lbnRzKHBhcmVudDogSUNvbnN0cnVjdCkge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwYXJlbnQubm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKHRoaXMub3duQ29udHJ1Y3RzLmluY2x1ZGVzKG5vZGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wuZmluZCgocykgPT4gcy5mdW5jdGlvbiA9PT0gbm9kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0RnVuY3Rpb24obm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2ludGVyY2VwdFNuc1RvcGljJyk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0U25zVG9waWMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0U25zU3Vic2NyaXB0aW9uKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgczMuQnVja2V0KSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0UzMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBkeW5hbW9EYi5UYWJsZSkge1xuICAgICAgICB0aGlzLmludGVyY2VwdER5bmFtb2RiKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0RXZlbnRCdXMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuUnVsZSkge1xuICAgICAgICB0aGlzLmludGVyY2VwdEV2ZW50QnVzUnVsZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRTcXMobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnTk8gTUFUQ0gnLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pdGVyYXRlQWxsRWxlbWVudHMobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRTcXMobm9kZTogbGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZykge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5maW5kRWxlbWVudDxzcXMuUXVldWU+KFxuICAgICAgKG46IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG4gaW5zdGFuY2VvZiBzcXMuUXVldWUgJiZcbiAgICAgICAgKG4gYXMgc3FzLlF1ZXVlKS5xdWV1ZUFybiA9PT0gbm9kZS5ldmVudFNvdXJjZUFyblxuICAgICk7XG5cbiAgICBjb25zdCBmdW5jID0gdGhpcy5maW5kRWxlbWVudDxsYW1iZGEuRnVuY3Rpb24+KFxuICAgICAgKG46IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG4gaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24gJiZcbiAgICAgICAgKG4gYXMgbGFtYmRhLkZ1bmN0aW9uKS5mdW5jdGlvbk5hbWUgPT09IG5vZGUuZnVuY3Rpb25OYW1lXG4gICAgKTtcblxuICAgIGlmIChxdWV1ZSAmJiBmdW5jKSB7XG4gICAgICBjb25zdCBxdWV1ZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUocXVldWUpO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYFNxcyMke3F1ZXVlTmFtZX1gO1xuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4ubWFwcGluZ1txdWV1ZS5xdWV1ZUFybl0gPSBzZXJ2aWNlS2V5O1xuICAgICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICAgICAgZnVuYy5hZGRFbnZpcm9ubWVudCgnRkxVRU5UX1RFU1RfU1VCU0NSSUJFRF9UT19TUVMnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGZ1bmMgPSBuZXcgbGFtYmRhTm9kZS5Ob2RlanNGdW5jdGlvbih0aGlzLCBgU3Vic2NyaXB0aW9uJHtpbmRleH1gLCB7XG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICBlbnRyeTogZ2V0QXNzZXRMb2NhdGlvbignZnVuY3Rpb25zL3NlbmRNZXNzYWdlLnRzJyksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBUQUJMRV9OQU1FOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmMpO1xuICAgIHRoaXMudGFibGUuZ3JhbnRSZWFkRGF0YShmdW5jKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KFxuICAgICAgJ1dTX0VORFBPSU5UJyxcbiAgICAgIGBodHRwczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnJlZ2lvblxuICAgICAgfS5hbWF6b25hd3MuY29tLyR7dGhpcy53ZWJTb2NrZXRTdGFnZS5zdGFnZU5hbWV9YFxuICAgICk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5ncmFudE1hbmFnZUNvbm5lY3Rpb25zKGZ1bmMpO1xuICAgIHJldHVybiBmdW5jO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRTMyhzM0J1Y2tldDogczMuQnVja2V0KSB7XG4gICAgczNCdWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURURfUFVULFxuICAgICAgbmV3IHMzbm90aWYuTGFtYmRhRGVzdGluYXRpb24odGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24pXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoczNCdWNrZXQpO1xuXG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBTMyMke25hbWV9YDtcbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3MzQnVja2V0LmJ1Y2tldEFybl0gPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RHluYW1vZGIodGFibGU6IGR5bmFtb0RiLlRhYmxlKSB7XG4gICAgLy8gZW5hYmxlIER5bmFtb0RCIHN0cmVhbXMgd2l0aCBhIGhhY2tcbiAgICAodGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZHluYW1vRGIuQ2ZuVGFibGUpLnN0cmVhbVNwZWNpZmljYXRpb24gPSB7XG4gICAgICBzdHJlYW1WaWV3VHlwZTogZHluYW1vRGIuU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgIH07XG4gICAgKHRhYmxlIGFzIGFueSkudGFibGVTdHJlYW1Bcm4gPSAoXG4gICAgICB0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBkeW5hbW9EYi5DZm5UYWJsZVxuICAgICkuYXR0clN0cmVhbUFybjtcblxuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uLmFkZEV2ZW50U291cmNlKFxuICAgICAgbmV3IGR5bmFtb0RiU3RyZWFtLkR5bmFtb0V2ZW50U291cmNlKHRhYmxlLCB7XG4gICAgICAgIHN0YXJ0aW5nUG9zaXRpb246IGxhbWJkYS5TdGFydGluZ1Bvc2l0aW9uLkxBVEVTVCxcbiAgICAgICAgYmF0Y2hTaXplOiAxLFxuICAgICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZSh0YWJsZSk7XG5cbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYER5bmFtb0RCIyR7bmFtZX1gO1xuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLm1hcHBpbmdbdGFibGUudGFibGVBcm5dID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdEV2ZW50QnVzUnVsZShydWxlOiBldmVudHMuUnVsZSkge1xuICAgIGNvbnN0IHsgZXZlbnRCdXNOYW1lIH0gPSBydWxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGV2ZW50cy5DZm5SdWxlO1xuICAgIGNvbnN0IGV2ZW50QnJpZGdlID0gdGhpcy5nZXRFdmVudEJyaWRnZShcbiAgICAgIChydWxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGFueSkuZXZlbnRCdXNOYW1lXG4gICAgKTtcblxuICAgIGlmICghZXZlbnRCcmlkZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuIG5vdCBmaW5kIEV2ZW50QnJpZGdlIHdpdGggbmFtZSBcIiR7ZXZlbnRCdXNOYW1lfVwiYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy51c2VkRm9yRXZlbnRCcmlkZ2VcbiAgICApO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnVzZWRGb3JFdmVudEJyaWRnZSA9IHRydWU7XG5cbiAgICBydWxlLmFkZFRhcmdldChuZXcgdGFyZ2V0cy5MYW1iZGFGdW5jdGlvbihmdW5jdGlvblN1YnNjcmlwdGlvbi5mdW5jdGlvbikpO1xuXG4gICAgY29uc3QgYnJpZGdlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShldmVudEJyaWRnZSk7XG4gICAgY29uc3QgcnVsZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUocnVsZSk7XG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBFdmVudEJyaWRnZVJ1bGUjJHticmlkZ2VOYW1lfSMke3J1bGVOYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZy5ldmVudEJyaWRnZSA9IHNlcnZpY2VLZXk7XG4gICAgdGhpcy5zZXJ2aWNlS2V5cy5wdXNoKHNlcnZpY2VLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRFdmVudEJ1cyhldmVudEJ1czogZXZlbnRzLkV2ZW50QnVzKSB7XG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy51c2VkRm9yRXZlbnRCcmlkZ2VcbiAgICApO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnVzZWRGb3JFdmVudEJyaWRnZSA9IHRydWU7XG5cbiAgICBjb25zdCBicmlkZ2VOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGV2ZW50QnVzKTtcbiAgICBjb25zdCBydWxlID0gbmV3IGV2ZW50cy5SdWxlKHRoaXMsIGBSdWxlQWxsJHticmlkZ2VOYW1lfWAsIHtcbiAgICAgIGV2ZW50QnVzLFxuICAgICAgZXZlbnRQYXR0ZXJuOiB7IHZlcnNpb246IFsnMCddIH0sXG4gICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuTGFtYmRhRnVuY3Rpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pXSxcbiAgICB9KTtcblxuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2gocnVsZSk7XG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBFdmVudEJyaWRnZSMke2JyaWRnZU5hbWV9YDtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nLmV2ZW50QnJpZGdlID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdFNuc1RvcGljKHRvcGljOiBzbnMuVG9waWMpIHtcbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgdG9waWMuYWRkU3Vic2NyaXB0aW9uKFxuICAgICAgbmV3IHNuc1N1YnMuTGFtYmRhU3Vic2NyaXB0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKVxuICAgICk7XG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBjb25zdCBzZXJ2aWNlS2V5ID0gYFNuc1RvcGljIyR7dG9waWNOYW1lfWA7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24ubWFwcGluZ1t0b3BpYy50b3BpY0Fybl0gPSBzZXJ2aWNlS2V5O1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChzZXJ2aWNlS2V5KTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5zdWJzcmliZWRUb3BpY3MucHVzaCh0b3BpYyk7XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdFNuc1N1YnNjcmlwdGlvbihzdWJzY3JpcHRpb246IHNucy5TdWJzY3JpcHRpb24pIHtcbiAgICBpZiAoIXN1YnNjcmlwdGlvbi5ub2RlLnNjb3BlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdG9waWMgPSB0aGlzLmdldFRvcGljKFxuICAgICAgKHN1YnNjcmlwdGlvbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uKS50b3BpY0FyblxuICAgICk7XG5cbiAgICBpZiAoIXRvcGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgZmluZCBUb3BpYycpO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMuc3Vic3JpYmVkVG9waWNzLmluY2x1ZGVzKHRvcGljKVxuICAgICk7XG5cbiAgICBjb25zdCB7IGZpbHRlclBvbGljeSB9ID0gc3Vic2NyaXB0aW9uLm5vZGVcbiAgICAgIC5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbkNsb25lID0gdG9waWMuYWRkU3Vic2NyaXB0aW9uKFxuICAgICAgbmV3IHNuc1N1YnMuTGFtYmRhU3Vic2NyaXB0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKVxuICAgICk7XG4gICAgKHN1YnNjcmlwdGlvbkNsb25lLm5vZGUuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb24pLmZpbHRlclBvbGljeSA9XG4gICAgICBmaWx0ZXJQb2xpY3k7XG5cbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHN1YnNjcmlwdGlvbkNsb25lKTtcblxuICAgIGNvbnN0IHRvcGljTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZSh0b3BpYyk7XG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShzdWJzY3JpcHRpb24ubm9kZS5zY29wZSk7XG5cbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5zdWJzcmliZWRUb3BpY3MucHVzaCh0b3BpYyk7XG4gICAgY29uc3Qgc2VydmljZUtleSA9IGBTbnNTdWJzY3JpcHRpb24jJHt0b3BpY05hbWV9IyR7dGFyZ2V0TmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmdbdG9waWMudG9waWNBcm5dID0gc2VydmljZUtleTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goc2VydmljZUtleSk7XG4gIH1cblxuICBwcml2YXRlIHByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICBmaWx0ZXJGdW5jdGlvbj86IChzdWJzY3JpcHRpb246IEZ1bmN0aW9uU3Vic2NyaXB0aW9uKSA9PiBib29sZWFuXG4gICkge1xuICAgIGxldCBmdW5jdGlvblN1YnNjcmlwdGlvbjogRnVuY3Rpb25TdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wuZmluZChmaWx0ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sWzBdO1xuICAgIH1cblxuICAgIGlmICghZnVuY3Rpb25TdWJzY3JpcHRpb24pIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0ge1xuICAgICAgICBzdWJzcmliZWRUb3BpY3M6IFtdLFxuICAgICAgICB1c2VkRm9yRXZlbnRCcmlkZ2U6IGZhbHNlLFxuICAgICAgICBtYXBwaW5nOiB7fSxcbiAgICAgICAgZnVuY3Rpb246IHRoaXMuY3JlYXRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wubGVuZ3RoXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wucHVzaChmdW5jdGlvblN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvblN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RnVuY3Rpb24oZnVuYzogbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgZnVuYy5hZGRMYXllcnModGhpcy5leHRlbnNpb25MYXllcik7XG4gICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uZ3JhbnRJbnZva2UoZnVuYyk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZnVuYyk7XG5cbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdGVU5DVElPTl9OQU1FJywgZnVuY3Rpb25OYW1lKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUicsICcvb3B0L3NweS13cmFwcGVyJyk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChcbiAgICAgICdGTFVFTlRfVEVTVF9TRU5EX0ZVTkNUSU9OX05BTUUnLFxuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uZnVuY3Rpb25OYW1lXG4gICAgKTtcblxuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChgRnVuY3Rpb24jJHtmdW5jdGlvbk5hbWV9I1JlcXVlc3RgKTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goYEZ1bmN0aW9uIyR7ZnVuY3Rpb25OYW1lfSNFcnJvcmApO1xuICAgIHRoaXMuc2VydmljZUtleXMucHVzaChgRnVuY3Rpb24jJHtmdW5jdGlvbk5hbWV9I0NvbnNvbGVgKTtcbiAgICB0aGlzLnNlcnZpY2VLZXlzLnB1c2goYEZ1bmN0aW9uIyR7ZnVuY3Rpb25OYW1lfSNSZXNwb25zZWApO1xuICB9XG5cbiAgcHVibGljIGdldENvbnN0cnVjdE5hbWUoY29uc3RydWN0OiBJQ29uc3RydWN0KSB7XG4gICAgbGV0IGZ1bmN0aW9uTmFtZSA9IGNvbnN0cnVjdC5ub2RlLnBhdGg7XG4gICAgY29uc3QgeyBzdGFja05hbWUgfSA9IFN0YWNrLm9mKHRoaXMpO1xuXG4gICAgaWYgKGZ1bmN0aW9uTmFtZS5zdGFydHNXaXRoKHN0YWNrTmFtZSkpIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZS5zdWJzdHJpbmcoc3RhY2tOYW1lLmxlbmd0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb25OYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb3BpYyh0b3BpY0Fybjogc3RyaW5nKTogc25zLlRvcGljIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0b3BpYyA9IHRoaXMuZmluZEVsZW1lbnQ8c25zLlRvcGljPihcbiAgICAgIChub2RlOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBub2RlIGluc3RhbmNlb2Ygc25zLlRvcGljICYmIChub2RlIGFzIHNucy5Ub3BpYykudG9waWNBcm4gPT09IHRvcGljQXJuXG4gICAgKTtcblxuICAgIHJldHVybiB0b3BpYztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXZlbnRCcmlkZ2UoZXZlbnRCdXNOYW1lOiBzdHJpbmcpOiBldmVudHMuRXZlbnRCdXMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGV2ZW50QnJpZGdlID0gdGhpcy5maW5kRWxlbWVudDxldmVudHMuRXZlbnRCdXM+KFxuICAgICAgKG5vZGU6IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG5vZGUgaW5zdGFuY2VvZiBldmVudHMuRXZlbnRCdXMgJiZcbiAgICAgICAgKG5vZGUgYXMgZXZlbnRzLkV2ZW50QnVzKS5ldmVudEJ1c05hbWUgPT09IGV2ZW50QnVzTmFtZVxuICAgICk7XG5cbiAgICByZXR1cm4gZXZlbnRCcmlkZ2U7XG4gIH1cblxuICBwcml2YXRlIGZpbmRFbGVtZW50PFQgZXh0ZW5kcyBJQ29uc3RydWN0ID0gSUNvbnN0cnVjdD4oXG4gICAgZmlsdGVyRnVuYzogKG5vZGU6IElDb25zdHJ1Y3QpID0+IGJvb2xlYW4sXG4gICAgcGFyZW50PzogSUNvbnN0cnVjdFxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcGFyZW50ID0gU3RhY2sub2YodGhpcyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBub2RlIG9mIHBhcmVudC5ub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoZmlsdGVyRnVuYyhub2RlKSkge1xuICAgICAgICByZXR1cm4gbm9kZSBhcyBUO1xuICAgICAgfVxuICAgICAgdGhpcy5maW5kRWxlbWVudDxUPihmaWx0ZXJGdW5jLCBub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbnR5cGUgRnVuY3Rpb25TdWJzY3JpcHRpb24gPSB7XG4gIHN1YnNyaWJlZFRvcGljczogc25zLlRvcGljW107XG4gIHVzZWRGb3JFdmVudEJyaWRnZTogYm9vbGVhbjtcbiAgZnVuY3Rpb246IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb247XG4gIG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59O1xuXG5mdW5jdGlvbiBnZXRBc3NldExvY2F0aW9uKGxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgY29uc3QgbG9jID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLycgKyBsb2NhdGlvbik7XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jKSkge1xuICAgIHJldHVybiBsb2M7XG4gIH1cblxuICBjb25zdCBsb2MyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uLycgKyBsb2NhdGlvbik7XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jMikpIHtcbiAgICByZXR1cm4gbG9jMjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgTG9jYXRpb24gJHtsb2N9IGFuZCAke2xvYzJ9IGRvZXMgbm90IGV4aXN0cy5gKTtcbn1cbiJdfQ==