@aurigma/ng-design-atoms-api-client 2.62.3 → 2.62.6

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.
@@ -3129,25 +3129,17 @@ export class DesignAtomsServiceApiClient extends ApiClientBase {
3129
3129
  throw new Error("The parameter 'patchType' cannot be null.");
3130
3130
  else
3131
3131
  content_.append("patchType", patchType.toString());
3132
- if (replaceImageItemFileInfo_itemName === null || replaceImageItemFileInfo_itemName === undefined)
3133
- throw new Error("The parameter 'replaceImageItemFileInfo_itemName' cannot be null.");
3134
- else
3132
+ if (replaceImageItemFileInfo_itemName !== null && replaceImageItemFileInfo_itemName !== undefined)
3135
3133
  content_.append("replaceImageItemFileInfo.itemName", replaceImageItemFileInfo_itemName.toString());
3136
- if (replaceImageItemFileInfo_sourceFile === null || replaceImageItemFileInfo_sourceFile === undefined)
3137
- throw new Error("The parameter 'replaceImageItemFileInfo_sourceFile' cannot be null.");
3138
- else
3134
+ if (replaceImageItemFileInfo_sourceFile !== null && replaceImageItemFileInfo_sourceFile !== undefined)
3139
3135
  content_.append("replaceImageItemFileInfo.sourceFile", replaceImageItemFileInfo_sourceFile.data, replaceImageItemFileInfo_sourceFile.fileName ? replaceImageItemFileInfo_sourceFile.fileName : "replaceImageItemFileInfo.sourceFile");
3140
- if (replacePlaceholderItemContentInfo_placeholderItemName === null || replacePlaceholderItemContentInfo_placeholderItemName === undefined)
3141
- throw new Error("The parameter 'replacePlaceholderItemContentInfo_placeholderItemName' cannot be null.");
3142
- else
3136
+ if (replacePlaceholderItemContentInfo_placeholderItemName !== null && replacePlaceholderItemContentInfo_placeholderItemName !== undefined)
3143
3137
  content_.append("replacePlaceholderItemContentInfo.placeholderItemName", replacePlaceholderItemContentInfo_placeholderItemName.toString());
3144
3138
  if (replacePlaceholderItemContentInfo_newContentType === null || replacePlaceholderItemContentInfo_newContentType === undefined)
3145
3139
  throw new Error("The parameter 'replacePlaceholderItemContentInfo_newContentType' cannot be null.");
3146
3140
  else
3147
3141
  content_.append("replacePlaceholderItemContentInfo.newContentType", replacePlaceholderItemContentInfo_newContentType.toString());
3148
- if (replacePlaceholderItemContentInfo_sourceFile === null || replacePlaceholderItemContentInfo_sourceFile === undefined)
3149
- throw new Error("The parameter 'replacePlaceholderItemContentInfo_sourceFile' cannot be null.");
3150
- else
3142
+ if (replacePlaceholderItemContentInfo_sourceFile !== null && replacePlaceholderItemContentInfo_sourceFile !== undefined)
3151
3143
  content_.append("replacePlaceholderItemContentInfo.sourceFile", replacePlaceholderItemContentInfo_sourceFile.data, replacePlaceholderItemContentInfo_sourceFile.fileName ? replacePlaceholderItemContentInfo_sourceFile.fileName : "replacePlaceholderItemContentInfo.sourceFile");
3152
3144
  let options_ = {
3153
3145
  body: content_,
@@ -4119,21 +4111,13 @@ export class DesignAtomsServiceApiClient extends ApiClientBase {
4119
4111
  url_ += "tenantId=" + encodeURIComponent("" + tenantId) + "&";
4120
4112
  url_ = url_.replace(/[?&]$/, "");
4121
4113
  const content_ = new FormData();
4122
- if (sourceType === null || sourceType === undefined)
4123
- throw new Error("The parameter 'sourceType' cannot be null.");
4124
- else
4114
+ if (sourceType !== null && sourceType !== undefined)
4125
4115
  content_.append("sourceType", sourceType.toString());
4126
- if (sourceId === null || sourceId === undefined)
4127
- throw new Error("The parameter 'sourceId' cannot be null.");
4128
- else
4116
+ if (sourceId !== null && sourceId !== undefined)
4129
4117
  content_.append("sourceId", sourceId.toString());
4130
- if (sourceOwnerId === null || sourceOwnerId === undefined)
4131
- throw new Error("The parameter 'sourceOwnerId' cannot be null.");
4132
- else
4118
+ if (sourceOwnerId !== null && sourceOwnerId !== undefined)
4133
4119
  content_.append("sourceOwnerId", sourceOwnerId.toString());
4134
- if (sourceFile === null || sourceFile === undefined)
4135
- throw new Error("The parameter 'sourceFile' cannot be null.");
4136
- else
4120
+ if (sourceFile !== null && sourceFile !== undefined)
4137
4121
  content_.append("sourceFile", sourceFile.data, sourceFile.fileName ? sourceFile.fileName : "sourceFile");
4138
4122
  let options_ = {
4139
4123
  body: content_,
@@ -7167,4 +7151,4 @@ function blobToText(blob) {
7167
7151
  }
7168
7152
  });
7169
7153
  }
7170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLWF0b21zLWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvYXVyaWdtYS9hZ2VudHMvQ0NIMDIvX3dvcmsvOC9zL3NyYy9BdXJpZ21hLkRlc2lnbkF0b21zQXBpLlR5cGVTY3JpcHRBcGlDbGllbnQvQW5ndWxhci9hcGktY2xpZW50L3Byb2plY3RzL2NsaWVudC9zcmMvIiwic291cmNlcyI6WyJsaWIvZGVzaWduLWF0b21zLWFwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsd0JBQXdCO0FBQ3hCLG1CQUFtQjtBQUNuQiw0SEFBNEg7QUFDNUgsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4Qix1Q0FBdUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxlQUFlLEVBQUUsVUFBVSxJQUFJLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRS9GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUV2RSxNQUFNLE9BQU8sc0JBQXNCO0lBQW5DO1FBQ0ksV0FBTSxHQUFXLHdCQUF3QixDQUFDO1FBQzFDLFdBQU0sR0FBVyxRQUFRLENBQUM7UUFDbEIsdUJBQWtCLEdBQVcsSUFBSSxDQUFDO0lBRzlDLENBQUM7SUFGUyxxQkFBcUI7OERBQXNCLE9BQU8sSUFBSSxD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Q0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDxhdXRvLWdlbmVyYXRlZD5cbi8vICAgICBHZW5lcmF0ZWQgdXNpbmcgdGhlIE5Td2FnIHRvb2xjaGFpbiB2MTMuMTUuNS4wIChOSnNvblNjaGVtYSB2MTAuNi42LjAgKE5ld3RvbnNvZnQuSnNvbiB2MTEuMC4wLjApKSAoaHR0cDovL05Td2FnLm9yZylcbi8vIDwvYXV0by1nZW5lcmF0ZWQ+XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlU2hhcnBlciBkaXNhYmxlIEluY29uc2lzdGVudE5hbWluZ1xuXG5pbXBvcnQgeyBtZXJnZU1hcCBhcyBfb2JzZXJ2YWJsZU1lcmdlTWFwLCBjYXRjaEVycm9yIGFzIF9vYnNlcnZhYmxlQ2F0Y2ggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tIGFzIF9vYnNlcnZhYmxlRnJvbSwgdGhyb3dFcnJvciBhcyBfb2JzZXJ2YWJsZVRocm93LCBvZiBhcyBfb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSwgSHR0cFJlc3BvbnNlQmFzZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuZXhwb3J0IGNvbnN0IEFQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdBUElfQkFTRV9VUkwnKTtcblxuZXhwb3J0IGNsYXNzIEFwaUNsaWVudENvbmZpZ3VyYXRpb24ge1xuICAgIGFwaVVybDogc3RyaW5nID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NTQyMjAnO1xuICAgIGFwaUtleTogc3RyaW5nID0gJ0FwaUtleSc7XG4gICAgcHJpdmF0ZSBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZyA9IG51bGw7XG4gICAgYXN5bmMgZ2V0QXV0aG9yaXphdGlvblRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbjsgfTtcbiAgICBzZXRBdXRob3JpemF0aW9uVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQgeyB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbiA9IHRva2VuOyB9O1xufVxuXG5leHBvcnQgY2xhc3MgQXBpQ2xpZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uKSB7IH1cblxuICAgIHByb3RlY3RlZCBhc3luYyB0cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldEF1dGhvcml6YXRpb25Ub2tlbigpO1xuICAgICAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IChvcHRpb25zLmhlYWRlcnMgYXMgSHR0cEhlYWRlcnMpLmFwcGVuZChcImF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gKG9wdGlvbnMuaGVhZGVycyBhcyBIdHRwSGVhZGVycykuYXBwZW5kKFwiWC1BUEktS2V5XCIsIHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgdHJhbnNmb3JtUmVzcG9uc2U6IChyZXMpID0+IHJlcywgcmVzcG9uc2VUeXBlOiAnanNvbicgfTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEJhc2VVcmwoZGVmdWx0VXJsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5hcGlVcmwuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5hcGlVcmwuc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uYXBpVXJsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0cmFuc2Zvcm1SZXN1bHQodXJsOiBzdHJpbmcsIHJlczogSHR0cFJlc3BvbnNlQmFzZSwgY2I6IChyZXM6IEh0dHBSZXNwb25zZUJhc2UpID0+IE9ic2VydmFibGU8YW55Pik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICByZXR1cm4gY2IocmVzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJ1aWxkSW5mb0FwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogR2V0IGFzc2VtYmx5IGJ1aWxkIGluZm8uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaGVhZEluZm8oKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBHZXQgYXNzZW1ibHkgYnVpbGQgaW5mby5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbmZvKCk6IE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEJ1aWxkSW5mb0FwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJQnVpbGRJbmZvQXBpQ2xpZW50IHtcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQ7XG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGpzb25QYXJzZVJldml2ZXI6ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEFwaUNsaWVudENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb246IEFwaUNsaWVudENvbmZpZ3VyYXRpb24sIEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwgIT09IHVuZGVmaW5lZCAmJiBiYXNlVXJsICE9PSBudWxsID8gYmFzZVVybCA6IHRoaXMuZ2V0QmFzZVVybChcIlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXNzZW1ibHkgYnVpbGQgaW5mby5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBoZWFkSW5mbygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvaW5mb1wiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImhlYWRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzSGVhZEluZm8oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NIZWFkSW5mbyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NIZWFkSW5mbyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhc3NlbWJseSBidWlsZCBpbmZvLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEluZm8oKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9pbmZvXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEluZm8oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbmZvKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8QnVpbGRJbmZvTW9kZWw+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8QnVpbGRJbmZvTW9kZWw+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXNpZ25BdG9tc0NvbXBhdGliaWxpdHlBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3NzRm9udHModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBmb250cyh0ZW5hbnRJZDogbnVtYmVyLCBwc05hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlldyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0Q29sb3JQcmV2aWV3UmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlld3ModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldENvbG9yUHJldmlld3NSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmb250S2V5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q3NzRm9udCh0ZW5hbnRJZDogbnVtYmVyLCBmb250S2V5Pzogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEZhbGxiYWNrRm9udHModGVuYW50SWQ6IG51bWJlcik6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEltYWdlU2l6ZSh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0SW1hZ2VTaXplUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8TnVsbEFibGVTaXplPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFNoYXBlQm91bmRzKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBHZXRTaGFwZUJvdW5kc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlY3RhbmdsZUY+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0V2F0ZXJtYXJrSXRlbXModGVuYW50SWQ6IG51bWJlciwgYm9keT86IGFueSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcncgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmggKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBpbWcodGVuYW50SWQ6IG51bWJlciwgZj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IHVuZGVmaW5lZCwgY215az86IHN0cmluZyB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRhcmdldD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtwPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb28/OiBudW1iZXIgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNvbG9yaXplQ29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJ3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCByaD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRMaWNlbnNlKHRlbmFudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwdGgodGVuYW50SWQ6IG51bWJlciwgZj86IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW1hZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXNvdXJjZSh0ZW5hbnRJZDogbnVtYmVyLCBpbWFnZT86IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcncgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmggKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBzdmcodGVuYW50SWQ6IG51bWJlciwgZj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IHVuZGVmaW5lZCwgY215az86IHN0cmluZyB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRhcmdldD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtwPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb28/OiBudW1iZXIgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNvbG9yaXplQ29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJ3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCByaD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHR4dCh0ZW5hbnRJZDogbnVtYmVyLCBmPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQnlDb2xvckRhdGEodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUNvbG9yc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QodGVuYW50SWQ6IG51bWJlciwgYm9keT86IE11bHRpQ2FsbFJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2VJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVNoYXBlSXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbkF0b21zQ29tcGF0aWJpbGl0eUFwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJRGVzaWduQXRvbXNDb21wYXRpYmlsaXR5QXBpQ2xpZW50IHtcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQ7XG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGpzb25QYXJzZVJldml2ZXI6ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEFwaUNsaWVudENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb246IEFwaUNsaWVudENvbmZpZ3VyYXRpb24sIEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwgIT09IHVuZGVmaW5lZCAmJiBiYXNlVXJsICE9PSBudWxsID8gYmFzZVVybCA6IHRoaXMuZ2V0QmFzZVVybChcIlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNzc0ZvbnRzKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBGb250c01ldGhvZERhdGEgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2Nzc2ZvbnRzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L2Nzc1wiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0Nzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDc3NGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxzdHJpbmc+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZm9udHModGVuYW50SWQ6IG51bWJlciwgcHNOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2ZvbnRzL3twc05hbWV9XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKHBzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IHBzTmFtZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BzTmFtZScgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntwc05hbWV9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHNOYW1lKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlldyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0Q29sb3JQcmV2aWV3UmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvR2V0Q29sb3JQcmV2aWV3XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbG9yUHJldmlldyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbG9yUHJldmlldyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0Q29sb3JQcmV2aWV3KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlld3ModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldENvbG9yUHJldmlld3NSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRDb2xvclByZXZpZXdzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbG9yUHJldmlld3MoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDb2xvclByZXZpZXdzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRDb2xvclByZXZpZXdzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZm9udEtleSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENzc0ZvbnQodGVuYW50SWQ6IG51bWJlciwgZm9udEtleT86IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvR2V0Q3NzRm9udD9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAoZm9udEtleSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2ZvbnRLZXknIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZm9udEtleSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImZvbnRLZXk9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGZvbnRLZXkpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q3NzRm9udCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENzc0ZvbnQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENzc0ZvbnQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0RmFsbGJhY2tGb250cyh0ZW5hbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRGYWxsYmFja0ZvbnRzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRGYWxsYmFja0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0RmFsbGJhY2tGb250cyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0RmFsbGJhY2tGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbWFnZVNpemUodGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldEltYWdlU2l6ZVJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL0dldEltYWdlU2l6ZVwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRJbWFnZVNpemUoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRJbWFnZVNpemUoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8TnVsbEFibGVTaXplPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEltYWdlU2l6ZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8TnVsbEFibGVTaXplPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxOdWxsQWJsZVNpemU+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxOdWxsQWJsZVNpemU+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRTaGFwZUJvdW5kcyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxSZWN0YW5nbGVGPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvR2V0U2hhcGVCb3VuZHNcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0U2hhcGVCb3VuZHMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRTaGFwZUJvdW5kcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxSZWN0YW5nbGVGPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlY3RhbmdsZUY+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRTaGFwZUJvdW5kcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UmVjdGFuZ2xlRj5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFJlY3RhbmdsZUY+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRXYXRlcm1hcmtJdGVtcyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogYW55IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRXYXRlcm1hcmtJdGVtc1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFdhdGVybWFya0l0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJ3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJoIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaW1nKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHc/OiBudW1iZXIgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJnYj86IHN0cmluZyB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHNxPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBhbHBoYU1hc2s/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBydz86IG51bWJlciB8IHVuZGVmaW5lZCwgcmg/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2ltZz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAoZiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2YnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIGlmICh3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh3ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGggPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBoKSArIFwiJlwiO1xuICAgICAgICBpZiAoY215ayA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2NteWsnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY215ayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImNteWs9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNteWspICsgXCImXCI7XG4gICAgICAgIGlmIChyZ2IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdyZ2InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocmdiICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmdiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZ2IpICsgXCImXCI7XG4gICAgICAgIGlmIChncmF5c2NhbGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdncmF5c2NhbGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZ3JheXNjYWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZ3JheXNjYWxlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBncmF5c2NhbGUpICsgXCImXCI7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0YXJnZXQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGFyZ2V0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YXJnZXQpICsgXCImXCI7XG4gICAgICAgIGlmIChzcSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NxJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHNxICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwic3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNxKSArIFwiJlwiO1xuICAgICAgICBpZiAoZWZmZWN0ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZWZmZWN0JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGVmZmVjdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImVmZmVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZWZmZWN0KSArIFwiJlwiO1xuICAgICAgICBpZiAoa3AgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdrcCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChrcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImtwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBrcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY29sb3IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3IpICsgXCImXCI7XG4gICAgICAgIGlmIChvYm0gPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdvYm0nIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob2JtICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib2JtPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvYm0pICsgXCImXCI7XG4gICAgICAgIGlmIChvbyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ29vJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKG9vICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib289XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9vKSArIFwiJlwiO1xuICAgICAgICBpZiAoYWxwaGFNYXNrID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnYWxwaGFNYXNrJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGFscGhhTWFzayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImFscGhhTWFzaz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYWxwaGFNYXNrKSArIFwiJlwiO1xuICAgICAgICBpZiAocGFnZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BhZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocGFnZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInBhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHBhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChjb2xvcml6ZUNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3JpemVDb2xvcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjb2xvcml6ZUNvbG9yICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3JpemVDb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3JpemVDb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJ3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncncnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocncgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJydz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcncpICsgXCImXCI7XG4gICAgICAgIGlmIChyaCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHJoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJoKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzSW1nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRMaWNlbnNlKHRlbmFudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2xpY2Vuc2VcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldExpY2Vuc2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRMaWNlbnNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRMaWNlbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHB0aCh0ZW5hbnRJZDogbnVtYmVyLCBmPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9wdGg/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1B0aCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1B0aCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUHRoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW1hZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXNvdXJjZSh0ZW5hbnRJZDogbnVtYmVyLCBpbWFnZT86IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvcmVzb3VyY2U/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGltYWdlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaW1hZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJpbWFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaW1hZ2UpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJ3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJoIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc3ZnKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHc/OiBudW1iZXIgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJnYj86IHN0cmluZyB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHNxPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBhbHBoYU1hc2s/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBydz86IG51bWJlciB8IHVuZGVmaW5lZCwgcmg/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL3N2Zz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAoZiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2YnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIGlmICh3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh3ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGggPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBoKSArIFwiJlwiO1xuICAgICAgICBpZiAoY215ayA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2NteWsnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY215ayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImNteWs9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNteWspICsgXCImXCI7XG4gICAgICAgIGlmIChyZ2IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdyZ2InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocmdiICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmdiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZ2IpICsgXCImXCI7XG4gICAgICAgIGlmIChncmF5c2NhbGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdncmF5c2NhbGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZ3JheXNjYWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZ3JheXNjYWxlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBncmF5c2NhbGUpICsgXCImXCI7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0YXJnZXQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGFyZ2V0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YXJnZXQpICsgXCImXCI7XG4gICAgICAgIGlmIChzcSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NxJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHNxICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwic3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNxKSArIFwiJlwiO1xuICAgICAgICBpZiAoZWZmZWN0ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZWZmZWN0JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGVmZmVjdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImVmZmVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZWZmZWN0KSArIFwiJlwiO1xuICAgICAgICBpZiAoa3AgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdrcCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChrcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImtwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBrcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY29sb3IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3IpICsgXCImXCI7XG4gICAgICAgIGlmIChvYm0gPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdvYm0nIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob2JtICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib2JtPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvYm0pICsgXCImXCI7XG4gICAgICAgIGlmIChvbyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ29vJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKG9vICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib289XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9vKSArIFwiJlwiO1xuICAgICAgICBpZiAoYWxwaGFNYXNrID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnYWxwaGFNYXNrJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGFscGhhTWFzayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImFscGhhTWFzaz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYWxwaGFNYXNrKSArIFwiJlwiO1xuICAgICAgICBpZiAocGFnZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BhZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocGFnZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInBhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHBhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChjb2xvcml6ZUNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3JpemVDb2xvcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjb2xvcml6ZUNvbG9yICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3JpemVDb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3JpemVDb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJ3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncncnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocncgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJydz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcncpICsgXCImXCI7XG4gICAgICAgIGlmIChyaCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHJoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJoKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU3ZnKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHR4dCh0ZW5hbnRJZDogbnVtYmVyLCBmPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci90eHQ/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1R4dCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1R4dCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVHh0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXJcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXJcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQnlDb2xvckRhdGEodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUNvbG9yc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUJ5Q29sb3JEYXRhXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlDb2xvckRhdGEoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogTXVsdGlDYWxsUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVJbWFnZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVJbWFnZUl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUltYWdlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXJcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVTaGFwZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlU2hhcGVJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVTaGFwZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXNpZ25BdG9tc0ltYWdlc0FwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIHdlYiBpbWFnZSBwcmV2aWV3IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgZmlsZSB3aWxsIGJlIHByb3ZpZGVkIGFzIGFuIGF0dGFjaG1lbnQgd2l0aCB1bmlxdWUgZmlsZW5hbWUgc3VwcGxpZWRcbiAgICAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckltYWdlUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJJbWFnZVByZXZpZXdNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgd2ViIGltYWdlIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kIHNhdmVzIHJlbmRlcmluZyByZXN1bHQgYXMgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJJbWFnZVByZXZpZXdUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVySW1hZ2VQcmV2aWV3VG9SZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbkF0b21zSW1hZ2VzQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc0ltYWdlc0FwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIHdlYiBpbWFnZSBwcmV2aWV3IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgZmlsZSB3aWxsIGJlIHByb3ZpZGVkIGFzIGFuIGF0dGFjaG1lbnQgd2l0aCB1bmlxdWUgZmlsZW5hbWUgc3VwcGxpZWRcbiAgICAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckltYWdlUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJJbWFnZVByZXZpZXdNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2ltYWdlcy9yZW5kZXItcHJldmlldz9cIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdhdHRhY2htZW50JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJhdHRhY2htZW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhdHRhY2htZW50KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVySW1hZ2VQcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVySW1hZ2VQcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXcocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgd2ViIGltYWdlIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kIHNhdmVzIHJlbmRlcmluZyByZXN1bHQgYXMgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJJbWFnZVByZXZpZXdUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVySW1hZ2VQcmV2aWV3VG9SZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvaW1hZ2VzL3JlbmRlci1wcmV2aWV3L3RvLXJlc291cmNlP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlbmRlckltYWdlUHJldmlld1RvUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXdUb1Jlc291cmNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlc291cmNlSW5mb0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXdUb1Jlc291cmNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFJlc291cmNlSW5mb0R0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFJlc291cmNlSW5mb0R0bz4oPGFueT5udWxsKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlc2lnbkF0b21zTW9ja3VwczNkQXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgM0QtTW9ja3VwIGF0dHJpYnV0ZXMuXG4gICAgICogQHBhcmFtIGlkIDNELU1vY2t1cCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBvd25lcklkIChvcHRpb25hbCkgUHJpdmF0ZSBtb2NrdXAgb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEF0dHJpYnV0ZXMoaWQ6IHN0cmluZywgb3duZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE1vY2t1cDNkQXR0cmlidXRlc0R0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIDNELU1vY2t1cCBjb250ZW50IGFzIHByb3RvYnVmIGJpbmFyeSBzdHJlYW0uXG4gICAgICogQHBhcmFtIGlkIDNELU1vY2t1cCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBvd25lcklkIChvcHRpb25hbCkgUHJpdmF0ZSBtb2NrdXAgb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbnRlbnRBc1Byb3RvYnVmKGlkOiBzdHJpbmcsIG93bmVySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSAzRC1Nb2NrdXAgZ2VvbWV0cnkgYXMgYmluYXJ5IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0gaWQgM0QtTW9ja3VwIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIG93bmVySWQgKG9wdGlvbmFsKSBQcml2YXRlIG1vY2t1cCBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0R2VvbWV0cnlGaWxlKGlkOiBzdHJpbmcsIG93bmVySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbkF0b21zTW9ja3VwczNkQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc01vY2t1cHMzZEFwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIDNELU1vY2t1cCBhdHRyaWJ1dGVzLlxuICAgICAqIEBwYXJhbSBpZCAzRC1Nb2NrdXAgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gb3duZXJJZCAob3B0aW9uYWwpIFByaXZhdGUgbW9ja3VwIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBdHRyaWJ1dGVzKGlkOiBzdHJpbmcsIG93bmVySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxNb2NrdXAzZEF0dHJpYnV0ZXNEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvbW9ja3Vwcy0zZC97aWR9L2F0dHJpYnV0ZXM/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKG93bmVySWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdvd25lcklkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKG93bmVySWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvd25lcklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvd25lcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBdHRyaWJ1dGVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QXR0cmlidXRlcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxNb2NrdXAzZEF0dHJpYnV0ZXNEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8TW9ja3VwM2RBdHRyaWJ1dGVzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0QXR0cmlidXRlcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8TW9ja3VwM2RBdHRyaWJ1dGVzRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxNb2NrdXAzZEF0dHJpYnV0ZXNEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQyMjogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQyMiA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNsaWVudCBFcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MjIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPE1vY2t1cDNkQXR0cmlidXRlc0R0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgM0QtTW9ja3VwIGNvbnRlbnQgYXMgcHJvdG9idWYgYmluYXJ5IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0gaWQgM0QtTW9ja3VwIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIG93bmVySWQgKG9wdGlvbmFsKSBQcml2YXRlIG1vY2t1cCBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29udGVudEFzUHJvdG9idWYoaWQ6IHN0cmluZywgb3duZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9tb2NrdXBzLTNkL3tpZH0vY29udGVudC9hcy1wcm90b2J1Zj9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAob3duZXJJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ293bmVySWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob3duZXJJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcIm93bmVySWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG93bmVySWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbnRlbnRBc1Byb3RvYnVmKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q29udGVudEFzUHJvdG9idWYoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENvbnRlbnRBc1Byb3RvYnVmKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQyMjogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQyMiA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNsaWVudCBFcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MjIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgM0QtTW9ja3VwIGdlb21ldHJ5IGFzIGJpbmFyeSBzdHJlYW0uXG4gICAgICogQHBhcmFtIGlkIDNELU1vY2t1cCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBvd25lcklkIChvcHRpb25hbCkgUHJpdmF0ZSBtb2NrdXAgb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEdlb21ldHJ5RmlsZShpZDogc3RyaW5nLCBvd25lcklkPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL21vY2t1cHMtM2Qve2lkfS9nZW9tZXRyeS9maWxlP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChvd25lcklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnb3duZXJJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChvd25lcklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib3duZXJJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb3duZXJJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0R2VvbWV0cnlGaWxlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0R2VvbWV0cnlGaWxlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRHZW9tZXRyeUZpbGUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQyMikge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDIyOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDIyID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ2xpZW50IEVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQyMik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNTZXJ2aWNlQXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBkZXNpZ24gZmlsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZCBzYXZlcyBpdCBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIERlc2lnbiBjcmVhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZFxuICAgICAqL1xuICAgIGNyZWF0ZURlc2lnbihwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZURlc2lnbk1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxEZXNpZ25JbmZvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvbnRlbnQgb2YgdGhlIGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdXJmYWNlSW5kZXggKG9wdGlvbmFsKSBTdXJmYWNlIGluZGV4LlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBleHRyYWN0QmFja2dyb3VuZChpZDogc3RyaW5nLCBzdXJmYWNlSW5kZXg/OiBudW1iZXIgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIExvYWRzIHByb2R1Y3QgKGRlc2lnbiBtb2RlbCkgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkUHJvZHVjdChpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBTYXZlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIHRvIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHByb2R1Y3QgZGVzY3JpcHRpb24uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2F2ZVByb2R1Y3QoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBhbnkgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgcHJvZHVjdCAoZGVzaWduIG1vZGVsKSBpbiBkZXNpZ24gZmlsZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwYXRjaFR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHBhdGNoUHJvZHVjdChpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgcGF0Y2hUeXBlPzogUHJvZHVjdFBhdGNoVHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZT86IEZpbGVQYXJhbWV0ZXIgfCB1bmRlZmluZWQsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGU/OiBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGRlc2lnbiBwYXJhbWV0ZXJzIHN0b3JlZCBpbiBwcm9kdWN0IG1vZGVsLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0RGVzaWduUGFyYW1ldGVycyhpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RGVzaWduUGFyYW1ldGVycz47XG4gICAgLyoqXG4gICAgICogTG9hZHMgZGF0YSBzY2hlbWEgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkRGF0YVNjaGVtYShpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBhIHRvZ2dsZSBzZXQgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkVG9nZ2xlU2V0KGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEdldHMgdmFyaWFibGUgaXRlbXMgaW5mb3JtYXRpb24gZm9yIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFZhcmlhYmxlcyhpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VmFyaWFibGVzTW9kZWw+O1xuICAgIC8qKlxuICAgICAqIFNldHMgdmFyaWFibGUgaXRlbXMgdmFsdWVzIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIERlc2lnbiB2YXJpYWJsZSB2YWx1ZXMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2V0VmFyaWFibGVzKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVmFyaWFibGVzTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIExvYWRzIHZhcmlhYmxlIGRhdGEgcHJpbnRpbmcgaW5mb3JtYXRpb24gZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkVmRwRGF0YShpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VmRwRGF0YU1vZGVsPjtcbiAgICAvKipcbiAgICAgKiBTYXZlcyB2YXJpYWJsZSBkYXRhIHByaW50aW5nIGluZm9ybWF0aW9uIHRvIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHZkcCBkYXRhLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNhdmVWZHBEYXRhKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVmRwRGF0YU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHZhcmlhYmxlIGRhdGEgcHJpbnRpbmcgaW5mb3JtYXRpb24gZnJvbSBkZXNpZ24gZmlsZSBhbmQgdXBkYXRlcyBkZXNpZ24gaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGRlbGV0ZVZkcERhdGEoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIExvYWRzIHByb2R1Y3QgKGRlc2lnbiBtb2RlbCkgZnJvbSByZXNvdXJjZSBmaWxlIHRha2VuIGZyb20gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgUmVzb3VyY2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZFByb2R1Y3RGcm9tUmVzb3VyY2UoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgY29sb3JzLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBDb252ZXJ0IGNvbG9ycyBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjb252ZXJ0Q29sb3JzKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogQ29udmVydENvbG9yc01vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgcHJvZHVjdCBpdGVtLlxuICAgICAqIEBwYXJhbSBpdGVtVHlwZSAob3B0aW9uYWwpIERlc2lyZWQgaXRlbSB0eXBlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHNvdXJjZVR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc291cmNlSWQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc291cmNlT3duZXJJZCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlSXRlbShpdGVtVHlwZT86IEl0ZW1UeXBlIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgc291cmNlVHlwZT86IEl0ZW1Tb3VyY2VUeXBlIHwgdW5kZWZpbmVkLCBzb3VyY2VJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc291cmNlT3duZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc291cmNlRmlsZT86IEZpbGVQYXJhbWV0ZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgcHJvZHVjdCBpdGVtIGltYWdlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBFeHRyYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZXh0cmFjdEl0ZW1JbWFnZSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEV4dHJhY3RJdGVtSW1hZ2VNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBGbGF0dGVuIGl0ZW1zLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBJdGVtcyB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZsYXR0ZW5JdGVtcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IGFueVtdIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBwcm9kdWN0IHByb29mIGltYWdlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBQcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyUHJvZHVjdChhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJQcm9kdWN0TW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIGRlc2lnbiBwcmV2aWV3IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgZmlsZSB3aWxsIGJlIHByb3ZpZGVkIGFzIGFuIGF0dGFjaG1lbnQgd2l0aCB1bmlxdWUgZmlsZW5hbWUgc3VwcGxpZWRcbiAgICAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByZXZpZXcoYXR0YWNobWVudD86IGJvb2xlYW4gfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJldmlld01vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQgc2F2ZXMgcmVuZGVyaW5nIHJlc3VsdCBhcyByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByZXZpZXdUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2VNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPjtcbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByb29mIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgZmlsZSB3aWxsIGJlIHByb3ZpZGVkIGFzIGFuIGF0dGFjaG1lbnQgd2l0aCB1bmlxdWUgZmlsZW5hbWUgc3VwcGxpZWRcbiAgICAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJvb2YgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJEZXNpZ25Qcm9vZihhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25Qcm9vZk1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJvb2Ygd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kIHNhdmVzIHJlbmRlcmluZyByZXN1bHQgYXMgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJEZXNpZ25Qcm9vZlRvUmVzb3VyY2UodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25Qcm9vZlRvUmVzb3VyY2VNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcHJpdmF0ZSBkZXNpZ24gZnJvbSBhIHB1YmxpYyBkZXNpZ24uXG4gICAgICogQHBhcmFtIGRlc2lnbklkIChvcHRpb25hbCkgUHVibGljIGRlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlRGVzaWduSWQgKG9wdGlvbmFsKSBQcml2YXRlIGRlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIENyZWF0ZWRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWF0ZVByaXZhdGVEZXNpZ25Gcm9tRGVzaWduKGRlc2lnbklkPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcml2YXRlRGVzaWduSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcHJpdmF0ZSBkZXNpZ24gZnJvbSBhIHB1YmxpYyByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gcmVzb3VyY2VJZCAob3B0aW9uYWwpIFJlc291cmNlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVEZXNpZ25JZCAob3B0aW9uYWwpIFByaXZhdGUgZGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJuIENyZWF0ZWRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWF0ZVByaXZhdGVEZXNpZ25Gcm9tUmVzb3VyY2UocmVzb3VyY2VJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJpdmF0ZURlc2lnbklkPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduQXRvbXNTZXJ2aWNlQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc1NlcnZpY2VBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGRlc2lnbiBmaWxlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kIHNhdmVzIGl0IGluIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgRGVzaWduIGNyZWF0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBDcmVhdGVkXG4gICAgICovXG4gICAgY3JlYXRlRGVzaWduKHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlRGVzaWduTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPERlc2lnbkluZm8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducz9cIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZURlc2lnbig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZURlc2lnbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxEZXNpZ25JbmZvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPERlc2lnbkluZm8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDcmVhdGVEZXNpZ24ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPERlc2lnbkluZm8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPERlc2lnbkluZm8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAxKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxEZXNpZ25JbmZvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY29udGVudCBvZiB0aGUgYmFja2dyb3VuZC5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHN1cmZhY2VJbmRleCAob3B0aW9uYWwpIFN1cmZhY2UgaW5kZXguXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGV4dHJhY3RCYWNrZ3JvdW5kKGlkOiBzdHJpbmcsIHN1cmZhY2VJbmRleD86IG51bWJlciB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vYmFja2dyb3VuZD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAoc3VyZmFjZUluZGV4ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3VyZmFjZUluZGV4JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHN1cmZhY2VJbmRleCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInN1cmZhY2VJbmRleD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3VyZmFjZUluZGV4KSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRXh0cmFjdEJhY2tncm91bmQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NFeHRyYWN0QmFja2dyb3VuZCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRXh0cmFjdEJhY2tncm91bmQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxNaXNzaW5nRGVzaWduRWxlbWVudER0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQyMikge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDIyOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDIyID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VW5wcm9jZXNzYWJsZURlc2lnbkVsZW1lbnREdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ2xpZW50IEVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQyMik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHByb2R1Y3QgKGRlc2lnbiBtb2RlbCkgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkUHJvZHVjdChpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9tb2RlbD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWRQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvYWRQcm9kdWN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgcHJvZHVjdCAoZGVzaWduIG1vZGVsKSB0byBkZXNpZ24gZmlsZSBhbmQgdXBkYXRlcyBkZXNpZ24gaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgU2VyaWFsaXplZCBwcm9kdWN0IGRlc2NyaXB0aW9uLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNhdmVQcm9kdWN0KGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9tb2RlbD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwdXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzU2F2ZVByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTYXZlUHJvZHVjdCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTYXZlUHJvZHVjdChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgcHJvZHVjdCAoZGVzaWduIG1vZGVsKSBpbiBkZXNpZ24gZmlsZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwYXRjaFR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHBhdGNoUHJvZHVjdChpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgcGF0Y2hUeXBlPzogUHJvZHVjdFBhdGNoVHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZT86IEZpbGVQYXJhbWV0ZXIgfCB1bmRlZmluZWQsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGU/OiBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9tb2RlbD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGlmIChwYXRjaFR5cGUgPT09IG51bGwgfHwgcGF0Y2hUeXBlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwYXRjaFR5cGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwicGF0Y2hUeXBlXCIsIHBhdGNoVHlwZS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZSA9PT0gbnVsbCB8fCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9faXRlbU5hbWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJyZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm8uaXRlbU5hbWVcIiwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAocmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGUgPT09IG51bGwgfHwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mby5zb3VyY2VGaWxlXCIsIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlLmRhdGEsIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlLmZpbGVOYW1lID8gcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGUuZmlsZU5hbWUgOiBcInJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mby5zb3VyY2VGaWxlXCIpO1xuICAgICAgICBpZiAocmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWUgPT09IG51bGwgfHwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mby5wbGFjZWhvbGRlckl0ZW1OYW1lXCIsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAocmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX25ld0NvbnRlbnRUeXBlID09PSBudWxsIHx8IHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX25ld0NvbnRlbnRUeXBlJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mby5uZXdDb250ZW50VHlwZVwiLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZSA9PT0gbnVsbCB8fCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwicmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvLnNvdXJjZUZpbGVcIiwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUuZGF0YSwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUuZmlsZU5hbWUgPyByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZS5maWxlTmFtZSA6IFwicmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvLnNvdXJjZUZpbGVcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwYXRjaFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NQYXRjaFByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NQYXRjaFByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUGF0Y2hQcm9kdWN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBkZXNpZ24gcGFyYW1ldGVycyBzdG9yZWQgaW4gcHJvZHVjdCBtb2RlbC5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldERlc2lnblBhcmFtZXRlcnMoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPERlc2lnblBhcmFtZXRlcnM+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3BhcmFtZXRlcnM/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXREZXNpZ25QYXJhbWV0ZXJzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0RGVzaWduUGFyYW1ldGVycyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxEZXNpZ25QYXJhbWV0ZXJzPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPERlc2lnblBhcmFtZXRlcnM+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXREZXNpZ25QYXJhbWV0ZXJzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxEZXNpZ25QYXJhbWV0ZXJzPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxEZXNpZ25QYXJhbWV0ZXJzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPERlc2lnblBhcmFtZXRlcnM+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgZGF0YSBzY2hlbWEgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkRGF0YVNjaGVtYShpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9zY2hlbWE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWREYXRhU2NoZW1hKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZERhdGFTY2hlbWEoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvYWREYXRhU2NoZW1hKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgdG9nZ2xlIHNldCBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGxvYWRUb2dnbGVTZXQoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vdG9nZ2xlLXNldD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFRvZ2dsZVNldCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWRUb2dnbGVTZXQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvYWRUb2dnbGVTZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA5OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA5ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ29uZmxpY3RcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB2YXJpYWJsZSBpdGVtcyBpbmZvcm1hdGlvbiBmb3IgZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0VmFyaWFibGVzKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxWYXJpYWJsZXNNb2RlbD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vdmFyaWFibGVzP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0VmFyaWFibGVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0VmFyaWFibGVzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0VmFyaWFibGVzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxWYXJpYWJsZXNNb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VmFyaWFibGVzTW9kZWw+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8VmFyaWFibGVzTW9kZWw+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB2YXJpYWJsZSBpdGVtcyB2YWx1ZXMgZm9yIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgRGVzaWduIHZhcmlhYmxlIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBzZXRWYXJpYWJsZXMoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBWYXJpYWJsZXNNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vdmFyaWFibGVzP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInB1dFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTZXRWYXJpYWJsZXMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTZXRWYXJpYWJsZXMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU2V0VmFyaWFibGVzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDb25mbGljdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGxvYWRWZHBEYXRhKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxWZHBEYXRhTW9kZWw+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZkcC1kYXRhP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFZkcERhdGEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxWZHBEYXRhTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VmRwRGF0YU1vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9hZFZkcERhdGEocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFZkcERhdGFNb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VmRwRGF0YU1vZGVsPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDb25mbGljdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFZkcERhdGFNb2RlbD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyB2YXJpYWJsZSBkYXRhIHByaW50aW5nIGluZm9ybWF0aW9uIHRvIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHZkcCBkYXRhLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNhdmVWZHBEYXRhKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVmRwRGF0YU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS92ZHAtZGF0YT9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwdXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzU2F2ZVZkcERhdGEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTYXZlVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTYXZlVmRwRGF0YShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiBmcm9tIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZGVsZXRlVmRwRGF0YShpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vdmRwLWRhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJkZWxldGVcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRGVsZXRlVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0RlbGV0ZVZkcERhdGEoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRGVsZXRlVmRwRGF0YShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDb25mbGljdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgcHJvZHVjdCAoZGVzaWduIG1vZGVsKSBmcm9tIHJlc291cmNlIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBSZXNvdXJjZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkUHJvZHVjdEZyb21SZXNvdXJjZShpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMvZnJvbS1yZXNvdXJjZS97aWR9L21vZGVsP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFByb2R1Y3RGcm9tUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkUHJvZHVjdEZyb21SZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9hZFByb2R1Y3RGcm9tUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDIyKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MjI6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MjIgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDbGllbnQgRXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDIyKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgY29sb3JzLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBDb252ZXJ0IGNvbG9ycyBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjb252ZXJ0Q29sb3JzKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogQ29udmVydENvbG9yc01vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy9tb2RlbC9jb252ZXJ0LWNvbG9ycz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDb252ZXJ0Q29sb3JzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ29udmVydENvbG9ycyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ29udmVydENvbG9ycyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgcHJvZHVjdCBpdGVtLlxuICAgICAqIEBwYXJhbSBpdGVtVHlwZSAob3B0aW9uYWwpIERlc2lyZWQgaXRlbSB0eXBlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHNvdXJjZVR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc291cmNlSWQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc291cmNlT3duZXJJZCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlSXRlbShpdGVtVHlwZT86IEl0ZW1UeXBlIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgc291cmNlVHlwZT86IEl0ZW1Tb3VyY2VUeXBlIHwgdW5kZWZpbmVkLCBzb3VyY2VJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc291cmNlT3duZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc291cmNlRmlsZT86IEZpbGVQYXJhbWV0ZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL2l0ZW1zP1wiO1xuICAgICAgICBpZiAoaXRlbVR5cGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpdGVtVHlwZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChpdGVtVHlwZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcIml0ZW1UeXBlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpdGVtVHlwZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09IG51bGwgfHwgc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc291cmNlVHlwZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJzb3VyY2VUeXBlXCIsIHNvdXJjZVR5cGUudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChzb3VyY2VJZCA9PT0gbnVsbCB8fCBzb3VyY2VJZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc291cmNlSWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwic291cmNlSWRcIiwgc291cmNlSWQudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChzb3VyY2VPd25lcklkID09PSBudWxsIHx8IHNvdXJjZU93bmVySWQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NvdXJjZU93bmVySWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwic291cmNlT3duZXJJZFwiLCBzb3VyY2VPd25lcklkLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc291cmNlRmlsZSA9PT0gbnVsbCB8fCBzb3VyY2VGaWxlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzb3VyY2VGaWxlJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInNvdXJjZUZpbGVcIiwgc291cmNlRmlsZS5kYXRhLCBzb3VyY2VGaWxlLmZpbGVOYW1lID8gc291cmNlRmlsZS5maWxlTmFtZSA6IFwic291cmNlRmlsZVwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVJdGVtKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlSXRlbSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlSXRlbShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHByb2R1Y3QgaXRlbSBpbWFnZS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgRXh0cmFjdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGV4dHJhY3RJdGVtSW1hZ2UodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBFeHRyYWN0SXRlbUltYWdlTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL2l0ZW1zL2V4dHJhY3QtaW1hZ2U/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NFeHRyYWN0SXRlbUltYWdlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRXh0cmFjdEl0ZW1JbWFnZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRXh0cmFjdEl0ZW1JbWFnZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW4gaXRlbXMuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIEl0ZW1zIHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZmxhdHRlbkl0ZW1zKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55W10gfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL2l0ZW1zL2ZsYXR0ZW4/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRmxhdHRlbkl0ZW1zKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRmxhdHRlbkl0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NGbGF0dGVuSXRlbXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlciBwcm9kdWN0IHByb29mIGltYWdlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBQcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyUHJvZHVjdChhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJQcm9kdWN0TW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL3JlbmRlci1wcm9vZj9cIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdhdHRhY2htZW50JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJhdHRhY2htZW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhdHRhY2htZW50KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyUHJvZHVjdCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlbmRlclByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1JlbmRlclByb2R1Y3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyRGVzaWduUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25QcmV2aWV3TW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3JlbmRlci1wcmV2aWV3P1wiO1xuICAgICAgICBpZiAoYXR0YWNobWVudCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2F0dGFjaG1lbnQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoYXR0YWNobWVudCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImF0dGFjaG1lbnQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGF0dGFjaG1lbnQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25QcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyRGVzaWduUHJldmlldyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVuZGVyRGVzaWduUHJldmlldyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQgc2F2ZXMgcmVuZGVyaW5nIHJlc3VsdCBhcyByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByZXZpZXdUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2VNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMvcmVuZGVyLXByZXZpZXcvdG8tcmVzb3VyY2U/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25QcmV2aWV3VG9SZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFJlc291cmNlSW5mb0R0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UmVzb3VyY2VJbmZvRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UmVzb3VyY2VJbmZvRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJvb2Ygd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcm9vZiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByb29mKGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlckRlc2lnblByb29mTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3JlbmRlci1wcm9vZj9cIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdhdHRhY2htZW50JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJhdHRhY2htZW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhdHRhY2htZW50KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyRGVzaWduUHJvb2YoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25Qcm9vZig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVuZGVyRGVzaWduUHJvb2YocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByb29mIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZCBzYXZlcyByZW5kZXJpbmcgcmVzdWx0IGFzIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyRGVzaWduUHJvb2ZUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJvb2ZUb1Jlc291cmNlTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlc291cmNlSW5mb0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3JlbmRlci1wcm9vZi90by1yZXNvdXJjZT9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25Qcm9vZlRvUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25Qcm9vZlRvUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlc291cmNlSW5mb0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1JlbmRlckRlc2lnblByb29mVG9SZXNvdXJjZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxSZXNvdXJjZUluZm9EdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxSZXNvdXJjZUluZm9EdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByaXZhdGUgZGVzaWduIGZyb20gYSBwdWJsaWMgZGVzaWduLlxuICAgICAqIEBwYXJhbSBkZXNpZ25JZCAob3B0aW9uYWwpIFB1YmxpYyBkZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZURlc2lnbklkIChvcHRpb25hbCkgUHJpdmF0ZSBkZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBDcmVhdGVkXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbihkZXNpZ25JZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJpdmF0ZURlc2lnbklkPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9wcml2YXRlLWRlc2lnbnMvZnJvbS1kZXNpZ24/XCI7XG4gICAgICAgIGlmIChkZXNpZ25JZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2Rlc2lnbklkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGRlc2lnbklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZGVzaWduSWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGRlc2lnbklkKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZURlc2lnbklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZURlc2lnbklkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVEZXNpZ25JZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVEZXNpZ25JZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZURlc2lnbklkKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlUHJpdmF0ZURlc2lnbkZyb21EZXNpZ24oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByaXZhdGUgZGVzaWduIGZyb20gYSBwdWJsaWMgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHJlc291cmNlSWQgKG9wdGlvbmFsKSBSZXNvdXJjZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlRGVzaWduSWQgKG9wdGlvbmFsKSBQcml2YXRlIGRlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBDcmVhdGVkXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVhdGVQcml2YXRlRGVzaWduRnJvbVJlc291cmNlKHJlc291cmNlSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHByaXZhdGVEZXNpZ25JZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvcHJpdmF0ZS1kZXNpZ25zL2Zyb20tcmVzb3VyY2U/XCI7XG4gICAgICAgIGlmIChyZXNvdXJjZUlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVzb3VyY2VJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChyZXNvdXJjZUlkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmVzb3VyY2VJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmVzb3VyY2VJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVEZXNpZ25JZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVEZXNpZ25JZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlRGVzaWduSWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlRGVzaWduSWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVEZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZVByaXZhdGVEZXNpZ25Gcm9tUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbVJlc291cmNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NyZWF0ZVByaXZhdGVEZXNpZ25Gcm9tUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNWaWV3ZXJBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjc3NGb250cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHBzTmFtZTogc3RyaW5nLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29sb3JQcmV2aWV3KHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0Q29sb3JQcmV2aWV3UmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29sb3JQcmV2aWV3cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEdldENvbG9yUHJldmlld3NSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmb250S2V5IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDc3NGb250KGZvbnRLZXk/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0RmFsbGJhY2tGb250cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW1hZ2VTaXplKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0SW1hZ2VTaXplUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8TnVsbEFibGVTaXplPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0U2hhcGVCb3VuZHModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBHZXRTaGFwZUJvdW5kc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlY3RhbmdsZUY+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRXYXRlcm1hcmtJdGVtcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IGFueSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcncgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGltZyhmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBoPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjbXlrPzogc3RyaW5nIHwgdW5kZWZpbmVkLCByZ2I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGdyYXlzY2FsZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGFyZ2V0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBzcT86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGVmZmVjdD86IHN0cmluZyB8IHVuZGVmaW5lZCwga3A/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBjb2xvcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgb2JtPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvbz86IG51bWJlciB8IHVuZGVmaW5lZCwgYWxwaGFNYXNrPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgcGFnZT86IG51bWJlciB8IHVuZGVmaW5lZCwgY29sb3JpemVDb2xvcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgcnc/OiBudW1iZXIgfCB1bmRlZmluZWQsIHJoPzogbnVtYmVyIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldExpY2Vuc2UodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHB0aChmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW1hZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlc291cmNlKGltYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcncgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHN2ZyhmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBoPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjbXlrPzogc3RyaW5nIHwgdW5kZWZpbmVkLCByZ2I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGdyYXlzY2FsZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGFyZ2V0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBzcT86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGVmZmVjdD86IHN0cmluZyB8IHVuZGVmaW5lZCwga3A/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBjb2xvcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgb2JtPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvbz86IG51bWJlciB8IHVuZGVmaW5lZCwgYWxwaGFNYXNrPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgcGFnZT86IG51bWJlciB8IHVuZGVmaW5lZCwgY29sb3JpemVDb2xvcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgcnc/OiBudW1iZXIgfCB1bmRlZmluZWQsIHJoPzogbnVtYmVyIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdHh0KGY/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeUNvbG9yRGF0YSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUNvbG9yc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IE11bHRpQ2FsbFJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbkF0b21zVmlld2VyQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc1ZpZXdlckFwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNzc0ZvbnRzKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogRm9udHNNZXRob2REYXRhIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvY3NzZm9udHM/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvY3NzXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0Nzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3NzRm9udHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0Nzc0ZvbnRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHN0cmluZz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHBzTmFtZTogc3RyaW5nLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL2ZvbnRzL3twc05hbWV9P1wiO1xuICAgICAgICBpZiAocHNOYW1lID09PSB1bmRlZmluZWQgfHwgcHNOYW1lID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHNOYW1lJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3BzTmFtZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwc05hbWUpKTtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29sb3JQcmV2aWV3KHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0Q29sb3JQcmV2aWV3UmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL0dldENvbG9yUHJldmlldz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDb2xvclByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDb2xvclByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENvbG9yUHJldmlldyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlld3ModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBHZXRDb2xvclByZXZpZXdzUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL0dldENvbG9yUHJldmlld3M/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q29sb3JQcmV2aWV3cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbG9yUHJldmlld3MoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENvbG9yUHJldmlld3MocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmb250S2V5IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDc3NGb250KGZvbnRLZXk/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvR2V0Q3NzRm9udD9cIjtcbiAgICAgICAgaWYgKGZvbnRLZXkgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmb250S2V5JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGZvbnRLZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmb250S2V5PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmb250S2V5KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDc3NGb250KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q3NzRm9udCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0Q3NzRm9udChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEZhbGxiYWNrRm9udHModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRGYWxsYmFja0ZvbnRzP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRGYWxsYmFja0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0RmFsbGJhY2tGb250cyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0RmFsbGJhY2tGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEltYWdlU2l6ZSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEdldEltYWdlU2l6ZVJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRJbWFnZVNpemU/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbWFnZVNpemUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8TnVsbEFibGVTaXplPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8TnVsbEFibGVTaXplPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRTaGFwZUJvdW5kcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEdldFNoYXBlQm91bmRzUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRTaGFwZUJvdW5kcz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRTaGFwZUJvdW5kcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFNoYXBlQm91bmRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlY3RhbmdsZUY+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVjdGFuZ2xlRj4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFNoYXBlQm91bmRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxSZWN0YW5nbGVGPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxSZWN0YW5nbGVGPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UmVjdGFuZ2xlRj4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0V2F0ZXJtYXJrSXRlbXModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBhbnkgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRXYXRlcm1hcmtJdGVtcz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFdhdGVybWFya0l0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJ3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBpbWcoZj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IHVuZGVmaW5lZCwgY215az86IHN0cmluZyB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRhcmdldD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtwPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb28/OiBudW1iZXIgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNvbG9yaXplQ29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJ3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCByaD86IG51bWJlciB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9pbWc/XCI7XG4gICAgICAgIGlmIChmID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChmICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHcgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd3JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHcgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ3PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB3KSArIFwiJlwiO1xuICAgICAgICBpZiAoaCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2gnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoaCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGgpICsgXCImXCI7XG4gICAgICAgIGlmIChjbXlrID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY215aycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjbXlrICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiY215az1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY215aykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJnYiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JnYicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChyZ2IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJyZ2I9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJnYikgKyBcIiZcIjtcbiAgICAgICAgaWYgKGdyYXlzY2FsZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2dyYXlzY2FsZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChncmF5c2NhbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJncmF5c2NhbGU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGdyYXlzY2FsZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RhcmdldCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0YXJnZXQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRhcmdldCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNxID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3EnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoc3EgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzcT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3EpICsgXCImXCI7XG4gICAgICAgIGlmIChlZmZlY3QgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdlZmZlY3QnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZWZmZWN0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZWZmZWN0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBlZmZlY3QpICsgXCImXCI7XG4gICAgICAgIGlmIChrcCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2twJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGtwICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwia3A9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGtwKSArIFwiJlwiO1xuICAgICAgICBpZiAoY29sb3IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdjb2xvcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjb2xvciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImNvbG9yPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKG9ibSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ29ibScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChvYm0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvYm09XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9ibSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKG9vID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnb28nIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob28gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvbz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb28pICsgXCImXCI7XG4gICAgICAgIGlmIChhbHBoYU1hc2sgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdhbHBoYU1hc2snIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoYWxwaGFNYXNrICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiYWxwaGFNYXNrPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhbHBoYU1hc2spICsgXCImXCI7XG4gICAgICAgIGlmIChwYWdlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncGFnZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwYWdlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicGFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcGFnZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yaXplQ29sb3IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdjb2xvcml6ZUNvbG9yJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGNvbG9yaXplQ29sb3IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2xvcml6ZUNvbG9yPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjb2xvcml6ZUNvbG9yKSArIFwiJlwiO1xuICAgICAgICBpZiAocncgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdydycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChydyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInJ3PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBydykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJoID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmgnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocmggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJyaD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmgpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzSW1nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldExpY2Vuc2UodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9saWNlbnNlP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRMaWNlbnNlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0TGljZW5zZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0TGljZW5zZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHB0aChmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL3B0aD9cIjtcbiAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NQdGgoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NQdGgoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1B0aChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IE1vZGlmaWVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGltYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXNvdXJjZShpbWFnZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9yZXNvdXJjZT9cIjtcbiAgICAgICAgaWYgKGltYWdlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaW1hZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJpbWFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaW1hZ2UpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1Jlc291cmNlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc291cmNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHcgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gaCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjbXlrIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJnYiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBncmF5c2NhbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNxIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGVmZmVjdCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBrcCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvciAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvYm0gKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb28gKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gYWxwaGFNYXNrIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHBhZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3JpemVDb2xvciAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBydyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByaCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc3ZnKGY/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHc/OiBudW1iZXIgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJnYj86IHN0cmluZyB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHNxPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBhbHBoYU1hc2s/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBydz86IG51bWJlciB8IHVuZGVmaW5lZCwgcmg/OiBudW1iZXIgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvc3ZnP1wiO1xuICAgICAgICBpZiAoZiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2YnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIGlmICh3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh3ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGggPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBoKSArIFwiJlwiO1xuICAgICAgICBpZiAoY215ayA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2NteWsnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY215ayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImNteWs9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNteWspICsgXCImXCI7XG4gICAgICAgIGlmIChyZ2IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdyZ2InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocmdiICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmdiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZ2IpICsgXCImXCI7XG4gICAgICAgIGlmIChncmF5c2NhbGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdncmF5c2NhbGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZ3JheXNjYWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZ3JheXNjYWxlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBncmF5c2NhbGUpICsgXCImXCI7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0YXJnZXQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGFyZ2V0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YXJnZXQpICsgXCImXCI7XG4gICAgICAgIGlmIChzcSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NxJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHNxICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwic3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNxKSArIFwiJlwiO1xuICAgICAgICBpZiAoZWZmZWN0ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZWZmZWN0JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGVmZmVjdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImVmZmVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZWZmZWN0KSArIFwiJlwiO1xuICAgICAgICBpZiAoa3AgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdrcCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChrcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImtwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBrcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY29sb3IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3IpICsgXCImXCI7XG4gICAgICAgIGlmIChvYm0gPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdvYm0nIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob2JtICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib2JtPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvYm0pICsgXCImXCI7XG4gICAgICAgIGlmIChvbyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ29vJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKG9vICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib289XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9vKSArIFwiJlwiO1xuICAgICAgICBpZiAoYWxwaGFNYXNrID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnYWxwaGFNYXNrJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGFscGhhTWFzayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImFscGhhTWFzaz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYWxwaGFNYXNrKSArIFwiJlwiO1xuICAgICAgICBpZiAocGFnZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BhZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocGFnZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInBhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHBhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChjb2xvcml6ZUNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3JpemVDb2xvcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjb2xvcml6ZUNvbG9yICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3JpemVDb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3JpemVDb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJ3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncncnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocncgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJydz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcncpICsgXCImXCI7XG4gICAgICAgIGlmIChyaCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHJoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJoKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTdmcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTdmcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1N2ZyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IE1vZGlmaWVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHR4dChmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL3R4dD9cIjtcbiAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NUeHQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NUeHQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1R4dChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IE1vZGlmaWVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5Q29sb3JEYXRhKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlQ29sb3JzUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUJ5Q29sb3JEYXRhP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlDb2xvckRhdGEoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogTXVsdGlDYWxsUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdD9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2VJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUltYWdlSGFuZGxlclJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVJbWFnZUl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUltYWdlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlU2hhcGVJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVTaGFwZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG4vKiogSW5mb3JtYXRpb24gYWJvdXQgYSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEluZm9Nb2RlbCB7XG4gICAgLyoqIFZlcnNpb24gbnVtYmVyLiAqL1xuICAgIHZlcnNpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBCdWlsZCBkYXRlIChVVEMpLiAqL1xuICAgIGJ1aWxkRGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEJ1aWxkIGNvbmZpZ3VyYXRpb24gKERlYnVnIHwgUmVsZWFzZSkuICovXG4gICAgY29uZmlndXJhdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFNlcnZpY2UgbmFtZS4gKi9cbiAgICBhcHBOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQXVyaWdtYS5EZXNpZ25BdG9tcyB2ZXJzaW9uLiAqL1xuICAgIGRlc2lnbkF0b21zVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEF1cmlnbWEuRGVzaWduQXRvbXMuTW9kZWwgdmVyc2lvbi4gKi9cbiAgICBkZXNpZ25BdG9tc01vZGVsVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBDb252ZXJ0IGNvbG9ycyBvcGVyYXRpb24gcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydENvbG9yc01vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCBjb2xvciBkZXNjcmlwdGlvbi4gKi9cbiAgICBjb2xvcnM6IGFueVtdO1xuICAgIC8qKiBTb3VyY2UgY29sb3IgcHJvZmlsZSBkZXNjcmlwdGlvbi4gKi9cbiAgICBzb3VyY2VDb2xvclByb2ZpbGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBEZXN0aW5hdGlvbiBjb2xvciBwcm9maWxlIGRlc2NyaXB0aW9uLiAqL1xuICAgIGRlc3RpbmF0aW9uQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVGFyZ2V0IGNvbG9yIHByb2ZpbGUgZGVzY3JpcHRpb24uICovXG4gICAgdGFyZ2V0RGV2aWNlQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIERlc2lnbiBjcmVhdGlvbiBwYXJhbWV0ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVEZXNpZ25Nb2RlbCB7XG4gICAgLyoqIFNlcmlhbGl6ZWQgcHJvZHVjdCBkZXNjcmlwdGlvbi4gKi9cbiAgICBwcm9kdWN0PzogYW55IHwgbnVsbDtcbiAgICAvKiogU2VyaWFsaXplZCBwcm9kdWN0IGRhdGEgc2NoZW1hIChiYXNlNjQgZmlsZSBzdHJlYW0pLiAqL1xuICAgIGRhdGFTY2hlbWE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBEZXNpZ24gbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogRGVzaWduIGxvY2F0aW9uIChmb2xkZXIgcGF0aCkuICovXG4gICAgcGF0aD86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBlbnVtIERlc2lnbkVsZW1lbnRUeXBlIHtcbiAgICBQcm9kdWN0ID0gXCJQcm9kdWN0XCIsXG4gICAgRGVzaWduID0gXCJEZXNpZ25cIixcbiAgICBTdXJmYWNlID0gXCJTdXJmYWNlXCIsXG4gICAgQ29udGFpbmVyID0gXCJDb250YWluZXJcIixcbiAgICBQcmludEFyZWEgPSBcIlByaW50QXJlYVwiLFxuICAgIEl0ZW0gPSBcIkl0ZW1cIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNpZ25JbmZvIHtcbiAgICBpZD86IHN0cmluZyB8IG51bGw7XG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZT86IGJvb2xlYW47XG59XG5cbi8qKiBTcGVjaWZpYyBkZXNpZ24gcGFyYW1ldGVycyBzdG9yZWQgaW4gcHJvZHVjdCBtb2RlbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVzaWduUGFyYW1ldGVycyB7XG4gICAgLyoqIERlc2lnbiBtZWFzdXJlIHVuaXQgZGVzY3JpcHRpb24uICovXG4gICAgbWVhc3VyZVVuaXQ/OiBNZWFzdXJlVW5pdEluZm8gfCBudWxsO1xuICAgIC8qKiBWZXJzaW9uIG9mIERlc2lnbkF0b21zIGxpYnJhcnkgdGhhdCB1c2VkIHRvIHNhdmUgZGVzaWduIGZpbGUuICovXG4gICAgZGVzaWduQXRvbXNWZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEl0ZW0gZXh0cmFjdGlvbiBvcGVyYXRpb24gcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdEl0ZW1JbWFnZU1vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCBpdGVtIGRlc2NyaXB0aW9uLiAqL1xuICAgIGl0ZW06IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb250c01ldGhvZERhdGEge1xuICAgIHJlcXVlc3RlZEZvbnRzQnlQc05hbWU/OiBzdHJpbmdbXSB8IG51bGw7XG4gICAgYWR2YW5jZWRNb2RlPzogYm9vbGVhbjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDb2xvclByZXZpZXdSZXF1ZXN0IHtcbiAgICBjb2xvckRhdGE/OiBhbnkgfCBudWxsO1xuICAgIGNvbG9yU2V0dGluZ3M/OiBQcmV2aWV3Q29sb3JTZXR0aW5ncyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Q29sb3JQcmV2aWV3c1JlcXVlc3Qge1xuICAgIGNvbG9yRGF0YT86IGFueSB8IG51bGw7XG4gICAgY29sb3JTZXR0aW5ncz86IFByZXZpZXdDb2xvclNldHRpbmdzIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRJbWFnZVNpemVSZXF1ZXN0IHtcbiAgICBpbWFnZUlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBwYWdlSW5kZXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHtcbiAgICBwYXRoPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEltYWdlIHByZXZpZXcgZml0IG1vZGUuICovXG5leHBvcnQgZW51bSBJbWFnZVByZXZpZXdGaXRNb2RlIHtcbiAgICBGaXQgPSBcIkZpdFwiLFxuICAgIFNocmluayA9IFwiU2hyaW5rXCIsXG4gICAgUmVzaXplID0gXCJSZXNpemVcIixcbiAgICBGaWxsID0gXCJGaWxsXCIsXG59XG5cbi8qKiBJbWFnZSBwcmV2aWV3IGZpbGUgZm9ybWF0LiAqL1xuZXhwb3J0IGVudW0gSW1hZ2VQcmV2aWV3Rm9ybWF0IHtcbiAgICBKcGVnID0gXCJKcGVnXCIsXG4gICAgUG5nID0gXCJQbmdcIixcbn1cblxuLyoqIFNldHRpbmdzIHRoYXQgZGVzY3JpYmUgaW1hZ2UgcHJldmlldyByZW5kZXJpbmcgcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VQcmV2aWV3UmVuZGVyaW5nQ29uZmlnIHtcbiAgICAvKiogSW1hZ2UgcHJldmlldyB3aWR0aC4gKi9cbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICAvKiogSW1hZ2UgcHJldmlldyBoZWlnaHQuICovXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKiBJbWFnZSBwcmV2aWV3IGZpbGUgZm9ybWF0LiAqL1xuICAgIGZpbGVGb3JtYXQ/OiBJbWFnZVByZXZpZXdGb3JtYXQgfCBudWxsO1xuICAgIC8qKiBJbWFnZSBwcmV2aWV3IGZpdCBtb2RlLiAqL1xuICAgIGZpdE1vZGU/OiBJbWFnZVByZXZpZXdGaXRNb2RlIHwgbnVsbDtcbn1cblxuLyoqIEl0ZW0gc291cmNlIHR5cGVzLiAqL1xuZXhwb3J0IGVudW0gSXRlbVNvdXJjZVR5cGUge1xuICAgIEZpbGUgPSBcIkZpbGVcIixcbiAgICBJbWFnZVN0b3JhZ2UgPSBcIkltYWdlU3RvcmFnZVwiLFxuICAgIFByaXZhdGVJbWFnZVN0b3JhZ2UgPSBcIlByaXZhdGVJbWFnZVN0b3JhZ2VcIixcbn1cblxuZXhwb3J0IGVudW0gSXRlbVR5cGUge1xuICAgIEltYWdlID0gXCJJbWFnZVwiLFxuICAgIFNoYXBlID0gXCJTaGFwZVwiLFxuICAgIENsaXBhcnQgPSBcIkNsaXBhcnRcIixcbiAgICBHcm91cCA9IFwiR3JvdXBcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlVW5pdEluZm8ge1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHNob3J0TmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgcmF0aW8/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlzc2luZ0Rlc2lnbkVsZW1lbnREdG8ge1xuICAgIC8qKiBQcm9ibGVtIGRlc2NyaXB0aW9uLiAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTWlzc2luZyBlbGVtZW50IHR5cGUuICovXG4gICAgcmVhZG9ubHkgbWlzc2luZ0VsZW1lbnRUeXBlPzogRGVzaWduRWxlbWVudFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ja3VwM2RBdHRyaWJ1dGVzRHRvIHtcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpQ2FsbFJlcXVlc3Qge1xuICAgIGl0ZW1zPzogTXVsdGlDYWxsUmVxdWVzdEl0ZW1bXSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlDYWxsUmVxdWVzdEl0ZW0ge1xuICAgIGNhbnZhc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGl0ZW1IYW5kbGVyc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbG9yRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgYWN0dWFsU2l6ZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIHByZXNlcnZlQXNwZWN0UmF0aW8/OiBib29sZWFuIHwgbnVsbDtcbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIGltYWdlSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIHBhZ2VJbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgbWV0aG9kTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbURhdGE/OiBhbnkgfCBudWxsO1xuICAgIGNvbG9yU2V0dGluZ3M/OiBQcmV2aWV3Q29sb3JTZXR0aW5ncyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVsbEFibGVTaXplIHtcbiAgICB3aWR0aD86IG51bWJlciB8IG51bGw7XG4gICAgaGVpZ2h0PzogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqIFBsYWNlaG9sZGVyIGl0ZW0gY29udGVudCB0eXBlLiAqL1xuZXhwb3J0IGVudW0gUGxhY2Vob2xkZXJJdGVtQ29udGVudFR5cGUge1xuICAgIEltYWdlID0gXCJJbWFnZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50RiB7XG4gICAgcmVhZG9ubHkgaXNFbXB0eT86IGJvb2xlYW47XG4gICAgeD86IG51bWJlcjtcbiAgICB5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXdDb2xvclNldHRpbmdzIHtcbiAgICByZ2JDb2xvclByb2ZpbGVOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBjbXlrQ29sb3JQcm9maWxlTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgZ3JheXNjYWxlQ29sb3JQcm9maWxlTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgaGlSZXNEZXN0aW5hdGlvbkNvbG9yUHJvZmlsZU5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1EZXRhaWxzIHtcbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICBkZXRhaWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIGluc3RhbmNlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEF2YWlsYWJsZSBwYXRjaCB0eXBlLiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFBhdGNoVHlwZSB7XG4gICAgVW5kZWZpbmVkID0gXCJVbmRlZmluZWRcIixcbiAgICBSZXBsYWNlSW1hZ2VJdGVtRmlsZSA9IFwiUmVwbGFjZUltYWdlSXRlbUZpbGVcIixcbiAgICBSZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudCA9IFwiUmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRcIixcbn1cblxuLyoqIFByb2R1Y3QgcHJldmlldyBmaWxlIGZvcm1hdC4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RQcmV2aWV3Rm9ybWF0IHtcbiAgICBKcGVnID0gXCJKcGVnXCIsXG4gICAgUG5nID0gXCJQbmdcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0UHJldmlld1JlbmRlcmluZ0NvbmZpZyB7XG4gICAgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgZmlsZUZvcm1hdD86IFByb2R1Y3RQcmV2aWV3Rm9ybWF0IHwgbnVsbDtcbn1cblxuZXhwb3J0IGVudW0gUHJvZHVjdFByb29mRm9ybWF0IHtcbiAgICBKcGVnID0gXCJKcGVnXCIsXG4gICAgUG5nID0gXCJQbmdcIixcbiAgICBUaWZmID0gXCJUaWZmXCIsXG4gICAgUGRmID0gXCJQZGZcIixcbn1cblxuZXhwb3J0IGVudW0gUHJvZHVjdFByb29mSW50ZXJwb2xhdGlvbk1vZGUge1xuICAgIEhpZ2ggPSBcIkhpZ2hcIixcbiAgICBNZWRpdW0gPSBcIk1lZGl1bVwiLFxuICAgIExvdyA9IFwiTG93XCIsXG4gICAgTmVhcmVzdE5laWdoYm91ciA9IFwiTmVhcmVzdE5laWdoYm91clwiLFxuICAgIExpbmVhciA9IFwiTGluZWFyXCIsXG4gICAgQ3ViaWMgPSBcIkN1YmljXCIsXG4gICAgU3VwZXJzYW1wbGluZyA9IFwiU3VwZXJzYW1wbGluZ1wiLFxuICAgIExhbmN6b3MgPSBcIkxhbmN6b3NcIixcbiAgICBBbmlzb3Ryb3BpYzQgPSBcIkFuaXNvdHJvcGljNFwiLFxuICAgIEFuaXNvdHJvcGljOSA9IFwiQW5pc290cm9waWM5XCIsXG4gICAgTGFuY3pvczMgPSBcIkxhbmN6b3MzXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFByb29mUmVuZGVyaW5nQ29uZmlnIHtcbiAgICAvKiogU3VyZmFjZSB0byByZW5kZXIuICovXG4gICAgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogRGVzaXJlZCBwcm9vZiBpbWFnZSB3aWR0aC4gKi9cbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICAvKiogRGVzaXJlZCBwcm9vZiBpbWFnZSBoZWlnaHQuICovXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKiBEZXNpcmVkIHByb29mIGltYWdlIGZvcm1hdC4gKi9cbiAgICBmb3JtYXQ/OiBQcm9kdWN0UHJvb2ZGb3JtYXQgfCBudWxsO1xuICAgIC8qKiBEZXNpcmVkIHByb29mIGltYWdlIGludGVycG9sYXRpb24uICovXG4gICAgaW50ZXJwb2xhdGlvbk1vZGU/OiBQcm9kdWN0UHJvb2ZJbnRlcnBvbGF0aW9uTW9kZSB8IG51bGw7XG4gICAgLyoqIERlZmluZXMgd2hldGhlciBzYWZldHkgbGluZXMgc2hvdWxkIGJlIHZpc3VhbGl6ZWQuICovXG4gICAgc2FmZXR5TGluZXNFbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqIERlZmluZXMgd2hldGhlciB3YXRlcm1hcmsgc2hvdWxkIGJlIGluY2x1ZGVkLiAqL1xuICAgIHdhdGVybWFya0VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKiogRGVmaW5lcyB3YXRlcm1hcmsgb3BhY2l0eSAoaW4gcmFuZ2UgMCAuLiAxLjApLiAqL1xuICAgIHdhdGVybWFya09wYWNpdHk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBEZWZpbmVzIHdoZXRoZXIgd2F0ZXJtYXJrIHNob3VsZCBiZSByZXBlYXRlZC4gKi9cbiAgICB3YXRlcm1hcmtSZXBlYXQ/OiBib29sZWFuIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWN0YW5nbGVGIHtcbiAgICBsb2NhdGlvbj86IFBvaW50RjtcbiAgICBzaXplPzogc3RyaW5nO1xuICAgIHg/OiBudW1iZXI7XG4gICAgeT86IG51bWJlcjtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgbGVmdD86IG51bWJlcjtcbiAgICByZWFkb25seSB0b3A/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcmlnaHQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgYm90dG9tPzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGlzRW1wdHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckRlc2lnblByZXZpZXdNb2RlbCB7XG4gICAgLyoqIERlc2lnbiBpZGVudGlmaWVyLlxuVXNlZCB0byBnZXQgZGVzaWduIGZpbGUgZnJvbSBwdWJsaWMgb3IgcHJpdmF0ZSBzdG9yYWdlLiAqL1xuICAgIGRlc2lnbklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTW9ja3VwIGlkZW50aWZpZXIuXG5Vc2VkIHRvIGdldCBtb2NrdXAgZmlsZSBmcm9tIHB1YmxpYyBzdG9yYWdlLiAqL1xuICAgIG1vY2t1cElkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSWRlbnRpZmllciBvZiB0aGUgZGVzaWduIG93bmVyLiAqL1xuICAgIG93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBJZGVudGlmaWVyIG9mIHRoZSBtb2NrdXAgb3duZXIuICovXG4gICAgbW9ja3VwT3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlbmRlcmluZyBjb25maWd1cmF0aW9uIGZvciBnZXR0aW5nIGEgcHJldmlldyBvZiBkZXNpZ24uICovXG4gICAgcmVuZGVyaW5nQ29uZmlnPzogUHJvZHVjdFByZXZpZXdSZW5kZXJpbmdDb25maWcgfCBudWxsO1xuICAgIC8qKiBWYXJpYWJsZSAodXNlcikgZGF0YSBmb3IgZGVzaWduIHZhcmlhYmxlIGZpZWxkcyBpbiB0aGUgcHJldmlldyBpbWFnZS4gKi9cbiAgICB2YXJpYWJsZURhdGE/OiBWYXJpYWJsZUluZm9bXSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2VNb2RlbCB7XG4gICAgLyoqIFBhcmFtZXRlcnMgb2YgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBwcmV2aWV3IHJlbmRlcmluZyByZXN1bHQuICovXG4gICAgcHJldmlld1Jlc291cmNlUGFyYW1zPzogUmVzb3VyY2VQYXJhbXMgfCBudWxsO1xuICAgIC8qKiBEZXNpZ24gaWRlbnRpZmllci5cblVzZWQgdG8gZ2V0IGRlc2lnbiBmaWxlIGZyb20gcHVibGljIG9yIHByaXZhdGUgc3RvcmFnZS4gKi9cbiAgICBkZXNpZ25JZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1vY2t1cCBpZGVudGlmaWVyLlxuVXNlZCB0byBnZXQgbW9ja3VwIGZpbGUgZnJvbSBwdWJsaWMgc3RvcmFnZS4gKi9cbiAgICBtb2NrdXBJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIElkZW50aWZpZXIgb2YgdGhlIGRlc2lnbiBvd25lci4gKi9cbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSWRlbnRpZmllciBvZiB0aGUgbW9ja3VwIG93bmVyLiAqL1xuICAgIG1vY2t1cE93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBSZW5kZXJpbmcgY29uZmlndXJhdGlvbiBmb3IgZ2V0dGluZyBhIHByZXZpZXcgb2YgZGVzaWduLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcmV2aWV3UmVuZGVyaW5nQ29uZmlnIHwgbnVsbDtcbiAgICAvKiogVmFyaWFibGUgKHVzZXIpIGRhdGEgZm9yIGRlc2lnbiB2YXJpYWJsZSBmaWVsZHMgaW4gdGhlIHByZXZpZXcgaW1hZ2UuICovXG4gICAgdmFyaWFibGVEYXRhPzogVmFyaWFibGVJbmZvW10gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckRlc2lnblByb29mTW9kZWwge1xuICAgIC8qKiBEZXNpZ24gaWRlbnRpZmllci5cblVzZWQgdG8gZ2V0IGRlc2lnbiBmaWxlIGZyb20gcHVibGljIG9yIHByaXZhdGUgc3RvcmFnZS4gKi9cbiAgICBkZXNpZ25JZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIElkZW50aWZpZXIgb2YgdGhlIGRlc2lnbiBvd25lci4gKi9cbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUmVuZGVyaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGdldHRpbmcgYSBwcm9vZiBpbWFnZSBvZiBkZXNpZ24uICovXG4gICAgcmVuZGVyaW5nQ29uZmlnPzogUHJvZHVjdFByb29mUmVuZGVyaW5nQ29uZmlnIHwgbnVsbDtcbiAgICAvKiogVmFyaWFibGUgKHVzZXIpIGRhdGEgZm9yIGRlc2lnbiB2YXJpYWJsZSBmaWVsZHMgaW4gdGhlIHByb29mIGltYWdlLiAqL1xuICAgIHZhcmlhYmxlRGF0YT86IFZhcmlhYmxlSW5mb1tdIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJEZXNpZ25Qcm9vZlRvUmVzb3VyY2VNb2RlbCB7XG4gICAgLyoqIFBhcmFtZXRlcnMgb2YgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBwcmV2aWV3IHJlbmRlcmluZyByZXN1bHQuICovXG4gICAgcHJvb2ZSZXNvdXJjZVBhcmFtcz86IFJlc291cmNlUGFyYW1zIHwgbnVsbDtcbiAgICAvKiogRGVzaWduIGlkZW50aWZpZXIuXG5Vc2VkIHRvIGdldCBkZXNpZ24gZmlsZSBmcm9tIHB1YmxpYyBvciBwcml2YXRlIHN0b3JhZ2UuICovXG4gICAgZGVzaWduSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBJZGVudGlmaWVyIG9mIHRoZSBkZXNpZ24gb3duZXIuICovXG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlbmRlcmluZyBjb25maWd1cmF0aW9uIGZvciBnZXR0aW5nIGEgcHJvb2YgaW1hZ2Ugb2YgZGVzaWduLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG4gICAgLyoqIFZhcmlhYmxlICh1c2VyKSBkYXRhIGZvciBkZXNpZ24gdmFyaWFibGUgZmllbGRzIGluIHRoZSBwcm9vZiBpbWFnZS4gKi9cbiAgICB2YXJpYWJsZURhdGE/OiBWYXJpYWJsZUluZm9bXSB8IG51bGw7XG59XG5cbi8qKiBJbWFnZSBwcmV2aWV3IHJlbmRlcmluZyBwYXJhbWV0ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJJbWFnZVByZXZpZXdNb2RlbCB7XG4gICAgLyoqIEV4dGVybmFsIGltYWdlIFVSTC4gKi9cbiAgICBpbWFnZVVybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFN0b3JhZ2UgaW1hZ2UgaWRlbnRpZmllci4gKi9cbiAgICBpbWFnZUlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogU3RvcmFnZSBpbWFnZSBvd25lciBpZGVudGlmaWVyLiAqL1xuICAgIG93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBNb2NrdXAgb3duZXIgaWRlbnRpZmllci4gKi9cbiAgICBtb2NrdXBPd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTW9ja3VwIGlkZW50aWZpZXIuICovXG4gICAgbW9ja3VwSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBJbWFnZSBwcmV2aWV3IGNvbmZpZ3VyYXRpb24uICovXG4gICAgcmVuZGVyaW5nQ29uZmlnPzogSW1hZ2VQcmV2aWV3UmVuZGVyaW5nQ29uZmlnIHwgbnVsbDtcbn1cblxuLyoqIEltYWdlIHByZXZpZXcgcmVuZGVyaW5nIHBhcmFtZXRlcnMuIFJlc3VsdCB3aWxsIGJlIHNhdmVkIGFzIHJlc291cmNlIHdpdGggcGFyYW1ldGVycyBzZXQgYXMgQXVyaWdtYS5EZXNpZ25BdG9tc0FwaS5XZWJBcGkuTW9kZWxzLkltYWdlLlJlbmRlckltYWdlUHJldmlld1RvUmVzb3VyY2VNb2RlbC5QcmV2aWV3UmVzb3VyY2VQYXJhbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckltYWdlUHJldmlld1RvUmVzb3VyY2VNb2RlbCB7XG4gICAgLyoqIFBhcmFtZXRlcnMgb2YgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBwcmV2aWV3IHJlbmRlcmluZyByZXN1bHQuICovXG4gICAgcHJldmlld1Jlc291cmNlUGFyYW1zPzogUmVzb3VyY2VQYXJhbXMgfCBudWxsO1xuICAgIC8qKiBFeHRlcm5hbCBpbWFnZSBVUkwuICovXG4gICAgaW1hZ2VVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBTdG9yYWdlIGltYWdlIGlkZW50aWZpZXIuICovXG4gICAgaW1hZ2VJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFN0b3JhZ2UgaW1hZ2Ugb3duZXIgaWRlbnRpZmllci4gKi9cbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTW9ja3VwIG93bmVyIGlkZW50aWZpZXIuICovXG4gICAgbW9ja3VwT3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1vY2t1cCBpZGVudGlmaWVyLiAqL1xuICAgIG1vY2t1cElkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSW1hZ2UgcHJldmlldyBjb25maWd1cmF0aW9uLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IEltYWdlUHJldmlld1JlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG59XG5cbi8qKiBSZW5kZXIgcHJvZHVjdCBwYXJhbWV0ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQcm9kdWN0TW9kZWwge1xuICAgIC8qKiBTZXJpYWxpemVkIHByb2R1Y3QgZGVzY3JpcHRpb24uICovXG4gICAgcHJvZHVjdDogYW55O1xuICAgIC8qKiBQcm9vZiBJbWFnZSByZW5kZXJpbmcgY29uZmlnLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VJbmZvRHRvIHtcbiAgICBpZD86IHN0cmluZyB8IG51bGw7XG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlPzogYm9vbGVhbjtcbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUGFyYW1zIHtcbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHNvdXJjZUlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICBhbm9ueW1vdXNBY2Nlc3M/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVucHJvY2Vzc2FibGVEZXNpZ25FbGVtZW50RHRvIHtcbiAgICAvKiogUHJvYmxlbSBkZXNjcmlwdGlvbi4gKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1pc3NpbmcgZWxlbWVudCB0eXBlLiAqL1xuICAgIHJlYWRvbmx5IG1pc3NpbmdFbGVtZW50VHlwZT86IERlc2lnbkVsZW1lbnRUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNvbG9yc1JlcXVlc3Qge1xuICAgIGNhbnZhc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbG9yRGF0YT86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSGFuZGxlclJlcXVlc3Qge1xuICAgIGNhbnZhc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGl0ZW1IYW5kbGVyRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbURhdGE/OiBhbnkgfCBudWxsO1xuICAgIGNvbG9yU2V0dGluZ3M/OiBQcmV2aWV3Q29sb3JTZXR0aW5ncyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB7XG4gICAgYWN0dWFsU2l6ZT86IGJvb2xlYW47XG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbz86IGJvb2xlYW47XG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICBjYW52YXNEYXRhPzogc3RyaW5nIHwgbnVsbDtcbiAgICBpdGVtSGFuZGxlckRhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGl0ZW1EYXRhPzogYW55IHwgbnVsbDtcbiAgICBjb2xvclNldHRpbmdzPzogUHJldmlld0NvbG9yU2V0dGluZ3MgfCBudWxsO1xufVxuXG4vKiogVmFyaWFibGUgaW5mb3JtYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhYmxlSW5mbyB7XG4gICAgLyoqIFZhcmlhYmxlIG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFZhcmlhYmxlIHZhbHVlLiAqL1xuICAgIHZhbHVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVmFyaWFibGUgdHlwZS4gKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFZhcmlhYmxlcyBpbmZvcm1hdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVzTW9kZWwge1xuICAgIC8qKiBMaXN0IG9mIHZhcmlhYmxlcy4gKi9cbiAgICBpdGVtcz86IFZhcmlhYmxlSW5mb1tdIHwgbnVsbDtcbn1cblxuLyoqIFZhcmlhYmxlIGRhdGEgcHJpbnRpbmcgaW5mb3JtYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFZkcERhdGFNb2RlbCB7XG4gICAgLyoqIFNlcmlhbGl6ZWQgdmRwIGRhdGFzZXQuICovXG4gICAgdmRwRGF0YVNldD86IGFueSB8IG51bGw7XG4gICAgLyoqIFNlcmlhbGl6ZWQgdmRwIGl0ZW1zIGRhdGEuICovXG4gICAgdmRwSXRlbXNEYXRhPzogYW55IHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUGFyYW1ldGVyIHtcbiAgICBkYXRhOiBhbnk7XG4gICAgZmlsZU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUmVzcG9uc2Uge1xuICAgIGRhdGE6IEJsb2I7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgZmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgaGVhZGVycz86IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xufVxuXG5leHBvcnQgY2xhc3MgQXBpRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICByZXNwb25zZTogc3RyaW5nO1xuICAgIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9O1xuICAgIHJlc3VsdDogYW55O1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgcmVzcG9uc2U6IHN0cmluZywgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIHJlc3VsdDogYW55KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQXBpRXhjZXB0aW9uID0gdHJ1ZTtcblxuICAgIHN0YXRpYyBpc0FwaUV4Y2VwdGlvbihvYmo6IGFueSk6IG9iaiBpcyBBcGlFeGNlcHRpb24ge1xuICAgICAgICByZXR1cm4gb2JqLmlzQXBpRXhjZXB0aW9uID09PSB0cnVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24obWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgcmVzcG9uc2U6IHN0cmluZywgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIHJlc3VsdD86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzdWx0KTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KG5ldyBBcGlFeGNlcHRpb24obWVzc2FnZSwgc3RhdHVzLCByZXNwb25zZSwgaGVhZGVycywgbnVsbCkpO1xufVxuXG5mdW5jdGlvbiBibG9iVG9UZXh0KGJsb2I6IGFueSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFibG9iKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KFwiXCIpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KCg8YW55PmV2ZW50LnRhcmdldCkucmVzdWx0KTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IpO1xuICAgICAgICB9XG4gICAgfSk7XG59Il19
7154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLWF0b21zLWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvYXVyaWdtYS9hZ2VudHMvQ0NIMDMvX3dvcmsvNC9zL3NyYy9BdXJpZ21hLkRlc2lnbkF0b21zQXBpLlR5cGVTY3JpcHRBcGlDbGllbnQvQW5ndWxhci9hcGktY2xpZW50L3Byb2plY3RzL2NsaWVudC9zcmMvIiwic291cmNlcyI6WyJsaWIvZGVzaWduLWF0b21zLWFwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsd0JBQXdCO0FBQ3hCLG1CQUFtQjtBQUNuQiw0SEFBNEg7QUFDNUgsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4Qix1Q0FBdUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxlQUFlLEVBQUUsVUFBVSxJQUFJLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRS9GLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUV2RSxNQUFNLE9BQU8sc0JBQXNCO0lBQW5DO1FBQ0ksV0FBTSxHQUFXLHdCQUF3QixDQUFDO1FBQzFDLFdBQU0sR0FBVyxRQUFRLENBQUM7UUFDbEIsdUJBQWtCLEdBQVcsSUFBSSxDQUFDO0lBRzlDLENBQUM7SUFGUyxxQkFBcUI7OERBQXNCLE9BQU8sSUFBSSxD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QUMsTUFBTSxDQUFDLENBQUM7O1FBRWhDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUYsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQVM7SUFDekIsT0FBTyxJQUFJLFVBQVUsQ0FBUyxDQUFDLFFBQWEsRUFBRSxFQUFFO1FBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2QjthQUFNO1lBQ0gsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFFO2dCQUNwQixRQUFRLENBQUMsSUFBSSxDQUFPLEtBQUssQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUM7WUFDRixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDxhdXRvLWdlbmVyYXRlZD5cbi8vICAgICBHZW5lcmF0ZWQgdXNpbmcgdGhlIE5Td2FnIHRvb2xjaGFpbiB2MTMuMTUuNS4wIChOSnNvblNjaGVtYSB2MTAuNi42LjAgKE5ld3RvbnNvZnQuSnNvbiB2MTEuMC4wLjApKSAoaHR0cDovL05Td2FnLm9yZylcbi8vIDwvYXV0by1nZW5lcmF0ZWQ+XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlU2hhcnBlciBkaXNhYmxlIEluY29uc2lzdGVudE5hbWluZ1xuXG5pbXBvcnQgeyBtZXJnZU1hcCBhcyBfb2JzZXJ2YWJsZU1lcmdlTWFwLCBjYXRjaEVycm9yIGFzIF9vYnNlcnZhYmxlQ2F0Y2ggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tIGFzIF9vYnNlcnZhYmxlRnJvbSwgdGhyb3dFcnJvciBhcyBfb2JzZXJ2YWJsZVRocm93LCBvZiBhcyBfb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSwgSHR0cFJlc3BvbnNlQmFzZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuZXhwb3J0IGNvbnN0IEFQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdBUElfQkFTRV9VUkwnKTtcblxuZXhwb3J0IGNsYXNzIEFwaUNsaWVudENvbmZpZ3VyYXRpb24ge1xuICAgIGFwaVVybDogc3RyaW5nID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NTQyMjAnO1xuICAgIGFwaUtleTogc3RyaW5nID0gJ0FwaUtleSc7XG4gICAgcHJpdmF0ZSBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZyA9IG51bGw7XG4gICAgYXN5bmMgZ2V0QXV0aG9yaXphdGlvblRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbjsgfTtcbiAgICBzZXRBdXRob3JpemF0aW9uVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQgeyB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbiA9IHRva2VuOyB9O1xufVxuXG5leHBvcnQgY2xhc3MgQXBpQ2xpZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uKSB7IH1cblxuICAgIHByb3RlY3RlZCBhc3luYyB0cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldEF1dGhvcml6YXRpb25Ub2tlbigpO1xuICAgICAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IChvcHRpb25zLmhlYWRlcnMgYXMgSHR0cEhlYWRlcnMpLmFwcGVuZChcImF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gKG9wdGlvbnMuaGVhZGVycyBhcyBIdHRwSGVhZGVycykuYXBwZW5kKFwiWC1BUEktS2V5XCIsIHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgdHJhbnNmb3JtUmVzcG9uc2U6IChyZXMpID0+IHJlcywgcmVzcG9uc2VUeXBlOiAnanNvbicgfTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEJhc2VVcmwoZGVmdWx0VXJsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5hcGlVcmwuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5hcGlVcmwuc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uYXBpVXJsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0cmFuc2Zvcm1SZXN1bHQodXJsOiBzdHJpbmcsIHJlczogSHR0cFJlc3BvbnNlQmFzZSwgY2I6IChyZXM6IEh0dHBSZXNwb25zZUJhc2UpID0+IE9ic2VydmFibGU8YW55Pik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICByZXR1cm4gY2IocmVzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJ1aWxkSW5mb0FwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogR2V0IGFzc2VtYmx5IGJ1aWxkIGluZm8uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaGVhZEluZm8oKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBHZXQgYXNzZW1ibHkgYnVpbGQgaW5mby5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbmZvKCk6IE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEJ1aWxkSW5mb0FwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJQnVpbGRJbmZvQXBpQ2xpZW50IHtcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQ7XG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGpzb25QYXJzZVJldml2ZXI6ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEFwaUNsaWVudENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb246IEFwaUNsaWVudENvbmZpZ3VyYXRpb24sIEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwgIT09IHVuZGVmaW5lZCAmJiBiYXNlVXJsICE9PSBudWxsID8gYmFzZVVybCA6IHRoaXMuZ2V0QmFzZVVybChcIlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXNzZW1ibHkgYnVpbGQgaW5mby5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBoZWFkSW5mbygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvaW5mb1wiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImhlYWRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzSGVhZEluZm8oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NIZWFkSW5mbyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NIZWFkSW5mbyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhc3NlbWJseSBidWlsZCBpbmZvLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEluZm8oKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9pbmZvXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEluZm8oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbmZvKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8QnVpbGRJbmZvTW9kZWw+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8QnVpbGRJbmZvTW9kZWw+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXNpZ25BdG9tc0NvbXBhdGliaWxpdHlBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3NzRm9udHModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBmb250cyh0ZW5hbnRJZDogbnVtYmVyLCBwc05hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlldyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0Q29sb3JQcmV2aWV3UmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlld3ModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldENvbG9yUHJldmlld3NSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmb250S2V5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q3NzRm9udCh0ZW5hbnRJZDogbnVtYmVyLCBmb250S2V5Pzogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEZhbGxiYWNrRm9udHModGVuYW50SWQ6IG51bWJlcik6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEltYWdlU2l6ZSh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0SW1hZ2VTaXplUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8TnVsbEFibGVTaXplPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFNoYXBlQm91bmRzKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBHZXRTaGFwZUJvdW5kc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlY3RhbmdsZUY+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0V2F0ZXJtYXJrSXRlbXModGVuYW50SWQ6IG51bWJlciwgYm9keT86IGFueSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcncgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmggKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBpbWcodGVuYW50SWQ6IG51bWJlciwgZj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IHVuZGVmaW5lZCwgY215az86IHN0cmluZyB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRhcmdldD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtwPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb28/OiBudW1iZXIgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNvbG9yaXplQ29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJ3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCByaD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRMaWNlbnNlKHRlbmFudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwdGgodGVuYW50SWQ6IG51bWJlciwgZj86IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW1hZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXNvdXJjZSh0ZW5hbnRJZDogbnVtYmVyLCBpbWFnZT86IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcncgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmggKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBzdmcodGVuYW50SWQ6IG51bWJlciwgZj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IHVuZGVmaW5lZCwgY215az86IHN0cmluZyB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRhcmdldD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtwPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb28/OiBudW1iZXIgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNvbG9yaXplQ29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJ3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCByaD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHR4dCh0ZW5hbnRJZDogbnVtYmVyLCBmPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQnlDb2xvckRhdGEodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUNvbG9yc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QodGVuYW50SWQ6IG51bWJlciwgYm9keT86IE11bHRpQ2FsbFJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2VJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVNoYXBlSXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbkF0b21zQ29tcGF0aWJpbGl0eUFwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJRGVzaWduQXRvbXNDb21wYXRpYmlsaXR5QXBpQ2xpZW50IHtcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQ7XG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIGpzb25QYXJzZVJldml2ZXI6ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEFwaUNsaWVudENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb246IEFwaUNsaWVudENvbmZpZ3VyYXRpb24sIEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwgIT09IHVuZGVmaW5lZCAmJiBiYXNlVXJsICE9PSBudWxsID8gYmFzZVVybCA6IHRoaXMuZ2V0QmFzZVVybChcIlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNzc0ZvbnRzKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBGb250c01ldGhvZERhdGEgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2Nzc2ZvbnRzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L2Nzc1wiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0Nzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDc3NGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxzdHJpbmc+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZm9udHModGVuYW50SWQ6IG51bWJlciwgcHNOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2ZvbnRzL3twc05hbWV9XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKHBzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IHBzTmFtZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BzTmFtZScgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntwc05hbWV9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHNOYW1lKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlldyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0Q29sb3JQcmV2aWV3UmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvR2V0Q29sb3JQcmV2aWV3XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbG9yUHJldmlldyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbG9yUHJldmlldyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0Q29sb3JQcmV2aWV3KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlld3ModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldENvbG9yUHJldmlld3NSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRDb2xvclByZXZpZXdzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbG9yUHJldmlld3MoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDb2xvclByZXZpZXdzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRDb2xvclByZXZpZXdzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZm9udEtleSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENzc0ZvbnQodGVuYW50SWQ6IG51bWJlciwgZm9udEtleT86IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvR2V0Q3NzRm9udD9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAoZm9udEtleSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2ZvbnRLZXknIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZm9udEtleSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImZvbnRLZXk9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGZvbnRLZXkpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q3NzRm9udCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENzc0ZvbnQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENzc0ZvbnQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0RmFsbGJhY2tGb250cyh0ZW5hbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRGYWxsYmFja0ZvbnRzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRGYWxsYmFja0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0RmFsbGJhY2tGb250cyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0RmFsbGJhY2tGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbWFnZVNpemUodGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldEltYWdlU2l6ZVJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL0dldEltYWdlU2l6ZVwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRJbWFnZVNpemUoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRJbWFnZVNpemUoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8TnVsbEFibGVTaXplPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEltYWdlU2l6ZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8TnVsbEFibGVTaXplPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxOdWxsQWJsZVNpemU+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxOdWxsQWJsZVNpemU+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRTaGFwZUJvdW5kcyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxSZWN0YW5nbGVGPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvR2V0U2hhcGVCb3VuZHNcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0U2hhcGVCb3VuZHMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRTaGFwZUJvdW5kcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxSZWN0YW5nbGVGPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlY3RhbmdsZUY+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRTaGFwZUJvdW5kcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UmVjdGFuZ2xlRj5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFJlY3RhbmdsZUY+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRXYXRlcm1hcmtJdGVtcyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogYW55IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRXYXRlcm1hcmtJdGVtc1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFdhdGVybWFya0l0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJ3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJoIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaW1nKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHc/OiBudW1iZXIgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJnYj86IHN0cmluZyB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHNxPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBhbHBoYU1hc2s/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBydz86IG51bWJlciB8IHVuZGVmaW5lZCwgcmg/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2ltZz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAoZiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2YnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIGlmICh3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh3ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGggPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBoKSArIFwiJlwiO1xuICAgICAgICBpZiAoY215ayA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2NteWsnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY215ayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImNteWs9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNteWspICsgXCImXCI7XG4gICAgICAgIGlmIChyZ2IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdyZ2InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocmdiICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmdiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZ2IpICsgXCImXCI7XG4gICAgICAgIGlmIChncmF5c2NhbGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdncmF5c2NhbGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZ3JheXNjYWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZ3JheXNjYWxlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBncmF5c2NhbGUpICsgXCImXCI7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0YXJnZXQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGFyZ2V0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YXJnZXQpICsgXCImXCI7XG4gICAgICAgIGlmIChzcSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NxJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHNxICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwic3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNxKSArIFwiJlwiO1xuICAgICAgICBpZiAoZWZmZWN0ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZWZmZWN0JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGVmZmVjdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImVmZmVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZWZmZWN0KSArIFwiJlwiO1xuICAgICAgICBpZiAoa3AgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdrcCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChrcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImtwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBrcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY29sb3IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3IpICsgXCImXCI7XG4gICAgICAgIGlmIChvYm0gPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdvYm0nIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob2JtICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib2JtPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvYm0pICsgXCImXCI7XG4gICAgICAgIGlmIChvbyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ29vJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKG9vICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib289XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9vKSArIFwiJlwiO1xuICAgICAgICBpZiAoYWxwaGFNYXNrID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnYWxwaGFNYXNrJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGFscGhhTWFzayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImFscGhhTWFzaz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYWxwaGFNYXNrKSArIFwiJlwiO1xuICAgICAgICBpZiAocGFnZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BhZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocGFnZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInBhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHBhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChjb2xvcml6ZUNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3JpemVDb2xvcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjb2xvcml6ZUNvbG9yICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3JpemVDb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3JpemVDb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJ3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncncnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocncgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJydz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcncpICsgXCImXCI7XG4gICAgICAgIGlmIChyaCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHJoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJoKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzSW1nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRMaWNlbnNlKHRlbmFudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2xpY2Vuc2VcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldExpY2Vuc2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRMaWNlbnNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRMaWNlbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHB0aCh0ZW5hbnRJZDogbnVtYmVyLCBmPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9wdGg/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1B0aCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1B0aCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUHRoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW1hZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXNvdXJjZSh0ZW5hbnRJZDogbnVtYmVyLCBpbWFnZT86IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvcmVzb3VyY2U/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGltYWdlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaW1hZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJpbWFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaW1hZ2UpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJ3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJoIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc3ZnKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHc/OiBudW1iZXIgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJnYj86IHN0cmluZyB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHNxPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBhbHBoYU1hc2s/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBydz86IG51bWJlciB8IHVuZGVmaW5lZCwgcmg/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL3N2Zz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAoZiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2YnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIGlmICh3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh3ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGggPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBoKSArIFwiJlwiO1xuICAgICAgICBpZiAoY215ayA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2NteWsnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY215ayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImNteWs9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNteWspICsgXCImXCI7XG4gICAgICAgIGlmIChyZ2IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdyZ2InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocmdiICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmdiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZ2IpICsgXCImXCI7XG4gICAgICAgIGlmIChncmF5c2NhbGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdncmF5c2NhbGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZ3JheXNjYWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZ3JheXNjYWxlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBncmF5c2NhbGUpICsgXCImXCI7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0YXJnZXQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGFyZ2V0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YXJnZXQpICsgXCImXCI7XG4gICAgICAgIGlmIChzcSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NxJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHNxICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwic3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNxKSArIFwiJlwiO1xuICAgICAgICBpZiAoZWZmZWN0ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZWZmZWN0JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGVmZmVjdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImVmZmVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZWZmZWN0KSArIFwiJlwiO1xuICAgICAgICBpZiAoa3AgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdrcCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChrcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImtwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBrcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY29sb3IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3IpICsgXCImXCI7XG4gICAgICAgIGlmIChvYm0gPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdvYm0nIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob2JtICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib2JtPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvYm0pICsgXCImXCI7XG4gICAgICAgIGlmIChvbyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ29vJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKG9vICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib289XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9vKSArIFwiJlwiO1xuICAgICAgICBpZiAoYWxwaGFNYXNrID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnYWxwaGFNYXNrJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGFscGhhTWFzayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImFscGhhTWFzaz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYWxwaGFNYXNrKSArIFwiJlwiO1xuICAgICAgICBpZiAocGFnZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BhZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocGFnZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInBhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHBhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChjb2xvcml6ZUNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3JpemVDb2xvcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjb2xvcml6ZUNvbG9yICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3JpemVDb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3JpemVDb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJ3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncncnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocncgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJydz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcncpICsgXCImXCI7XG4gICAgICAgIGlmIChyaCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHJoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJoKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU3ZnKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHR4dCh0ZW5hbnRJZDogbnVtYmVyLCBmPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci90eHQ/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1R4dCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1R4dCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVHh0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXJcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXJcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQnlDb2xvckRhdGEodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUNvbG9yc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUJ5Q29sb3JEYXRhXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlDb2xvckRhdGEoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogTXVsdGlDYWxsUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVJbWFnZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVJbWFnZUl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUltYWdlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXJcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVTaGFwZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlU2hhcGVJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVTaGFwZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZXNpZ25BdG9tc0ltYWdlc0FwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIHdlYiBpbWFnZSBwcmV2aWV3IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgZmlsZSB3aWxsIGJlIHByb3ZpZGVkIGFzIGFuIGF0dGFjaG1lbnQgd2l0aCB1bmlxdWUgZmlsZW5hbWUgc3VwcGxpZWRcbiAgICAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckltYWdlUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJJbWFnZVByZXZpZXdNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgd2ViIGltYWdlIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kIHNhdmVzIHJlbmRlcmluZyByZXN1bHQgYXMgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJJbWFnZVByZXZpZXdUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVySW1hZ2VQcmV2aWV3VG9SZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbkF0b21zSW1hZ2VzQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc0ltYWdlc0FwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIHdlYiBpbWFnZSBwcmV2aWV3IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgZmlsZSB3aWxsIGJlIHByb3ZpZGVkIGFzIGFuIGF0dGFjaG1lbnQgd2l0aCB1bmlxdWUgZmlsZW5hbWUgc3VwcGxpZWRcbiAgICAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckltYWdlUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJJbWFnZVByZXZpZXdNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2ltYWdlcy9yZW5kZXItcHJldmlldz9cIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdhdHRhY2htZW50JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJhdHRhY2htZW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhdHRhY2htZW50KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVySW1hZ2VQcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVySW1hZ2VQcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXcocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgd2ViIGltYWdlIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kIHNhdmVzIHJlbmRlcmluZyByZXN1bHQgYXMgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJJbWFnZVByZXZpZXdUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVySW1hZ2VQcmV2aWV3VG9SZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvaW1hZ2VzL3JlbmRlci1wcmV2aWV3L3RvLXJlc291cmNlP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlbmRlckltYWdlUHJldmlld1RvUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXdUb1Jlc291cmNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlc291cmNlSW5mb0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXdUb1Jlc291cmNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFJlc291cmNlSW5mb0R0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFJlc291cmNlSW5mb0R0bz4oPGFueT5udWxsKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlc2lnbkF0b21zTW9ja3VwczNkQXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgM0QtTW9ja3VwIGF0dHJpYnV0ZXMuXG4gICAgICogQHBhcmFtIGlkIDNELU1vY2t1cCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBvd25lcklkIChvcHRpb25hbCkgUHJpdmF0ZSBtb2NrdXAgb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEF0dHJpYnV0ZXMoaWQ6IHN0cmluZywgb3duZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE1vY2t1cDNkQXR0cmlidXRlc0R0bz47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIDNELU1vY2t1cCBjb250ZW50IGFzIHByb3RvYnVmIGJpbmFyeSBzdHJlYW0uXG4gICAgICogQHBhcmFtIGlkIDNELU1vY2t1cCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBvd25lcklkIChvcHRpb25hbCkgUHJpdmF0ZSBtb2NrdXAgb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbnRlbnRBc1Byb3RvYnVmKGlkOiBzdHJpbmcsIG93bmVySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSAzRC1Nb2NrdXAgZ2VvbWV0cnkgYXMgYmluYXJ5IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0gaWQgM0QtTW9ja3VwIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIG93bmVySWQgKG9wdGlvbmFsKSBQcml2YXRlIG1vY2t1cCBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0R2VvbWV0cnlGaWxlKGlkOiBzdHJpbmcsIG93bmVySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbkF0b21zTW9ja3VwczNkQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc01vY2t1cHMzZEFwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIDNELU1vY2t1cCBhdHRyaWJ1dGVzLlxuICAgICAqIEBwYXJhbSBpZCAzRC1Nb2NrdXAgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gb3duZXJJZCAob3B0aW9uYWwpIFByaXZhdGUgbW9ja3VwIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRBdHRyaWJ1dGVzKGlkOiBzdHJpbmcsIG93bmVySWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxNb2NrdXAzZEF0dHJpYnV0ZXNEdG8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvbW9ja3Vwcy0zZC97aWR9L2F0dHJpYnV0ZXM/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKG93bmVySWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdvd25lcklkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKG93bmVySWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvd25lcklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvd25lcklkKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRBdHRyaWJ1dGVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0QXR0cmlidXRlcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxNb2NrdXAzZEF0dHJpYnV0ZXNEdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8TW9ja3VwM2RBdHRyaWJ1dGVzRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0QXR0cmlidXRlcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8TW9ja3VwM2RBdHRyaWJ1dGVzRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxNb2NrdXAzZEF0dHJpYnV0ZXNEdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQyMjogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQyMiA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNsaWVudCBFcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MjIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPE1vY2t1cDNkQXR0cmlidXRlc0R0bz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgM0QtTW9ja3VwIGNvbnRlbnQgYXMgcHJvdG9idWYgYmluYXJ5IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0gaWQgM0QtTW9ja3VwIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIG93bmVySWQgKG9wdGlvbmFsKSBQcml2YXRlIG1vY2t1cCBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29udGVudEFzUHJvdG9idWYoaWQ6IHN0cmluZywgb3duZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9tb2NrdXBzLTNkL3tpZH0vY29udGVudC9hcy1wcm90b2J1Zj9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAob3duZXJJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ293bmVySWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob3duZXJJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcIm93bmVySWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG93bmVySWQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbnRlbnRBc1Byb3RvYnVmKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q29udGVudEFzUHJvdG9idWYoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENvbnRlbnRBc1Byb3RvYnVmKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQyMjogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQyMiA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNsaWVudCBFcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MjIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgM0QtTW9ja3VwIGdlb21ldHJ5IGFzIGJpbmFyeSBzdHJlYW0uXG4gICAgICogQHBhcmFtIGlkIDNELU1vY2t1cCBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBvd25lcklkIChvcHRpb25hbCkgUHJpdmF0ZSBtb2NrdXAgb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEdlb21ldHJ5RmlsZShpZDogc3RyaW5nLCBvd25lcklkPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL21vY2t1cHMtM2Qve2lkfS9nZW9tZXRyeS9maWxlP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChvd25lcklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnb3duZXJJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChvd25lcklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib3duZXJJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb3duZXJJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0R2VvbWV0cnlGaWxlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0R2VvbWV0cnlGaWxlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRHZW9tZXRyeUZpbGUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQyMikge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDIyOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDIyID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ2xpZW50IEVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQyMik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNTZXJ2aWNlQXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBkZXNpZ24gZmlsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZCBzYXZlcyBpdCBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIERlc2lnbiBjcmVhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZFxuICAgICAqL1xuICAgIGNyZWF0ZURlc2lnbihwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IENyZWF0ZURlc2lnbk1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxEZXNpZ25JbmZvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvbnRlbnQgb2YgdGhlIGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdXJmYWNlSW5kZXggKG9wdGlvbmFsKSBTdXJmYWNlIGluZGV4LlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBleHRyYWN0QmFja2dyb3VuZChpZDogc3RyaW5nLCBzdXJmYWNlSW5kZXg/OiBudW1iZXIgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIExvYWRzIHByb2R1Y3QgKGRlc2lnbiBtb2RlbCkgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkUHJvZHVjdChpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBTYXZlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIHRvIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHByb2R1Y3QgZGVzY3JpcHRpb24uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2F2ZVByb2R1Y3QoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBhbnkgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgcHJvZHVjdCAoZGVzaWduIG1vZGVsKSBpbiBkZXNpZ24gZmlsZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwYXRjaFR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHBhdGNoUHJvZHVjdChpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgcGF0Y2hUeXBlPzogUHJvZHVjdFBhdGNoVHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGU/OiBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBkZXNpZ24gcGFyYW1ldGVycyBzdG9yZWQgaW4gcHJvZHVjdCBtb2RlbC5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldERlc2lnblBhcmFtZXRlcnMoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPERlc2lnblBhcmFtZXRlcnM+O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGRhdGEgc2NoZW1hIGZyb20gZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZERhdGFTY2hlbWEoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogTG9hZHMgYSB0b2dnbGUgc2V0IGZyb20gZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZFRvZ2dsZVNldChpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBHZXRzIHZhcmlhYmxlIGl0ZW1zIGluZm9ybWF0aW9uIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRWYXJpYWJsZXMoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPjtcbiAgICAvKipcbiAgICAgKiBTZXRzIHZhcmlhYmxlIGl0ZW1zIHZhbHVlcyBmb3IgZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBEZXNpZ24gdmFyaWFibGUgdmFsdWVzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNldFZhcmlhYmxlcyhpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFZhcmlhYmxlc01vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBMb2FkcyB2YXJpYWJsZSBkYXRhIHByaW50aW5nIGluZm9ybWF0aW9uIGZyb20gZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZFZkcERhdGEoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZkcERhdGFNb2RlbD47XG4gICAgLyoqXG4gICAgICogU2F2ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiB0byBkZXNpZ24gZmlsZSBhbmQgdXBkYXRlcyBkZXNpZ24gaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgU2VyaWFsaXplZCB2ZHAgZGF0YS5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBzYXZlVmRwRGF0YShpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFZkcERhdGFNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB2YXJpYWJsZSBkYXRhIHByaW50aW5nIGluZm9ybWF0aW9uIGZyb20gZGVzaWduIGZpbGUgYW5kIHVwZGF0ZXMgZGVzaWduIGluIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkZWxldGVWZHBEYXRhKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIGZyb20gcmVzb3VyY2UgZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIFJlc291cmNlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGxvYWRQcm9kdWN0RnJvbVJlc291cmNlKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGNvbG9ycy5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgQ29udmVydCBjb2xvcnMgb3BlcmF0aW9uIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY29udmVydENvbG9ycyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IENvbnZlcnRDb2xvcnNNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHByb2R1Y3QgaXRlbS5cbiAgICAgKiBAcGFyYW0gaXRlbVR5cGUgKG9wdGlvbmFsKSBEZXNpcmVkIGl0ZW0gdHlwZS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBzb3VyY2VUeXBlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZUlkIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZU93bmVySWQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZUl0ZW0oaXRlbVR5cGU/OiBJdGVtVHlwZSB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIHNvdXJjZVR5cGU/OiBJdGVtU291cmNlVHlwZSB8IG51bGwgfCB1bmRlZmluZWQsIHNvdXJjZUlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc291cmNlT3duZXJJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBwcm9kdWN0IGl0ZW0gaW1hZ2UuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIEV4dHJhY3Rpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBleHRyYWN0SXRlbUltYWdlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogRXh0cmFjdEl0ZW1JbWFnZU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEZsYXR0ZW4gaXRlbXMuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIEl0ZW1zIHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZmxhdHRlbkl0ZW1zKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55W10gfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogUmVuZGVyIHByb2R1Y3QgcHJvb2YgaW1hZ2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkXG4gICAgKGRlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJykuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJQcm9kdWN0KGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlclByb2R1Y3RNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyRGVzaWduUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25QcmV2aWV3TW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIGRlc2lnbiBwcmV2aWV3IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZCBzYXZlcyByZW5kZXJpbmcgcmVzdWx0IGFzIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2UodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25QcmV2aWV3VG9SZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+O1xuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJvb2Ygd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcm9vZiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByb29mKGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlckRlc2lnblByb29mTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIGRlc2lnbiBwcm9vZiB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQgc2F2ZXMgcmVuZGVyaW5nIHJlc3VsdCBhcyByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByb29mVG9SZXNvdXJjZSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlckRlc2lnblByb29mVG9SZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcml2YXRlIGRlc2lnbiBmcm9tIGEgcHVibGljIGRlc2lnbi5cbiAgICAgKiBAcGFyYW0gZGVzaWduSWQgKG9wdGlvbmFsKSBQdWJsaWMgZGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVEZXNpZ25JZCAob3B0aW9uYWwpIFByaXZhdGUgZGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gQ3JlYXRlZFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlYXRlUHJpdmF0ZURlc2lnbkZyb21EZXNpZ24oZGVzaWduSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHByaXZhdGVEZXNpZ25JZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcml2YXRlIGRlc2lnbiBmcm9tIGEgcHVibGljIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSByZXNvdXJjZUlkIChvcHRpb25hbCkgUmVzb3VyY2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZURlc2lnbklkIChvcHRpb25hbCkgUHJpdmF0ZSBkZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm4gQ3JlYXRlZFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZShyZXNvdXJjZUlkPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcml2YXRlRGVzaWduSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25BdG9tc1NlcnZpY2VBcGlDbGllbnQgZXh0ZW5kcyBBcGlDbGllbnRCYXNlIGltcGxlbWVudHMgSURlc2lnbkF0b21zU2VydmljZUFwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZGVzaWduIGZpbGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQgc2F2ZXMgaXQgaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBEZXNpZ24gY3JlYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIENyZWF0ZWRcbiAgICAgKi9cbiAgICBjcmVhdGVEZXNpZ24ocHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBDcmVhdGVEZXNpZ25Nb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RGVzaWduSW5mbz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zP1wiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlRGVzaWduKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlRGVzaWduKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPERlc2lnbkluZm8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RGVzaWduSW5mbz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NyZWF0ZURlc2lnbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RGVzaWduSW5mbz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAxOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAxID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8RGVzaWduSW5mbz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDEpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPERlc2lnbkluZm8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb250ZW50IG9mIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3VyZmFjZUluZGV4IChvcHRpb25hbCkgU3VyZmFjZSBpbmRleC5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZXh0cmFjdEJhY2tncm91bmQoaWQ6IHN0cmluZywgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9iYWNrZ3JvdW5kP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChzdXJmYWNlSW5kZXggPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdzdXJmYWNlSW5kZXgnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoc3VyZmFjZUluZGV4ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwic3VyZmFjZUluZGV4PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdXJmYWNlSW5kZXgpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NFeHRyYWN0QmFja2dyb3VuZCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0V4dHJhY3RCYWNrZ3JvdW5kKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NFeHRyYWN0QmFja2dyb3VuZChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPE1pc3NpbmdEZXNpZ25FbGVtZW50RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDIyKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MjI6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MjIgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxVbnByb2Nlc3NhYmxlRGVzaWduRWxlbWVudER0bz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDbGllbnQgRXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDIyKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgcHJvZHVjdCAoZGVzaWduIG1vZGVsKSBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGxvYWRQcm9kdWN0KGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L21vZGVsP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkUHJvZHVjdCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9hZFByb2R1Y3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIHRvIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHByb2R1Y3QgZGVzY3JpcHRpb24uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2F2ZVByb2R1Y3QoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBhbnkgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L21vZGVsP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInB1dFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTYXZlUHJvZHVjdCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NhdmVQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1NhdmVQcm9kdWN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF0Y2hlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIGluIGRlc2lnbiBmaWxlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHBhdGNoVHlwZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9faXRlbU5hbWUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX25ld0NvbnRlbnRUeXBlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19zb3VyY2VGaWxlIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcGF0Y2hQcm9kdWN0KGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBwYXRjaFR5cGU/OiBQcm9kdWN0UGF0Y2hUeXBlIHwgdW5kZWZpbmVkLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9faXRlbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZT86IEZpbGVQYXJhbWV0ZXIgfCBudWxsIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZT86IFBsYWNlaG9sZGVySXRlbUNvbnRlbnRUeXBlIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZT86IEZpbGVQYXJhbWV0ZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9tb2RlbD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGlmIChwYXRjaFR5cGUgPT09IG51bGwgfHwgcGF0Y2hUeXBlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwYXRjaFR5cGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwicGF0Y2hUeXBlXCIsIHBhdGNoVHlwZS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZSAhPT0gbnVsbCAmJiByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9faXRlbU5hbWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mby5pdGVtTmFtZVwiLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9faXRlbU5hbWUudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChyZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZSAhPT0gbnVsbCAmJiByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwicmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvLnNvdXJjZUZpbGVcIiwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGUuZGF0YSwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGUuZmlsZU5hbWUgPyByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZS5maWxlTmFtZSA6IFwicmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvLnNvdXJjZUZpbGVcIik7XG4gICAgICAgIGlmIChyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZSAhPT0gbnVsbCAmJiByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwicmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvLnBsYWNlaG9sZGVySXRlbU5hbWVcIiwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWUudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUgPT09IG51bGwgfHwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX25ld0NvbnRlbnRUeXBlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwicmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvLm5ld0NvbnRlbnRUeXBlXCIsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19zb3VyY2VGaWxlICE9PSBudWxsICYmIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19zb3VyY2VGaWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm8uc291cmNlRmlsZVwiLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZS5kYXRhLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fc291cmNlRmlsZS5maWxlTmFtZSA/IHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19zb3VyY2VGaWxlLmZpbGVOYW1lIDogXCJyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm8uc291cmNlRmlsZVwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBhdGNoXCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1BhdGNoUHJvZHVjdCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1BhdGNoUHJvZHVjdCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NQYXRjaFByb2R1Y3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGRlc2lnbiBwYXJhbWV0ZXJzIHN0b3JlZCBpbiBwcm9kdWN0IG1vZGVsLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0RGVzaWduUGFyYW1ldGVycyhpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RGVzaWduUGFyYW1ldGVycz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vcGFyYW1ldGVycz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldERlc2lnblBhcmFtZXRlcnMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXREZXNpZ25QYXJhbWV0ZXJzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPERlc2lnblBhcmFtZXRlcnM+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RGVzaWduUGFyYW1ldGVycz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldERlc2lnblBhcmFtZXRlcnMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPERlc2lnblBhcmFtZXRlcnM+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPERlc2lnblBhcmFtZXRlcnM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RGVzaWduUGFyYW1ldGVycz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBkYXRhIHNjaGVtYSBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGxvYWREYXRhU2NoZW1hKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3NjaGVtYT9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZERhdGFTY2hlbWEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkRGF0YVNjaGVtYSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9hZERhdGFTY2hlbWEocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA5OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA5ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ29uZmxpY3RcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYSB0b2dnbGUgc2V0IGZyb20gZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZFRvZ2dsZVNldChpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS90b2dnbGUtc2V0P1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkVG9nZ2xlU2V0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFRvZ2dsZVNldCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9hZFRvZ2dsZVNldChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDb25mbGljdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHZhcmlhYmxlIGl0ZW1zIGluZm9ybWF0aW9uIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRWYXJpYWJsZXMoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS92YXJpYWJsZXM/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRWYXJpYWJsZXMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRWYXJpYWJsZXMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VmFyaWFibGVzTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VmFyaWFibGVzTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRWYXJpYWJsZXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxWYXJpYWJsZXNNb2RlbD5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxWYXJpYWJsZXNNb2RlbD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHZhcmlhYmxlIGl0ZW1zIHZhbHVlcyBmb3IgZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBEZXNpZ24gdmFyaWFibGUgdmFsdWVzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNldFZhcmlhYmxlcyhpZDogc3RyaW5nLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFZhcmlhYmxlc01vZGVsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS92YXJpYWJsZXM/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicHV0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NldFZhcmlhYmxlcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NldFZhcmlhYmxlcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTZXRWYXJpYWJsZXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB2YXJpYWJsZSBkYXRhIHByaW50aW5nIGluZm9ybWF0aW9uIGZyb20gZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZFZkcERhdGEoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZkcERhdGFNb2RlbD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vdmRwLWRhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWRWZHBEYXRhKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFZkcERhdGFNb2RlbD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxWZHBEYXRhTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NMb2FkVmRwRGF0YShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8VmRwRGF0YU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxWZHBEYXRhTW9kZWw+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8VmRwRGF0YU1vZGVsPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHZhcmlhYmxlIGRhdGEgcHJpbnRpbmcgaW5mb3JtYXRpb24gdG8gZGVzaWduIGZpbGUgYW5kIHVwZGF0ZXMgZGVzaWduIGluIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFNlcmlhbGl6ZWQgdmRwIGRhdGEuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2F2ZVZkcERhdGEoaWQ6IHN0cmluZywgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBWZHBEYXRhTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZkcC1kYXRhP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZVN0b3JhZ2VPd25lcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInB1dFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTYXZlVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NhdmVWZHBEYXRhKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1NhdmVWZHBEYXRhKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB2YXJpYWJsZSBkYXRhIHByaW50aW5nIGluZm9ybWF0aW9uIGZyb20gZGVzaWduIGZpbGUgYW5kIHVwZGF0ZXMgZGVzaWduIGluIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkZWxldGVWZHBEYXRhKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS92ZHAtZGF0YT9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImRlbGV0ZVwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NEZWxldGVWZHBEYXRhKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRGVsZXRlVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NEZWxldGVWZHBEYXRhKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIGZyb20gcmVzb3VyY2UgZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIFJlc291cmNlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGxvYWRQcm9kdWN0RnJvbVJlc291cmNlKGlkOiBzdHJpbmcsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy9mcm9tLXJlc291cmNlL3tpZH0vbW9kZWw/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkUHJvZHVjdEZyb21SZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWRQcm9kdWN0RnJvbVJlc291cmNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NMb2FkUHJvZHVjdEZyb21SZXNvdXJjZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQyMjogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQyMiA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNsaWVudCBFcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MjIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBjb2xvcnMuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENvbnZlcnQgY29sb3JzIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNvbnZlcnRDb2xvcnModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBDb252ZXJ0Q29sb3JzTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL2NvbnZlcnQtY29sb3JzP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NvbnZlcnRDb2xvcnMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDb252ZXJ0Q29sb3JzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDb252ZXJ0Q29sb3JzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBwcm9kdWN0IGl0ZW0uXG4gICAgICogQHBhcmFtIGl0ZW1UeXBlIChvcHRpb25hbCkgRGVzaXJlZCBpdGVtIHR5cGUuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gc291cmNlVHlwZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzb3VyY2VJZCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzb3VyY2VPd25lcklkIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZUZpbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVJdGVtKGl0ZW1UeXBlPzogSXRlbVR5cGUgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBzb3VyY2VUeXBlPzogSXRlbVNvdXJjZVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3VyY2VJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNvdXJjZU93bmVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3VyY2VGaWxlPzogRmlsZVBhcmFtZXRlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL2l0ZW1zP1wiO1xuICAgICAgICBpZiAoaXRlbVR5cGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpdGVtVHlwZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChpdGVtVHlwZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcIml0ZW1UeXBlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpdGVtVHlwZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgIT09IG51bGwgJiYgc291cmNlVHlwZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwic291cmNlVHlwZVwiLCBzb3VyY2VUeXBlLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc291cmNlSWQgIT09IG51bGwgJiYgc291cmNlSWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInNvdXJjZUlkXCIsIHNvdXJjZUlkLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc291cmNlT3duZXJJZCAhPT0gbnVsbCAmJiBzb3VyY2VPd25lcklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJzb3VyY2VPd25lcklkXCIsIHNvdXJjZU93bmVySWQudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChzb3VyY2VGaWxlICE9PSBudWxsICYmIHNvdXJjZUZpbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInNvdXJjZUZpbGVcIiwgc291cmNlRmlsZS5kYXRhLCBzb3VyY2VGaWxlLmZpbGVOYW1lID8gc291cmNlRmlsZS5maWxlTmFtZSA6IFwic291cmNlRmlsZVwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVJdGVtKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlSXRlbSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlSXRlbShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHByb2R1Y3QgaXRlbSBpbWFnZS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgRXh0cmFjdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGV4dHJhY3RJdGVtSW1hZ2UodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBFeHRyYWN0SXRlbUltYWdlTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL2l0ZW1zL2V4dHJhY3QtaW1hZ2U/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NFeHRyYWN0SXRlbUltYWdlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRXh0cmFjdEl0ZW1JbWFnZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRXh0cmFjdEl0ZW1JbWFnZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW4gaXRlbXMuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIEl0ZW1zIHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZmxhdHRlbkl0ZW1zKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55W10gfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL2l0ZW1zL2ZsYXR0ZW4/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRmxhdHRlbkl0ZW1zKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRmxhdHRlbkl0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NGbGF0dGVuSXRlbXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlciBwcm9kdWN0IHByb29mIGltYWdlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBQcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyUHJvZHVjdChhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJQcm9kdWN0TW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL21vZGVsL3JlbmRlci1wcm9vZj9cIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdhdHRhY2htZW50JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJhdHRhY2htZW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhdHRhY2htZW50KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyUHJvZHVjdCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlbmRlclByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1JlbmRlclByb2R1Y3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyRGVzaWduUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25QcmV2aWV3TW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3JlbmRlci1wcmV2aWV3P1wiO1xuICAgICAgICBpZiAoYXR0YWNobWVudCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2F0dGFjaG1lbnQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoYXR0YWNobWVudCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImF0dGFjaG1lbnQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGF0dGFjaG1lbnQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25QcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyRGVzaWduUHJldmlldyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVuZGVyRGVzaWduUHJldmlldyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQgc2F2ZXMgcmVuZGVyaW5nIHJlc3VsdCBhcyByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJldmlldyBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByZXZpZXdUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2VNb2RlbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMvcmVuZGVyLXByZXZpZXcvdG8tcmVzb3VyY2U/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25QcmV2aWV3VG9SZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxSZXNvdXJjZUluZm9EdG8+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFJlc291cmNlSW5mb0R0bz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UmVzb3VyY2VJbmZvRHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UmVzb3VyY2VJbmZvRHRvPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJvb2Ygd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcm9vZiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByb29mKGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlckRlc2lnblByb29mTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3JlbmRlci1wcm9vZj9cIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdhdHRhY2htZW50JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJhdHRhY2htZW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhdHRhY2htZW50KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyRGVzaWduUHJvb2YoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25Qcm9vZig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVuZGVyRGVzaWduUHJvb2YocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByb29mIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZCBzYXZlcyByZW5kZXJpbmcgcmVzdWx0IGFzIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyRGVzaWduUHJvb2ZUb1Jlc291cmNlKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJvb2ZUb1Jlc291cmNlTW9kZWwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlc291cmNlSW5mb0R0bz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3JlbmRlci1wcm9vZi90by1yZXNvdXJjZT9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25Qcm9vZlRvUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25Qcm9vZlRvUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlc291cmNlSW5mb0R0bz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1JlbmRlckRlc2lnblByb29mVG9SZXNvdXJjZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UmVzb3VyY2VJbmZvRHRvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxSZXNvdXJjZUluZm9EdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxSZXNvdXJjZUluZm9EdG8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByaXZhdGUgZGVzaWduIGZyb20gYSBwdWJsaWMgZGVzaWduLlxuICAgICAqIEBwYXJhbSBkZXNpZ25JZCAob3B0aW9uYWwpIFB1YmxpYyBkZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZURlc2lnbklkIChvcHRpb25hbCkgUHJpdmF0ZSBkZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBDcmVhdGVkXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbihkZXNpZ25JZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJpdmF0ZURlc2lnbklkPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9wcml2YXRlLWRlc2lnbnMvZnJvbS1kZXNpZ24/XCI7XG4gICAgICAgIGlmIChkZXNpZ25JZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2Rlc2lnbklkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGRlc2lnbklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZGVzaWduSWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGRlc2lnbklkKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZURlc2lnbklkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHJpdmF0ZURlc2lnbklkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVEZXNpZ25JZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVEZXNpZ25JZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZURlc2lnbklkKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVTdG9yYWdlT3duZXInIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlUHJpdmF0ZURlc2lnbkZyb21EZXNpZ24oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByaXZhdGUgZGVzaWduIGZyb20gYSBwdWJsaWMgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHJlc291cmNlSWQgKG9wdGlvbmFsKSBSZXNvdXJjZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlRGVzaWduSWQgKG9wdGlvbmFsKSBQcml2YXRlIGRlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybiBDcmVhdGVkXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVhdGVQcml2YXRlRGVzaWduRnJvbVJlc291cmNlKHJlc291cmNlSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHByaXZhdGVEZXNpZ25JZD86IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvcHJpdmF0ZS1kZXNpZ25zL2Zyb20tcmVzb3VyY2U/XCI7XG4gICAgICAgIGlmIChyZXNvdXJjZUlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmVzb3VyY2VJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChyZXNvdXJjZUlkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmVzb3VyY2VJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmVzb3VyY2VJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVEZXNpZ25JZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3ByaXZhdGVEZXNpZ25JZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwcml2YXRlRGVzaWduSWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlRGVzaWduSWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVEZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwcml2YXRlU3RvcmFnZU93bmVyJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZVByaXZhdGVEZXNpZ25Gcm9tUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbVJlc291cmNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0NyZWF0ZVByaXZhdGVEZXNpZ25Gcm9tUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNWaWV3ZXJBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjc3NGb250cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHBzTmFtZTogc3RyaW5nLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29sb3JQcmV2aWV3KHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0Q29sb3JQcmV2aWV3UmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29sb3JQcmV2aWV3cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEdldENvbG9yUHJldmlld3NSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmb250S2V5IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDc3NGb250KGZvbnRLZXk/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0RmFsbGJhY2tGb250cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW1hZ2VTaXplKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0SW1hZ2VTaXplUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8TnVsbEFibGVTaXplPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0U2hhcGVCb3VuZHModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBHZXRTaGFwZUJvdW5kc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlY3RhbmdsZUY+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRXYXRlcm1hcmtJdGVtcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IGFueSB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcncgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGltZyhmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBoPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjbXlrPzogc3RyaW5nIHwgdW5kZWZpbmVkLCByZ2I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGdyYXlzY2FsZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGFyZ2V0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBzcT86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGVmZmVjdD86IHN0cmluZyB8IHVuZGVmaW5lZCwga3A/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBjb2xvcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgb2JtPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvbz86IG51bWJlciB8IHVuZGVmaW5lZCwgYWxwaGFNYXNrPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgcGFnZT86IG51bWJlciB8IHVuZGVmaW5lZCwgY29sb3JpemVDb2xvcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgcnc/OiBudW1iZXIgfCB1bmRlZmluZWQsIHJoPzogbnVtYmVyIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldExpY2Vuc2UodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHB0aChmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW1hZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlc291cmNlKGltYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcncgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHN2ZyhmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCBoPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjbXlrPzogc3RyaW5nIHwgdW5kZWZpbmVkLCByZ2I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGdyYXlzY2FsZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGFyZ2V0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBzcT86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGVmZmVjdD86IHN0cmluZyB8IHVuZGVmaW5lZCwga3A/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBjb2xvcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgb2JtPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvbz86IG51bWJlciB8IHVuZGVmaW5lZCwgYWxwaGFNYXNrPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgcGFnZT86IG51bWJlciB8IHVuZGVmaW5lZCwgY29sb3JpemVDb2xvcj86IHN0cmluZyB8IHVuZGVmaW5lZCwgcnc/OiBudW1iZXIgfCB1bmRlZmluZWQsIHJoPzogbnVtYmVyIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdHh0KGY/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeUNvbG9yRGF0YSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUNvbG9yc1JlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IE11bHRpQ2FsbFJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbkF0b21zVmlld2VyQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc1ZpZXdlckFwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNzc0ZvbnRzKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogRm9udHNNZXRob2REYXRhIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvY3NzZm9udHM/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcInRleHQvY3NzXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0Nzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3NzRm9udHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0Nzc0ZvbnRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHN0cmluZz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHBzTmFtZTogc3RyaW5nLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL2ZvbnRzL3twc05hbWV9P1wiO1xuICAgICAgICBpZiAocHNOYW1lID09PSB1bmRlZmluZWQgfHwgcHNOYW1lID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHNOYW1lJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3BzTmFtZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwc05hbWUpKTtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q29sb3JQcmV2aWV3KHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0Q29sb3JQcmV2aWV3UmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL0dldENvbG9yUHJldmlldz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDb2xvclByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDb2xvclByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENvbG9yUHJldmlldyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENvbG9yUHJldmlld3ModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBHZXRDb2xvclByZXZpZXdzUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL0dldENvbG9yUHJldmlld3M/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q29sb3JQcmV2aWV3cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENvbG9yUHJldmlld3MoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENvbG9yUHJldmlld3MocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmb250S2V5IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDc3NGb250KGZvbnRLZXk/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvR2V0Q3NzRm9udD9cIjtcbiAgICAgICAgaWYgKGZvbnRLZXkgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmb250S2V5JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGZvbnRLZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmb250S2V5PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmb250S2V5KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDc3NGb250KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q3NzRm9udCg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0Q3NzRm9udChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEZhbGxiYWNrRm9udHModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRGYWxsYmFja0ZvbnRzP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRGYWxsYmFja0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0RmFsbGJhY2tGb250cyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0RmFsbGJhY2tGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEltYWdlU2l6ZSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEdldEltYWdlU2l6ZVJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRJbWFnZVNpemU/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbWFnZVNpemUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8TnVsbEFibGVTaXplPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8TnVsbEFibGVTaXplPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRTaGFwZUJvdW5kcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEdldFNoYXBlQm91bmRzUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRTaGFwZUJvdW5kcz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRTaGFwZUJvdW5kcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFNoYXBlQm91bmRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlY3RhbmdsZUY+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVjdGFuZ2xlRj4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFNoYXBlQm91bmRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxSZWN0YW5nbGVGPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxSZWN0YW5nbGVGPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8UmVjdGFuZ2xlRj4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0V2F0ZXJtYXJrSXRlbXModGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBhbnkgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRXYXRlcm1hcmtJdGVtcz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFdhdGVybWFya0l0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJ3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBpbWcoZj86IHN0cmluZyB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IHVuZGVmaW5lZCwgY215az86IHN0cmluZyB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRhcmdldD86IHN0cmluZyB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGtwPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb28/OiBudW1iZXIgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNvbG9yaXplQ29sb3I/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJ3PzogbnVtYmVyIHwgdW5kZWZpbmVkLCByaD86IG51bWJlciB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9pbWc/XCI7XG4gICAgICAgIGlmIChmID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChmICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHcgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd3JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHcgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ3PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB3KSArIFwiJlwiO1xuICAgICAgICBpZiAoaCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2gnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoaCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGgpICsgXCImXCI7XG4gICAgICAgIGlmIChjbXlrID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY215aycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjbXlrICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiY215az1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY215aykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJnYiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JnYicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChyZ2IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJyZ2I9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJnYikgKyBcIiZcIjtcbiAgICAgICAgaWYgKGdyYXlzY2FsZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2dyYXlzY2FsZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChncmF5c2NhbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJncmF5c2NhbGU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGdyYXlzY2FsZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RhcmdldCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0YXJnZXQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRhcmdldCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNxID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnc3EnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoc3EgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzcT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3EpICsgXCImXCI7XG4gICAgICAgIGlmIChlZmZlY3QgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdlZmZlY3QnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZWZmZWN0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZWZmZWN0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBlZmZlY3QpICsgXCImXCI7XG4gICAgICAgIGlmIChrcCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2twJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGtwICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwia3A9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGtwKSArIFwiJlwiO1xuICAgICAgICBpZiAoY29sb3IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdjb2xvcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjb2xvciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImNvbG9yPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKG9ibSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ29ibScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChvYm0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvYm09XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9ibSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKG9vID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnb28nIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob28gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvbz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb28pICsgXCImXCI7XG4gICAgICAgIGlmIChhbHBoYU1hc2sgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdhbHBoYU1hc2snIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoYWxwaGFNYXNrICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiYWxwaGFNYXNrPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhbHBoYU1hc2spICsgXCImXCI7XG4gICAgICAgIGlmIChwYWdlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncGFnZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChwYWdlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicGFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcGFnZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yaXplQ29sb3IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdjb2xvcml6ZUNvbG9yJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGNvbG9yaXplQ29sb3IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2xvcml6ZUNvbG9yPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjb2xvcml6ZUNvbG9yKSArIFwiJlwiO1xuICAgICAgICBpZiAocncgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdydycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChydyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInJ3PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBydykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJoID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncmgnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocmggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJyaD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmgpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzSW1nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldExpY2Vuc2UodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9saWNlbnNlP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRMaWNlbnNlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0TGljZW5zZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0TGljZW5zZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHB0aChmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL3B0aD9cIjtcbiAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NQdGgoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NQdGgoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1B0aChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IE1vZGlmaWVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGltYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXNvdXJjZShpbWFnZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9yZXNvdXJjZT9cIjtcbiAgICAgICAgaWYgKGltYWdlID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaW1hZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJpbWFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaW1hZ2UpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1Jlc291cmNlKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1Jlc291cmNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHcgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gaCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjbXlrIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJnYiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBncmF5c2NhbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNxIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGVmZmVjdCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBrcCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvciAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvYm0gKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb28gKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gYWxwaGFNYXNrIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHBhZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3JpemVDb2xvciAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBydyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByaCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc3ZnKGY/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHc/OiBudW1iZXIgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHJnYj86IHN0cmluZyB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCB1bmRlZmluZWQsIHNxPzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCB1bmRlZmluZWQsIGNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBhbHBoYU1hc2s/OiBib29sZWFuIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBydz86IG51bWJlciB8IHVuZGVmaW5lZCwgcmg/OiBudW1iZXIgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvc3ZnP1wiO1xuICAgICAgICBpZiAoZiA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2YnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIGlmICh3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndycgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh3ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGggPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBoKSArIFwiJlwiO1xuICAgICAgICBpZiAoY215ayA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2NteWsnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY215ayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImNteWs9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNteWspICsgXCImXCI7XG4gICAgICAgIGlmIChyZ2IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdyZ2InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocmdiICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmdiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyByZ2IpICsgXCImXCI7XG4gICAgICAgIGlmIChncmF5c2NhbGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdncmF5c2NhbGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoZ3JheXNjYWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiZ3JheXNjYWxlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBncmF5c2NhbGUpICsgXCImXCI7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0YXJnZXQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGFyZ2V0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0YXJnZXQpICsgXCImXCI7XG4gICAgICAgIGlmIChzcSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3NxJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHNxICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwic3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNxKSArIFwiJlwiO1xuICAgICAgICBpZiAoZWZmZWN0ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnZWZmZWN0JyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGVmZmVjdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImVmZmVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZWZmZWN0KSArIFwiJlwiO1xuICAgICAgICBpZiAoa3AgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdrcCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChrcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImtwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBrcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3InIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAoY29sb3IgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3IpICsgXCImXCI7XG4gICAgICAgIGlmIChvYm0gPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdvYm0nIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAob2JtICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib2JtPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBvYm0pICsgXCImXCI7XG4gICAgICAgIGlmIChvbyA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ29vJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKG9vICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwib289XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9vKSArIFwiJlwiO1xuICAgICAgICBpZiAoYWxwaGFNYXNrID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnYWxwaGFNYXNrJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGFscGhhTWFzayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcImFscGhhTWFzaz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYWxwaGFNYXNrKSArIFwiJlwiO1xuICAgICAgICBpZiAocGFnZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BhZ2UnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocGFnZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInBhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHBhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChjb2xvcml6ZUNvbG9yID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnY29sb3JpemVDb2xvcicgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmIChjb2xvcml6ZUNvbG9yICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3JpemVDb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3JpemVDb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJ3ID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncncnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocncgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJydz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcncpICsgXCImXCI7XG4gICAgICAgIGlmIChyaCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JoJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHJoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicmg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJoKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTdmcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTdmcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1N2ZyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IE1vZGlmaWVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHR4dChmPzogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL3R4dD9cIjtcbiAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdmJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NUeHQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NUeHQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1R4dChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IE1vZGlmaWVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5Q29sb3JEYXRhKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlQ29sb3JzUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUJ5Q29sb3JEYXRhP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlDb2xvckRhdGEoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogTXVsdGlDYWxsUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdD9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2VJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUltYWdlSGFuZGxlclJlcXVlc3QgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVJbWFnZUl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUltYWdlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlU2hhcGVJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVTaGFwZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG4vKiogSW5mb3JtYXRpb24gYWJvdXQgYSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEluZm9Nb2RlbCB7XG4gICAgLyoqIFZlcnNpb24gbnVtYmVyLiAqL1xuICAgIHZlcnNpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBCdWlsZCBkYXRlIChVVEMpLiAqL1xuICAgIGJ1aWxkRGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEJ1aWxkIGNvbmZpZ3VyYXRpb24gKERlYnVnIHwgUmVsZWFzZSkuICovXG4gICAgY29uZmlndXJhdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFNlcnZpY2UgbmFtZS4gKi9cbiAgICBhcHBOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogQXVyaWdtYS5EZXNpZ25BdG9tcyB2ZXJzaW9uLiAqL1xuICAgIGRlc2lnbkF0b21zVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEF1cmlnbWEuRGVzaWduQXRvbXMuTW9kZWwgdmVyc2lvbi4gKi9cbiAgICBkZXNpZ25BdG9tc01vZGVsVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBDb252ZXJ0IGNvbG9ycyBvcGVyYXRpb24gcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydENvbG9yc01vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCBjb2xvciBkZXNjcmlwdGlvbi4gKi9cbiAgICBjb2xvcnM6IGFueVtdO1xuICAgIC8qKiBTb3VyY2UgY29sb3IgcHJvZmlsZSBkZXNjcmlwdGlvbi4gKi9cbiAgICBzb3VyY2VDb2xvclByb2ZpbGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBEZXN0aW5hdGlvbiBjb2xvciBwcm9maWxlIGRlc2NyaXB0aW9uLiAqL1xuICAgIGRlc3RpbmF0aW9uQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVGFyZ2V0IGNvbG9yIHByb2ZpbGUgZGVzY3JpcHRpb24uICovXG4gICAgdGFyZ2V0RGV2aWNlQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIERlc2lnbiBjcmVhdGlvbiBwYXJhbWV0ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVEZXNpZ25Nb2RlbCB7XG4gICAgLyoqIFNlcmlhbGl6ZWQgcHJvZHVjdCBkZXNjcmlwdGlvbi4gKi9cbiAgICBwcm9kdWN0PzogYW55IHwgbnVsbDtcbiAgICAvKiogU2VyaWFsaXplZCBwcm9kdWN0IGRhdGEgc2NoZW1hIChiYXNlNjQgZmlsZSBzdHJlYW0pLiAqL1xuICAgIGRhdGFTY2hlbWE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBEZXNpZ24gbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogRGVzaWduIGxvY2F0aW9uIChmb2xkZXIgcGF0aCkuICovXG4gICAgcGF0aD86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBlbnVtIERlc2lnbkVsZW1lbnRUeXBlIHtcbiAgICBQcm9kdWN0ID0gXCJQcm9kdWN0XCIsXG4gICAgRGVzaWduID0gXCJEZXNpZ25cIixcbiAgICBTdXJmYWNlID0gXCJTdXJmYWNlXCIsXG4gICAgQ29udGFpbmVyID0gXCJDb250YWluZXJcIixcbiAgICBQcmludEFyZWEgPSBcIlByaW50QXJlYVwiLFxuICAgIEl0ZW0gPSBcIkl0ZW1cIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNpZ25JbmZvIHtcbiAgICBpZD86IHN0cmluZyB8IG51bGw7XG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZT86IGJvb2xlYW47XG59XG5cbi8qKiBTcGVjaWZpYyBkZXNpZ24gcGFyYW1ldGVycyBzdG9yZWQgaW4gcHJvZHVjdCBtb2RlbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVzaWduUGFyYW1ldGVycyB7XG4gICAgLyoqIERlc2lnbiBtZWFzdXJlIHVuaXQgZGVzY3JpcHRpb24uICovXG4gICAgbWVhc3VyZVVuaXQ/OiBNZWFzdXJlVW5pdEluZm8gfCBudWxsO1xuICAgIC8qKiBWZXJzaW9uIG9mIERlc2lnbkF0b21zIGxpYnJhcnkgdGhhdCB1c2VkIHRvIHNhdmUgZGVzaWduIGZpbGUuICovXG4gICAgZGVzaWduQXRvbXNWZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEl0ZW0gZXh0cmFjdGlvbiBvcGVyYXRpb24gcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdEl0ZW1JbWFnZU1vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCBpdGVtIGRlc2NyaXB0aW9uLiAqL1xuICAgIGl0ZW06IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb250c01ldGhvZERhdGEge1xuICAgIHJlcXVlc3RlZEZvbnRzQnlQc05hbWU/OiBzdHJpbmdbXSB8IG51bGw7XG4gICAgYWR2YW5jZWRNb2RlPzogYm9vbGVhbjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDb2xvclByZXZpZXdSZXF1ZXN0IHtcbiAgICBjb2xvckRhdGE/OiBhbnkgfCBudWxsO1xuICAgIGNvbG9yU2V0dGluZ3M/OiBQcmV2aWV3Q29sb3JTZXR0aW5ncyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Q29sb3JQcmV2aWV3c1JlcXVlc3Qge1xuICAgIGNvbG9yRGF0YT86IGFueSB8IG51bGw7XG4gICAgY29sb3JTZXR0aW5ncz86IFByZXZpZXdDb2xvclNldHRpbmdzIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRJbWFnZVNpemVSZXF1ZXN0IHtcbiAgICBpbWFnZUlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBwYWdlSW5kZXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHtcbiAgICBwYXRoPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEltYWdlIHByZXZpZXcgZml0IG1vZGUuICovXG5leHBvcnQgZW51bSBJbWFnZVByZXZpZXdGaXRNb2RlIHtcbiAgICBGaXQgPSBcIkZpdFwiLFxuICAgIFNocmluayA9IFwiU2hyaW5rXCIsXG4gICAgUmVzaXplID0gXCJSZXNpemVcIixcbiAgICBGaWxsID0gXCJGaWxsXCIsXG59XG5cbi8qKiBJbWFnZSBwcmV2aWV3IGZpbGUgZm9ybWF0LiAqL1xuZXhwb3J0IGVudW0gSW1hZ2VQcmV2aWV3Rm9ybWF0IHtcbiAgICBKcGVnID0gXCJKcGVnXCIsXG4gICAgUG5nID0gXCJQbmdcIixcbn1cblxuLyoqIFNldHRpbmdzIHRoYXQgZGVzY3JpYmUgaW1hZ2UgcHJldmlldyByZW5kZXJpbmcgcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VQcmV2aWV3UmVuZGVyaW5nQ29uZmlnIHtcbiAgICAvKiogSW1hZ2UgcHJldmlldyB3aWR0aC4gKi9cbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICAvKiogSW1hZ2UgcHJldmlldyBoZWlnaHQuICovXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKiBJbWFnZSBwcmV2aWV3IGZpbGUgZm9ybWF0LiAqL1xuICAgIGZpbGVGb3JtYXQ/OiBJbWFnZVByZXZpZXdGb3JtYXQgfCBudWxsO1xuICAgIC8qKiBJbWFnZSBwcmV2aWV3IGZpdCBtb2RlLiAqL1xuICAgIGZpdE1vZGU/OiBJbWFnZVByZXZpZXdGaXRNb2RlIHwgbnVsbDtcbn1cblxuLyoqIEl0ZW0gc291cmNlIHR5cGVzLiAqL1xuZXhwb3J0IGVudW0gSXRlbVNvdXJjZVR5cGUge1xuICAgIEZpbGUgPSBcIkZpbGVcIixcbiAgICBJbWFnZVN0b3JhZ2UgPSBcIkltYWdlU3RvcmFnZVwiLFxuICAgIFByaXZhdGVJbWFnZVN0b3JhZ2UgPSBcIlByaXZhdGVJbWFnZVN0b3JhZ2VcIixcbn1cblxuZXhwb3J0IGVudW0gSXRlbVR5cGUge1xuICAgIEltYWdlID0gXCJJbWFnZVwiLFxuICAgIFNoYXBlID0gXCJTaGFwZVwiLFxuICAgIENsaXBhcnQgPSBcIkNsaXBhcnRcIixcbiAgICBHcm91cCA9IFwiR3JvdXBcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlVW5pdEluZm8ge1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHNob3J0TmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgcmF0aW8/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlzc2luZ0Rlc2lnbkVsZW1lbnREdG8ge1xuICAgIC8qKiBQcm9ibGVtIGRlc2NyaXB0aW9uLiAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTWlzc2luZyBlbGVtZW50IHR5cGUuICovXG4gICAgcmVhZG9ubHkgbWlzc2luZ0VsZW1lbnRUeXBlPzogRGVzaWduRWxlbWVudFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9ja3VwM2RBdHRyaWJ1dGVzRHRvIHtcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpQ2FsbFJlcXVlc3Qge1xuICAgIGl0ZW1zPzogTXVsdGlDYWxsUmVxdWVzdEl0ZW1bXSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlDYWxsUmVxdWVzdEl0ZW0ge1xuICAgIGNhbnZhc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGl0ZW1IYW5kbGVyc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbG9yRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgYWN0dWFsU2l6ZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIHByZXNlcnZlQXNwZWN0UmF0aW8/OiBib29sZWFuIHwgbnVsbDtcbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIGltYWdlSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIHBhZ2VJbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgbWV0aG9kTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbURhdGE/OiBhbnkgfCBudWxsO1xuICAgIGNvbG9yU2V0dGluZ3M/OiBQcmV2aWV3Q29sb3JTZXR0aW5ncyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVsbEFibGVTaXplIHtcbiAgICB3aWR0aD86IG51bWJlciB8IG51bGw7XG4gICAgaGVpZ2h0PzogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqIFBsYWNlaG9sZGVyIGl0ZW0gY29udGVudCB0eXBlLiAqL1xuZXhwb3J0IGVudW0gUGxhY2Vob2xkZXJJdGVtQ29udGVudFR5cGUge1xuICAgIEltYWdlID0gXCJJbWFnZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50RiB7XG4gICAgcmVhZG9ubHkgaXNFbXB0eT86IGJvb2xlYW47XG4gICAgeD86IG51bWJlcjtcbiAgICB5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXdDb2xvclNldHRpbmdzIHtcbiAgICByZ2JDb2xvclByb2ZpbGVOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBjbXlrQ29sb3JQcm9maWxlTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgZ3JheXNjYWxlQ29sb3JQcm9maWxlTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgaGlSZXNEZXN0aW5hdGlvbkNvbG9yUHJvZmlsZU5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1EZXRhaWxzIHtcbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICBkZXRhaWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIGluc3RhbmNlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEF2YWlsYWJsZSBwYXRjaCB0eXBlLiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFBhdGNoVHlwZSB7XG4gICAgVW5kZWZpbmVkID0gXCJVbmRlZmluZWRcIixcbiAgICBSZXBsYWNlSW1hZ2VJdGVtRmlsZSA9IFwiUmVwbGFjZUltYWdlSXRlbUZpbGVcIixcbiAgICBSZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudCA9IFwiUmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRcIixcbn1cblxuLyoqIFByb2R1Y3QgcHJldmlldyBmaWxlIGZvcm1hdC4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RQcmV2aWV3Rm9ybWF0IHtcbiAgICBKcGVnID0gXCJKcGVnXCIsXG4gICAgUG5nID0gXCJQbmdcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0UHJldmlld1JlbmRlcmluZ0NvbmZpZyB7XG4gICAgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgZmlsZUZvcm1hdD86IFByb2R1Y3RQcmV2aWV3Rm9ybWF0IHwgbnVsbDtcbn1cblxuZXhwb3J0IGVudW0gUHJvZHVjdFByb29mRm9ybWF0IHtcbiAgICBKcGVnID0gXCJKcGVnXCIsXG4gICAgUG5nID0gXCJQbmdcIixcbiAgICBUaWZmID0gXCJUaWZmXCIsXG4gICAgUGRmID0gXCJQZGZcIixcbn1cblxuZXhwb3J0IGVudW0gUHJvZHVjdFByb29mSW50ZXJwb2xhdGlvbk1vZGUge1xuICAgIEhpZ2ggPSBcIkhpZ2hcIixcbiAgICBNZWRpdW0gPSBcIk1lZGl1bVwiLFxuICAgIExvdyA9IFwiTG93XCIsXG4gICAgTmVhcmVzdE5laWdoYm91ciA9IFwiTmVhcmVzdE5laWdoYm91clwiLFxuICAgIExpbmVhciA9IFwiTGluZWFyXCIsXG4gICAgQ3ViaWMgPSBcIkN1YmljXCIsXG4gICAgU3VwZXJzYW1wbGluZyA9IFwiU3VwZXJzYW1wbGluZ1wiLFxuICAgIExhbmN6b3MgPSBcIkxhbmN6b3NcIixcbiAgICBBbmlzb3Ryb3BpYzQgPSBcIkFuaXNvdHJvcGljNFwiLFxuICAgIEFuaXNvdHJvcGljOSA9IFwiQW5pc290cm9waWM5XCIsXG4gICAgTGFuY3pvczMgPSBcIkxhbmN6b3MzXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFByb29mUmVuZGVyaW5nQ29uZmlnIHtcbiAgICAvKiogU3VyZmFjZSB0byByZW5kZXIuICovXG4gICAgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogRGVzaXJlZCBwcm9vZiBpbWFnZSB3aWR0aC4gKi9cbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICAvKiogRGVzaXJlZCBwcm9vZiBpbWFnZSBoZWlnaHQuICovXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKiBEZXNpcmVkIHByb29mIGltYWdlIGZvcm1hdC4gKi9cbiAgICBmb3JtYXQ/OiBQcm9kdWN0UHJvb2ZGb3JtYXQgfCBudWxsO1xuICAgIC8qKiBEZXNpcmVkIHByb29mIGltYWdlIGludGVycG9sYXRpb24uICovXG4gICAgaW50ZXJwb2xhdGlvbk1vZGU/OiBQcm9kdWN0UHJvb2ZJbnRlcnBvbGF0aW9uTW9kZSB8IG51bGw7XG4gICAgLyoqIERlZmluZXMgd2hldGhlciBzYWZldHkgbGluZXMgc2hvdWxkIGJlIHZpc3VhbGl6ZWQuICovXG4gICAgc2FmZXR5TGluZXNFbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqIERlZmluZXMgd2hldGhlciB3YXRlcm1hcmsgc2hvdWxkIGJlIGluY2x1ZGVkLiAqL1xuICAgIHdhdGVybWFya0VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKiogRGVmaW5lcyB3YXRlcm1hcmsgb3BhY2l0eSAoaW4gcmFuZ2UgMCAuLiAxLjApLiAqL1xuICAgIHdhdGVybWFya09wYWNpdHk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBEZWZpbmVzIHdoZXRoZXIgd2F0ZXJtYXJrIHNob3VsZCBiZSByZXBlYXRlZC4gKi9cbiAgICB3YXRlcm1hcmtSZXBlYXQ/OiBib29sZWFuIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWN0YW5nbGVGIHtcbiAgICBsb2NhdGlvbj86IFBvaW50RjtcbiAgICBzaXplPzogc3RyaW5nO1xuICAgIHg/OiBudW1iZXI7XG4gICAgeT86IG51bWJlcjtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgbGVmdD86IG51bWJlcjtcbiAgICByZWFkb25seSB0b3A/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcmlnaHQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgYm90dG9tPzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGlzRW1wdHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckRlc2lnblByZXZpZXdNb2RlbCB7XG4gICAgLyoqIERlc2lnbiBpZGVudGlmaWVyLlxuVXNlZCB0byBnZXQgZGVzaWduIGZpbGUgZnJvbSBwdWJsaWMgb3IgcHJpdmF0ZSBzdG9yYWdlLiAqL1xuICAgIGRlc2lnbklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTW9ja3VwIGlkZW50aWZpZXIuXG5Vc2VkIHRvIGdldCBtb2NrdXAgZmlsZSBmcm9tIHB1YmxpYyBzdG9yYWdlLiAqL1xuICAgIG1vY2t1cElkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSWRlbnRpZmllciBvZiB0aGUgZGVzaWduIG93bmVyLiAqL1xuICAgIG93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBJZGVudGlmaWVyIG9mIHRoZSBtb2NrdXAgb3duZXIuICovXG4gICAgbW9ja3VwT3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlbmRlcmluZyBjb25maWd1cmF0aW9uIGZvciBnZXR0aW5nIGEgcHJldmlldyBvZiBkZXNpZ24uICovXG4gICAgcmVuZGVyaW5nQ29uZmlnPzogUHJvZHVjdFByZXZpZXdSZW5kZXJpbmdDb25maWcgfCBudWxsO1xuICAgIC8qKiBWYXJpYWJsZSAodXNlcikgZGF0YSBmb3IgZGVzaWduIHZhcmlhYmxlIGZpZWxkcyBpbiB0aGUgcHJldmlldyBpbWFnZS4gKi9cbiAgICB2YXJpYWJsZURhdGE/OiBWYXJpYWJsZUluZm9bXSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyRGVzaWduUHJldmlld1RvUmVzb3VyY2VNb2RlbCB7XG4gICAgLyoqIFBhcmFtZXRlcnMgb2YgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBwcmV2aWV3IHJlbmRlcmluZyByZXN1bHQuICovXG4gICAgcHJldmlld1Jlc291cmNlUGFyYW1zPzogUmVzb3VyY2VQYXJhbXMgfCBudWxsO1xuICAgIC8qKiBEZXNpZ24gaWRlbnRpZmllci5cblVzZWQgdG8gZ2V0IGRlc2lnbiBmaWxlIGZyb20gcHVibGljIG9yIHByaXZhdGUgc3RvcmFnZS4gKi9cbiAgICBkZXNpZ25JZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1vY2t1cCBpZGVudGlmaWVyLlxuVXNlZCB0byBnZXQgbW9ja3VwIGZpbGUgZnJvbSBwdWJsaWMgc3RvcmFnZS4gKi9cbiAgICBtb2NrdXBJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIElkZW50aWZpZXIgb2YgdGhlIGRlc2lnbiBvd25lci4gKi9cbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSWRlbnRpZmllciBvZiB0aGUgbW9ja3VwIG93bmVyLiAqL1xuICAgIG1vY2t1cE93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBSZW5kZXJpbmcgY29uZmlndXJhdGlvbiBmb3IgZ2V0dGluZyBhIHByZXZpZXcgb2YgZGVzaWduLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcmV2aWV3UmVuZGVyaW5nQ29uZmlnIHwgbnVsbDtcbiAgICAvKiogVmFyaWFibGUgKHVzZXIpIGRhdGEgZm9yIGRlc2lnbiB2YXJpYWJsZSBmaWVsZHMgaW4gdGhlIHByZXZpZXcgaW1hZ2UuICovXG4gICAgdmFyaWFibGVEYXRhPzogVmFyaWFibGVJbmZvW10gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckRlc2lnblByb29mTW9kZWwge1xuICAgIC8qKiBEZXNpZ24gaWRlbnRpZmllci5cblVzZWQgdG8gZ2V0IGRlc2lnbiBmaWxlIGZyb20gcHVibGljIG9yIHByaXZhdGUgc3RvcmFnZS4gKi9cbiAgICBkZXNpZ25JZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIElkZW50aWZpZXIgb2YgdGhlIGRlc2lnbiBvd25lci4gKi9cbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogUmVuZGVyaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGdldHRpbmcgYSBwcm9vZiBpbWFnZSBvZiBkZXNpZ24uICovXG4gICAgcmVuZGVyaW5nQ29uZmlnPzogUHJvZHVjdFByb29mUmVuZGVyaW5nQ29uZmlnIHwgbnVsbDtcbiAgICAvKiogVmFyaWFibGUgKHVzZXIpIGRhdGEgZm9yIGRlc2lnbiB2YXJpYWJsZSBmaWVsZHMgaW4gdGhlIHByb29mIGltYWdlLiAqL1xuICAgIHZhcmlhYmxlRGF0YT86IFZhcmlhYmxlSW5mb1tdIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJEZXNpZ25Qcm9vZlRvUmVzb3VyY2VNb2RlbCB7XG4gICAgLyoqIFBhcmFtZXRlcnMgb2YgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBwcmV2aWV3IHJlbmRlcmluZyByZXN1bHQuICovXG4gICAgcHJvb2ZSZXNvdXJjZVBhcmFtcz86IFJlc291cmNlUGFyYW1zIHwgbnVsbDtcbiAgICAvKiogRGVzaWduIGlkZW50aWZpZXIuXG5Vc2VkIHRvIGdldCBkZXNpZ24gZmlsZSBmcm9tIHB1YmxpYyBvciBwcml2YXRlIHN0b3JhZ2UuICovXG4gICAgZGVzaWduSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBJZGVudGlmaWVyIG9mIHRoZSBkZXNpZ24gb3duZXIuICovXG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlbmRlcmluZyBjb25maWd1cmF0aW9uIGZvciBnZXR0aW5nIGEgcHJvb2YgaW1hZ2Ugb2YgZGVzaWduLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG4gICAgLyoqIFZhcmlhYmxlICh1c2VyKSBkYXRhIGZvciBkZXNpZ24gdmFyaWFibGUgZmllbGRzIGluIHRoZSBwcm9vZiBpbWFnZS4gKi9cbiAgICB2YXJpYWJsZURhdGE/OiBWYXJpYWJsZUluZm9bXSB8IG51bGw7XG59XG5cbi8qKiBJbWFnZSBwcmV2aWV3IHJlbmRlcmluZyBwYXJhbWV0ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJJbWFnZVByZXZpZXdNb2RlbCB7XG4gICAgLyoqIEV4dGVybmFsIGltYWdlIFVSTC4gKi9cbiAgICBpbWFnZVVybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFN0b3JhZ2UgaW1hZ2UgaWRlbnRpZmllci4gKi9cbiAgICBpbWFnZUlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogU3RvcmFnZSBpbWFnZSBvd25lciBpZGVudGlmaWVyLiAqL1xuICAgIG93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBNb2NrdXAgb3duZXIgaWRlbnRpZmllci4gKi9cbiAgICBtb2NrdXBPd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTW9ja3VwIGlkZW50aWZpZXIuICovXG4gICAgbW9ja3VwSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBJbWFnZSBwcmV2aWV3IGNvbmZpZ3VyYXRpb24uICovXG4gICAgcmVuZGVyaW5nQ29uZmlnPzogSW1hZ2VQcmV2aWV3UmVuZGVyaW5nQ29uZmlnIHwgbnVsbDtcbn1cblxuLyoqIEltYWdlIHByZXZpZXcgcmVuZGVyaW5nIHBhcmFtZXRlcnMuIFJlc3VsdCB3aWxsIGJlIHNhdmVkIGFzIHJlc291cmNlIHdpdGggcGFyYW1ldGVycyBzZXQgYXMgQXVyaWdtYS5EZXNpZ25BdG9tc0FwaS5XZWJBcGkuTW9kZWxzLkltYWdlLlJlbmRlckltYWdlUHJldmlld1RvUmVzb3VyY2VNb2RlbC5QcmV2aWV3UmVzb3VyY2VQYXJhbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckltYWdlUHJldmlld1RvUmVzb3VyY2VNb2RlbCB7XG4gICAgLyoqIFBhcmFtZXRlcnMgb2YgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBwcmV2aWV3IHJlbmRlcmluZyByZXN1bHQuICovXG4gICAgcHJldmlld1Jlc291cmNlUGFyYW1zPzogUmVzb3VyY2VQYXJhbXMgfCBudWxsO1xuICAgIC8qKiBFeHRlcm5hbCBpbWFnZSBVUkwuICovXG4gICAgaW1hZ2VVcmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBTdG9yYWdlIGltYWdlIGlkZW50aWZpZXIuICovXG4gICAgaW1hZ2VJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFN0b3JhZ2UgaW1hZ2Ugb3duZXIgaWRlbnRpZmllci4gKi9cbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTW9ja3VwIG93bmVyIGlkZW50aWZpZXIuICovXG4gICAgbW9ja3VwT3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1vY2t1cCBpZGVudGlmaWVyLiAqL1xuICAgIG1vY2t1cElkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSW1hZ2UgcHJldmlldyBjb25maWd1cmF0aW9uLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IEltYWdlUHJldmlld1JlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG59XG5cbi8qKiBSZW5kZXIgcHJvZHVjdCBwYXJhbWV0ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQcm9kdWN0TW9kZWwge1xuICAgIC8qKiBTZXJpYWxpemVkIHByb2R1Y3QgZGVzY3JpcHRpb24uICovXG4gICAgcHJvZHVjdDogYW55O1xuICAgIC8qKiBQcm9vZiBJbWFnZSByZW5kZXJpbmcgY29uZmlnLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VJbmZvRHRvIHtcbiAgICBpZD86IHN0cmluZyB8IG51bGw7XG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlPzogYm9vbGVhbjtcbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUGFyYW1zIHtcbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHNvdXJjZUlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICBhbm9ueW1vdXNBY2Nlc3M/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVucHJvY2Vzc2FibGVEZXNpZ25FbGVtZW50RHRvIHtcbiAgICAvKiogUHJvYmxlbSBkZXNjcmlwdGlvbi4gKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1pc3NpbmcgZWxlbWVudCB0eXBlLiAqL1xuICAgIHJlYWRvbmx5IG1pc3NpbmdFbGVtZW50VHlwZT86IERlc2lnbkVsZW1lbnRUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNvbG9yc1JlcXVlc3Qge1xuICAgIGNhbnZhc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbG9yRGF0YT86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSGFuZGxlclJlcXVlc3Qge1xuICAgIGNhbnZhc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGl0ZW1IYW5kbGVyRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbURhdGE/OiBhbnkgfCBudWxsO1xuICAgIGNvbG9yU2V0dGluZ3M/OiBQcmV2aWV3Q29sb3JTZXR0aW5ncyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB7XG4gICAgYWN0dWFsU2l6ZT86IGJvb2xlYW47XG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbz86IGJvb2xlYW47XG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICBjYW52YXNEYXRhPzogc3RyaW5nIHwgbnVsbDtcbiAgICBpdGVtSGFuZGxlckRhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGl0ZW1EYXRhPzogYW55IHwgbnVsbDtcbiAgICBjb2xvclNldHRpbmdzPzogUHJldmlld0NvbG9yU2V0dGluZ3MgfCBudWxsO1xufVxuXG4vKiogVmFyaWFibGUgaW5mb3JtYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhYmxlSW5mbyB7XG4gICAgLyoqIFZhcmlhYmxlIG5hbWUuICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFZhcmlhYmxlIHZhbHVlLiAqL1xuICAgIHZhbHVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVmFyaWFibGUgdHlwZS4gKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFZhcmlhYmxlcyBpbmZvcm1hdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVzTW9kZWwge1xuICAgIC8qKiBMaXN0IG9mIHZhcmlhYmxlcy4gKi9cbiAgICBpdGVtcz86IFZhcmlhYmxlSW5mb1tdIHwgbnVsbDtcbn1cblxuLyoqIFZhcmlhYmxlIGRhdGEgcHJpbnRpbmcgaW5mb3JtYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFZkcERhdGFNb2RlbCB7XG4gICAgLyoqIFNlcmlhbGl6ZWQgdmRwIGRhdGFzZXQuICovXG4gICAgdmRwRGF0YVNldD86IGFueSB8IG51bGw7XG4gICAgLyoqIFNlcmlhbGl6ZWQgdmRwIGl0ZW1zIGRhdGEuICovXG4gICAgdmRwSXRlbXNEYXRhPzogYW55IHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUGFyYW1ldGVyIHtcbiAgICBkYXRhOiBhbnk7XG4gICAgZmlsZU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUmVzcG9uc2Uge1xuICAgIGRhdGE6IEJsb2I7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgZmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgaGVhZGVycz86IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xufVxuXG5leHBvcnQgY2xhc3MgQXBpRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICByZXNwb25zZTogc3RyaW5nO1xuICAgIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9O1xuICAgIHJlc3VsdDogYW55O1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgcmVzcG9uc2U6IHN0cmluZywgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIHJlc3VsdDogYW55KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQXBpRXhjZXB0aW9uID0gdHJ1ZTtcblxuICAgIHN0YXRpYyBpc0FwaUV4Y2VwdGlvbihvYmo6IGFueSk6IG9iaiBpcyBBcGlFeGNlcHRpb24ge1xuICAgICAgICByZXR1cm4gb2JqLmlzQXBpRXhjZXB0aW9uID09PSB0cnVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24obWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgcmVzcG9uc2U6IHN0cmluZywgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIHJlc3VsdD86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzdWx0KTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KG5ldyBBcGlFeGNlcHRpb24obWVzc2FnZSwgc3RhdHVzLCByZXNwb25zZSwgaGVhZGVycywgbnVsbCkpO1xufVxuXG5mdW5jdGlvbiBibG9iVG9UZXh0KGJsb2I6IGFueSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFibG9iKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KFwiXCIpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KCg8YW55PmV2ZW50LnRhcmdldCkucmVzdWx0KTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IpO1xuICAgICAgICB9XG4gICAgfSk7XG59Il19