obsidian-integration-testing 2.5.8 → 2.5.9

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.
@@ -151,7 +151,7 @@ class DesktopCliTransport {
151
151
  `window.electron.ipcRenderer.sendSync('vault-open', ${JSON.stringify(vaultPath)}, false);`
152
152
  );
153
153
  await this.evaluate(registerExpr, { cwd: existingVaultPath });
154
- await this.enablePluginsInLocalStorage(vaultPath);
154
+ await this.enablePluginsInLocalStorage(vaultPath, existingVaultPath);
155
155
  const pollExpr = buildSimpleExpression(
156
156
  "return JSON.stringify(app.vault.adapter.getBasePath());"
157
157
  );
@@ -231,8 +231,11 @@ class DesktopCliTransport {
231
231
  * `obsidian.json`) and before the new vault window finishes loading.
232
232
  *
233
233
  * @param vaultPath - The absolute path to the vault folder.
234
+ * @param evalTargetVaultPath - The vault path to use as eval target (an existing, loaded vault).
235
+ * localStorage is shared across all Obsidian windows (same Electron origin), so the
236
+ * `localStorage.setItem` call can run in any loaded vault window.
234
237
  */
235
- async enablePluginsInLocalStorage(vaultPath) {
238
+ async enablePluginsInLocalStorage(vaultPath, evalTargetVaultPath) {
236
239
  const vaultId = (0, import_obsidian_config.getVaultId)(vaultPath);
237
240
  if (!vaultId) {
238
241
  (0, import_log.log)("[cli-transport] Could not find vault ID \u2014 skipping localStorage trust flag.");
@@ -241,7 +244,7 @@ class DesktopCliTransport {
241
244
  const enableExpr = buildSimpleExpression(
242
245
  `localStorage.setItem(${JSON.stringify(`enable-plugin-${vaultId}`)}, 'true');`
243
246
  );
244
- await this.evaluate(enableExpr, { cwd: vaultPath });
247
+ await this.evaluate(enableExpr, { cwd: evalTargetVaultPath });
245
248
  (0, import_log.log)(`[cli-transport] Set enable-plugin-${vaultId} in localStorage.`);
246
249
  }
247
250
  /**
@@ -329,4 +332,4 @@ function getObsidianLaunchCommand() {
329
332
  0 && (module.exports = {
330
333
  DesktopCliTransport
331
334
  });
332
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbi1leHByZXNzaW9uLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vbm9vcC5janMnO1xuaW1wb3J0IHtcbiAgZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZFxufSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5janMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6ZS1lcnJvci5janMnO1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSB0aGUgYG9ic2lkaWFuIGV2YWxgIENMSSBjb21tYW5kXG4gKiBhbmQgbWFuYWdlcyB2YXVsdHMgdmlhIEVsZWN0cm9uIElQQy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDbGlUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5janNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGludm9rZU5hbWUgPSBgaW52b2tlXyR7c2NyaXB0SWR9YDtcbiAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb24sIHJlc3VsdFBhdGgsIGludm9rZU5hbWUpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JpcHRQYXRoLCBzY3JpcHRDb250ZW50KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgbW9kdWxlLmNvbnN0cnVjdG9yLl9sb2FkIHRvIGJ5cGFzcyBhbnkgbW9ua2V5LXBhdGNoZWQgcmVxdWlyZSgpXG4gICAgICAvLyAoZS5nLiwgb2JzaWRpYW4tY29kZXNjcmlwdC10b29sa2l0IHBhdGNoZXMgcmVxdWlyZSBpbiB0aGUgcmVuZGVyZXIgcHJvY2VzcykuXG4gICAgICBjb25zdCBzYWZlUmVxdWlyZSA9IGBtb2R1bGUuY29uc3RydWN0b3IuX2xvYWQoJHtKU09OLnN0cmluZ2lmeShzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKSl9KWA7XG4gICAgICBjb25zdCByZXF1aXJlRXhwciA9IGAoYXN5bmMgKCkgPT4geyBhd2FpdCAke3NhZmVSZXF1aXJlfS4ke2ludm9rZU5hbWV9KCkgfSkoKWA7XG4gICAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsICdldmFsJywgJy0tYWxsb3ctZm9jdXMtc3RlYWwnLCBgY29kZT0ke3JlcXVpcmVFeHByfWBdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH0gXHUyMDE0IHRoZSB2YXVsdCBtYXkgbm90IGJlIGZvdW5kIG9yIE9ic2lkaWFuIGRpZCBub3QgcnVuIHRoZSBldmFsLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgZGlzYWJsZWQuIEVuYWJsZSBpdCBpbiBPYnNpZGlhbiBTZXR0aW5ncyBcXHUyMTkyIEdlbmVyYWwgXFx1MjE5MiBDTEkuJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0UGF0aCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICBpZiAoIWV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIHZhdWx0OiBubyBleGlzdGluZyB2YXVsdCBpcyByZWdpc3RlcmVkIGluIE9ic2lkaWFuLiBPcGVuIE9ic2lkaWFuIGFuZCBjcmVhdGUgb3Igb3BlbiBhdCBsZWFzdCBvbmUgdmF1bHQgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYnVpbGRJcGNFeHByZXNzaW9uKFxuICAgICAgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtb3BlbicsICR7SlNPTi5zdHJpbmdpZnkodmF1bHRQYXRoKX0sIGZhbHNlKTtgXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRQYXRoIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoKTtcblxuICAgIGNvbnN0IHBvbGxFeHByID0gYnVpbGRTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgJ3JldHVybiBKU09OLnN0cmluZ2lmeShhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpKTsnXG4gICAgKTtcblxuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHJlYWRpbmVzcyAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShwb2xsRXhwciwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgICAgaWYgKEpTT04ucGFyc2UoYmFzZVBhdGgpID09PSB2YXVsdFBhdGgpIHtcbiAgICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWFkeS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCBub3QgcmVhZHkgeWV0LlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIFNjaGVkdWxlcyB0aGUgdmF1bHQgd2luZG93IHRvIGNsb3NlLCB3YWl0cywgdGhlbiByZW1vdmVzIHRoZSB2YXVsdFxuICAgKiBmcm9tIHRoZSByZWdpc3RyeSB2aWEgYHZhdWx0LXJlbW92ZWAgSVBDLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBVbnJlZ2lzdGVyaW5nIHZhdWx0OiBjbG9zaW5nIHdpbmRvdyBmb3IgJHt2YXVsdFBhdGh9Li4uYCk7XG4gICAgY29uc3QgZGVzdHJveUV4cHIgPSBidWlsZFNpbXBsZUV4cHJlc3Npb24oYFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh3aW5kb3cuZWxlY3Ryb24gJiYgd2luZG93LmVsZWN0cm9uLnJlbW90ZSkge1xuICAgICAgICAgIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZGVzdHJveUV4cHIsIHsgY3dkOiB2YXVsdFBhdGgsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGNvbW1hbmQgc2VudC4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXYWl0aW5nIGZvciB3aW5kb3cgdG8gY2xvc2UuLi4nKTtcbiAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gUmVtb3ZpbmcgdmF1bHQgZnJvbSByZWdpc3RyeS4uLicpO1xuICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBidWlsZElwY0V4cHJlc3Npb24oXG4gICAgICBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1yZW1vdmUnLCAke0pTT04uc3RyaW5naWZ5KHZhdWx0UGF0aCl9KTtgXG4gICAgKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUocmVtb3ZlRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBObyBleGlzdGluZyB2YXVsdCB0byB0YXJnZXQgZm9yIHJlbW92YWwgSVBDIFx1MjAxNCBza2lwcGluZy4nKTtcbiAgICAgIH1cbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlbW92ZWQgZnJvbSByZWdpc3RyeS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgcmVnaXN0cnkgcmVtb3ZhbCBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSBQQVRILlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlcnRDbGlBdmFpbGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnd2hlcmUuZXhlIG9ic2lkaWFuJyA6ICd3aGljaCBvYnNpZGlhbic7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgbm90IGF2YWlsYWJsZS4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgaXRzIENMSSBpcyBpbiB5b3VyIFBBVEguJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYGVuYWJsZS1wbHVnaW4tPHZhdWx0SWQ+YCBpbiBPYnNpZGlhbidzIGxvY2FsU3RvcmFnZSB0byBwcmV2ZW50XG4gICAqIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGZyb20gYXBwZWFyaW5nXG4gICAqIHdoZW4gYSB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqXG4gICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgdmF1bHQtb3BlbmAgSVBDIChzbyB0aGUgdmF1bHQgSUQgZXhpc3RzIGluXG4gICAqIGBvYnNpZGlhbi5qc29uYCkgYW5kIGJlZm9yZSB0aGUgbmV3IHZhdWx0IHdpbmRvdyBmaW5pc2hlcyBsb2FkaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVFeHByID0gYnVpbGRTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgYGxvY2FsU3RvcmFnZS5zZXRJdGVtKCR7SlNPTi5zdHJpbmdpZnkoYGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfWApfSwgJ3RydWUnKTtgXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGVuYWJsZUV4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIGFzeW5jIElJRkUgdGhhdCB3YWl0cyBmb3IgbGF5b3V0IHJlYWR5IGFuZCBleGVjdXRlcyBhbiBJUEMgY2FsbC5cbiAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYEpTT04uc3RyaW5naWZ5KHVuZGVmaW5lZClgIHNvIHRoZSBDTEkgcHJvZHVjZXMgYChubyBvdXRwdXQpYC5cbiAqXG4gKiBAcGFyYW0gaXBjU3RhdGVtZW50IC0gVGhlIElQQyBzdGF0ZW1lbnQgdG8gZXhlY3V0ZS5cbiAqIEByZXR1cm5zIFRoZSBJSUZFIGV4cHJlc3Npb24gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZElwY0V4cHJlc3Npb24oaXBjU3RhdGVtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGlwY1N0YXRlbWVudCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb250ZW50IG9mIGEgdGVtcG9yYXJ5IGAuY2pzYCBzY3JpcHQgZmlsZS5cbiAqXG4gKiBUaGUgc2NyaXB0IGRlZmluZXMgYW4gYXN5bmMgYGludm9rZSgpYCBmdW5jdGlvbiB0aGF0IGV2YWx1YXRlcyB0aGVcbiAqIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IChvciBlcnJvcikgdG8gYHJlc3VsdFBhdGhgLCBhbmQgaXNcbiAqIGV4cG9ydGVkIGZvciB0aGUgQ0xJIHRvIGByZXF1aXJlKClgIGFuZCBjYWxsLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZXN1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJlc3VsdCBmaWxlLlxuICogQHBhcmFtIGludm9rZU5hbWUgLSBUaGUgdW5pcXVlIGZ1bmN0aW9uIG5hbWUgdG8gZXhwb3J0IChhdm9pZHMgY29sbGlzaW9ucykuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nLCBpbnZva2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHRQYXRoSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgcmV0dXJuIGBcInVzZSBzdHJpY3RcIjtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgc2VyaWFsaXplRXJyb3IgPSAke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcil9O1xuXG5hc3luYyBmdW5jdGlvbiAke2ludm9rZU5hbWV9KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0ICgke2V4cHJlc3Npb259KTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFwiXCIsIHR5cGU6IFwidW5kZWZpbmVkXCIgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKCR7cmVzdWx0UGF0aEpzb259LCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBcIlwiLCB0eXBlOiBcIm51bGxcIiB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFN0cmluZyhyZXN1bHQpIH0pKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHNlcmlhbGl6ZUVycm9yKGVyciksIHR5cGU6IFwiZXJyb3JcIiB9KSk7XG4gIH1cbn1cblxuZXhwb3J0cy4ke2ludm9rZU5hbWV9ID0gJHtpbnZva2VOYW1lfTtcbmA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2ltcGxlIGFzeW5jIElJRkUgZXhwcmVzc2lvbiB0aGF0IHdhaXRzIGZvciBsYXlvdXQgcmVhZHkuXG4gKlxuICogQHBhcmFtIGJvZHkgLSBUaGUgSmF2YVNjcmlwdCBzdGF0ZW1lbnRzIHRvIGV4ZWN1dGUuXG4gKiBAcmV0dXJucyBUaGUgSUlGRSBleHByZXNzaW9uIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgKGFzeW5jICgpID0+IHtcbiAgaWYgKCFhcHAud29ya3NwYWNlLmxheW91dFJlYWR5KSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKSk7XG4gIH1cbiAgJHtib2R5fVxufSkoKWA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGxvY2FsQXBwRGF0YSA9IHByb2Nlc3MuZW52WydMT0NBTEFQUERBVEEnXSA/PyAnJztcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2xvY2FsQXBwRGF0YX1cXFxcUHJvZ3JhbXNcXFxcT2JzaWRpYW5cXFxcT2JzaWRpYW4uZXhlXCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuICcvQXBwbGljYXRpb25zL09ic2lkaWFuLmFwcC9Db250ZW50cy9NYWNPUy9PYnNpZGlhbiAmJztcbiAgfVxuXG4gIHJldHVybiAnb2JzaWRpYW4gJic7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLHFCQUEyQjtBQUMzQixzQkFLTztBQUNQLHFCQUF1QjtBQUN2Qix1QkFBcUI7QUFDckIsMEJBQW9CO0FBT3BCLGtCQUFxQjtBQUNyQixpQ0FBNEM7QUFDNUMsaUJBQW9CO0FBQ3BCLGtCQUFxQjtBQUNyQiw2QkFLTztBQUNQLDZCQUErQjtBQWMvQixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHNDQUFzQztBQUM1QyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLHFDQUFxQztBQU1wQyxNQUFNLG9CQUFpRDtBQUFBO0FBQUEsRUFFNUMsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUIzQixNQUFhLFNBQVMsWUFBb0IsU0FBZ0Q7QUFDeEYsVUFBTSxjQUFjO0FBQ3BCLFVBQU0sV0FBVyxPQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsTUFBTSxXQUFXO0FBQ3hELFVBQU0sZ0JBQVksMkJBQUssdUJBQU8sR0FBRyw4QkFBOEI7QUFDL0QsVUFBTSxpQkFBYSx1QkFBSyxXQUFXLEdBQUcsUUFBUSxNQUFNO0FBQ3BELFVBQU0saUJBQWEsdUJBQUssV0FBVyxHQUFHLFFBQVEsY0FBYztBQUU1RCxjQUFNLHVCQUFNLFdBQVcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUUxQyxVQUFNLGFBQWEsVUFBVSxRQUFRO0FBQ3JDLFVBQU0sZ0JBQWdCLGdCQUFnQixZQUFZLFlBQVksVUFBVTtBQUN4RSxjQUFNLDJCQUFVLFlBQVksYUFBYTtBQUV6QyxRQUFJO0FBR0YsWUFBTSxjQUFjLDRCQUE0QixLQUFLLFVBQVUsV0FBVyxRQUFRLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDOUYsWUFBTSxjQUFjLHdCQUF3QixXQUFXLElBQUksVUFBVTtBQUNyRSxZQUFNLFVBQVUsQ0FBQyxZQUFZLFFBQVEsdUJBQXVCLFFBQVEsV0FBVyxFQUFFO0FBRWpGLFVBQUk7QUFDRixrQkFBTSxrQkFBSyxTQUFTO0FBQUEsVUFDbEIsS0FBSyxRQUFRO0FBQUEsVUFDYixTQUFTO0FBQUEsVUFDVCxHQUFJLFFBQVEsMEJBQTBCLFVBQWEsRUFBRSx1QkFBdUIsUUFBUSxzQkFBc0I7QUFBQSxRQUM1RyxDQUFDO0FBQUEsTUFDSCxTQUFTLE9BQU87QUFDZCxjQUFNLFVBQVUsaUJBQWlCLFFBQVEsTUFBTSxVQUFVLE9BQU8sS0FBSztBQUNyRSxZQUFJLFFBQVEsU0FBUyx1QkFBdUIsR0FBRztBQUM3QyxnQkFBTSxLQUFLLDhCQUE4QixTQUFTLFFBQVEsR0FBRztBQUFBLFFBQy9ELE9BQU87QUFDTCxnQkFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBRUEsVUFBSSxLQUFDLDJCQUFXLFVBQVUsR0FBRztBQUMzQixjQUFNLElBQUksTUFBTSxvQ0FBb0MsUUFBUSxHQUFHLHNFQUFpRTtBQUFBLE1BQ2xJO0FBRUEsWUFBTSxZQUFZLFVBQU0sMEJBQVMsWUFBWSxPQUFPO0FBQ3BELFlBQU0sV0FBVyxLQUFLLE1BQU0sU0FBUztBQUVyQyxVQUFJLFVBQVUsVUFBVTtBQUN0QixZQUFJLFNBQVMsU0FBUyxTQUFTO0FBQzdCLGdCQUFNLElBQUksTUFBTSxzQ0FBc0MsUUFBUSxHQUFHLEtBQUssU0FBUyxLQUFLLEVBQUU7QUFBQSxRQUN4RjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTyxTQUFTO0FBQUEsSUFDbEIsVUFBRTtBQUNBLGdCQUFNLHdCQUFPLFVBQVUsRUFBRSxNQUFNLGdCQUFJO0FBQ25DLGdCQUFNLHdCQUFPLFVBQVUsRUFBRSxNQUFNLGdCQUFJO0FBQUEsSUFDckM7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUEsTUFBYSxlQUFlLFdBQWtDO0FBQzVELHdCQUFJLHNEQUFzRCxTQUFTLEVBQUU7QUFDckUsUUFBSSxLQUFDLDBDQUFrQixTQUFTLEdBQUc7QUFDakMsWUFBTSxJQUFJO0FBQUEsUUFDUix3Q0FBd0MsU0FBUztBQUFBLE1BQ25EO0FBQUEsSUFDRjtBQUVBLFFBQUksS0FBQyxxQ0FBYSxHQUFHO0FBQ25CLFlBQU0sSUFBSSxNQUFNLHFGQUFxRjtBQUFBLElBQ3ZHO0FBRUEsVUFBTSxLQUFLLG1CQUFtQjtBQUM5Qix3QkFBSSx5Q0FBeUM7QUFBQSxFQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWEsY0FBYyxXQUFrQztBQUMzRCx3QkFBSSxzQ0FBc0MsU0FBUyxFQUFFO0FBQ3JELFVBQU0sd0JBQW9CLGtEQUEwQjtBQUNwRCxRQUFJLENBQUMsbUJBQW1CO0FBQ3RCLFlBQU0sSUFBSSxNQUFNLGtJQUFrSTtBQUFBLElBQ3BKO0FBRUEsVUFBTSxlQUFlO0FBQUEsTUFDbkIsc0RBQXNELEtBQUssVUFBVSxTQUFTLENBQUM7QUFBQSxJQUNqRjtBQUNBLFVBQU0sS0FBSyxTQUFTLGNBQWMsRUFBRSxLQUFLLGtCQUFrQixDQUFDO0FBRTVELFVBQU0sS0FBSyw0QkFBNEIsU0FBUztBQUVoRCxVQUFNLFdBQVc7QUFBQSxNQUNmO0FBQUEsSUFDRjtBQUVBLHdCQUFJLHdEQUF3RCxPQUFPLGtDQUFrQyxDQUFDLFFBQVE7QUFDOUcsVUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJO0FBQzlCLFdBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixVQUFJO0FBQ0YsY0FBTSxXQUFXLE1BQU0sS0FBSyxTQUFTLFVBQVUsRUFBRSxLQUFLLFVBQVUsQ0FBQztBQUNqRSxZQUFJLEtBQUssTUFBTSxRQUFRLE1BQU0sV0FBVztBQUN0Qyw4QkFBSSxpQ0FBaUM7QUFDckM7QUFBQSxRQUNGO0FBQUEsTUFDRixRQUFRO0FBQUEsTUFFUjtBQUNBLFlBQU0sTUFBTSxtQ0FBbUM7QUFBQSxJQUNqRDtBQUNBLFVBQU0sSUFBSSxNQUFNLFlBQVksU0FBUyxnQ0FBZ0MsT0FBTyxrQ0FBa0MsQ0FBQyxJQUFJO0FBQUEsRUFDckg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVQSxNQUFhLGdCQUFnQixXQUFrQztBQUM3RCx3QkFBSSwyREFBMkQsU0FBUyxLQUFLO0FBQzdFLFVBQU0sY0FBYyxzQkFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNekM7QUFDRCxRQUFJO0FBQ0YsWUFBTSxLQUFLLFNBQVMsYUFBYSxFQUFFLEtBQUssV0FBVyx1QkFBdUIsbUNBQW1DLENBQUM7QUFDOUcsMEJBQUksOENBQThDO0FBQUEsSUFDcEQsU0FBUyxPQUFnQjtBQUN2QiwwQkFBSSwwREFBc0QsdUNBQWUsS0FBSyxDQUFDLEVBQUU7QUFBQSxJQUNuRjtBQUVBLHdCQUFJLGdEQUFnRDtBQUNwRCxVQUFNLE1BQU0saUNBQWlDO0FBRTdDLHdCQUFJLGlEQUFpRDtBQUNyRCxVQUFNLGFBQWE7QUFBQSxNQUNqQix3REFBd0QsS0FBSyxVQUFVLFNBQVMsQ0FBQztBQUFBLElBQ25GO0FBQ0EsVUFBTSw4QkFBMEIsa0RBQTBCO0FBQzFELFFBQUk7QUFDRixVQUFJLHlCQUF5QjtBQUMzQixjQUFNLEtBQUssU0FBUyxZQUFZLEVBQUUsS0FBSyx5QkFBeUIsdUJBQXVCLG1DQUFtQyxDQUFDO0FBQUEsTUFDN0gsT0FBTztBQUNMLDRCQUFJLDhFQUF5RTtBQUFBLE1BQy9FO0FBQ0EsMEJBQUksOENBQThDO0FBQUEsSUFDcEQsU0FBUyxPQUFnQjtBQUN2QiwwQkFBSSxrRUFBOEQsdUNBQWUsS0FBSyxDQUFDLEVBQUU7QUFBQSxJQUMzRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWMscUJBQW9DO0FBQ2hELFVBQU0sVUFBVSxvQkFBQUEsUUFBUSxhQUFhLFVBQVUsdUJBQXVCO0FBQ3RFLFFBQUk7QUFDRixnQkFBTSxrQkFBSyxTQUFTLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxJQUN2QyxRQUFRO0FBQ04sWUFBTSxJQUFJLE1BQU0sMEZBQTBGO0FBQUEsSUFDNUc7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlBLE1BQWMsNEJBQTRCLFdBQWtDO0FBQzFFLFVBQU0sY0FBVSxtQ0FBVyxTQUFTO0FBQ3BDLFFBQUksQ0FBQyxTQUFTO0FBQ1osMEJBQUksa0ZBQTZFO0FBQ2pGO0FBQUEsSUFDRjtBQUVBLFVBQU0sYUFBYTtBQUFBLE1BQ2pCLHdCQUF3QixLQUFLLFVBQVUsaUJBQWlCLE9BQU8sRUFBRSxDQUFDO0FBQUEsSUFDcEU7QUFDQSxVQUFNLEtBQUssU0FBUyxZQUFZLEVBQUUsS0FBSyxVQUFVLENBQUM7QUFDbEQsd0JBQUkscUNBQXFDLE9BQU8sbUJBQW1CO0FBQUEsRUFDckU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWMsOEJBQThCLFNBQW1CLEtBQTRCO0FBQ3pGLHdCQUFJLCtEQUErRDtBQUVuRSxRQUFJO0FBQ0YsZ0JBQU0sa0JBQUsseUJBQXlCLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLElBQzFELFFBQVE7QUFBQSxJQUVSO0FBRUEsd0JBQUkscURBQXFELE9BQU8sa0NBQWtDLENBQUMsUUFBUTtBQUMzRyxVQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFDOUIsV0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFlBQU0sTUFBTSx3Q0FBd0M7QUFDcEQsVUFBSTtBQUNGLGtCQUFNLGtCQUFLLFNBQVMsRUFBRSxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQzFDLDRCQUFJLHlDQUF5QztBQUM3QztBQUFBLE1BQ0YsU0FBUyxPQUFPO0FBQ2QsY0FBTSxVQUFVLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFDckUsWUFBSSxDQUFDLFFBQVEsU0FBUyx1QkFBdUIsR0FBRztBQUM5QyxnQkFBTTtBQUFBLFFBQ1I7QUFDQSw0QkFBSSxxREFBcUQ7QUFBQSxNQUMzRDtBQUFBLElBQ0Y7QUFFQSxVQUFNLElBQUksTUFBTSxpQ0FBaUMsT0FBTyxrQ0FBa0MsQ0FBQyxLQUFLO0FBQUEsRUFDbEc7QUFDRjtBQVNBLFNBQVMsbUJBQW1CLGNBQThCO0FBQ3hELFNBQU8sc0JBQXNCLFlBQVk7QUFDM0M7QUFjQSxTQUFTLGdCQUFnQixZQUFvQixZQUFvQixZQUE0QjtBQUMzRixRQUFNLGlCQUFpQixLQUFLLFVBQVUsV0FBVyxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ3BFLFNBQU87QUFBQTtBQUFBLDZCQUVnQix3REFBNEIscUNBQWMsQ0FBQztBQUFBO0FBQUEsaUJBRW5ELFVBQVU7QUFBQTtBQUFBLDRCQUVDLFVBQVU7QUFBQTtBQUFBLHlCQUViLGNBQWM7QUFBQTtBQUFBLHlCQUVkLGNBQWM7QUFBQTtBQUFBLHlCQUVkLGNBQWM7QUFBQTtBQUFBO0FBQUEsdUJBR2hCLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQUkzQixVQUFVLE1BQU0sVUFBVTtBQUFBO0FBRXBDO0FBUUEsU0FBUyxzQkFBc0IsTUFBc0I7QUFDbkQsU0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUwsSUFBSTtBQUFBO0FBRVI7QUFRQSxTQUFTLE1BQU0sSUFBMkI7QUFDeEMsU0FBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzlCLGVBQVcsU0FBUyxFQUFFO0FBQUEsRUFDeEIsQ0FBQztBQUNIO0FBT0EsU0FBUywyQkFBbUM7QUFDMUMsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFNBQVM7QUFDaEMsVUFBTSxlQUFlLG9CQUFBQSxRQUFRLElBQUksY0FBYyxLQUFLO0FBQ3BELFdBQU8sYUFBYSxZQUFZO0FBQUEsRUFDbEM7QUFFQSxNQUFJLG9CQUFBQSxRQUFRLGFBQWEsVUFBVTtBQUNqQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
335
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbi1leHByZXNzaW9uLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vbm9vcC5janMnO1xuaW1wb3J0IHtcbiAgZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZFxufSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5janMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6ZS1lcnJvci5janMnO1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSB0aGUgYG9ic2lkaWFuIGV2YWxgIENMSSBjb21tYW5kXG4gKiBhbmQgbWFuYWdlcyB2YXVsdHMgdmlhIEVsZWN0cm9uIElQQy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDbGlUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5janNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGludm9rZU5hbWUgPSBgaW52b2tlXyR7c2NyaXB0SWR9YDtcbiAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb24sIHJlc3VsdFBhdGgsIGludm9rZU5hbWUpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JpcHRQYXRoLCBzY3JpcHRDb250ZW50KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgbW9kdWxlLmNvbnN0cnVjdG9yLl9sb2FkIHRvIGJ5cGFzcyBhbnkgbW9ua2V5LXBhdGNoZWQgcmVxdWlyZSgpXG4gICAgICAvLyAoZS5nLiwgb2JzaWRpYW4tY29kZXNjcmlwdC10b29sa2l0IHBhdGNoZXMgcmVxdWlyZSBpbiB0aGUgcmVuZGVyZXIgcHJvY2VzcykuXG4gICAgICBjb25zdCBzYWZlUmVxdWlyZSA9IGBtb2R1bGUuY29uc3RydWN0b3IuX2xvYWQoJHtKU09OLnN0cmluZ2lmeShzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKSl9KWA7XG4gICAgICBjb25zdCByZXF1aXJlRXhwciA9IGAoYXN5bmMgKCkgPT4geyBhd2FpdCAke3NhZmVSZXF1aXJlfS4ke2ludm9rZU5hbWV9KCkgfSkoKWA7XG4gICAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsICdldmFsJywgJy0tYWxsb3ctZm9jdXMtc3RlYWwnLCBgY29kZT0ke3JlcXVpcmVFeHByfWBdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH0gXHUyMDE0IHRoZSB2YXVsdCBtYXkgbm90IGJlIGZvdW5kIG9yIE9ic2lkaWFuIGRpZCBub3QgcnVuIHRoZSBldmFsLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgZGlzYWJsZWQuIEVuYWJsZSBpdCBpbiBPYnNpZGlhbiBTZXR0aW5ncyBcXHUyMTkyIEdlbmVyYWwgXFx1MjE5MiBDTEkuJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0UGF0aCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICBpZiAoIWV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIHZhdWx0OiBubyBleGlzdGluZyB2YXVsdCBpcyByZWdpc3RlcmVkIGluIE9ic2lkaWFuLiBPcGVuIE9ic2lkaWFuIGFuZCBjcmVhdGUgb3Igb3BlbiBhdCBsZWFzdCBvbmUgdmF1bHQgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYnVpbGRJcGNFeHByZXNzaW9uKFxuICAgICAgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtb3BlbicsICR7SlNPTi5zdHJpbmdpZnkodmF1bHRQYXRoKX0sIGZhbHNlKTtgXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRQYXRoIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoLCBleGlzdGluZ1ZhdWx0UGF0aCk7XG5cbiAgICBjb25zdCBwb2xsRXhwciA9IGJ1aWxkU2ltcGxlRXhwcmVzc2lvbihcbiAgICAgICdyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSk7J1xuICAgICk7XG5cbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCByZWFkaW5lc3MgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUocG9sbEV4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICAgIGlmIChKU09OLnBhcnNlKGJhc2VQYXRoKSA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVmF1bHQgbm90IHJlYWR5IHlldC5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBTY2hlZHVsZXMgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSwgd2FpdHMsIHRoZW4gcmVtb3ZlcyB0aGUgdmF1bHRcbiAgICogZnJvbSB0aGUgcmVnaXN0cnkgdmlhIGB2YXVsdC1yZW1vdmVgIElQQy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVW5yZWdpc3RlcmluZyB2YXVsdDogY2xvc2luZyB3aW5kb3cgZm9yICR7dmF1bHRQYXRofS4uLmApO1xuICAgIGNvbnN0IGRlc3Ryb3lFeHByID0gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGBcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAod2luZG93LmVsZWN0cm9uICYmIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUpIHtcbiAgICAgICAgICB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGRlc3Ryb3lFeHByLCB7IGN3ZDogdmF1bHRQYXRoLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXaW5kb3cgZGVzdHJveSBjb21tYW5kIHNlbnQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCByZW1vdmVFeHByID0gYnVpbGRJcGNFeHByZXNzaW9uKFxuICAgICAgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtcmVtb3ZlJywgJHtKU09OLnN0cmluZ2lmeSh2YXVsdFBhdGgpfSk7YFxuICAgICk7XG4gICAgY29uc3QgZXhpc3RpbmdWYXVsdEZvclJlbW92YWwgPSBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlbW92ZUV4cHIsIHsgY3dkOiBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBWQVVMVF9FVkFMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gTm8gZXhpc3RpbmcgdmF1bHQgdG8gdGFyZ2V0IGZvciByZW1vdmFsIElQQyBcdTIwMTQgc2tpcHBpbmcuJyk7XG4gICAgICB9XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCByZW1vdmVkIGZyb20gcmVnaXN0cnkuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlZ2lzdHJ5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gUEFUSC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0Q2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ3doZXJlLmV4ZSBvYnNpZGlhbicgOiAnd2hpY2ggb2JzaWRpYW4nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSBldmFsVGFyZ2V0VmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGFzIGV2YWwgdGFyZ2V0IChhbiBleGlzdGluZywgbG9hZGVkIHZhdWx0KS5cbiAgICogICBsb2NhbFN0b3JhZ2UgaXMgc2hhcmVkIGFjcm9zcyBhbGwgT2JzaWRpYW4gd2luZG93cyAoc2FtZSBFbGVjdHJvbiBvcmlnaW4pLCBzbyB0aGVcbiAgICogICBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIGNhbGwgY2FuIHJ1biBpbiBhbnkgbG9hZGVkIHZhdWx0IHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nLCBldmFsVGFyZ2V0VmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZUV4cHIgPSBidWlsZFNpbXBsZUV4cHJlc3Npb24oXG4gICAgICBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9YCl9LCAndHJ1ZScpO2BcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZW5hYmxlRXhwciwgeyBjd2Q6IGV2YWxUYXJnZXRWYXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIGFzeW5jIElJRkUgdGhhdCB3YWl0cyBmb3IgbGF5b3V0IHJlYWR5IGFuZCBleGVjdXRlcyBhbiBJUEMgY2FsbC5cbiAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYEpTT04uc3RyaW5naWZ5KHVuZGVmaW5lZClgIHNvIHRoZSBDTEkgcHJvZHVjZXMgYChubyBvdXRwdXQpYC5cbiAqXG4gKiBAcGFyYW0gaXBjU3RhdGVtZW50IC0gVGhlIElQQyBzdGF0ZW1lbnQgdG8gZXhlY3V0ZS5cbiAqIEByZXR1cm5zIFRoZSBJSUZFIGV4cHJlc3Npb24gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZElwY0V4cHJlc3Npb24oaXBjU3RhdGVtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGlwY1N0YXRlbWVudCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb250ZW50IG9mIGEgdGVtcG9yYXJ5IGAuY2pzYCBzY3JpcHQgZmlsZS5cbiAqXG4gKiBUaGUgc2NyaXB0IGRlZmluZXMgYW4gYXN5bmMgYGludm9rZSgpYCBmdW5jdGlvbiB0aGF0IGV2YWx1YXRlcyB0aGVcbiAqIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IChvciBlcnJvcikgdG8gYHJlc3VsdFBhdGhgLCBhbmQgaXNcbiAqIGV4cG9ydGVkIGZvciB0aGUgQ0xJIHRvIGByZXF1aXJlKClgIGFuZCBjYWxsLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZXN1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJlc3VsdCBmaWxlLlxuICogQHBhcmFtIGludm9rZU5hbWUgLSBUaGUgdW5pcXVlIGZ1bmN0aW9uIG5hbWUgdG8gZXhwb3J0IChhdm9pZHMgY29sbGlzaW9ucykuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nLCBpbnZva2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHRQYXRoSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgcmV0dXJuIGBcInVzZSBzdHJpY3RcIjtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgc2VyaWFsaXplRXJyb3IgPSAke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcil9O1xuXG5hc3luYyBmdW5jdGlvbiAke2ludm9rZU5hbWV9KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0ICgke2V4cHJlc3Npb259KTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFwiXCIsIHR5cGU6IFwidW5kZWZpbmVkXCIgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKCR7cmVzdWx0UGF0aEpzb259LCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBcIlwiLCB0eXBlOiBcIm51bGxcIiB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFN0cmluZyhyZXN1bHQpIH0pKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHNlcmlhbGl6ZUVycm9yKGVyciksIHR5cGU6IFwiZXJyb3JcIiB9KSk7XG4gIH1cbn1cblxuZXhwb3J0cy4ke2ludm9rZU5hbWV9ID0gJHtpbnZva2VOYW1lfTtcbmA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2ltcGxlIGFzeW5jIElJRkUgZXhwcmVzc2lvbiB0aGF0IHdhaXRzIGZvciBsYXlvdXQgcmVhZHkuXG4gKlxuICogQHBhcmFtIGJvZHkgLSBUaGUgSmF2YVNjcmlwdCBzdGF0ZW1lbnRzIHRvIGV4ZWN1dGUuXG4gKiBAcmV0dXJucyBUaGUgSUlGRSBleHByZXNzaW9uIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgKGFzeW5jICgpID0+IHtcbiAgaWYgKCFhcHAud29ya3NwYWNlLmxheW91dFJlYWR5KSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKSk7XG4gIH1cbiAgJHtib2R5fVxufSkoKWA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGxvY2FsQXBwRGF0YSA9IHByb2Nlc3MuZW52WydMT0NBTEFQUERBVEEnXSA/PyAnJztcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2xvY2FsQXBwRGF0YX1cXFxcUHJvZ3JhbXNcXFxcT2JzaWRpYW5cXFxcT2JzaWRpYW4uZXhlXCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuICcvQXBwbGljYXRpb25zL09ic2lkaWFuLmFwcC9Db250ZW50cy9NYWNPUy9PYnNpZGlhbiAmJztcbiAgfVxuXG4gIHJldHVybiAnb2JzaWRpYW4gJic7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLHFCQUEyQjtBQUMzQixzQkFLTztBQUNQLHFCQUF1QjtBQUN2Qix1QkFBcUI7QUFDckIsMEJBQW9CO0FBT3BCLGtCQUFxQjtBQUNyQixpQ0FBNEM7QUFDNUMsaUJBQW9CO0FBQ3BCLGtCQUFxQjtBQUNyQiw2QkFLTztBQUNQLDZCQUErQjtBQWMvQixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHNDQUFzQztBQUM1QyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLHFDQUFxQztBQU1wQyxNQUFNLG9CQUFpRDtBQUFBO0FBQUEsRUFFNUMsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUIzQixNQUFhLFNBQVMsWUFBb0IsU0FBZ0Q7QUFDeEYsVUFBTSxjQUFjO0FBQ3BCLFVBQU0sV0FBVyxPQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsTUFBTSxXQUFXO0FBQ3hELFVBQU0sZ0JBQVksMkJBQUssdUJBQU8sR0FBRyw4QkFBOEI7QUFDL0QsVUFBTSxpQkFBYSx1QkFBSyxXQUFXLEdBQUcsUUFBUSxNQUFNO0FBQ3BELFVBQU0saUJBQWEsdUJBQUssV0FBVyxHQUFHLFFBQVEsY0FBYztBQUU1RCxjQUFNLHVCQUFNLFdBQVcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUUxQyxVQUFNLGFBQWEsVUFBVSxRQUFRO0FBQ3JDLFVBQU0sZ0JBQWdCLGdCQUFnQixZQUFZLFlBQVksVUFBVTtBQUN4RSxjQUFNLDJCQUFVLFlBQVksYUFBYTtBQUV6QyxRQUFJO0FBR0YsWUFBTSxjQUFjLDRCQUE0QixLQUFLLFVBQVUsV0FBVyxRQUFRLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDOUYsWUFBTSxjQUFjLHdCQUF3QixXQUFXLElBQUksVUFBVTtBQUNyRSxZQUFNLFVBQVUsQ0FBQyxZQUFZLFFBQVEsdUJBQXVCLFFBQVEsV0FBVyxFQUFFO0FBRWpGLFVBQUk7QUFDRixrQkFBTSxrQkFBSyxTQUFTO0FBQUEsVUFDbEIsS0FBSyxRQUFRO0FBQUEsVUFDYixTQUFTO0FBQUEsVUFDVCxHQUFJLFFBQVEsMEJBQTBCLFVBQWEsRUFBRSx1QkFBdUIsUUFBUSxzQkFBc0I7QUFBQSxRQUM1RyxDQUFDO0FBQUEsTUFDSCxTQUFTLE9BQU87QUFDZCxjQUFNLFVBQVUsaUJBQWlCLFFBQVEsTUFBTSxVQUFVLE9BQU8sS0FBSztBQUNyRSxZQUFJLFFBQVEsU0FBUyx1QkFBdUIsR0FBRztBQUM3QyxnQkFBTSxLQUFLLDhCQUE4QixTQUFTLFFBQVEsR0FBRztBQUFBLFFBQy9ELE9BQU87QUFDTCxnQkFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBRUEsVUFBSSxLQUFDLDJCQUFXLFVBQVUsR0FBRztBQUMzQixjQUFNLElBQUksTUFBTSxvQ0FBb0MsUUFBUSxHQUFHLHNFQUFpRTtBQUFBLE1BQ2xJO0FBRUEsWUFBTSxZQUFZLFVBQU0sMEJBQVMsWUFBWSxPQUFPO0FBQ3BELFlBQU0sV0FBVyxLQUFLLE1BQU0sU0FBUztBQUVyQyxVQUFJLFVBQVUsVUFBVTtBQUN0QixZQUFJLFNBQVMsU0FBUyxTQUFTO0FBQzdCLGdCQUFNLElBQUksTUFBTSxzQ0FBc0MsUUFBUSxHQUFHLEtBQUssU0FBUyxLQUFLLEVBQUU7QUFBQSxRQUN4RjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTyxTQUFTO0FBQUEsSUFDbEIsVUFBRTtBQUNBLGdCQUFNLHdCQUFPLFVBQVUsRUFBRSxNQUFNLGdCQUFJO0FBQ25DLGdCQUFNLHdCQUFPLFVBQVUsRUFBRSxNQUFNLGdCQUFJO0FBQUEsSUFDckM7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUEsTUFBYSxlQUFlLFdBQWtDO0FBQzVELHdCQUFJLHNEQUFzRCxTQUFTLEVBQUU7QUFDckUsUUFBSSxLQUFDLDBDQUFrQixTQUFTLEdBQUc7QUFDakMsWUFBTSxJQUFJO0FBQUEsUUFDUix3Q0FBd0MsU0FBUztBQUFBLE1BQ25EO0FBQUEsSUFDRjtBQUVBLFFBQUksS0FBQyxxQ0FBYSxHQUFHO0FBQ25CLFlBQU0sSUFBSSxNQUFNLHFGQUFxRjtBQUFBLElBQ3ZHO0FBRUEsVUFBTSxLQUFLLG1CQUFtQjtBQUM5Qix3QkFBSSx5Q0FBeUM7QUFBQSxFQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWEsY0FBYyxXQUFrQztBQUMzRCx3QkFBSSxzQ0FBc0MsU0FBUyxFQUFFO0FBQ3JELFVBQU0sd0JBQW9CLGtEQUEwQjtBQUNwRCxRQUFJLENBQUMsbUJBQW1CO0FBQ3RCLFlBQU0sSUFBSSxNQUFNLGtJQUFrSTtBQUFBLElBQ3BKO0FBRUEsVUFBTSxlQUFlO0FBQUEsTUFDbkIsc0RBQXNELEtBQUssVUFBVSxTQUFTLENBQUM7QUFBQSxJQUNqRjtBQUNBLFVBQU0sS0FBSyxTQUFTLGNBQWMsRUFBRSxLQUFLLGtCQUFrQixDQUFDO0FBRTVELFVBQU0sS0FBSyw0QkFBNEIsV0FBVyxpQkFBaUI7QUFFbkUsVUFBTSxXQUFXO0FBQUEsTUFDZjtBQUFBLElBQ0Y7QUFFQSx3QkFBSSx3REFBd0QsT0FBTyxrQ0FBa0MsQ0FBQyxRQUFRO0FBQzlHLFVBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5QixXQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsVUFBSTtBQUNGLGNBQU0sV0FBVyxNQUFNLEtBQUssU0FBUyxVQUFVLEVBQUUsS0FBSyxVQUFVLENBQUM7QUFDakUsWUFBSSxLQUFLLE1BQU0sUUFBUSxNQUFNLFdBQVc7QUFDdEMsOEJBQUksaUNBQWlDO0FBQ3JDO0FBQUEsUUFDRjtBQUFBLE1BQ0YsUUFBUTtBQUFBLE1BRVI7QUFDQSxZQUFNLE1BQU0sbUNBQW1DO0FBQUEsSUFDakQ7QUFDQSxVQUFNLElBQUksTUFBTSxZQUFZLFNBQVMsZ0NBQWdDLE9BQU8sa0NBQWtDLENBQUMsSUFBSTtBQUFBLEVBQ3JIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUEsTUFBYSxnQkFBZ0IsV0FBa0M7QUFDN0Qsd0JBQUksMkRBQTJELFNBQVMsS0FBSztBQUM3RSxVQUFNLGNBQWMsc0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTXpDO0FBQ0QsUUFBSTtBQUNGLFlBQU0sS0FBSyxTQUFTLGFBQWEsRUFBRSxLQUFLLFdBQVcsdUJBQXVCLG1DQUFtQyxDQUFDO0FBQzlHLDBCQUFJLDhDQUE4QztBQUFBLElBQ3BELFNBQVMsT0FBZ0I7QUFDdkIsMEJBQUksMERBQXNELHVDQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDbkY7QUFFQSx3QkFBSSxnREFBZ0Q7QUFDcEQsVUFBTSxNQUFNLGlDQUFpQztBQUU3Qyx3QkFBSSxpREFBaUQ7QUFDckQsVUFBTSxhQUFhO0FBQUEsTUFDakIsd0RBQXdELEtBQUssVUFBVSxTQUFTLENBQUM7QUFBQSxJQUNuRjtBQUNBLFVBQU0sOEJBQTBCLGtEQUEwQjtBQUMxRCxRQUFJO0FBQ0YsVUFBSSx5QkFBeUI7QUFDM0IsY0FBTSxLQUFLLFNBQVMsWUFBWSxFQUFFLEtBQUsseUJBQXlCLHVCQUF1QixtQ0FBbUMsQ0FBQztBQUFBLE1BQzdILE9BQU87QUFDTCw0QkFBSSw4RUFBeUU7QUFBQSxNQUMvRTtBQUNBLDBCQUFJLDhDQUE4QztBQUFBLElBQ3BELFNBQVMsT0FBZ0I7QUFDdkIsMEJBQUksa0VBQThELHVDQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDM0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFjLHFCQUFvQztBQUNoRCxVQUFNLFVBQVUsb0JBQUFBLFFBQVEsYUFBYSxVQUFVLHVCQUF1QjtBQUN0RSxRQUFJO0FBQ0YsZ0JBQU0sa0JBQUssU0FBUyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDdkMsUUFBUTtBQUNOLFlBQU0sSUFBSSxNQUFNLDBGQUEwRjtBQUFBLElBQzVHO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFlQSxNQUFjLDRCQUE0QixXQUFtQixxQkFBNEM7QUFDdkcsVUFBTSxjQUFVLG1DQUFXLFNBQVM7QUFDcEMsUUFBSSxDQUFDLFNBQVM7QUFDWiwwQkFBSSxrRkFBNkU7QUFDakY7QUFBQSxJQUNGO0FBRUEsVUFBTSxhQUFhO0FBQUEsTUFDakIsd0JBQXdCLEtBQUssVUFBVSxpQkFBaUIsT0FBTyxFQUFFLENBQUM7QUFBQSxJQUNwRTtBQUNBLFVBQU0sS0FBSyxTQUFTLFlBQVksRUFBRSxLQUFLLG9CQUFvQixDQUFDO0FBQzVELHdCQUFJLHFDQUFxQyxPQUFPLG1CQUFtQjtBQUFBLEVBQ3JFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFjLDhCQUE4QixTQUFtQixLQUE0QjtBQUN6Rix3QkFBSSwrREFBK0Q7QUFFbkUsUUFBSTtBQUNGLGdCQUFNLGtCQUFLLHlCQUF5QixHQUFHLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxJQUMxRCxRQUFRO0FBQUEsSUFFUjtBQUVBLHdCQUFJLHFEQUFxRCxPQUFPLGtDQUFrQyxDQUFDLFFBQVE7QUFDM0csVUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJO0FBQzlCLFdBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixZQUFNLE1BQU0sd0NBQXdDO0FBQ3BELFVBQUk7QUFDRixrQkFBTSxrQkFBSyxTQUFTLEVBQUUsS0FBSyxTQUFTLEtBQUssQ0FBQztBQUMxQyw0QkFBSSx5Q0FBeUM7QUFDN0M7QUFBQSxNQUNGLFNBQVMsT0FBTztBQUNkLGNBQU0sVUFBVSxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLO0FBQ3JFLFlBQUksQ0FBQyxRQUFRLFNBQVMsdUJBQXVCLEdBQUc7QUFDOUMsZ0JBQU07QUFBQSxRQUNSO0FBQ0EsNEJBQUkscURBQXFEO0FBQUEsTUFDM0Q7QUFBQSxJQUNGO0FBRUEsVUFBTSxJQUFJLE1BQU0saUNBQWlDLE9BQU8sa0NBQWtDLENBQUMsS0FBSztBQUFBLEVBQ2xHO0FBQ0Y7QUFTQSxTQUFTLG1CQUFtQixjQUE4QjtBQUN4RCxTQUFPLHNCQUFzQixZQUFZO0FBQzNDO0FBY0EsU0FBUyxnQkFBZ0IsWUFBb0IsWUFBb0IsWUFBNEI7QUFDM0YsUUFBTSxpQkFBaUIsS0FBSyxVQUFVLFdBQVcsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNwRSxTQUFPO0FBQUE7QUFBQSw2QkFFZ0Isd0RBQTRCLHFDQUFjLENBQUM7QUFBQTtBQUFBLGlCQUVuRCxVQUFVO0FBQUE7QUFBQSw0QkFFQyxVQUFVO0FBQUE7QUFBQSx5QkFFYixjQUFjO0FBQUE7QUFBQSx5QkFFZCxjQUFjO0FBQUE7QUFBQSx5QkFFZCxjQUFjO0FBQUE7QUFBQTtBQUFBLHVCQUdoQixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFJM0IsVUFBVSxNQUFNLFVBQVU7QUFBQTtBQUVwQztBQVFBLFNBQVMsc0JBQXNCLE1BQXNCO0FBQ25ELFNBQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlMLElBQUk7QUFBQTtBQUVSO0FBUUEsU0FBUyxNQUFNLElBQTJCO0FBQ3hDLFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM5QixlQUFXLFNBQVMsRUFBRTtBQUFBLEVBQ3hCLENBQUM7QUFDSDtBQU9BLFNBQVMsMkJBQW1DO0FBQzFDLE1BQUksb0JBQUFBLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFVBQU0sZUFBZSxvQkFBQUEsUUFBUSxJQUFJLGNBQWMsS0FBSztBQUNwRCxXQUFPLGFBQWEsWUFBWTtBQUFBLEVBQ2xDO0FBRUEsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFVBQVU7QUFDakMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbInByb2Nlc3MiXQp9Cg==
@@ -68,6 +68,9 @@ export declare class DesktopCliTransport implements ObsidianTransport {
68
68
  * `obsidian.json`) and before the new vault window finishes loading.
69
69
  *
70
70
  * @param vaultPath - The absolute path to the vault folder.
71
+ * @param evalTargetVaultPath - The vault path to use as eval target (an existing, loaded vault).
72
+ * localStorage is shared across all Obsidian windows (same Electron origin), so the
73
+ * `localStorage.setItem` call can run in any loaded vault window.
71
74
  */
72
75
  private enablePluginsInLocalStorage;
73
76
  /**
@@ -68,6 +68,9 @@ export declare class DesktopCliTransport implements ObsidianTransport {
68
68
  * `obsidian.json`) and before the new vault window finishes loading.
69
69
  *
70
70
  * @param vaultPath - The absolute path to the vault folder.
71
+ * @param evalTargetVaultPath - The vault path to use as eval target (an existing, loaded vault).
72
+ * localStorage is shared across all Obsidian windows (same Electron origin), so the
73
+ * `localStorage.setItem` call can run in any loaded vault window.
71
74
  */
72
75
  private enablePluginsInLocalStorage;
73
76
  /**
@@ -128,7 +128,7 @@ class DesktopCliTransport {
128
128
  `window.electron.ipcRenderer.sendSync('vault-open', ${JSON.stringify(vaultPath)}, false);`
129
129
  );
130
130
  await this.evaluate(registerExpr, { cwd: existingVaultPath });
131
- await this.enablePluginsInLocalStorage(vaultPath);
131
+ await this.enablePluginsInLocalStorage(vaultPath, existingVaultPath);
132
132
  const pollExpr = buildSimpleExpression(
133
133
  "return JSON.stringify(app.vault.adapter.getBasePath());"
134
134
  );
@@ -208,8 +208,11 @@ class DesktopCliTransport {
208
208
  * `obsidian.json`) and before the new vault window finishes loading.
209
209
  *
210
210
  * @param vaultPath - The absolute path to the vault folder.
211
+ * @param evalTargetVaultPath - The vault path to use as eval target (an existing, loaded vault).
212
+ * localStorage is shared across all Obsidian windows (same Electron origin), so the
213
+ * `localStorage.setItem` call can run in any loaded vault window.
211
214
  */
212
- async enablePluginsInLocalStorage(vaultPath) {
215
+ async enablePluginsInLocalStorage(vaultPath, evalTargetVaultPath) {
213
216
  const vaultId = getVaultId(vaultPath);
214
217
  if (!vaultId) {
215
218
  log("[cli-transport] Could not find vault ID \u2014 skipping localStorage trust flag.");
@@ -218,7 +221,7 @@ class DesktopCliTransport {
218
221
  const enableExpr = buildSimpleExpression(
219
222
  `localStorage.setItem(${JSON.stringify(`enable-plugin-${vaultId}`)}, 'true');`
220
223
  );
221
- await this.evaluate(enableExpr, { cwd: vaultPath });
224
+ await this.evaluate(enableExpr, { cwd: evalTargetVaultPath });
222
225
  log(`[cli-transport] Set enable-plugin-${vaultId} in localStorage.`);
223
226
  }
224
227
  /**
@@ -305,4 +308,4 @@ function getObsidianLaunchCommand() {
305
308
  export {
306
309
  DesktopCliTransport
307
310
  };
308
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbi1leHByZXNzaW9uLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vbm9vcC5tanMnO1xuaW1wb3J0IHtcbiAgZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZFxufSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5tanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6ZS1lcnJvci5tanMnO1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSB0aGUgYG9ic2lkaWFuIGV2YWxgIENMSSBjb21tYW5kXG4gKiBhbmQgbWFuYWdlcyB2YXVsdHMgdmlhIEVsZWN0cm9uIElQQy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDbGlUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5janNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGludm9rZU5hbWUgPSBgaW52b2tlXyR7c2NyaXB0SWR9YDtcbiAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb24sIHJlc3VsdFBhdGgsIGludm9rZU5hbWUpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JpcHRQYXRoLCBzY3JpcHRDb250ZW50KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgbW9kdWxlLmNvbnN0cnVjdG9yLl9sb2FkIHRvIGJ5cGFzcyBhbnkgbW9ua2V5LXBhdGNoZWQgcmVxdWlyZSgpXG4gICAgICAvLyAoZS5nLiwgb2JzaWRpYW4tY29kZXNjcmlwdC10b29sa2l0IHBhdGNoZXMgcmVxdWlyZSBpbiB0aGUgcmVuZGVyZXIgcHJvY2VzcykuXG4gICAgICBjb25zdCBzYWZlUmVxdWlyZSA9IGBtb2R1bGUuY29uc3RydWN0b3IuX2xvYWQoJHtKU09OLnN0cmluZ2lmeShzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKSl9KWA7XG4gICAgICBjb25zdCByZXF1aXJlRXhwciA9IGAoYXN5bmMgKCkgPT4geyBhd2FpdCAke3NhZmVSZXF1aXJlfS4ke2ludm9rZU5hbWV9KCkgfSkoKWA7XG4gICAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsICdldmFsJywgJy0tYWxsb3ctZm9jdXMtc3RlYWwnLCBgY29kZT0ke3JlcXVpcmVFeHByfWBdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH0gXHUyMDE0IHRoZSB2YXVsdCBtYXkgbm90IGJlIGZvdW5kIG9yIE9ic2lkaWFuIGRpZCBub3QgcnVuIHRoZSBldmFsLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgZGlzYWJsZWQuIEVuYWJsZSBpdCBpbiBPYnNpZGlhbiBTZXR0aW5ncyBcXHUyMTkyIEdlbmVyYWwgXFx1MjE5MiBDTEkuJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0UGF0aCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICBpZiAoIWV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIHZhdWx0OiBubyBleGlzdGluZyB2YXVsdCBpcyByZWdpc3RlcmVkIGluIE9ic2lkaWFuLiBPcGVuIE9ic2lkaWFuIGFuZCBjcmVhdGUgb3Igb3BlbiBhdCBsZWFzdCBvbmUgdmF1bHQgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYnVpbGRJcGNFeHByZXNzaW9uKFxuICAgICAgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtb3BlbicsICR7SlNPTi5zdHJpbmdpZnkodmF1bHRQYXRoKX0sIGZhbHNlKTtgXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRQYXRoIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoKTtcblxuICAgIGNvbnN0IHBvbGxFeHByID0gYnVpbGRTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgJ3JldHVybiBKU09OLnN0cmluZ2lmeShhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpKTsnXG4gICAgKTtcblxuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHJlYWRpbmVzcyAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShwb2xsRXhwciwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgICAgaWYgKEpTT04ucGFyc2UoYmFzZVBhdGgpID09PSB2YXVsdFBhdGgpIHtcbiAgICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWFkeS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCBub3QgcmVhZHkgeWV0LlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIFNjaGVkdWxlcyB0aGUgdmF1bHQgd2luZG93IHRvIGNsb3NlLCB3YWl0cywgdGhlbiByZW1vdmVzIHRoZSB2YXVsdFxuICAgKiBmcm9tIHRoZSByZWdpc3RyeSB2aWEgYHZhdWx0LXJlbW92ZWAgSVBDLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBVbnJlZ2lzdGVyaW5nIHZhdWx0OiBjbG9zaW5nIHdpbmRvdyBmb3IgJHt2YXVsdFBhdGh9Li4uYCk7XG4gICAgY29uc3QgZGVzdHJveUV4cHIgPSBidWlsZFNpbXBsZUV4cHJlc3Npb24oYFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh3aW5kb3cuZWxlY3Ryb24gJiYgd2luZG93LmVsZWN0cm9uLnJlbW90ZSkge1xuICAgICAgICAgIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZGVzdHJveUV4cHIsIHsgY3dkOiB2YXVsdFBhdGgsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGNvbW1hbmQgc2VudC4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXYWl0aW5nIGZvciB3aW5kb3cgdG8gY2xvc2UuLi4nKTtcbiAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gUmVtb3ZpbmcgdmF1bHQgZnJvbSByZWdpc3RyeS4uLicpO1xuICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBidWlsZElwY0V4cHJlc3Npb24oXG4gICAgICBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1yZW1vdmUnLCAke0pTT04uc3RyaW5naWZ5KHZhdWx0UGF0aCl9KTtgXG4gICAgKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUocmVtb3ZlRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBObyBleGlzdGluZyB2YXVsdCB0byB0YXJnZXQgZm9yIHJlbW92YWwgSVBDIFx1MjAxNCBza2lwcGluZy4nKTtcbiAgICAgIH1cbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlbW92ZWQgZnJvbSByZWdpc3RyeS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgcmVnaXN0cnkgcmVtb3ZhbCBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSBQQVRILlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlcnRDbGlBdmFpbGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnd2hlcmUuZXhlIG9ic2lkaWFuJyA6ICd3aGljaCBvYnNpZGlhbic7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgbm90IGF2YWlsYWJsZS4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgaXRzIENMSSBpcyBpbiB5b3VyIFBBVEguJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYGVuYWJsZS1wbHVnaW4tPHZhdWx0SWQ+YCBpbiBPYnNpZGlhbidzIGxvY2FsU3RvcmFnZSB0byBwcmV2ZW50XG4gICAqIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGZyb20gYXBwZWFyaW5nXG4gICAqIHdoZW4gYSB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqXG4gICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgdmF1bHQtb3BlbmAgSVBDIChzbyB0aGUgdmF1bHQgSUQgZXhpc3RzIGluXG4gICAqIGBvYnNpZGlhbi5qc29uYCkgYW5kIGJlZm9yZSB0aGUgbmV3IHZhdWx0IHdpbmRvdyBmaW5pc2hlcyBsb2FkaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVFeHByID0gYnVpbGRTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgYGxvY2FsU3RvcmFnZS5zZXRJdGVtKCR7SlNPTi5zdHJpbmdpZnkoYGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfWApfSwgJ3RydWUnKTtgXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGVuYWJsZUV4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIGFzeW5jIElJRkUgdGhhdCB3YWl0cyBmb3IgbGF5b3V0IHJlYWR5IGFuZCBleGVjdXRlcyBhbiBJUEMgY2FsbC5cbiAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYEpTT04uc3RyaW5naWZ5KHVuZGVmaW5lZClgIHNvIHRoZSBDTEkgcHJvZHVjZXMgYChubyBvdXRwdXQpYC5cbiAqXG4gKiBAcGFyYW0gaXBjU3RhdGVtZW50IC0gVGhlIElQQyBzdGF0ZW1lbnQgdG8gZXhlY3V0ZS5cbiAqIEByZXR1cm5zIFRoZSBJSUZFIGV4cHJlc3Npb24gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZElwY0V4cHJlc3Npb24oaXBjU3RhdGVtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGlwY1N0YXRlbWVudCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb250ZW50IG9mIGEgdGVtcG9yYXJ5IGAuY2pzYCBzY3JpcHQgZmlsZS5cbiAqXG4gKiBUaGUgc2NyaXB0IGRlZmluZXMgYW4gYXN5bmMgYGludm9rZSgpYCBmdW5jdGlvbiB0aGF0IGV2YWx1YXRlcyB0aGVcbiAqIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IChvciBlcnJvcikgdG8gYHJlc3VsdFBhdGhgLCBhbmQgaXNcbiAqIGV4cG9ydGVkIGZvciB0aGUgQ0xJIHRvIGByZXF1aXJlKClgIGFuZCBjYWxsLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZXN1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJlc3VsdCBmaWxlLlxuICogQHBhcmFtIGludm9rZU5hbWUgLSBUaGUgdW5pcXVlIGZ1bmN0aW9uIG5hbWUgdG8gZXhwb3J0IChhdm9pZHMgY29sbGlzaW9ucykuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nLCBpbnZva2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHRQYXRoSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgcmV0dXJuIGBcInVzZSBzdHJpY3RcIjtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgc2VyaWFsaXplRXJyb3IgPSAke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcil9O1xuXG5hc3luYyBmdW5jdGlvbiAke2ludm9rZU5hbWV9KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0ICgke2V4cHJlc3Npb259KTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFwiXCIsIHR5cGU6IFwidW5kZWZpbmVkXCIgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKCR7cmVzdWx0UGF0aEpzb259LCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBcIlwiLCB0eXBlOiBcIm51bGxcIiB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFN0cmluZyhyZXN1bHQpIH0pKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHNlcmlhbGl6ZUVycm9yKGVyciksIHR5cGU6IFwiZXJyb3JcIiB9KSk7XG4gIH1cbn1cblxuZXhwb3J0cy4ke2ludm9rZU5hbWV9ID0gJHtpbnZva2VOYW1lfTtcbmA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2ltcGxlIGFzeW5jIElJRkUgZXhwcmVzc2lvbiB0aGF0IHdhaXRzIGZvciBsYXlvdXQgcmVhZHkuXG4gKlxuICogQHBhcmFtIGJvZHkgLSBUaGUgSmF2YVNjcmlwdCBzdGF0ZW1lbnRzIHRvIGV4ZWN1dGUuXG4gKiBAcmV0dXJucyBUaGUgSUlGRSBleHByZXNzaW9uIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgKGFzeW5jICgpID0+IHtcbiAgaWYgKCFhcHAud29ya3NwYWNlLmxheW91dFJlYWR5KSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKSk7XG4gIH1cbiAgJHtib2R5fVxufSkoKWA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGxvY2FsQXBwRGF0YSA9IHByb2Nlc3MuZW52WydMT0NBTEFQUERBVEEnXSA/PyAnJztcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2xvY2FsQXBwRGF0YX1cXFxcUHJvZ3JhbXNcXFxcT2JzaWRpYW5cXFxcT2JzaWRpYW4uZXhlXCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuICcvQXBwbGljYXRpb25zL09ic2lkaWFuLmFwcC9Db250ZW50cy9NYWNPUy9PYnNpZGlhbiAmJztcbiAgfVxuXG4gIHJldHVybiAnb2JzaWRpYW4gJic7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFTQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFPcEIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsV0FBVztBQUNwQixTQUFTLFlBQVk7QUFDckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsc0JBQXNCO0FBYy9CLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sc0NBQXNDO0FBQzVDLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sb0NBQW9DO0FBQzFDLE1BQU0scUNBQXFDO0FBTXBDLE1BQU0sb0JBQWlEO0FBQUE7QUFBQSxFQUU1QyxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFpQjNCLE1BQWEsU0FBUyxZQUFvQixTQUFnRDtBQUN4RixVQUFNLGNB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
311
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbi1leHByZXNzaW9uLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vbm9vcC5tanMnO1xuaW1wb3J0IHtcbiAgZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZFxufSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5tanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6ZS1lcnJvci5tanMnO1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSB0aGUgYG9ic2lkaWFuIGV2YWxgIENMSSBjb21tYW5kXG4gKiBhbmQgbWFuYWdlcyB2YXVsdHMgdmlhIEVsZWN0cm9uIElQQy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDbGlUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5janNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGludm9rZU5hbWUgPSBgaW52b2tlXyR7c2NyaXB0SWR9YDtcbiAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb24sIHJlc3VsdFBhdGgsIGludm9rZU5hbWUpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JpcHRQYXRoLCBzY3JpcHRDb250ZW50KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgbW9kdWxlLmNvbnN0cnVjdG9yLl9sb2FkIHRvIGJ5cGFzcyBhbnkgbW9ua2V5LXBhdGNoZWQgcmVxdWlyZSgpXG4gICAgICAvLyAoZS5nLiwgb2JzaWRpYW4tY29kZXNjcmlwdC10b29sa2l0IHBhdGNoZXMgcmVxdWlyZSBpbiB0aGUgcmVuZGVyZXIgcHJvY2VzcykuXG4gICAgICBjb25zdCBzYWZlUmVxdWlyZSA9IGBtb2R1bGUuY29uc3RydWN0b3IuX2xvYWQoJHtKU09OLnN0cmluZ2lmeShzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKSl9KWA7XG4gICAgICBjb25zdCByZXF1aXJlRXhwciA9IGAoYXN5bmMgKCkgPT4geyBhd2FpdCAke3NhZmVSZXF1aXJlfS4ke2ludm9rZU5hbWV9KCkgfSkoKWA7XG4gICAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsICdldmFsJywgJy0tYWxsb3ctZm9jdXMtc3RlYWwnLCBgY29kZT0ke3JlcXVpcmVFeHByfWBdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH0gXHUyMDE0IHRoZSB2YXVsdCBtYXkgbm90IGJlIGZvdW5kIG9yIE9ic2lkaWFuIGRpZCBub3QgcnVuIHRoZSBldmFsLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgZGlzYWJsZWQuIEVuYWJsZSBpdCBpbiBPYnNpZGlhbiBTZXR0aW5ncyBcXHUyMTkyIEdlbmVyYWwgXFx1MjE5MiBDTEkuJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0UGF0aCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICBpZiAoIWV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIHZhdWx0OiBubyBleGlzdGluZyB2YXVsdCBpcyByZWdpc3RlcmVkIGluIE9ic2lkaWFuLiBPcGVuIE9ic2lkaWFuIGFuZCBjcmVhdGUgb3Igb3BlbiBhdCBsZWFzdCBvbmUgdmF1bHQgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYnVpbGRJcGNFeHByZXNzaW9uKFxuICAgICAgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtb3BlbicsICR7SlNPTi5zdHJpbmdpZnkodmF1bHRQYXRoKX0sIGZhbHNlKTtgXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRQYXRoIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoLCBleGlzdGluZ1ZhdWx0UGF0aCk7XG5cbiAgICBjb25zdCBwb2xsRXhwciA9IGJ1aWxkU2ltcGxlRXhwcmVzc2lvbihcbiAgICAgICdyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSk7J1xuICAgICk7XG5cbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCByZWFkaW5lc3MgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUocG9sbEV4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICAgIGlmIChKU09OLnBhcnNlKGJhc2VQYXRoKSA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVmF1bHQgbm90IHJlYWR5IHlldC5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBTY2hlZHVsZXMgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSwgd2FpdHMsIHRoZW4gcmVtb3ZlcyB0aGUgdmF1bHRcbiAgICogZnJvbSB0aGUgcmVnaXN0cnkgdmlhIGB2YXVsdC1yZW1vdmVgIElQQy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVW5yZWdpc3RlcmluZyB2YXVsdDogY2xvc2luZyB3aW5kb3cgZm9yICR7dmF1bHRQYXRofS4uLmApO1xuICAgIGNvbnN0IGRlc3Ryb3lFeHByID0gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGBcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAod2luZG93LmVsZWN0cm9uICYmIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUpIHtcbiAgICAgICAgICB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGRlc3Ryb3lFeHByLCB7IGN3ZDogdmF1bHRQYXRoLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXaW5kb3cgZGVzdHJveSBjb21tYW5kIHNlbnQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCByZW1vdmVFeHByID0gYnVpbGRJcGNFeHByZXNzaW9uKFxuICAgICAgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtcmVtb3ZlJywgJHtKU09OLnN0cmluZ2lmeSh2YXVsdFBhdGgpfSk7YFxuICAgICk7XG4gICAgY29uc3QgZXhpc3RpbmdWYXVsdEZvclJlbW92YWwgPSBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlbW92ZUV4cHIsIHsgY3dkOiBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBWQVVMVF9FVkFMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gTm8gZXhpc3RpbmcgdmF1bHQgdG8gdGFyZ2V0IGZvciByZW1vdmFsIElQQyBcdTIwMTQgc2tpcHBpbmcuJyk7XG4gICAgICB9XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCByZW1vdmVkIGZyb20gcmVnaXN0cnkuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlZ2lzdHJ5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gUEFUSC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0Q2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ3doZXJlLmV4ZSBvYnNpZGlhbicgOiAnd2hpY2ggb2JzaWRpYW4nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSBldmFsVGFyZ2V0VmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGFzIGV2YWwgdGFyZ2V0IChhbiBleGlzdGluZywgbG9hZGVkIHZhdWx0KS5cbiAgICogICBsb2NhbFN0b3JhZ2UgaXMgc2hhcmVkIGFjcm9zcyBhbGwgT2JzaWRpYW4gd2luZG93cyAoc2FtZSBFbGVjdHJvbiBvcmlnaW4pLCBzbyB0aGVcbiAgICogICBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIGNhbGwgY2FuIHJ1biBpbiBhbnkgbG9hZGVkIHZhdWx0IHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nLCBldmFsVGFyZ2V0VmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZUV4cHIgPSBidWlsZFNpbXBsZUV4cHJlc3Npb24oXG4gICAgICBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9YCl9LCAndHJ1ZScpO2BcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZW5hYmxlRXhwciwgeyBjd2Q6IGV2YWxUYXJnZXRWYXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIGFzeW5jIElJRkUgdGhhdCB3YWl0cyBmb3IgbGF5b3V0IHJlYWR5IGFuZCBleGVjdXRlcyBhbiBJUEMgY2FsbC5cbiAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYEpTT04uc3RyaW5naWZ5KHVuZGVmaW5lZClgIHNvIHRoZSBDTEkgcHJvZHVjZXMgYChubyBvdXRwdXQpYC5cbiAqXG4gKiBAcGFyYW0gaXBjU3RhdGVtZW50IC0gVGhlIElQQyBzdGF0ZW1lbnQgdG8gZXhlY3V0ZS5cbiAqIEByZXR1cm5zIFRoZSBJSUZFIGV4cHJlc3Npb24gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZElwY0V4cHJlc3Npb24oaXBjU3RhdGVtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGlwY1N0YXRlbWVudCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb250ZW50IG9mIGEgdGVtcG9yYXJ5IGAuY2pzYCBzY3JpcHQgZmlsZS5cbiAqXG4gKiBUaGUgc2NyaXB0IGRlZmluZXMgYW4gYXN5bmMgYGludm9rZSgpYCBmdW5jdGlvbiB0aGF0IGV2YWx1YXRlcyB0aGVcbiAqIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IChvciBlcnJvcikgdG8gYHJlc3VsdFBhdGhgLCBhbmQgaXNcbiAqIGV4cG9ydGVkIGZvciB0aGUgQ0xJIHRvIGByZXF1aXJlKClgIGFuZCBjYWxsLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZXN1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJlc3VsdCBmaWxlLlxuICogQHBhcmFtIGludm9rZU5hbWUgLSBUaGUgdW5pcXVlIGZ1bmN0aW9uIG5hbWUgdG8gZXhwb3J0IChhdm9pZHMgY29sbGlzaW9ucykuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nLCBpbnZva2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHRQYXRoSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgcmV0dXJuIGBcInVzZSBzdHJpY3RcIjtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgc2VyaWFsaXplRXJyb3IgPSAke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcil9O1xuXG5hc3luYyBmdW5jdGlvbiAke2ludm9rZU5hbWV9KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0ICgke2V4cHJlc3Npb259KTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFwiXCIsIHR5cGU6IFwidW5kZWZpbmVkXCIgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKCR7cmVzdWx0UGF0aEpzb259LCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBcIlwiLCB0eXBlOiBcIm51bGxcIiB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFN0cmluZyhyZXN1bHQpIH0pKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHNlcmlhbGl6ZUVycm9yKGVyciksIHR5cGU6IFwiZXJyb3JcIiB9KSk7XG4gIH1cbn1cblxuZXhwb3J0cy4ke2ludm9rZU5hbWV9ID0gJHtpbnZva2VOYW1lfTtcbmA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2ltcGxlIGFzeW5jIElJRkUgZXhwcmVzc2lvbiB0aGF0IHdhaXRzIGZvciBsYXlvdXQgcmVhZHkuXG4gKlxuICogQHBhcmFtIGJvZHkgLSBUaGUgSmF2YVNjcmlwdCBzdGF0ZW1lbnRzIHRvIGV4ZWN1dGUuXG4gKiBAcmV0dXJucyBUaGUgSUlGRSBleHByZXNzaW9uIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgKGFzeW5jICgpID0+IHtcbiAgaWYgKCFhcHAud29ya3NwYWNlLmxheW91dFJlYWR5KSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKSk7XG4gIH1cbiAgJHtib2R5fVxufSkoKWA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGxvY2FsQXBwRGF0YSA9IHByb2Nlc3MuZW52WydMT0NBTEFQUERBVEEnXSA/PyAnJztcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2xvY2FsQXBwRGF0YX1cXFxcUHJvZ3JhbXNcXFxcT2JzaWRpYW5cXFxcT2JzaWRpYW4uZXhlXCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuICcvQXBwbGljYXRpb25zL09ic2lkaWFuLmFwcC9Db250ZW50cy9NYWNPUy9PYnNpZGlhbiAmJztcbiAgfVxuXG4gIHJldHVybiAnb2JzaWRpYW4gJic7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFTQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFPcEIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsV0FBVztBQUNwQixTQUFTLFlBQVk7QUFDckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "2.5.8",
3
+ "version": "2.5.9",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",