@rdfc/js-runner 3.0.2 → 3.0.4-remote

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/README.md +41 -1
  3. package/__tests__/echoProcessor.test.ts +11 -12
  4. package/bin/runner.js +7 -1
  5. package/bin/server.js +13 -0
  6. package/bun.lock +820 -0
  7. package/examples/echo/.idea/echo.iml +9 -0
  8. package/examples/echo/.idea/misc.xml +6 -0
  9. package/{.idea → examples/echo/.idea}/modules.xml +1 -1
  10. package/examples/echo/.idea/vcs.xml +7 -0
  11. package/examples/echo/.swls/config.json +1 -0
  12. package/examples/echo/package-lock.json +27 -29
  13. package/examples/echo/pipeline.ttl +0 -1
  14. package/examples/echo/processors.ttl +1 -1
  15. package/examples/echo/remote_pipeline.ttl +18 -0
  16. package/examples/echo/server.ttl +5 -0
  17. package/examples/echo/untitled:/types/MyType.ttl +0 -0
  18. package/file:/home/silvius/Projects/mumo-pipeline/ldes/http_3A_2F_2Fdata.mumo.be_2Fstreams_2Fnodes_2Fdefault/root/index.trig +3 -0
  19. package/ldes/http_3A_2F_2Fdata.mumo.be_2Fstreams_2Fnodes_2Fdefault/root/index.trig +3 -0
  20. package/lib/client.d.ts +2 -1
  21. package/lib/client.js +70 -22
  22. package/lib/index.d.ts +2 -0
  23. package/lib/index.js +3 -1
  24. package/lib/jsonld.d.ts +17 -0
  25. package/lib/jsonld.js +135 -0
  26. package/lib/logger.d.ts +1 -0
  27. package/lib/logger.js +19 -9
  28. package/lib/reader.d.ts +4 -1
  29. package/lib/reader.js +11 -3
  30. package/lib/runner.d.ts +6 -1
  31. package/lib/runner.js +43 -15
  32. package/lib/server.d.ts +9 -0
  33. package/lib/server.js +459 -0
  34. package/lib/state.d.ts +32 -0
  35. package/lib/state.js +71 -0
  36. package/lib/testUtils/duplex.js +1 -1
  37. package/lib/testUtils/index.d.ts +9 -9
  38. package/lib/testUtils/index.js +9 -9
  39. package/lib/testUtils.d.ts +24 -0
  40. package/lib/testUtils.js +150 -0
  41. package/lib/tsconfig.tsbuildinfo +1 -1
  42. package/lib/writer.d.ts +5 -1
  43. package/lib/writer.js +26 -10
  44. package/minimal.ttl +99 -0
  45. package/package.json +21 -19
  46. package/src/client.ts +99 -24
  47. package/src/index.ts +2 -0
  48. package/src/logger.ts +15 -7
  49. package/src/reader.ts +19 -9
  50. package/src/runner.ts +61 -12
  51. package/src/server.ts +545 -0
  52. package/src/state.ts +105 -0
  53. package/src/testUtils/duplex.ts +1 -4
  54. package/src/testUtils/index.ts +25 -21
  55. package/src/writer.ts +36 -12
  56. package/.idea/LNKD.tech Editor.xml +0 -194
  57. package/.idea/codeStyles/Project.xml +0 -52
  58. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  59. package/.idea/copilot.data.migration.agent.xml +0 -6
  60. package/.idea/copilot.data.migration.ask.xml +0 -6
  61. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  62. package/.idea/copilot.data.migration.edit.xml +0 -6
  63. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  64. package/.idea/js-runner.iml +0 -12
  65. package/.idea/vcs.xml +0 -6
  66. package/dist/args.d.ts +0 -4
  67. package/dist/args.js +0 -58
  68. package/dist/connectors/file.d.ts +0 -15
  69. package/dist/connectors/file.js +0 -89
  70. package/dist/connectors/http.d.ts +0 -14
  71. package/dist/connectors/http.js +0 -82
  72. package/dist/connectors/kafka.d.ts +0 -48
  73. package/dist/connectors/kafka.js +0 -68
  74. package/dist/connectors/ws.d.ts +0 -10
  75. package/dist/connectors/ws.js +0 -72
  76. package/dist/connectors.d.ts +0 -73
  77. package/dist/connectors.js +0 -168
  78. package/dist/index.cjs +0 -732
  79. package/dist/index.d.ts +0 -42
  80. package/dist/index.js +0 -83
  81. package/dist/tsconfig.tsbuildinfo +0 -1
  82. package/dist/util.d.ts +0 -71
  83. package/dist/util.js +0 -92
  84. package/jest.config.js +0 -2
package/lib/reader.js CHANGED
@@ -57,12 +57,14 @@ export class ReaderInstance {
57
57
  uri;
58
58
  logger;
59
59
  notifyOrchestrator;
60
+ tracker;
60
61
  consumers = [];
61
- constructor(uri, client, notifyOrchestrator, logger) {
62
+ constructor(uri, client, notifyOrchestrator, logger, tracker) {
62
63
  this.uri = uri;
63
64
  this.client = client;
64
65
  this.logger = logger;
65
66
  this.notifyOrchestrator = notifyOrchestrator;
67
+ this.tracker = tracker;
66
68
  }
67
69
  anys() {
68
70
  const iter = new MyIter(AnyConvertor);
@@ -86,6 +88,7 @@ export class ReaderInstance {
86
88
  }
87
89
  handleMsg(msg) {
88
90
  this.logger.debug(`${this.uri} handling message`);
91
+ this.tracker?.recordMessage(msg.data.length);
89
92
  const promises = [];
90
93
  for (const iter of this.consumers) {
91
94
  promises.push(new Promise((res) => iter.push(msg.data, () => res(null))));
@@ -97,13 +100,18 @@ export class ReaderInstance {
97
100
  },
98
101
  }));
99
102
  }
103
+ hasClosed = false;
100
104
  close() {
105
+ if (this.hasClosed)
106
+ return;
107
+ this.hasClosed = true;
101
108
  for (const iter of this.consumers) {
102
109
  iter.close(() => { });
103
110
  }
104
111
  }
105
112
  async handleStreamingMessage({ channel, globalSequenceNumber, }) {
106
113
  this.logger.debug(`${this.uri} handling streaming message`);
114
+ this.tracker?.recordMessage(0);
107
115
  const chunks = this.client.receiveStreamMessage();
108
116
  const writeControlMessage = promisify(chunks.write.bind(chunks));
109
117
  const consumersConsumed = [];
@@ -116,7 +124,7 @@ export class ReaderInstance {
116
124
  }
117
125
  await writeControlMessage({ globalSequenceNumber });
118
126
  Promise.all(consumersConsumed).then(() => {
119
- console.log('Writing processed for streaming message');
127
+ chunks.end();
120
128
  this.notifyOrchestrator({ processed: { globalSequenceNumber, channel } });
121
129
  });
122
130
  }
@@ -208,4 +216,4 @@ function fanoutStream(stream, numConsumers, onAllHandled) {
208
216
  const rawIterables = Array.from({ length: numConsumers }, makeIterable);
209
217
  return rawIterables.map(wrap);
210
218
  }
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQ0wsWUFBWSxFQUVaLFdBQVcsRUFDWCxlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLGFBQWEsQ0FBQTtBQUVwQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBMEJoQyxNQUFNLE1BQU07SUFDRixTQUFTLENBQWM7SUFDdkIsS0FBSyxHQUEwQixFQUFFLENBQUE7SUFDakMsV0FBVyxHQUF3QyxJQUFJLENBQUE7SUFFL0QsWUFBWSxTQUF1QjtRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUM1QixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQWtCLEVBQUUsVUFBc0I7UUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQXNCO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7UUFDekIsQ0FBQztJQUNILENB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S0FBSyxDQUFDLE1BQU07d0JBQ1YsZUFBZSxFQUFFLENBQUE7d0JBQ2pCLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUMxQixHQUFHLEVBQUUsQ0FBQTt3QkFDUCxDQUFDO3dCQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQTtvQkFDekMsQ0FBQztpQkFDRixDQUFBO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsS0FBSyxVQUFVLEdBQUc7UUFDaEIsV0FBVyxFQUFFLENBQUE7UUFDYixJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUV0QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDZCxNQUFNLFlBQVksRUFBRSxDQUFBO1lBQ3BCLEtBQUssRUFBRSxDQUFBO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFHRCxTQUFTLElBQUksQ0FBQyxRQUEwQjtRQUN0QyxPQUFPO1lBQ0wsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUMzQixJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxJQUFJLENBQUE7b0JBQ1YsTUFBTSxHQUFHLEVBQUUsQ0FBQTtnQkFDYixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN2RSxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaWVudFJlYWRhYmxlU3RyZWFtIH0gZnJvbSAnQGdycGMvZ3JwYy1qcydcbmltcG9ydCB7XG4gIERhdGFDaHVuayxcbiAgUmVjZWl2aW5nTWVzc2FnZSxcbiAgUmVjZWl2aW5nU3RyZWFtTWVzc2FnZSxcbiAgUnVubmVyQ2xpZW50LFxufSBmcm9tICdAcmRmYy9wcm90bydcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ3dpbnN0b24nXG5pbXBvcnQge1xuICBBbnlDb252ZXJ0b3IsXG4gIENvbnZlcnRvcixcbiAgTm9Db252ZXJ0b3IsXG4gIFN0cmVhbUNvbnZlcnRvcixcbiAgU3RyaW5nQ29udmVydG9yLFxufSBmcm9tICcuL2NvbnZlcnRvcidcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnLi9ydW5uZXInXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJ1xuXG5leHBvcnQgdHlwZSBBbnkgPVxuICB8IHtcbiAgICBzdHJpbmc6IHN0cmluZ1xuICB9XG4gIHwge1xuICAgIHN0cmVhbTogQXN5bmNHZW5lcmF0b3I8VWludDhBcnJheT5cbiAgfVxuICB8IHtcbiAgICBidWZmZXI6IFVpbnQ4QXJyYXlcbiAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRlciB7XG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nXG4gIHN0cmluZ3MoKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+XG4gIHN0cmVhbXMoKTogQXN5bmNJdGVyYWJsZTxBc3luY0dlbmVyYXRvcjxVaW50OEFycmF5Pj5cbiAgYnVmZmVycygpOiBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+XG4gIGFueXMoKTogQXN5bmNJdGVyYWJsZTxBbnk+XG59XG5cbnR5cGUgVG9kbzxUPiA9IHtcbiAgaXRlbTogVFxuICBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkXG59XG5cbmNsYXNzIE15SXRlcjxUPiBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8VD4ge1xuICBwcml2YXRlIGNvbnZlcnRvcjogQ29udmVydG9yPFQ+XG4gIHByaXZhdGUgcXVldWU6IFRvZG88VCB8IHVuZGVmaW5lZD5bXSA9IFtdXG4gIHByaXZhdGUgcmVzb2x2ZU5leHQ6ICgodmFsdWU6IHVuZGVmaW5lZCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yKGNvbnZlcnRvcjogQ29udmVydG9yPFQ+KSB7XG4gICAgdGhpcy5jb252ZXJ0b3IgPSBjb252ZXJ0b3JcbiAgfVxuXG4gIHB1c2goYnVmZmVyOiBVaW50OEFycmF5LCBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuY29udmVydG9yLmZyb20oYnVmZmVyKVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW0sIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNsb3NlKG9uQ29tcGxldGU6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnF1ZXVlLnB1c2goeyBpdGVtOiB1bmRlZmluZWQsIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHB1c2hTdHJlYW0oY2h1bmtzOiBBc3luY0l0ZXJhYmxlPERhdGFDaHVuaz4sIG9uQ29tcGxldGU6ICgpID0+IHZvaWQpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIGdlbmVyYXRvciB0aGF0IHRyYW5zZm9ybXMgRGF0YUNodW5rcyB0byBCdWZmZXJzXG4gICAgY29uc3Qgc3RyZWFtID0gKGFzeW5jIGZ1bmN0aW9uKihzdHJlYW0pIHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc3RyZWFtKSB7XG4gICAgICAgIHlpZWxkIGNodW5rLmRhdGFcbiAgICAgIH1cbiAgICB9KShjaHVua3MpXG5cbiAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5jb252ZXJ0b3IuZnJvbVN0cmVhbShzdHJlYW0pXG4gICAgdGhpcy5xdWV1ZS5wdXNoKHsgaXRlbSwgb25Db21wbGV0ZSB9KVxuICAgIGlmICh0aGlzLnJlc29sdmVOZXh0KSB7XG4gICAgICB0aGlzLnJlc29sdmVOZXh0KHVuZGVmaW5lZClcbiAgICAgIHRoaXMucmVzb2x2ZU5leHQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgeyBpdGVtLCBvbkNvbXBsZXRlIH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCkhXG4gICAgICAgIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvbkNvbXBsZXRlKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIGl0ZW1cbiAgICAgICAgLy8gTm90ZTogZXhlY3V0aW9uIHBhdXNlcyBhdCBgeWllbGRgIHVudGlsIHRoZSBjb25zdW1lciBjYWxscyBgLm5leHQoKWAgYWdhaW4uXG4gICAgICAgIC8vIFdlIGNhbGwgb25Db21wbGV0ZSAqYWZ0ZXIqIHJlc3VtaW5nLCBzbyB0aGUgcHJvZHVjZXIga25vd3MgdGhlIGl0ZW0gd2FzIGFjdHVhbGx5IGNvbnN1bWVkLlxuICAgICAgICBvbkNvbXBsZXRlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHVuZGVmaW5lZD4oKHJlc29sdmUpID0+ICh0aGlzLnJlc29sdmVOZXh0ID0gcmVzb2x2ZSkpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWFkZXJJbnN0YW5jZSBpbXBsZW1lbnRzIFJlYWRlciB7XG4gIHByaXZhdGUgY2xpZW50OiBSdW5uZXJDbGllbnRcbiAgcmVhZG9ubHkgdXJpOiBzdHJpbmdcbiAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclxuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmeU9yY2hlc3RyYXRvcjogV3JpdGFibGVcblxuICBwcml2YXRlIGNvbnN1bWVyczogTXlJdGVyPHVua25vd24+W10gPSBbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHVyaTogc3RyaW5nLFxuICAgIGNsaWVudDogUnVubmVyQ2xpZW50LFxuICAgIG5vdGlmeU9yY2hlc3RyYXRvcjogV3JpdGFibGUsXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICkge1xuICAgIHRoaXMudXJpID0gdXJpXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgIHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yID0gbm90aWZ5T3JjaGVzdHJhdG9yXG4gIH1cblxuICBhbnlzKCk6IEFzeW5jSXRlcmFibGU8QW55PiB7XG4gICAgY29uc3QgaXRlciA9IG5ldyBNeUl0ZXIoQW55Q29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgc3RyaW5ncygpOiBBc3luY0l0ZXJhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKFN0cmluZ0NvbnZlcnRvcilcbiAgICB0aGlzLmNvbnN1bWVycy5wdXNoKGl0ZXIpXG4gICAgcmV0dXJuIGl0ZXJcbiAgfVxuXG4gIGJ1ZmZlcnMoKTogQXN5bmNJdGVyYWJsZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgaXRlciA9IG5ldyBNeUl0ZXIoTm9Db252ZXJ0b3IpXG4gICAgdGhpcy5jb25zdW1lcnMucHVzaChpdGVyKVxuICAgIHJldHVybiBpdGVyXG4gIH1cblxuICBzdHJlYW1zKCk6IEFzeW5jSXRlcmFibGU8QXN5bmNHZW5lcmF0b3I8VWludDhBcnJheT4+IHtcbiAgICBjb25zdCBpdGVyID0gbmV3IE15SXRlcihTdHJlYW1Db252ZXJ0b3IpXG4gICAgdGhpcy5jb25zdW1lcnMucHVzaChpdGVyKVxuICAgIHJldHVybiBpdGVyXG4gIH1cblxuICBoYW5kbGVNc2cobXNnOiBSZWNlaXZpbmdNZXNzYWdlKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dGhpcy51cml9IGhhbmRsaW5nIG1lc3NhZ2VgKVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXVxuICAgIGZvciAoY29uc3QgaXRlciBvZiB0aGlzLmNvbnN1bWVycykge1xuICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZSgocmVzKSA9PiBpdGVyLnB1c2gobXNnLmRhdGEsICgpID0+IHJlcyhudWxsKSkpKVxuICAgIH1cblxuICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+XG4gICAgICB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvcih7XG4gICAgICAgIHByb2Nlc3NlZDoge1xuICAgICAgICAgIGdsb2JhbFNlcXVlbmNlTnVtYmVyOiBtc2cuZ2xvYmFsU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgY2hhbm5lbDogdGhpcy51cmksXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIGl0ZXIuY2xvc2UoKCkgPT4geyB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIFRoZXJlIGlzIGEgc3RyZWFtIG1lc3NhZ2UgYXZhaWxhYmxlIGZvciB0aGlzIHJlYWRlclxuICBhc3luYyBoYW5kbGVTdHJlYW1pbmdNZXNzYWdlKHtcbiAgICBjaGFubmVsLFxuICAgIGdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICB9OiBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dGhpcy51cml9IGhhbmRsaW5nIHN0cmVhbWluZyBtZXNzYWdlYClcblxuICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuY2xpZW50LnJlY2VpdmVTdHJlYW1NZXNzYWdlKClcbiAgICBjb25zdCB3cml0ZUNvbnRyb2xNZXNzYWdlID0gcHJvbWlzaWZ5KGNodW5rcy53cml0ZS5iaW5kKGNodW5rcykpXG4gICAgY29uc3QgY29uc3VtZXJzQ29uc3VtZWQgPSBbXVxuXG4gICAgLy8gQWZ0ZXIgZWFjaCBjaHVuayBpcyBoYW5kbGVkIGJ5IGFsbCBjb25zdW1lciwgZW1pdCBhIHByb2Nlc3NlZCBtZXNzYWdlXG4gICAgbGV0IGlkeCA9IDBcbiAgICBjb25zdCBtZXNzYWdlSXRlcmF0b3JzID0gZmFub3V0U3RyZWFtKFxuICAgICAgY2h1bmtzLFxuICAgICAgdGhpcy5jb25zdW1lcnMubGVuZ3RoLFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB3cml0ZUNvbnRyb2xNZXNzYWdlKHsgc3RyZWFtU2VxdWVuY2VOdW1iZXI6IGlkeCsrIH0pXG4gICAgICB9LFxuICAgIClcblxuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIGNvbnN1bWVyc0NvbnN1bWVkLnB1c2goXG4gICAgICAgIG5ldyBQcm9taXNlKChyZXMpID0+XG4gICAgICAgICAgY29uc3VtZXIucHVzaFN0cmVhbShtZXNzYWdlSXRlcmF0b3JzLnBvcCgpISwgKCkgPT4gcmVzKG51bGwpKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUNvbnRyb2xNZXNzYWdlKHsgZ2xvYmFsU2VxdWVuY2VOdW1iZXIgfSlcblxuICAgIFByb21pc2UuYWxsKGNvbnN1bWVyc0NvbnN1bWVkKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdXcml0aW5nIHByb2Nlc3NlZCBmb3Igc3RyZWFtaW5nIG1lc3NhZ2UnKVxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IoeyBwcm9jZXNzZWQ6IHsgZ2xvYmFsU2VxdWVuY2VOdW1iZXIsIGNoYW5uZWwgfSB9KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gdGVlIGEgc3RyZWFtIGBudW1Db25zdW1lcnNgIHRpbWVzXG4gKiBXaGVuIGVhY2ggdGVlJ2Qgc3RyZWFtIGhhcyBoYW5kbGVkIGEgY2h1bmssIGNhbGwge0BsaW5rIG9uQWxsSGFuZGxlZH1cbiAqL1xuZnVuY3Rpb24gZmFub3V0U3RyZWFtPFQ+KFxuICBzdHJlYW06IENsaWVudFJlYWRhYmxlU3RyZWFtPFQ+LFxuICBudW1Db25zdW1lcnM6IG51bWJlcixcbiAgb25BbGxIYW5kbGVkOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbik6IEFzeW5jSXRlcmFibGU8VD5bXSB7XG4gIHR5cGUgV2FpdGVyID0gKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxUPikgPT4gdm9pZFxuXG4gIGxldCBlbmRlZCA9IGZhbHNlXG4gIGNvbnN0IGJ1ZmZlcjogVFtdID0gW11cbiAgY29uc3QgcGVuZGluZzogV2FpdGVyW10gPSBbXVxuICBsZXQgYWN0aXZlQ29uc3VtZXJzID0gbnVtQ29uc3VtZXJzXG5cbiAgLy8gY29uc3VtZXIgYm9va2tlZXBpbmdcbiAgbGV0IGF3YWl0aW5nQWNrID0gMFxuXG4gIGZ1bmN0aW9uIHB1c2hDaHVuayhjaHVuazogVCkge1xuICAgIGJ1ZmZlci5wdXNoKGNodW5rKVxuICAgIGZsdXNoKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID4gMCAmJiBwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYnVmZmVyWzBdIC8vIGtlZXAgdW50aWwgYWxsIGNvbnN1bWVycyBhY2tcbiAgICAgIGNvbnN0IHdhaXRlciA9IHBlbmRpbmcuc2hpZnQoKSFcbiAgICAgIHdhaXRlcih7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSlcbiAgICAgIGF3YWl0aW5nQWNrKytcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbmQoKSB7XG4gICAgZW5kZWQgPSB0cnVlXG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd2FpdGVyID0gcGVuZGluZy5zaGlmdCgpIVxuICAgICAgd2FpdGVyKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5vbignZGF0YScsIChjaHVuazogVCkgPT4ge1xuICAgIHB1c2hDaHVuayhjaHVuaylcbiAgfSlcblxuICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICBlbmQoKVxuICB9KVxuXG4gIHN0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd2FpdGVyID0gcGVuZGluZy5zaGlmdCgpIVxuICAgICAgd2FpdGVyKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJcbiAgfSlcblxuICBmdW5jdGlvbiBtYWtlSXRlcmFibGUoKTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBidWZmZXJbMF1cbiAgICAgICAgICAgICAgYXdhaXRpbmdBY2srK1xuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy5wdXNoKHJlc29sdmUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAgICAgYWN0aXZlQ29uc3VtZXJzLS1cbiAgICAgICAgICAgIGlmIChhY3RpdmVDb25zdW1lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgZW5kKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYWNrKCkge1xuICAgIGF3YWl0aW5nQWNrLS1cbiAgICBpZiAoYXdhaXRpbmdBY2sgPT09IDApIHtcbiAgICAgIC8vIGFsbCBjb25zdW1lcnMgZG9uZSB3aXRoIHRoZSBjdXJyZW50IGNodW5rXG4gICAgICBidWZmZXIuc2hpZnQoKSAvLyBkcm9wIGl0XG4gICAgICBhd2FpdCBvbkFsbEhhbmRsZWQoKVxuICAgICAgZmx1c2goKSAvLyBjb250aW51ZSB3aXRoIG5leHQgY2h1bmtcbiAgICB9XG4gIH1cblxuICAvLyB3cmFwIGNvbnN1bWVyIHNvIHRoZXkgKm11c3QqIGNhbGwgYWNrKCkgYWZ0ZXIgcHJvY2Vzc2luZ1xuICBmdW5jdGlvbiB3cmFwKGl0ZXJhYmxlOiBBc3luY0l0ZXJhYmxlPFQ+KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICB5aWVsZCBpdGVtXG4gICAgICAgICAgYXdhaXQgYWNrKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICBjb25zdCByYXdJdGVyYWJsZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1Db25zdW1lcnMgfSwgbWFrZUl0ZXJhYmxlKVxuICByZXR1cm4gcmF3SXRlcmFibGVzLm1hcCh3cmFwKVxufVxuIl19
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQ0wsWUFBWSxFQUVaLFdBQVcsRUFDWCxlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLGFBQWEsQ0FBQTtBQUVwQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBMkJoQyxNQUFNLE1BQU07SUFDRixTQUFTLENBQWM7SUFDdkIsS0FBSyxHQUEwQixFQUFFLENBQUE7SUFDakMsV0FBVyxHQUF3QyxJQUFJLENBQUE7SUFFL0QsWUFBWSxTQUF1QjtRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUM1QixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQWtCLEVBQUUsVUFBc0I7UUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQXNCO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7UUFDekIsQ0FBQztJQUNILENB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QVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFBO0lBQ3ZFLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xpZW50UmVhZGFibGVTdHJlYW0gfSBmcm9tICdAZ3JwYy9ncnBjLWpzJ1xuaW1wb3J0IHtcbiAgRGF0YUNodW5rLFxuICBSZWNlaXZpbmdNZXNzYWdlLFxuICBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlLFxuICBSdW5uZXJDbGllbnQsXG59IGZyb20gJ0ByZGZjL3Byb3RvJ1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnd2luc3RvbidcbmltcG9ydCB7XG4gIEFueUNvbnZlcnRvcixcbiAgQ29udmVydG9yLFxuICBOb0NvbnZlcnRvcixcbiAgU3RyZWFtQ29udmVydG9yLFxuICBTdHJpbmdDb252ZXJ0b3IsXG59IGZyb20gJy4vY29udmVydG9yJ1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tICcuL3J1bm5lcidcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnXG5pbXBvcnQgeyBDaGFubmVsVHJhY2tlciB9IGZyb20gJy4vc3RhdGUnXG5cbmV4cG9ydCB0eXBlIEFueSA9XG4gIHwge1xuICAgICAgc3RyaW5nOiBzdHJpbmdcbiAgICB9XG4gIHwge1xuICAgICAgc3RyZWFtOiBBc3luY0dlbmVyYXRvcjxVaW50OEFycmF5PlxuICAgIH1cbiAgfCB7XG4gICAgICBidWZmZXI6IFVpbnQ4QXJyYXlcbiAgICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZGVyIHtcbiAgcmVhZG9ubHkgdXJpOiBzdHJpbmdcbiAgc3RyaW5ncygpOiBBc3luY0l0ZXJhYmxlPHN0cmluZz5cbiAgc3RyZWFtcygpOiBBc3luY0l0ZXJhYmxlPEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+PlxuICBidWZmZXJzKCk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT5cbiAgYW55cygpOiBBc3luY0l0ZXJhYmxlPEFueT5cbn1cblxudHlwZSBUb2RvPFQ+ID0ge1xuICBpdGVtOiBUXG4gIG9uQ29tcGxldGU6ICgpID0+IHZvaWRcbn1cblxuY2xhc3MgTXlJdGVyPFQ+IGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxUPiB7XG4gIHByaXZhdGUgY29udmVydG9yOiBDb252ZXJ0b3I8VD5cbiAgcHJpdmF0ZSBxdWV1ZTogVG9kbzxUIHwgdW5kZWZpbmVkPltdID0gW11cbiAgcHJpdmF0ZSByZXNvbHZlTmV4dDogKCh2YWx1ZTogdW5kZWZpbmVkKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoY29udmVydG9yOiBDb252ZXJ0b3I8VD4pIHtcbiAgICB0aGlzLmNvbnZlcnRvciA9IGNvbnZlcnRvclxuICB9XG5cbiAgcHVzaChidWZmZXI6IFVpbnQ4QXJyYXksIG9uQ29tcGxldGU6ICgpID0+IHZvaWQpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5jb252ZXJ0b3IuZnJvbShidWZmZXIpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKHsgaXRlbSwgb25Db21wbGV0ZSB9KVxuICAgIGlmICh0aGlzLnJlc29sdmVOZXh0KSB7XG4gICAgICB0aGlzLnJlc29sdmVOZXh0KHVuZGVmaW5lZClcbiAgICAgIHRoaXMucmVzb2x2ZU5leHQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgY2xvc2Uob25Db21wbGV0ZTogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW06IHVuZGVmaW5lZCwgb25Db21wbGV0ZSB9KVxuICAgIGlmICh0aGlzLnJlc29sdmVOZXh0KSB7XG4gICAgICB0aGlzLnJlc29sdmVOZXh0KHVuZGVmaW5lZClcbiAgICAgIHRoaXMucmVzb2x2ZU5leHQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcHVzaFN0cmVhbShjaHVua3M6IEFzeW5jSXRlcmFibGU8RGF0YUNodW5rPiwgb25Db21wbGV0ZTogKCkgPT4gdm9pZCkge1xuICAgIC8vIFRoaXMgaXMgYW4gYXN5bmMgZ2VuZXJhdG9yIHRoYXQgdHJhbnNmb3JtcyBEYXRhQ2h1bmtzIHRvIEJ1ZmZlcnNcbiAgICBjb25zdCBzdHJlYW0gPSAoYXN5bmMgZnVuY3Rpb24qIChzdHJlYW0pIHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc3RyZWFtKSB7XG4gICAgICAgIHlpZWxkIGNodW5rLmRhdGFcbiAgICAgIH1cbiAgICB9KShjaHVua3MpXG5cbiAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5jb252ZXJ0b3IuZnJvbVN0cmVhbShzdHJlYW0pXG4gICAgdGhpcy5xdWV1ZS5wdXNoKHsgaXRlbSwgb25Db21wbGV0ZSB9KVxuICAgIGlmICh0aGlzLnJlc29sdmVOZXh0KSB7XG4gICAgICB0aGlzLnJlc29sdmVOZXh0KHVuZGVmaW5lZClcbiAgICAgIHRoaXMucmVzb2x2ZU5leHQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgeyBpdGVtLCBvbkNvbXBsZXRlIH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCkhXG4gICAgICAgIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvbkNvbXBsZXRlKClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIGl0ZW1cbiAgICAgICAgLy8gTm90ZTogZXhlY3V0aW9uIHBhdXNlcyBhdCBgeWllbGRgIHVudGlsIHRoZSBjb25zdW1lciBjYWxscyBgLm5leHQoKWAgYWdhaW4uXG4gICAgICAgIC8vIFdlIGNhbGwgb25Db21wbGV0ZSAqYWZ0ZXIqIHJlc3VtaW5nLCBzbyB0aGUgcHJvZHVjZXIga25vd3MgdGhlIGl0ZW0gd2FzIGFjdHVhbGx5IGNvbnN1bWVkLlxuICAgICAgICBvbkNvbXBsZXRlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHVuZGVmaW5lZD4oKHJlc29sdmUpID0+ICh0aGlzLnJlc29sdmVOZXh0ID0gcmVzb2x2ZSkpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWFkZXJJbnN0YW5jZSBpbXBsZW1lbnRzIFJlYWRlciB7XG4gIHByaXZhdGUgY2xpZW50OiBSdW5uZXJDbGllbnRcbiAgcmVhZG9ubHkgdXJpOiBzdHJpbmdcbiAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclxuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmeU9yY2hlc3RyYXRvcjogV3JpdGFibGVcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFja2VyOiBDaGFubmVsVHJhY2tlciB8IHVuZGVmaW5lZFxuXG4gIHByaXZhdGUgY29uc3VtZXJzOiBNeUl0ZXI8dW5rbm93bj5bXSA9IFtdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgdXJpOiBzdHJpbmcsXG4gICAgY2xpZW50OiBSdW5uZXJDbGllbnQsXG4gICAgbm90aWZ5T3JjaGVzdHJhdG9yOiBXcml0YWJsZSxcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICB0cmFja2VyPzogQ2hhbm5lbFRyYWNrZXIsXG4gICkge1xuICAgIHRoaXMudXJpID0gdXJpXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgIHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yID0gbm90aWZ5T3JjaGVzdHJhdG9yXG4gICAgdGhpcy50cmFja2VyID0gdHJhY2tlclxuICB9XG5cbiAgYW55cygpOiBBc3luY0l0ZXJhYmxlPEFueT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKEFueUNvbnZlcnRvcilcbiAgICB0aGlzLmNvbnN1bWVycy5wdXNoKGl0ZXIpXG4gICAgcmV0dXJuIGl0ZXJcbiAgfVxuXG4gIHN0cmluZ3MoKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpdGVyID0gbmV3IE15SXRlcihTdHJpbmdDb252ZXJ0b3IpXG4gICAgdGhpcy5jb25zdW1lcnMucHVzaChpdGVyKVxuICAgIHJldHVybiBpdGVyXG4gIH1cblxuICBidWZmZXJzKCk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKE5vQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgc3RyZWFtcygpOiBBc3luY0l0ZXJhYmxlPEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+PiB7XG4gICAgY29uc3QgaXRlciA9IG5ldyBNeUl0ZXIoU3RyZWFtQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgaGFuZGxlTXNnKG1zZzogUmVjZWl2aW5nTWVzc2FnZSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke3RoaXMudXJpfSBoYW5kbGluZyBtZXNzYWdlYClcbiAgICB0aGlzLnRyYWNrZXI/LnJlY29yZE1lc3NhZ2UobXNnLmRhdGEubGVuZ3RoKVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXVxuICAgIGZvciAoY29uc3QgaXRlciBvZiB0aGlzLmNvbnN1bWVycykge1xuICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZSgocmVzKSA9PiBpdGVyLnB1c2gobXNnLmRhdGEsICgpID0+IHJlcyhudWxsKSkpKVxuICAgIH1cblxuICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+XG4gICAgICB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvcih7XG4gICAgICAgIHByb2Nlc3NlZDoge1xuICAgICAgICAgIGdsb2JhbFNlcXVlbmNlTnVtYmVyOiBtc2cuZ2xvYmFsU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgY2hhbm5lbDogdGhpcy51cmksXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGhhc0Nsb3NlZCA9IGZhbHNlXG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuaGFzQ2xvc2VkKSByZXR1cm5cbiAgICB0aGlzLmhhc0Nsb3NlZCA9IHRydWVcbiAgICBmb3IgKGNvbnN0IGl0ZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIGl0ZXIuY2xvc2UoKCkgPT4ge30pXG4gICAgfVxuICB9XG5cbiAgLy8gVGhlcmUgaXMgYSBzdHJlYW0gbWVzc2FnZSBhdmFpbGFibGUgZm9yIHRoaXMgcmVhZGVyXG4gIGFzeW5jIGhhbmRsZVN0cmVhbWluZ01lc3NhZ2Uoe1xuICAgIGNoYW5uZWwsXG4gICAgZ2xvYmFsU2VxdWVuY2VOdW1iZXIsXG4gIH06IFJlY2VpdmluZ1N0cmVhbU1lc3NhZ2UpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHt0aGlzLnVyaX0gaGFuZGxpbmcgc3RyZWFtaW5nIG1lc3NhZ2VgKVxuICAgIHRoaXMudHJhY2tlcj8ucmVjb3JkTWVzc2FnZSgwKVxuXG4gICAgY29uc3QgY2h1bmtzID0gdGhpcy5jbGllbnQucmVjZWl2ZVN0cmVhbU1lc3NhZ2UoKVxuICAgIGNvbnN0IHdyaXRlQ29udHJvbE1lc3NhZ2UgPSBwcm9taXNpZnkoY2h1bmtzLndyaXRlLmJpbmQoY2h1bmtzKSlcbiAgICBjb25zdCBjb25zdW1lcnNDb25zdW1lZCA9IFtdXG5cbiAgICAvLyBBZnRlciBlYWNoIGNodW5rIGlzIGhhbmRsZWQgYnkgYWxsIGNvbnN1bWVyLCBlbWl0IGEgcHJvY2Vzc2VkIG1lc3NhZ2VcbiAgICBsZXQgaWR4ID0gMFxuICAgIGNvbnN0IG1lc3NhZ2VJdGVyYXRvcnMgPSBmYW5vdXRTdHJlYW0oXG4gICAgICBjaHVua3MsXG4gICAgICB0aGlzLmNvbnN1bWVycy5sZW5ndGgsXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHdyaXRlQ29udHJvbE1lc3NhZ2UoeyBzdHJlYW1TZXF1ZW5jZU51bWJlcjogaWR4KysgfSlcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmNvbnN1bWVycykge1xuICAgICAgY29uc3VtZXJzQ29uc3VtZWQucHVzaChcbiAgICAgICAgbmV3IFByb21pc2UoKHJlcykgPT5cbiAgICAgICAgICBjb25zdW1lci5wdXNoU3RyZWFtKG1lc3NhZ2VJdGVyYXRvcnMucG9wKCkhLCAoKSA9PiByZXMobnVsbCkpLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlQ29udHJvbE1lc3NhZ2UoeyBnbG9iYWxTZXF1ZW5jZU51bWJlciB9KVxuXG4gICAgUHJvbWlzZS5hbGwoY29uc3VtZXJzQ29uc3VtZWQpLnRoZW4oKCkgPT4ge1xuICAgICAgY2h1bmtzLmVuZCgpXG4gICAgICB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvcih7IHByb2Nlc3NlZDogeyBnbG9iYWxTZXF1ZW5jZU51bWJlciwgY2hhbm5lbCB9IH0pXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB0ZWUgYSBzdHJlYW0gYG51bUNvbnN1bWVyc2AgdGltZXNcbiAqIFdoZW4gZWFjaCB0ZWUnZCBzdHJlYW0gaGFzIGhhbmRsZWQgYSBjaHVuaywgY2FsbCB7QGxpbmsgb25BbGxIYW5kbGVkfVxuICovXG5mdW5jdGlvbiBmYW5vdXRTdHJlYW08VD4oXG4gIHN0cmVhbTogQ2xpZW50UmVhZGFibGVTdHJlYW08VD4sXG4gIG51bUNvbnN1bWVyczogbnVtYmVyLFxuICBvbkFsbEhhbmRsZWQ6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxuKTogQXN5bmNJdGVyYWJsZTxUPltdIHtcbiAgdHlwZSBXYWl0ZXIgPSAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PFQ+KSA9PiB2b2lkXG5cbiAgbGV0IGVuZGVkID0gZmFsc2VcbiAgY29uc3QgYnVmZmVyOiBUW10gPSBbXVxuICBjb25zdCBwZW5kaW5nOiBXYWl0ZXJbXSA9IFtdXG4gIGxldCBhY3RpdmVDb25zdW1lcnMgPSBudW1Db25zdW1lcnNcblxuICAvLyBjb25zdW1lciBib29ra2VlcGluZ1xuICBsZXQgYXdhaXRpbmdBY2sgPSAwXG5cbiAgZnVuY3Rpb24gcHVzaENodW5rKGNodW5rOiBUKSB7XG4gICAgYnVmZmVyLnB1c2goY2h1bmspXG4gICAgZmx1c2goKVxuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPiAwICYmIHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2h1bmsgPSBidWZmZXJbMF0gLy8ga2VlcCB1bnRpbCBhbGwgY29uc3VtZXJzIGFja1xuICAgICAgY29uc3Qgd2FpdGVyID0gcGVuZGluZy5zaGlmdCgpIVxuICAgICAgd2FpdGVyKHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9KVxuICAgICAgYXdhaXRpbmdBY2srK1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZCgpIHtcbiAgICBlbmRlZCA9IHRydWVcbiAgICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB3YWl0ZXIgPSBwZW5kaW5nLnNoaWZ0KCkhXG4gICAgICB3YWl0ZXIoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgfVxuICB9XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgKGNodW5rOiBUKSA9PiB7XG4gICAgcHVzaENodW5rKGNodW5rKVxuICB9KVxuXG4gIHN0cmVhbS5vbignZW5kJywgKCkgPT4ge1xuICAgIGVuZCgpXG4gIH0pXG5cbiAgc3RyZWFtLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB3YWl0ZXIgPSBwZW5kaW5nLnNoaWZ0KCkhXG4gICAgICB3YWl0ZXIoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgfVxuICAgIHRocm93IGVyclxuICB9KVxuXG4gIGZ1bmN0aW9uIG1ha2VJdGVyYWJsZSgpOiBBc3luY0l0ZXJhYmxlPFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IGJ1ZmZlclswXVxuICAgICAgICAgICAgICBhd2FpdGluZ0FjaysrXG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICBwZW5kaW5nLnB1c2gocmVzb2x2ZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3luYyByZXR1cm4oKSB7XG4gICAgICAgICAgICBhY3RpdmVDb25zdW1lcnMtLVxuICAgICAgICAgICAgaWYgKGFjdGl2ZUNvbnN1bWVycyA9PT0gMCkge1xuICAgICAgICAgICAgICBlbmQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBhY2soKSB7XG4gICAgYXdhaXRpbmdBY2stLVxuICAgIGlmIChhd2FpdGluZ0FjayA9PT0gMCkge1xuICAgICAgLy8gYWxsIGNvbnN1bWVycyBkb25lIHdpdGggdGhlIGN1cnJlbnQgY2h1bmtcbiAgICAgIGJ1ZmZlci5zaGlmdCgpIC8vIGRyb3AgaXRcbiAgICAgIGF3YWl0IG9uQWxsSGFuZGxlZCgpXG4gICAgICBmbHVzaCgpIC8vIGNvbnRpbnVlIHdpdGggbmV4dCBjaHVua1xuICAgIH1cbiAgfVxuXG4gIC8vIHdyYXAgY29uc3VtZXIgc28gdGhleSAqbXVzdCogY2FsbCBhY2soKSBhZnRlciBwcm9jZXNzaW5nXG4gIGZ1bmN0aW9uIHdyYXAoaXRlcmFibGU6IEFzeW5jSXRlcmFibGU8VD4pOiBBc3luY0l0ZXJhYmxlPFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgIHlpZWxkIGl0ZW1cbiAgICAgICAgICBhd2FpdCBhY2soKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJhd0l0ZXJhYmxlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG51bUNvbnN1bWVycyB9LCBtYWtlSXRlcmFibGUpXG4gIHJldHVybiByYXdJdGVyYWJsZXMubWFwKHdyYXApXG59XG4iXX0=
package/lib/runner.d.ts CHANGED
@@ -4,6 +4,7 @@ import { Writer } from './writer.js';
4
4
  import { Processor as Proc } from './processor.js';
5
5
  import { Logger } from 'winston';
6
6
  import { Term } from '@rdfjs/types';
7
+ import { State } from './state.js';
7
8
  export type Writable = (msg: FromRunner) => Promise<unknown>;
8
9
  export type FullProc<C> = C extends Proc<infer T> ? T & C : never;
9
10
  export declare class Runner {
@@ -17,7 +18,11 @@ export declare class Runner {
17
18
  private readonly uri;
18
19
  private readonly processors;
19
20
  private readonly processorTransforms;
20
- constructor(client: RunnerClient, notifyOrchestrator: Writable, uri: string, logger: Logger);
21
+ private readonly configPath?;
22
+ private readonly state?;
23
+ private readonly runnerId?;
24
+ constructor(client: RunnerClient, notifyOrchestrator: Writable, uri: string, logger: Logger, configPath?: string, state?: State, runnerId?: string);
25
+ makeRelative(target: string, base: string): string;
21
26
  createProcessor<P extends Proc<unknown>>(proc: Processor): Promise<FullProc<P>>;
22
27
  addProcessor<P extends Proc<unknown>>(proc: Processor): Promise<FullProc<P>>;
23
28
  start(): Promise<void>;
package/lib/runner.js CHANGED
@@ -1,7 +1,7 @@
1
+ import { pathToFileURL } from 'node:url';
1
2
  import { ReaderInstance } from './reader.js';
2
3
  import { WriterInstance } from './writer.js';
3
- import { createLogger } from 'winston';
4
- import { RpcTransport } from './logger.js';
4
+ import { extendLogger } from './logger.js';
5
5
  import { empty, extractShapes } from 'rdf-lens';
6
6
  import { NamedNode, Parser } from 'n3';
7
7
  import { createNamespace, createUriAndTermNamespace, RDF } from '@treecg/types';
@@ -18,21 +18,42 @@ export class Runner {
18
18
  uri;
19
19
  processors = [];
20
20
  processorTransforms = [];
21
- constructor(client, notifyOrchestrator, uri, logger) {
21
+ configPath;
22
+ state;
23
+ runnerId;
24
+ constructor(client, notifyOrchestrator, uri, logger, configPath, state, runnerId) {
22
25
  this.client = client;
23
26
  this.notifyOrchestrator = notifyOrchestrator;
24
27
  this.uri = uri;
25
28
  this.logger = logger;
29
+ this.configPath = configPath;
30
+ this.state = state;
31
+ this.runnerId = runnerId;
32
+ }
33
+ makeRelative(target, base) {
34
+ if (!this.configPath)
35
+ return target;
36
+ const targetUrl = new URL(target);
37
+ const baseUrl = new URL(base);
38
+ const targetParts = targetUrl.pathname.split('/');
39
+ const baseParts = baseUrl.pathname.split('/');
40
+ baseParts.pop();
41
+ let i = 0;
42
+ while (i < targetParts.length &&
43
+ i < baseParts.length &&
44
+ targetParts[i] === baseParts[i]) {
45
+ i++;
46
+ }
47
+ const up = baseParts.slice(i).map(() => '..');
48
+ const down = targetParts.slice(i);
49
+ const thing = './' + [...up, ...down].join('/');
50
+ const configPath = this.configPath && pathToFileURL(this.configPath);
51
+ console.log({ configPath, thing, base, target });
52
+ const final = new URL(thing, configPath);
53
+ return final.href;
26
54
  }
27
55
  async createProcessor(proc) {
28
- const procLogger = createLogger({
29
- transports: [
30
- new RpcTransport({
31
- entities: [proc.uri, this.uri],
32
- stream: this.client.logStream(() => { }),
33
- }),
34
- ],
35
- });
56
+ const procLogger = extendLogger(this.logger, proc.uri);
36
57
  const ty = this.quads
37
58
  .filter((x) => x.subject.value === proc.uri && x.predicate.equals(RDF.terms.type))
38
59
  .map((x) => x.object.value);
@@ -42,12 +63,13 @@ export class Runner {
42
63
  quads: this.quads,
43
64
  });
44
65
  const config = JSON.parse(proc.config);
45
- const jsProgram = await import(config.file);
66
+ const jsProgram = await import(this.makeRelative(config.file, this.uri));
46
67
  const clazz = jsProgram[config.clazz || 'default'];
47
68
  const instance = new clazz(args, procLogger);
48
69
  return instance;
49
70
  }
50
71
  async addProcessor(proc) {
72
+ this.logger.info(JSON.stringify(proc));
51
73
  const instance = await this.createProcessor(proc);
52
74
  await instance.init();
53
75
  this.logger.info(`Initiated processor '${proc.uri}'`);
@@ -70,7 +92,10 @@ export class Runner {
70
92
  if (this.writers[id] !== undefined) {
71
93
  return this.writers[id];
72
94
  }
73
- const writer = new WriterInstance(id, this.client, this.notifyOrchestrator, this.uri, this.logger);
95
+ const tracker = this.runnerId !== undefined
96
+ ? this.state?.trackChannel(this.runnerId, id, 'writer')
97
+ : undefined;
98
+ const writer = new WriterInstance(id, this.client, this.notifyOrchestrator, this.uri, this.logger, tracker);
74
99
  this.writers[id] = writer;
75
100
  return writer;
76
101
  }
@@ -79,7 +104,10 @@ export class Runner {
79
104
  if (this.readers[ids] !== undefined) {
80
105
  return this.readers[ids];
81
106
  }
82
- const reader = new ReaderInstance(ids, this.client, this.notifyOrchestrator, this.logger);
107
+ const tracker = this.runnerId !== undefined
108
+ ? this.state?.trackChannel(this.runnerId, ids, 'reader')
109
+ : undefined;
110
+ const reader = new ReaderInstance(ids, this.client, this.notifyOrchestrator, this.logger, tracker);
83
111
  this.readers[ids] = reader;
84
112
  return reader;
85
113
  }
@@ -162,4 +190,4 @@ export class Runner {
162
190
  }
163
191
  }
164
192
  }
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQVUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ2pELE9BQU8sRUFBVSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFakQsT0FBTyxFQUFFLFlBQVksRUFBVSxNQUFNLFNBQVMsQ0FBQTtBQUU5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3ZDLE9BQU8sRUFBUSxLQUFLLEVBQUUsYUFBYSxFQUFVLE1BQU0sVUFBVSxDQUFBO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRy9FLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUNwQyxxQ0FBcUMsRUFDckMsS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxFQUNULGNBQWMsRUFDZCxhQUFhLEVBQ2IsUUFBUSxFQUNSLFlBQVksRUFDWixVQUFVLENBQ1gsQ0FBQTtBQUVELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FDMUIsK0JBQStCLEVBQy9CLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQ1IsUUFBUSxFQUNSLFFBQVEsQ0FDVCxDQUFBO0FBV0QsTUFBTSxPQUFPLE1BQU07SUFDQSxPQUFPLEdBQXNDLEVBQUUsQ0FBQTtJQUMvQyxPQUFPLEdBQXNDLEVBQUUsQ0FBQTtJQUMvQyxNQUFNLENBQWM7SUFDcEIsa0JBQWtCLENBQVU7SUFDNUIsTUFBTSxDQUFRO0lBQ3ZCLE1BQU0sQ0FBUTtJQUNkLEtBQUssR0FBVyxFQUFFLENBQUE7SUFFVCxHQUFHLENBQVE7SUFFWCxVQUFVLEdBQW9CLEVBQUUsQ0FBQTtJQUNoQyxtQkFBbUIsR0FBdUIs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QzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiwwQ0FBMEMsU0FBUyxDQUFDLE9BQU8sOEJBQThCLENBQzFGLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2xvc2UsXG4gIEZyb21SdW5uZXIsXG4gIFByb2Nlc3NvcixcbiAgUnVubmVyQ2xpZW50LFxuICBUb1J1bm5lcixcbiAgTG9jYWxBY2ssXG4gIFJlY2VpdmluZ01lc3NhZ2UsXG4gIFJlY2VpdmluZ1N0cmVhbU1lc3NhZ2UsXG59IGZyb20gJ0ByZGZjL3Byb3RvJ1xuaW1wb3J0IHsgUmVhZGVyLCBSZWFkZXJJbnN0YW5jZSB9IGZyb20gJy4vcmVhZGVyJ1xuaW1wb3J0IHsgV3JpdGVyLCBXcml0ZXJJbnN0YW5jZSB9IGZyb20gJy4vd3JpdGVyJ1xuaW1wb3J0IHsgUHJvY2Vzc29yIGFzIFByb2MgfSBmcm9tICcuL3Byb2Nlc3NvcidcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgTG9nZ2VyIH0gZnJvbSAnd2luc3RvbidcblxuaW1wb3J0IHsgUnBjVHJhbnNwb3J0IH0gZnJvbSAnLi9sb2dnZXInXG5pbXBvcnQgeyBDb250LCBlbXB0eSwgZXh0cmFjdFNoYXBlcywgU2hhcGVzIH0gZnJvbSAncmRmLWxlbnMnXG5pbXBvcnQgeyBOYW1lZE5vZGUsIFBhcnNlciB9IGZyb20gJ24zJ1xuaW1wb3J0IHsgY3JlYXRlTmFtZXNwYWNlLCBjcmVhdGVVcmlBbmRUZXJtTmFtZXNwYWNlLCBSREYgfSBmcm9tICdAdHJlZWNnL3R5cGVzJ1xuaW1wb3J0IHsgUXVhZCwgVGVybSB9IGZyb20gJ0ByZGZqcy90eXBlcydcblxuY29uc3QgUkRGTCA9IGNyZWF0ZVVyaUFuZFRlcm1OYW1lc3BhY2UoXG4gICdodHRwczovL3czaWQub3JnL3JkZi1sZW5zL29udG9sb2d5IycsXG4gICdDQkQnLFxuICAnUGF0aCcsXG4gICdQYXRoTGVucycsXG4gICdDb250ZXh0JyxcbiAgJ1R5cGVkRXh0cmFjdCcsXG4gICdFbnZWYXJpYWJsZScsXG4gICdlbnZLZXknLFxuICAnZW52RGVmYXVsdCcsXG4gICdkYXRhdHlwZScsXG4pXG5cbmNvbnN0IFJERkMgPSBjcmVhdGVOYW1lc3BhY2UoXG4gICdodHRwczovL3czaWQub3JnL3JkZi1jb25uZWN0IycsXG4gICh4KSA9PiB4LFxuICAnUmVhZGVyJyxcbiAgJ1dyaXRlcicsXG4pXG5cbmV4cG9ydCB0eXBlIFdyaXRhYmxlID0gKG1zZzogRnJvbVJ1bm5lcikgPT4gUHJvbWlzZTx1bmtub3duPlxuXG50eXBlIFByb2Nlc3NvckNvbmZpZyA9IHtcbiAgbG9jYXRpb246IHN0cmluZ1xuICBmaWxlOiBzdHJpbmdcbiAgY2xheno/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRnVsbFByb2M8Qz4gPSBDIGV4dGVuZHMgUHJvYzxpbmZlciBUPiA/IFQgJiBDIDogbmV2ZXJcbmV4cG9ydCBjbGFzcyBSdW5uZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRlcnM6IHsgW3VyaTogc3RyaW5nXTogUmVhZGVySW5zdGFuY2UgfSA9IHt9XG4gIHByaXZhdGUgcmVhZG9ubHkgd3JpdGVyczogeyBbdXJpOiBzdHJpbmddOiBXcml0ZXJJbnN0YW5jZSB9ID0ge31cbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFJ1bm5lckNsaWVudFxuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmeU9yY2hlc3RyYXRvcjogV3JpdGFibGVcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlclxuICBwcml2YXRlIHNoYXBlczogU2hhcGVzXG4gIHByaXZhdGUgcXVhZHM6IFF1YWRbXSA9IFtdXG5cbiAgcHJpdmF0ZSByZWFkb25seSB1cmk6IHN0cmluZ1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvY2Vzc29yczogUHJvYzx1bmtub3duPltdID0gW11cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9jZXNzb3JUcmFuc2Zvcm1zOiBQcm9taXNlPHVua25vd24+W10gPSBbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogUnVubmVyQ2xpZW50LFxuICAgIG5vdGlmeU9yY2hlc3RyYXRvcjogV3JpdGFibGUsXG4gICAgdXJpOiBzdHJpbmcsXG4gICAgbG9nZ2VyOiBMb2dnZXIsXG4gICkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IgPSBub3RpZnlPcmNoZXN0cmF0b3JcbiAgICB0aGlzLnVyaSA9IHVyaVxuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9jZXNzb3I8UCBleHRlbmRzIFByb2M8dW5rbm93bj4+KFxuICAgIHByb2M6IFByb2Nlc3NvcixcbiAgKTogUHJvbWlzZTxGdWxsUHJvYzxQPj4ge1xuICAgIGNvbnN0IHByb2NMb2dnZXIgPSBjcmVhdGVMb2dnZXIoe1xuICAgICAgdHJhbnNwb3J0czogW1xuICAgICAgICBuZXcgUnBjVHJhbnNwb3J0KHtcbiAgICAgICAgICBlbnRpdGllczogW3Byb2MudXJpLCB0aGlzLnVyaV0sXG4gICAgICAgICAgc3RyZWFtOiB0aGlzLmNsaWVudC5sb2dTdHJlYW0oKCkgPT4ge30pLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSlcblxuICAgIGNvbnN0IHR5ID0gdGhpcy5xdWFkc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHgpID0+XG4gICAgICAgICAgeC5zdWJqZWN0LnZhbHVlID09PSBwcm9jLnVyaSAmJiB4LnByZWRpY2F0ZS5lcXVhbHMoUkRGLnRlcm1zLnR5cGUpLFxuICAgICAgKVxuICAgICAgLm1hcCgoeCkgPT4geC5vYmplY3QudmFsdWUpXG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKGBQYXJzaW5nIHByb2Nlc3NvciAnJHtwcm9jLnVyaX0nIG9mIHR5cGUocykgWyR7dHkuam9pbignLCAnKX1dYClcbiAgICBjb25zdCBhcmdzID0gdGhpcy5zaGFwZXMubGVuc2VzW1JERkwuVHlwZWRFeHRyYWN0XS5leGVjdXRlKHtcbiAgICAgIGlkOiBuZXcgTmFtZWROb2RlKHByb2MudXJpKSxcbiAgICAgIHF1YWRzOiB0aGlzLnF1YWRzLFxuICAgIH0pXG5cbiAgICBjb25zdCBjb25maWc6IFByb2Nlc3NvckNvbmZpZyA9IEpTT04ucGFyc2UocHJvYy5jb25maWcpXG4gICAgY29uc3QganNQcm9ncmFtID0gYXdhaXQgaW1wb3J0KGNvbmZpZy5maWxlKVxuICAgIGNvbnN0IGNsYXp6ID0ganNQcm9ncmFtW2NvbmZpZy5jbGF6eiB8fCAnZGVmYXVsdCddXG4gICAgY29uc3QgaW5zdGFuY2U6IFByb2M8dW5rbm93bj4gPSBuZXcgY2xhenooYXJncywgcHJvY0xvZ2dlcilcblxuICAgIHJldHVybiA8RnVsbFByb2M8UD4+aW5zdGFuY2VcbiAgfVxuXG4gIGFzeW5jIGFkZFByb2Nlc3NvcjxQIGV4dGVuZHMgUHJvYzx1bmtub3duPj4oXG4gICAgcHJvYzogUHJvY2Vzc29yLFxuICApOiBQcm9taXNlPEZ1bGxQcm9jPFA+PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCB0aGlzLmNyZWF0ZVByb2Nlc3NvcjxQPihwcm9jKVxuXG4gICAgYXdhaXQgaW5zdGFuY2UuaW5pdCgpXG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKGBJbml0aWF0ZWQgcHJvY2Vzc29yICcke3Byb2MudXJpfSdgKVxuXG4gICAgdGhpcy5wcm9jZXNzb3JzLnB1c2goaW5zdGFuY2UpXG4gICAgdGhpcy5wcm9jZXNzb3JUcmFuc2Zvcm1zLnB1c2goaW5zdGFuY2UudHJhbnNmb3JtKCkpXG5cbiAgICBhd2FpdCB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvcih7IGluaXRpYWxpemVkOiB7IHVyaTogcHJvYy51cmkgfSB9KVxuXG4gICAgcmV0dXJuIDxGdWxsUHJvYzxQPj5pbnN0YW5jZVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucHJvY2Vzc29ycy5tYXAoKHgpID0+IHgucHJvZHVjZSgpKSlcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucHJvY2Vzc29yVHJhbnNmb3JtcylcbiAgICB9IGNhdGNoIChleDogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1N0YXJ0IGZhaWxlZDogJyArIEpTT04uc3RyaW5naWZ5KGV4KSlcbiAgICB9XG4gIH1cblxuICBjcmVhdGVXcml0ZXIodXJpOiBUZXJtKTogV3JpdGVyIHtcbiAgICBjb25zdCBpZCA9IHVyaS52YWx1ZVxuXG4gICAgaWYgKHRoaXMud3JpdGVyc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMud3JpdGVyc1tpZF1cbiAgICB9XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IFdyaXRlckluc3RhbmNlKFxuICAgICAgaWQsXG4gICAgICB0aGlzLmNsaWVudCxcbiAgICAgIHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yLFxuICAgICAgdGhpcy51cmksXG4gICAgICB0aGlzLmxvZ2dlcixcbiAgICApXG4gICAgdGhpcy53cml0ZXJzW2lkXSA9IHdyaXRlclxuICAgIHJldHVybiB3cml0ZXJcbiAgfVxuXG4gIGNyZWF0ZVJlYWRlcih1cmk6IFRlcm0pOiBSZWFkZXIge1xuICAgIGNvbnN0IGlkcyA9IHVyaS52YWx1ZVxuXG4gICAgaWYgKHRoaXMucmVhZGVyc1tpZHNdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRlcnNbaWRzXVxuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVySW5zdGFuY2UoXG4gICAgICBpZHMsXG4gICAgICB0aGlzLmNsaWVudCxcbiAgICAgIHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yLFxuICAgICAgdGhpcy5sb2dnZXIsXG4gICAgKVxuICAgIHRoaXMucmVhZGVyc1tpZHNdID0gcmVhZGVyXG4gICAgcmV0dXJuIHJlYWRlclxuICB9XG5cbiAgYXN5bmMgaGFuZGxlT3JjaE1lc3NhZ2UobXNnOiBUb1J1bm5lcikge1xuICAgIGlmIChtc2cubXNnKSB7XG4gICAgICB0aGlzLmhhbmRsZU1zZyhtc2cubXNnKVxuICAgIH1cblxuICAgIGlmIChtc2cuc3RyZWFtTXNnKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVN0cmVhbU1zZyhtc2cuc3RyZWFtTXNnKVxuICAgIH1cblxuICAgIGlmIChtc2cuY2xvc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ2xvc2UobXNnLmNsb3NlKVxuICAgIH1cblxuICAgIGlmIChtc2cucGlwZWxpbmUpIHtcbiAgICAgIHRoaXMuaGFuZGxlUGlwZWxpbmUobXNnLnBpcGVsaW5lKVxuICAgIH1cblxuICAgIGlmIChtc2cucHJvY2Vzc2VkKSB7XG4gICAgICB0aGlzLmhhbmRsZVByb2Nlc3NlZChtc2cucHJvY2Vzc2VkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2xvc2UoY2xvc2U6IENsb3NlKSB7XG4gICAgY29uc3QgdXJpID0gY2xvc2UuY2hhbm5lbFxuICAgIGNvbnN0IHIgPSB0aGlzLnJlYWRlcnNbdXJpXVxuXG4gICAgbGV0IGNsb3NlZCA9IGZhbHNlXG4gICAgaWYgKHIpIHtcbiAgICAgIHIuY2xvc2UoKVxuICAgICAgY2xvc2VkID0gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCB3ID0gdGhpcy53cml0ZXJzW3VyaV1cbiAgICBpZiAodykge1xuICAgICAgY2xvc2VkID0gdHJ1ZVxuICAgICAgYXdhaXQgdy5jbG9zZSh0cnVlKVxuICAgIH1cblxuICAgIGlmICghY2xvc2VkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFJlY2VpdmVkIGEgY2xvc2UgZXZlbnQgZm9yIGNoYW5uZWwgJHt1cml9LCBidXQgbmVpdGhlciByZWFkZXIgbm9yIHdyaXRlciBpcyBwcmVzZW50LmAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQaXBlbGluZShwaXBlbGluZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1YWRzID0gbmV3IFBhcnNlcigpLnBhcnNlKHBpcGVsaW5lKVxuICAgICAgdGhpcy5zaGFwZXMgPSBleHRyYWN0U2hhcGVzKFxuICAgICAgICBxdWFkcyxcbiAgICAgICAge1xuICAgICAgICAgIFtSREZDLlJlYWRlcl06ICh4OiBDb250KSA9PiB0aGlzLmNyZWF0ZVJlYWRlcih4LmlkKSxcbiAgICAgICAgICBbUkRGQy5Xcml0ZXJdOiAoeDogQ29udCkgPT4gdGhpcy5jcmVhdGVXcml0ZXIoeC5pZCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBbUkRGQy5SZWFkZXJdOiBlbXB0eTxDb250PigpLFxuICAgICAgICAgIFtSREZDLldyaXRlcl06IGVtcHR5PENvbnQ+KCksXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICB0aGlzLnF1YWRzID0gcXVhZHNcbiAgICB9IGNhdGNoIChleDogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1BpcGVsaW5lIGZhaWxlZDogJyArIEpTT04uc3RyaW5naWZ5KGV4KSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1zZyhtc2c6IFJlY2VpdmluZ01lc3NhZ2UpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnSGFuZGxpbmcgZGF0YSBtc2cgZm9yICcgKyBtc2cuY2hhbm5lbClcbiAgICBjb25zdCByID0gdGhpcy5yZWFkZXJzW21zZy5jaGFubmVsXVxuXG4gICAgaWYgKHIpIHtcbiAgICAgIHIuaGFuZGxlTXNnKG1zZylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBSZWNlaXZlZCBtZXNzYWdlIGZvciBjaGFubmVsICR7bXNnLmNoYW5uZWx9LCBidXQgbm8gcmVhZGVyIHdhcyBwcmVzZW50LmAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdHJlYW1Nc2coc3RyZWFtTXNnOiBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlKSB7XG4gICAgY29uc3QgciA9IHRoaXMucmVhZGVyc1tzdHJlYW1Nc2cuY2hhbm5lbF1cblxuICAgIGlmIChyKSB7XG4gICAgICBhd2FpdCByLmhhbmRsZVN0cmVhbWluZ01lc3NhZ2Uoc3RyZWFtTXNnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFJlY2VpdmVkIHN0cmVhbSBtZXNzYWdlIGZvciBjaGFubmVsICR7c3RyZWFtTXNnLmNoYW5uZWx9LCBidXQgbm8gcmVhZGVyIHdhcyBwcmVzZW50LmAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQcm9jZXNzZWQocHJvY2Vzc2VkOiBMb2NhbEFjaykge1xuICAgIGNvbnN0IHdyaXRlciA9IHRoaXMud3JpdGVyc1twcm9jZXNzZWQuY2hhbm5lbF1cbiAgICBpZiAod3JpdGVyKSB7XG4gICAgICB3cml0ZXIuaGFuZGxlZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgUmVjZWl2ZWQgcHJvY2Vzc2VkIG1lc3NhZ2UgZm9yIGNoYW5uZWwgJHtwcm9jZXNzZWQuY2hhbm5lbH0sIGJ1dCBubyB3cml0ZXIgd2FzIHByZXNlbnQuYCxcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3hDLE9BQU8sRUFBVSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDakQsT0FBTyxFQUFVLGNBQWMsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUlqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3ZDLE9BQU8sRUFBUSxLQUFLLEVBQUUsYUFBYSxFQUFVLE1BQU0sVUFBVSxDQUFBO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBSS9FLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUNwQyxxQ0FBcUMsRUFDckMsS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxFQUNULGNBQWMsRUFDZCxhQUFhLEVBQ2IsUUFBUSxFQUNSLFlBQVksRUFDWixVQUFVLENBQ1gsQ0FBQTtBQUVELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FDMUIsK0JBQStCLEVBQy9CLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQ1IsUUFBUSxFQUNSLFFBQVEsQ0FDVCxDQUFBO0FBV0QsTUFBTSxPQUFPLE1BQU07SUFDQSxPQUFPLEdBQXNDLEVBQUUsQ0FBQTtJQUMvQyxPQUFPLEdBQXNDLEVBQUUsQ0FBQTtJQUMvQyxNQUFNLENBQWM7SUFDcEIsa0JBQWtCLENBQVU7SUFDNUIsTUFBTSxDQUFRO0lBQ3ZCLE1BQU0sQ0FBUTtJQUNkLEtBQUssR0FBVyxFQUFFLENBQUE7SUFFVCxHQUFHLENBQVE7SUFFWCxVQUFVLEdBQW9CLEVBQUUsQ0FBQTtJQUNoQyxtQkFBbUIsR0FBdUIs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QUFDLENBQUE7UUFFbkMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNOLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixnQ0FBZ0MsR0FBRyxDQUFDLE9BQU8sOEJBQThCLENBQzFFLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBaUM7UUFDN0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNOLE1BQU0sQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsdUNBQXVDLFNBQVMsQ0FBQyxPQUFPLDhCQUE4QixDQUN2RixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxlQUFlLENBQUMsU0FBbUI7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDOUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLDBDQUEwQyxTQUFTLENBQUMsT0FBTyw4QkFBOEIsQ0FDMUYsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDbG9zZSxcbiAgRnJvbVJ1bm5lcixcbiAgUHJvY2Vzc29yLFxuICBSdW5uZXJDbGllbnQsXG4gIFRvUnVubmVyLFxuICBMb2NhbEFjayxcbiAgUmVjZWl2aW5nTWVzc2FnZSxcbiAgUmVjZWl2aW5nU3RyZWFtTWVzc2FnZSxcbn0gZnJvbSAnQHJkZmMvcHJvdG8nXG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAnbm9kZTp1cmwnXG5pbXBvcnQgeyBSZWFkZXIsIFJlYWRlckluc3RhbmNlIH0gZnJvbSAnLi9yZWFkZXInXG5pbXBvcnQgeyBXcml0ZXIsIFdyaXRlckluc3RhbmNlIH0gZnJvbSAnLi93cml0ZXInXG5pbXBvcnQgeyBQcm9jZXNzb3IgYXMgUHJvYyB9IGZyb20gJy4vcHJvY2Vzc29yJ1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnd2luc3RvbidcblxuaW1wb3J0IHsgZXh0ZW5kTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5pbXBvcnQgeyBDb250LCBlbXB0eSwgZXh0cmFjdFNoYXBlcywgU2hhcGVzIH0gZnJvbSAncmRmLWxlbnMnXG5pbXBvcnQgeyBOYW1lZE5vZGUsIFBhcnNlciB9IGZyb20gJ24zJ1xuaW1wb3J0IHsgY3JlYXRlTmFtZXNwYWNlLCBjcmVhdGVVcmlBbmRUZXJtTmFtZXNwYWNlLCBSREYgfSBmcm9tICdAdHJlZWNnL3R5cGVzJ1xuaW1wb3J0IHsgUXVhZCwgVGVybSB9IGZyb20gJ0ByZGZqcy90eXBlcydcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi9zdGF0ZSdcblxuY29uc3QgUkRGTCA9IGNyZWF0ZVVyaUFuZFRlcm1OYW1lc3BhY2UoXG4gICdodHRwczovL3czaWQub3JnL3JkZi1sZW5zL29udG9sb2d5IycsXG4gICdDQkQnLFxuICAnUGF0aCcsXG4gICdQYXRoTGVucycsXG4gICdDb250ZXh0JyxcbiAgJ1R5cGVkRXh0cmFjdCcsXG4gICdFbnZWYXJpYWJsZScsXG4gICdlbnZLZXknLFxuICAnZW52RGVmYXVsdCcsXG4gICdkYXRhdHlwZScsXG4pXG5cbmNvbnN0IFJERkMgPSBjcmVhdGVOYW1lc3BhY2UoXG4gICdodHRwczovL3czaWQub3JnL3JkZi1jb25uZWN0IycsXG4gICh4KSA9PiB4LFxuICAnUmVhZGVyJyxcbiAgJ1dyaXRlcicsXG4pXG5cbmV4cG9ydCB0eXBlIFdyaXRhYmxlID0gKG1zZzogRnJvbVJ1bm5lcikgPT4gUHJvbWlzZTx1bmtub3duPlxuXG50eXBlIFByb2Nlc3NvckNvbmZpZyA9IHtcbiAgbG9jYXRpb246IHN0cmluZ1xuICBmaWxlOiBzdHJpbmdcbiAgY2xheno/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRnVsbFByb2M8Qz4gPSBDIGV4dGVuZHMgUHJvYzxpbmZlciBUPiA/IFQgJiBDIDogbmV2ZXJcbmV4cG9ydCBjbGFzcyBSdW5uZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRlcnM6IHsgW3VyaTogc3RyaW5nXTogUmVhZGVySW5zdGFuY2UgfSA9IHt9XG4gIHByaXZhdGUgcmVhZG9ubHkgd3JpdGVyczogeyBbdXJpOiBzdHJpbmddOiBXcml0ZXJJbnN0YW5jZSB9ID0ge31cbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFJ1bm5lckNsaWVudFxuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmeU9yY2hlc3RyYXRvcjogV3JpdGFibGVcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlclxuICBwcml2YXRlIHNoYXBlczogU2hhcGVzXG4gIHByaXZhdGUgcXVhZHM6IFF1YWRbXSA9IFtdXG5cbiAgcHJpdmF0ZSByZWFkb25seSB1cmk6IHN0cmluZ1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvY2Vzc29yczogUHJvYzx1bmtub3duPltdID0gW11cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9jZXNzb3JUcmFuc2Zvcm1zOiBQcm9taXNlPHVua25vd24+W10gPSBbXVxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZT86IFN0YXRlXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVubmVySWQ/OiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IFJ1bm5lckNsaWVudCxcbiAgICBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlLFxuICAgIHVyaTogc3RyaW5nLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIGNvbmZpZ1BhdGg/OiBzdHJpbmcsXG4gICAgc3RhdGU/OiBTdGF0ZSxcbiAgICBydW5uZXJJZD86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvciA9IG5vdGlmeU9yY2hlc3RyYXRvclxuICAgIHRoaXMudXJpID0gdXJpXG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoXG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlXG4gICAgdGhpcy5ydW5uZXJJZCA9IHJ1bm5lcklkXG4gIH1cblxuICBtYWtlUmVsYXRpdmUodGFyZ2V0OiBzdHJpbmcsIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ1BhdGgpIHJldHVybiB0YXJnZXRcblxuICAgIGNvbnN0IHRhcmdldFVybCA9IG5ldyBVUkwodGFyZ2V0KVxuICAgIGNvbnN0IGJhc2VVcmwgPSBuZXcgVVJMKGJhc2UpXG5cbiAgICBjb25zdCB0YXJnZXRQYXJ0cyA9IHRhcmdldFVybC5wYXRobmFtZS5zcGxpdCgnLycpXG4gICAgY29uc3QgYmFzZVBhcnRzID0gYmFzZVVybC5wYXRobmFtZS5zcGxpdCgnLycpXG5cbiAgICAvLyBSZW1vdmUgZmlsZW5hbWUgZnJvbSBiYXNlICh0cmVhdCBhcyBkaXJlY3RvcnkpXG4gICAgYmFzZVBhcnRzLnBvcCgpXG5cbiAgICAvLyBGaW5kIGNvbW1vbiBwYXRoXG4gICAgbGV0IGkgPSAwXG4gICAgd2hpbGUgKFxuICAgICAgaSA8IHRhcmdldFBhcnRzLmxlbmd0aCAmJlxuICAgICAgaSA8IGJhc2VQYXJ0cy5sZW5ndGggJiZcbiAgICAgIHRhcmdldFBhcnRzW2ldID09PSBiYXNlUGFydHNbaV1cbiAgICApIHtcbiAgICAgIGkrK1xuICAgIH1cblxuICAgIGNvbnN0IHVwID0gYmFzZVBhcnRzLnNsaWNlKGkpLm1hcCgoKSA9PiAnLi4nKVxuICAgIGNvbnN0IGRvd24gPSB0YXJnZXRQYXJ0cy5zbGljZShpKVxuXG4gICAgY29uc3QgdGhpbmcgPSAnLi8nICsgWy4uLnVwLCAuLi5kb3duXS5qb2luKCcvJylcbiAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5jb25maWdQYXRoICYmIHBhdGhUb0ZpbGVVUkwodGhpcy5jb25maWdQYXRoKVxuICAgIGNvbnNvbGUubG9nKHsgY29uZmlnUGF0aCwgdGhpbmcsIGJhc2UsIHRhcmdldCB9KVxuICAgIGNvbnN0IGZpbmFsID0gbmV3IFVSTCh0aGluZywgY29uZmlnUGF0aClcbiAgICByZXR1cm4gZmluYWwuaHJlZlxuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvY2Vzc29yPFAgZXh0ZW5kcyBQcm9jPHVua25vd24+PihcbiAgICBwcm9jOiBQcm9jZXNzb3IsXG4gICk6IFByb21pc2U8RnVsbFByb2M8UD4+IHtcbiAgICBjb25zdCBwcm9jTG9nZ2VyID0gZXh0ZW5kTG9nZ2VyKHRoaXMubG9nZ2VyLCBwcm9jLnVyaSlcblxuICAgIGNvbnN0IHR5ID0gdGhpcy5xdWFkc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHgpID0+XG4gICAgICAgICAgeC5zdWJqZWN0LnZhbHVlID09PSBwcm9jLnVyaSAmJiB4LnByZWRpY2F0ZS5lcXVhbHMoUkRGLnRlcm1zLnR5cGUpLFxuICAgICAgKVxuICAgICAgLm1hcCgoeCkgPT4geC5vYmplY3QudmFsdWUpXG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYFBhcnNpbmcgcHJvY2Vzc29yICcke3Byb2MudXJpfScgb2YgdHlwZShzKSBbJHt0eS5qb2luKCcsICcpfV1gLFxuICAgIClcbiAgICBjb25zdCBhcmdzID0gdGhpcy5zaGFwZXMubGVuc2VzW1JERkwuVHlwZWRFeHRyYWN0XS5leGVjdXRlKHtcbiAgICAgIGlkOiBuZXcgTmFtZWROb2RlKHByb2MudXJpKSxcbiAgICAgIHF1YWRzOiB0aGlzLnF1YWRzLFxuICAgIH0pXG5cbiAgICBjb25zdCBjb25maWc6IFByb2Nlc3NvckNvbmZpZyA9IEpTT04ucGFyc2UocHJvYy5jb25maWcpXG4gICAgY29uc3QganNQcm9ncmFtID0gYXdhaXQgaW1wb3J0KHRoaXMubWFrZVJlbGF0aXZlKGNvbmZpZy5maWxlLCB0aGlzLnVyaSkpXG4gICAgY29uc3QgY2xhenogPSBqc1Byb2dyYW1bY29uZmlnLmNsYXp6IHx8ICdkZWZhdWx0J11cbiAgICBjb25zdCBpbnN0YW5jZTogUHJvYzx1bmtub3duPiA9IG5ldyBjbGF6eihhcmdzLCBwcm9jTG9nZ2VyKVxuXG4gICAgcmV0dXJuIDxGdWxsUHJvYzxQPj5pbnN0YW5jZVxuICB9XG5cbiAgYXN5bmMgYWRkUHJvY2Vzc29yPFAgZXh0ZW5kcyBQcm9jPHVua25vd24+PihcbiAgICBwcm9jOiBQcm9jZXNzb3IsXG4gICk6IFByb21pc2U8RnVsbFByb2M8UD4+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKEpTT04uc3RyaW5naWZ5KHByb2MpKVxuICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgdGhpcy5jcmVhdGVQcm9jZXNzb3I8UD4ocHJvYylcblxuICAgIGF3YWl0IGluc3RhbmNlLmluaXQoKVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbyhgSW5pdGlhdGVkIHByb2Nlc3NvciAnJHtwcm9jLnVyaX0nYClcblxuICAgIHRoaXMucHJvY2Vzc29ycy5wdXNoKGluc3RhbmNlKVxuICAgIHRoaXMucHJvY2Vzc29yVHJhbnNmb3Jtcy5wdXNoKGluc3RhbmNlLnRyYW5zZm9ybSgpKVxuXG4gICAgYXdhaXQgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IoeyBpbml0aWFsaXplZDogeyB1cmk6IHByb2MudXJpIH0gfSlcblxuICAgIHJldHVybiA8RnVsbFByb2M8UD4+aW5zdGFuY2VcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnByb2Nlc3NvcnMubWFwKCh4KSA9PiB4LnByb2R1Y2UoKSkpXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnByb2Nlc3NvclRyYW5zZm9ybXMpXG4gICAgfSBjYXRjaCAoZXg6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdTdGFydCBmYWlsZWQ6ICcgKyBKU09OLnN0cmluZ2lmeShleCkpXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlV3JpdGVyKHVyaTogVGVybSk6IFdyaXRlciB7XG4gICAgY29uc3QgaWQgPSB1cmkudmFsdWVcblxuICAgIGlmICh0aGlzLndyaXRlcnNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLndyaXRlcnNbaWRdXG4gICAgfVxuICAgIGNvbnN0IHRyYWNrZXIgPVxuICAgICAgdGhpcy5ydW5uZXJJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5zdGF0ZT8udHJhY2tDaGFubmVsKHRoaXMucnVubmVySWQsIGlkLCAnd3JpdGVyJylcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV3JpdGVySW5zdGFuY2UoXG4gICAgICBpZCxcbiAgICAgIHRoaXMuY2xpZW50LFxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IsXG4gICAgICB0aGlzLnVyaSxcbiAgICAgIHRoaXMubG9nZ2VyLFxuICAgICAgdHJhY2tlcixcbiAgICApXG4gICAgdGhpcy53cml0ZXJzW2lkXSA9IHdyaXRlclxuICAgIHJldHVybiB3cml0ZXJcbiAgfVxuXG4gIGNyZWF0ZVJlYWRlcih1cmk6IFRlcm0pOiBSZWFkZXIge1xuICAgIGNvbnN0IGlkcyA9IHVyaS52YWx1ZVxuXG4gICAgaWYgKHRoaXMucmVhZGVyc1tpZHNdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRlcnNbaWRzXVxuICAgIH1cbiAgICBjb25zdCB0cmFja2VyID1cbiAgICAgIHRoaXMucnVubmVySWQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuc3RhdGU/LnRyYWNrQ2hhbm5lbCh0aGlzLnJ1bm5lcklkLCBpZHMsICdyZWFkZXInKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBSZWFkZXJJbnN0YW5jZShcbiAgICAgIGlkcyxcbiAgICAgIHRoaXMuY2xpZW50LFxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IsXG4gICAgICB0aGlzLmxvZ2dlcixcbiAgICAgIHRyYWNrZXIsXG4gICAgKVxuICAgIHRoaXMucmVhZGVyc1tpZHNdID0gcmVhZGVyXG4gICAgcmV0dXJuIHJlYWRlclxuICB9XG5cbiAgYXN5bmMgaGFuZGxlT3JjaE1lc3NhZ2UobXNnOiBUb1J1bm5lcikge1xuICAgIGlmIChtc2cubXNnKSB7XG4gICAgICB0aGlzLmhhbmRsZU1zZyhtc2cubXNnKVxuICAgIH1cblxuICAgIGlmIChtc2cuc3RyZWFtTXNnKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVN0cmVhbU1zZyhtc2cuc3RyZWFtTXNnKVxuICAgIH1cblxuICAgIGlmIChtc2cuY2xvc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ2xvc2UobXNnLmNsb3NlKVxuICAgIH1cblxuICAgIGlmIChtc2cucGlwZWxpbmUpIHtcbiAgICAgIHRoaXMuaGFuZGxlUGlwZWxpbmUobXNnLnBpcGVsaW5lKVxuICAgIH1cblxuICAgIGlmIChtc2cucHJvY2Vzc2VkKSB7XG4gICAgICB0aGlzLmhhbmRsZVByb2Nlc3NlZChtc2cucHJvY2Vzc2VkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2xvc2UoY2xvc2U6IENsb3NlKSB7XG4gICAgY29uc3QgdXJpID0gY2xvc2UuY2hhbm5lbFxuICAgIGNvbnN0IHIgPSB0aGlzLnJlYWRlcnNbdXJpXVxuXG4gICAgbGV0IGNsb3NlZCA9IGZhbHNlXG4gICAgaWYgKHIpIHtcbiAgICAgIHIuY2xvc2UoKVxuICAgICAgY2xvc2VkID0gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCB3ID0gdGhpcy53cml0ZXJzW3VyaV1cbiAgICBpZiAodykge1xuICAgICAgY2xvc2VkID0gdHJ1ZVxuICAgICAgYXdhaXQgdy5jbG9zZSh0cnVlKVxuICAgIH1cblxuICAgIGlmICghY2xvc2VkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFJlY2VpdmVkIGEgY2xvc2UgZXZlbnQgZm9yIGNoYW5uZWwgJHt1cml9LCBidXQgbmVpdGhlciByZWFkZXIgbm9yIHdyaXRlciBpcyBwcmVzZW50LmAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQaXBlbGluZShwaXBlbGluZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1YWRzID0gbmV3IFBhcnNlcigpLnBhcnNlKHBpcGVsaW5lKVxuICAgICAgdGhpcy5zaGFwZXMgPSBleHRyYWN0U2hhcGVzKFxuICAgICAgICBxdWFkcyxcbiAgICAgICAge1xuICAgICAgICAgIFtSREZDLlJlYWRlcl06ICh4OiBDb250KSA9PiB0aGlzLmNyZWF0ZVJlYWRlcih4LmlkKSxcbiAgICAgICAgICBbUkRGQy5Xcml0ZXJdOiAoeDogQ29udCkgPT4gdGhpcy5jcmVhdGVXcml0ZXIoeC5pZCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBbUkRGQy5SZWFkZXJdOiBlbXB0eTxDb250PigpLFxuICAgICAgICAgIFtSREZDLldyaXRlcl06IGVtcHR5PENvbnQ+KCksXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICB0aGlzLnF1YWRzID0gcXVhZHNcbiAgICB9IGNhdGNoIChleDogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1BpcGVsaW5lIGZhaWxlZDogJyArIEpTT04uc3RyaW5naWZ5KGV4KSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1zZyhtc2c6IFJlY2VpdmluZ01lc3NhZ2UpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnSGFuZGxpbmcgZGF0YSBtc2cgZm9yICcgKyBtc2cuY2hhbm5lbClcbiAgICBjb25zdCByID0gdGhpcy5yZWFkZXJzW21zZy5jaGFubmVsXVxuXG4gICAgaWYgKHIpIHtcbiAgICAgIHIuaGFuZGxlTXNnKG1zZylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBSZWNlaXZlZCBtZXNzYWdlIGZvciBjaGFubmVsICR7bXNnLmNoYW5uZWx9LCBidXQgbm8gcmVhZGVyIHdhcyBwcmVzZW50LmAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdHJlYW1Nc2coc3RyZWFtTXNnOiBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlKSB7XG4gICAgY29uc3QgciA9IHRoaXMucmVhZGVyc1tzdHJlYW1Nc2cuY2hhbm5lbF1cblxuICAgIGlmIChyKSB7XG4gICAgICBhd2FpdCByLmhhbmRsZVN0cmVhbWluZ01lc3NhZ2Uoc3RyZWFtTXNnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFJlY2VpdmVkIHN0cmVhbSBtZXNzYWdlIGZvciBjaGFubmVsICR7c3RyZWFtTXNnLmNoYW5uZWx9LCBidXQgbm8gcmVhZGVyIHdhcyBwcmVzZW50LmAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQcm9jZXNzZWQocHJvY2Vzc2VkOiBMb2NhbEFjaykge1xuICAgIGNvbnN0IHdyaXRlciA9IHRoaXMud3JpdGVyc1twcm9jZXNzZWQuY2hhbm5lbF1cbiAgICBpZiAod3JpdGVyKSB7XG4gICAgICB3cml0ZXIuaGFuZGxlZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgUmVjZWl2ZWQgcHJvY2Vzc2VkIG1lc3NhZ2UgZm9yIGNoYW5uZWwgJHtwcm9jZXNzZWQuY2hhbm5lbH0sIGJ1dCBubyB3cml0ZXIgd2FzIHByZXNlbnQuYCxcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ interface ServerConfig {
2
+ port: number;
3
+ processorPaths: string[];
4
+ }
5
+ export declare function parseServerConfig(configPath: string): Promise<ServerConfig>;
6
+ export declare function buildWhitelist(processorPaths: string[]): Promise<Set<string>>;
7
+ export declare function generateIndexTtl(processorPaths: string[], cwd: string): Promise<string>;
8
+ export declare function serve(configPath: string): Promise<void>;
9
+ export {};