@kaspernj/api-maker 1.0.2157 → 1.0.2158

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.
package/README.md CHANGED
@@ -161,6 +161,26 @@ import resetRealtimeRuntimeState from "@kaspernj/api-maker/build/reset-realtime-
161
161
  resetRealtimeRuntimeState()
162
162
  ```
163
163
 
164
+ ### System test ActionCable cleanup (Ruby)
165
+
166
+ When using `use_transactional_fixtures = true` with system specs, ActionCable disconnect Fibers can hold the shared DB connection after the browser is killed, causing all subsequent tests to fail. Api Maker provides two helpers to prevent this:
167
+
168
+ **`reset_api_maker_realtime_runtime!`** — calls the auto-registered JS hook to gracefully disconnect ActionCable from the browser side before quitting the session. Returns `:ok`, `:missing`, `:error`, or `:unavailable`.
169
+
170
+ **`wait_for_action_cable_connections_to_close!`** — waits for server-side ActionCable connections to drain so disconnect Fibers release the shared DB connection.
171
+
172
+ Wire both into your test cleanup:
173
+
174
+ ```ruby
175
+ # In your rails_helper.rb ensure block, after resetting Capybara sessions
176
+ # and before DatabaseCleaner.clean:
177
+ reset_api_maker_realtime_runtime!
178
+ Capybara.reset!
179
+ wait_for_action_cable_connections_to_close!
180
+ ```
181
+
182
+ The JS hook is auto-registered on `globalThis.__apiMakerResetRealtimeRuntimeForSystemSpecs` when the module is loaded — downstream projects no longer need to register it manually.
183
+
164
184
  ## Realtime model events
165
185
 
166
186
  For model-specific websocket events in React/ShapeComponent UI code, prefer `useModelEvent` over manual `ModelEvents.connect(...)` subscriptions. The hook handles subscription lifecycle automatically and avoids leaked listeners.
@@ -47,6 +47,14 @@ export default class ApiMakerCommandsPool {
47
47
  errors: string[];
48
48
  validation_errors: string[];
49
49
  }): Promise<void>;
50
+ /**
51
+ * Rejects the command with the given error, splicing the caller's stack (captured synchronously in addCommand) onto error.stack.
52
+ * Needed because error.stack is frozen at construction time inside flush()'s microtask and therefore loses the caller's frames.
53
+ * @param {CommandDataType} commandData
54
+ * @param {Error} error
55
+ * @returns {void}
56
+ */
57
+ rejectWithCallerStack(commandData: CommandDataType, error: Error): void;
50
58
  /**
51
59
  * @param {Record<string, any>} commandResponseData
52
60
  * @returns {Promise<void>}
@@ -1 +1 @@
1
- {"version":3,"file":"commands-pool.d.ts","sourceRoot":"/src/","sources":["commands-pool.js"],"names":[],"mappings":"AA8BA,4BAA4B;AAC5B;IACE,kBAAkB;IAClB,6CAqBC;IAED,eAAe;IACf,sBAIC;IAED,aAAa;IACb,qBAEC;IAIC,mBAAmB;IAEnB,8CAA8C;IAC9C,MADW,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAC5B;IAEd,2BAA2B;IAC3B,UADW,YAAY,CACL;IAElB,kBAAkB;IAElB,kCAAkC;IAClC,mBADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACH;IAE3B,kCAAkC;IAClC,gBADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACN;IAG1B,kBAAkB;IAClB,gDAkCC;IAED,wBAAwB;IACxB,iBADc,MAAM,CAGnB;IAED;;;;;;OAMG;IACH,0DALG;QAAqB,GAAG,EAAhB,MAAM;QACkB,iBAAiB,EAAzC,iBAAiB;QACe,gBAAgB,GAAhD,wBAAwB;KAChC,GAAU,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAiCxC;IAED,aAAa;IACb,2BAyDC;IAED;;;;;;;OAOG;IACH,kCAPW,eAAe,uBAEvB;QAAoC,UAAU,EAAtC,MAAM;QACwB,MAAM,EAApC,MAAM,EAAE;QACsB,iBAAiB,EAA/C,MAAM,EAAE;KAChB,GAAU,OAAO,CAAC,IAAI,CAAC,CA4BzB;IAED;;;OAGG;IACH,0DAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED,gBAAgB;IAChB,oBAUC;IAED,sBAAsC;CACvC;;sBArRa,wBAAwB;WACxB,MAAM;;2BAGN;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG;YAAC,CAAC,GAAG,EAAE,MAAM,GAAG;gBAAC,CAAC,GAAG,EAAE,MAAM,GAAG;oBAAC,IAAI,EAAE,MAAM,CAAC;oBAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;oBAAC,EAAE,EAAE,MAAM,CAAA;iBAAC,CAAA;aAAC,CAAA;SAAC,CAAA;KAAC,CAAA;CAAC;qCAvBrG,wBAAwB;8BAC/B,0BAA0B;oBASpC,eAAe"}
1
+ {"version":3,"file":"commands-pool.d.ts","sourceRoot":"/src/","sources":["commands-pool.js"],"names":[],"mappings":"AA8BA,4BAA4B;AAC5B;IACE,kBAAkB;IAClB,6CAqBC;IAED,eAAe;IACf,sBAIC;IAED,aAAa;IACb,qBAEC;IAIC,mBAAmB;IAEnB,8CAA8C;IAC9C,MADW,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAC5B;IAEd,2BAA2B;IAC3B,UADW,YAAY,CACL;IAElB,kBAAkB;IAElB,kCAAkC;IAClC,mBADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACH;IAE3B,kCAAkC;IAClC,gBADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACN;IAG1B,kBAAkB;IAClB,gDAkCC;IAED,wBAAwB;IACxB,iBADc,MAAM,CAGnB;IAED;;;;;;OAMG;IACH,0DALG;QAAqB,GAAG,EAAhB,MAAM;QACkB,iBAAiB,EAAzC,iBAAiB;QACe,gBAAgB,GAAhD,wBAAwB;KAChC,GAAU,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAiCxC;IAED,aAAa;IACb,2BAkDC;IAED;;;;;;;OAOG;IACH,kCAPW,eAAe,uBAEvB;QAAoC,UAAU,EAAtC,MAAM;QACwB,MAAM,EAApC,MAAM,EAAE;QACsB,iBAAiB,EAA/C,MAAM,EAAE;KAChB,GAAU,OAAO,CAAC,IAAI,CAAC,CAwBzB;IAED;;;;;;OAMG;IACH,mCAJW,eAAe,SACf,KAAK,GACH,IAAI,CAkBhB;IAED;;;OAGG;IACH,0DAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED,gBAAgB;IAChB,oBAUC;IAED,sBAAsC;CACvC;;sBAnSa,wBAAwB;WACxB,MAAM;;2BAGN;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG;YAAC,CAAC,GAAG,EAAE,MAAM,GAAG;gBAAC,CAAC,GAAG,EAAE,MAAM,GAAG;oBAAC,IAAI,EAAE,MAAM,CAAC;oBAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;oBAAC,EAAE,EAAE,MAAM,CAAA;iBAAC,CAAA;aAAC,CAAA;SAAC,CAAA;KAAC,CAAA;CAAC;qCAvBrG,wBAAwB;8BAC/B,0BAA0B;oBASpC,eAAe"}
@@ -175,12 +175,7 @@ export default class ApiMakerCommandsPool {
175
175
  commandData.commandExecution.resolve(commandResponseData);
176
176
  }
177
177
  else if (responseType == "error") {
178
- const error = new CustomError("Command error", { response: commandResponseData });
179
- error.stack += "\n";
180
- error.stack += commandData.stack.split("\n")
181
- .slice(1)
182
- .join("\n");
183
- commandData.commandExecution.reject(error);
178
+ this.rejectWithCallerStack(commandData, new CustomError("Command error", { response: commandResponseData }));
184
179
  }
185
180
  else if (responseType == "failed") {
186
181
  await this.handleFailedResponse(commandData, commandResponseData);
@@ -217,12 +212,31 @@ export default class ApiMakerCommandsPool {
217
212
  events.emit("onValidationErrors", validationErrors);
218
213
  }
219
214
  else {
220
- let errorMessage;
221
- if (!commandResponseData.errors) {
222
- errorMessage = "Command failed";
223
- }
215
+ const errorMessage = commandResponseData.errors ? undefined : "Command failed";
224
216
  error = new CustomError(errorMessage, { response: commandResponseData });
225
217
  }
218
+ this.rejectWithCallerStack(commandData, error);
219
+ }
220
+ /**
221
+ * Rejects the command with the given error, splicing the caller's stack (captured synchronously in addCommand) onto error.stack.
222
+ * Needed because error.stack is frozen at construction time inside flush()'s microtask and therefore loses the caller's frames.
223
+ * @param {CommandDataType} commandData
224
+ * @param {Error} error
225
+ * @returns {void}
226
+ */
227
+ rejectWithCallerStack(commandData, error) {
228
+ if (commandData.stack) {
229
+ // V8 prefixes "Error\n" as a header; JSC/SpiderMonkey stacks start directly with a frame.
230
+ const callerFrames = commandData.stack.startsWith("Error")
231
+ ? commandData.stack
232
+ .split("\n")
233
+ .slice(1)
234
+ .join("\n")
235
+ : commandData.stack;
236
+ if (callerFrames) {
237
+ error.stack = `${error.stack ?? ""}\n${callerFrames}`;
238
+ }
239
+ }
226
240
  commandData.commandExecution.reject(error);
227
241
  }
228
242
  /**
@@ -253,4 +267,4 @@ export default class ApiMakerCommandsPool {
253
267
  }
254
268
  flushRunLast = new RunLast(this.flush);
255
269
  }
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMtcG9vbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiY29tbWFuZHMtcG9vbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFBO0FBQzFCLE9BQU8sd0JBQXdCLE1BQU0sd0JBQXdCLENBQUE7QUFDN0QsT0FBTyxpQkFBaUIsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUEsQ0FBQyxtQ0FBbUM7QUFDaEYsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBLENBQUMsbUNBQW1DO0FBQ3ZFLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLGtCQUFrQixNQUFNLHNCQUFzQixDQUFBLENBQUMsbUNBQW1DO0FBQ3pGLE9BQU8sT0FBTyxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLG9CQUFvQixNQUFNLDZCQUE2QixDQUFBO0FBQzlELE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3ZELE9BQU8sc0JBQXNCLE1BQU0sK0JBQStCLENBQUE7QUFFbEU7Ozs7R0FJRztBQUVILDJKQUEySjtBQUUzSixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7QUFFakIsNEJBQTRCO0FBQzVCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQW9CO0lBQ3ZDLGtCQUFrQjtJQUNsQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFB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QUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUU1RyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFDNUQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELFlBQVksR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7Q0FDdkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEFwaSBmcm9tIFwiLi9hcGkuanNcIlxuaW1wb3J0IEFwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbiBmcm9tIFwiLi9jb21tYW5kLWV4ZWN1dGlvbi5qc1wiXG5pbXBvcnQgQ29tbWFuZFN1Ym1pdERhdGEgZnJvbSBcIi4vY29tbWFuZC1zdWJtaXQtZGF0YS5qc1wiXG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuL2NvbmZpZy5qc1wiXG5pbXBvcnQgQ3VzdG9tRXJyb3IgZnJvbSBcIi4vY3VzdG9tLWVycm9yLmpzXCJcbmltcG9ydCBEZXN0cm95RXJyb3IgZnJvbSBcIi4vZGVzdHJveS1lcnJvci5qc1wiXG5pbXBvcnQgRGVzZXJpYWxpemVyIGZyb20gXCIuL2Rlc2VyaWFsaXplci5qc1wiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc29ydC1pbXBvcnRzXG5pbXBvcnQgRGV2aXNlIGZyb20gXCIuL2RldmlzZS5qc1wiXG5pbXBvcnQge2RpZywgZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc29ydC1pbXBvcnRzXG5pbXBvcnQgZXZlbnRzIGZyb20gXCIuL2V2ZW50cy5qc1wiXG5pbXBvcnQgRm9ybURhdGFPYmplY3RpemVyIGZyb20gXCJmb3JtLWRhdGEtb2JqZWN0aXplclwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc29ydC1pbXBvcnRzXG5pbXBvcnQgUnVuTGFzdCBmcm9tIFwiLi9ydW4tbGFzdC5qc1wiXG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwiLi9zZXJpYWxpemVyLmpzXCJcbmltcG9ydCBTZXNzaW9uU3RhdHVzVXBkYXRlciBmcm9tIFwiLi9zZXNzaW9uLXN0YXR1cy11cGRhdGVyLmpzXCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvci5qc1wiXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcnN9IGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3JzLmpzXCJcbmltcG9ydCBXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50IGZyb20gXCIuL3dlYnNvY2tldC1yZXF1ZXN0LWNsaWVudC5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tbWFuZERhdGFUeXBlXG4gKiBAcHJvcGVydHkge0FwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbn0gY29tbWFuZEV4ZWN1dGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0YWNrXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7W2tleTogc3RyaW5nXToge1trZXk6IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiB7W2tleTogbnVtYmVyXToge2FyZ3M6IG9iamVjdCwgcHJpbWFyeV9rZXk6IG51bWJlciB8IHN0cmluZywgaWQ6IG51bWJlcn19fX19fSBQb29sRGF0YVR5cGUgKi9cblxuY29uc3Qgc2hhcmVkID0ge31cblxuLyoqIEFwaU1ha2VyQ29tbWFuZHNQb29sLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJDb21tYW5kc1Bvb2wge1xuICAvKiogYWRkQ29tbWFuZC4gKi9cbiAgc3RhdGljIGFkZENvbW1hbmQoZGF0YSwgYXJncyA9IHt9KSB7XG4gICAgbGV0IHBvb2xcbiAgICBjb25zdCB1c2VXZWJzb2NrZXRSZXF1ZXN0cyA9IENvbmZpZy5nZXRXZWJzb2NrZXRSZXF1ZXN0cygpXG5cbiAgICBpZiAoYXJncy5pbnN0YW50IHx8IHVzZVdlYnNvY2tldFJlcXVlc3RzKSB7XG4gICAgICBwb29sID0gbmV3IEFwaU1ha2VyQ29tbWFuZHNQb29sKClcbiAgICAgIHBvb2wuZ2xvYmFsUmVxdWVzdERhdGEgPSB7Li4uQXBpTWFrZXJDb21tYW5kc1Bvb2wuY3VycmVudCgpLmdsb2JhbFJlcXVlc3REYXRhfVxuICAgICAgcG9vbC5yZXF1ZXN0T3B0aW9ucyA9IHsuLi5hcmdzfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb29sID0gQXBpTWFrZXJDb21tYW5kc1Bvb2wuY3VycmVudCgpXG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZVJlc3VsdCA9IHBvb2wuYWRkQ29tbWFuZChkYXRhKVxuXG4gICAgaWYgKGFyZ3MuaW5zdGFudCB8fCB1c2VXZWJzb2NrZXRSZXF1ZXN0cykge1xuICAgICAgcG9vbC5mbHVzaFJ1bkxhc3QucnVuKClcbiAgICB9IGVsc2Uge1xuICAgICAgcG9vbC5mbHVzaFJ1bkxhc3QucXVldWUoKVxuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlUmVzdWx0XG4gIH1cblxuICAvKiogY3VycmVudC4gKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFzaGFyZWQuY3VycmVudEFwaU1ha2VyQ29tbWFuZHNQb29sKSBzaGFyZWQuY3VycmVudEFwaU1ha2VyQ29tbWFuZHNQb29sID0gbmV3IEFwaU1ha2VyQ29tbWFuZHNQb29sKClcblxuICAgIHJldHVybiBzaGFyZWQuY3VycmVudEFwaU1ha2VyQ29tbWFuZHNQb29sXG4gIH1cblxuICAvKiogZmx1c2guICovXG4gIHN0YXRpYyBmbHVzaCgpIHtcbiAgICBBcGlNYWtlckNvbW1hbmRzUG9vbC5jdXJyZW50KCkuZmx1c2goKVxuICB9XG5cbiAgLyoqIENvbnN0cnVjdG9yLiAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZsdXNoQ291bnQgPSAwXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIENvbW1hbmREYXRhVHlwZT59ICovXG4gICAgdGhpcy5wb29sID0ge31cblxuICAgIC8qKiBAdHlwZSB7UG9vbERhdGFUeXBlfSAqL1xuICAgIHRoaXMucG9vbERhdGEgPSB7fVxuXG4gICAgdGhpcy5jdXJyZW50SWQgPSAxXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5nbG9iYWxSZXF1ZXN0RGF0YSA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5yZXF1ZXN0T3B0aW9ucyA9IHt9XG4gIH1cblxuICAvKiogYWRkQ29tbWFuZC4gKi9cbiAgYWRkQ29tbWFuZChkYXRhKSB7XG4gICAgY29uc3Qgc3RhY2sgPSBFcnJvcigpLnN0YWNrXG4gICAgY29uc3QgaWQgPSB0aGlzLmN1cnJlbnRJZFxuICAgIGNvbnN0IGNvbW1hbmRFeGVjdXRpb24gPSBuZXcgQXBpTWFrZXJDb21tYW5kRXhlY3V0aW9uKClcbiAgICBjb25zdCBjb21tYW5kVHlwZSA9IGRhdGEudHlwZVxuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gZGF0YS5jb21tYW5kXG4gICAgY29uc3QgY29sbGVjdGlvbk5hbWUgPSBkYXRhLmNvbGxlY3Rpb25OYW1lXG5cbiAgICB0aGlzLmN1cnJlbnRJZCArPSAxXG4gICAgdGhpcy5wb29sW2lkXSA9IHtjb21tYW5kRXhlY3V0aW9uLCBzdGFja31cblxuICAgIGlmICghdGhpcy5wb29sRGF0YVtjb21tYW5kVHlwZV0pIHRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdID0ge31cbiAgICBpZiAoIXRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXSkgdGhpcy5wb29sRGF0YVtjb21tYW5kVHlwZV1bY29sbGVjdGlvbk5hbWVdID0ge31cbiAgICBpZiAoIXRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXVtjb21tYW5kTmFtZV0pIHRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXVtjb21tYW5kTmFtZV0gPSB7fVxuXG4gICAgbGV0IGFyZ3NcblxuICAgIGlmIChkYXRhLmFyZ3M/Lm5vZGVOYW1lID09IFwiRk9STVwiKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShkYXRhLmFyZ3MpXG5cbiAgICAgIGFyZ3MgPSBGb3JtRGF0YU9iamVjdGl6ZXIudG9PYmplY3QoZm9ybURhdGEpXG4gICAgfSBlbHNlIGlmIChkYXRhLmFyZ3MgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgYXJncyA9IEZvcm1EYXRhT2JqZWN0aXplci50b09iamVjdChkYXRhLmFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBTZXJpYWxpemVyLnNlcmlhbGl6ZShkYXRhLmFyZ3MpXG4gICAgfVxuXG4gICAgdGhpcy5wb29sRGF0YVtjb21tYW5kVHlwZV1bY29sbGVjdGlvbk5hbWVdW2NvbW1hbmROYW1lXVtpZF0gPSB7XG4gICAgICBhcmdzLFxuICAgICAgcHJpbWFyeV9rZXk6IGRhdGEucHJpbWFyeUtleSxcbiAgICAgIGlkXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmRFeGVjdXRpb25cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBjb21tYW5kc0NvdW50KCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnBvb2wpLmxlbmd0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnVybFxuICAgKiBAcGFyYW0ge0NvbW1hbmRTdWJtaXREYXRhfSBhcmdzLmNvbW1hbmRTdWJtaXREYXRhXG4gICAqIEBwYXJhbSB7QXBpTWFrZXJDb21tYW5kRXhlY3V0aW9ufSBbYXJncy5jb21tYW5kRXhlY3V0aW9uXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn1cbiAgICovXG4gIGFzeW5jIHNlbmRSZXF1ZXN0KHtjb21tYW5kRXhlY3V0aW9uLCBjb21tYW5kU3VibWl0RGF0YSwgdXJsfSkge1xuICAgIGlmIChDb25maWcuZ2V0V2Vic29ja2V0UmVxdWVzdHMoKSAmJiAhdGhpcy5yZXF1ZXN0T3B0aW9ucy5mb3JjZUh0dHAgJiYgY29tbWFuZFN1Ym1pdERhdGEuZ2V0RmlsZXNDb3VudCgpID09IDApIHtcbiAgICAgIHJldHVybiBhd2FpdCBXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50LmN1cnJlbnQoKS5wZXJmb3JtKHtcbiAgICAgICAgY2FjaGVSZXNwb25zZTogdGhpcy5yZXF1ZXN0T3B0aW9ucy5jYWNoZVJlc3BvbnNlLFxuICAgICAgICBnbG9iYWw6IHRoaXMuZ2xvYmFsUmVxdWVzdERhdGEsXG4gICAgICAgIG9uTG9nOiAobWVzc2FnZSkgPT4gY29tbWFuZEV4ZWN1dGlvbj8uYWRkTG9nKG1lc3NhZ2UpLFxuICAgICAgICBvblByb2dyZXNzOiAocHJvZ3Jlc3NEYXRhKSA9PiBjb21tYW5kRXhlY3V0aW9uPy5zZXRQcm9ncmVzcyhwcm9ncmVzc0RhdGEpLFxuICAgICAgICBvblJlY2VpdmVkOiAocmVjZWl2ZWREYXRhKSA9PiBjb21tYW5kRXhlY3V0aW9uPy5zZXRSZWNlaXZlZChyZWNlaXZlZERhdGEpLFxuICAgICAgICByZXF1ZXN0OiBjb21tYW5kU3VibWl0RGF0YS5nZXRKc29uRGF0YSgpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGxldCByZXNwb25zZVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgIGlmIChjb21tYW5kU3VibWl0RGF0YS5nZXRGaWxlc0NvdW50KCkgPiAwKSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgQXBpLnJlcXVlc3RMb2NhbCh7cGF0aDogdXJsLCBtZXRob2Q6IFwiUE9TVFwiLCByYXdEYXRhOiBjb21tYW5kU3VibWl0RGF0YS5nZXRGb3JtRGF0YSgpfSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IEFwaS5yZXF1ZXN0TG9jYWwoe3BhdGg6IHVybCwgbWV0aG9kOiBcIlBPU1RcIiwgZGF0YTogY29tbWFuZFN1Ym1pdERhdGEuZ2V0SnNvbkRhdGEoKX0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gZmFsc2UgJiYgcmVzcG9uc2UudHlwZSA9PSBcImludmFsaWRfYXV0aGVudGljaXR5X3Rva2VuXCIpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnZhbGlkIGF1dGhlbnRpY2l0eSB0b2tlbiAtIHRyeSBhZ2FpblwiKVxuICAgICAgICBhd2FpdCBTZXNzaW9uU3RhdHVzVXBkYXRlci5jdXJyZW50KCkudXBkYXRlU2Vzc2lvblN0YXR1cygpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBjb250aW51ZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbnQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGUgcmVxdWVzdFwiKVxuICB9XG5cbiAgLyoqIGZsdXNoLiAqL1xuICBmbHVzaCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAodGhpcy5jb21tYW5kc0NvdW50KCkgPT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFBvb2wgPSB0aGlzLnBvb2xcbiAgICBjb25zdCBjdXJyZW50UG9vbERhdGEgPSB0aGlzLnBvb2xEYXRhXG5cbiAgICB0aGlzLnBvb2wgPSB7fVxuICAgIHRoaXMucG9vbERhdGEgPSB7fVxuICAgIHRoaXMuZmx1c2hDb3VudCsrXG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VibWl0RGF0YSA9IHtwb29sOiBjdXJyZW50UG9vbERhdGF9XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmdsb2JhbFJlcXVlc3REYXRhKS5sZW5ndGggPiAwKVxuICAgICAgICBzdWJtaXREYXRhLmdsb2JhbCA9IHRoaXMuZ2xvYmFsUmVxdWVzdERhdGFcblxuICAgICAgY29uc3QgY29tbWFuZFN1Ym1pdERhdGEgPSBuZXcgQ29tbWFuZFN1Ym1pdERhdGEoc3VibWl0RGF0YSlcbiAgICAgIGNvbnN0IHVybCA9IFwiL2FwaV9tYWtlci9jb21tYW5kc1wiXG4gICAgICBjb25zdCBjb21tYW5kRXhlY3V0aW9uID0gT2JqZWN0LnZhbHVlcyhjdXJyZW50UG9vbClbMF0/LmNvbW1hbmRFeGVjdXRpb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCh7Y29tbWFuZEV4ZWN1dGlvbiwgY29tbWFuZFN1Ym1pdERhdGEsIHVybH0pXG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHJlc3BvbnNlLnJlc3BvbnNlcykubWFwKGFzeW5jKGNvbW1hbmRJZCkgPT4ge1xuICAgICAgICBjb25zdCBjb21tYW5kUmVzcG9uc2UgPSByZXNwb25zZS5yZXNwb25zZXNbY29tbWFuZElkXVxuICAgICAgICBjb25zdCBjb21tYW5kUmVzcG9uc2VEYXRhID0gRGVzZXJpYWxpemVyLnBhcnNlKGNvbW1hbmRSZXNwb25zZS5kYXRhKVxuICAgICAgICBjb25zdCBjb21tYW5kRGF0YSA9IGN1cnJlbnRQb29sW3BhcnNlSW50KGNvbW1hbmRJZCwgMTApXVxuICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSBjb21tYW5kUmVzcG9uc2UudHlwZVxuXG4gICAgICAgIGlmIChjb21tYW5kUmVzcG9uc2VEYXRhICYmIHR5cGVvZiBjb21tYW5kUmVzcG9uc2VEYXRhID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBjb25zdCBidWdSZXBvcnRVcmwgPSBkaWcoY29tbWFuZFJlc3BvbnNlRGF0YSwgXCJidWdfcmVwb3J0X3VybFwiKVxuXG4gICAgICAgICAgaWYgKGJ1Z1JlcG9ydFVybCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEJ1ZyByZXBvcnQgVVJMOiAke2J1Z1JlcG9ydFVybH1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICBjb21tYW5kRGF0YS5jb21tYW5kRXhlY3V0aW9uLnJlc29sdmUoY29tbWFuZFJlc3BvbnNlRGF0YSlcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3VzdG9tRXJyb3IoXCJDb21tYW5kIGVycm9yXCIsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pXG5cbiAgICAgICAgICBlcnJvci5zdGFjayArPSBcIlxcblwiXG4gICAgICAgICAgZXJyb3Iuc3RhY2sgKz0gY29tbWFuZERhdGEuc3RhY2suc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgLmpvaW4oXCJcXG5cIilcblxuICAgICAgICAgIGNvbW1hbmREYXRhLmNvbW1hbmRFeGVjdXRpb24ucmVqZWN0KGVycm9yKVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PSBcImZhaWxlZFwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGYWlsZWRSZXNwb25zZShjb21tYW5kRGF0YSwgY29tbWFuZFJlc3BvbnNlRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCByZXNwb25zZSB0eXBlOiAke3Jlc3BvbnNlVHlwZX1gKVxuICAgICAgICB9XG4gICAgICB9KSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5mbHVzaENvdW50LS1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtDb21tYW5kRGF0YVR5cGV9IGNvbW1hbmREYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21tYW5kUmVzcG9uc2VEYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kUmVzcG9uc2VEYXRhLmVycm9yX3R5cGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY29tbWFuZFJlc3BvbnNlRGF0YS5lcnJvcnNcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY29tbWFuZFJlc3BvbnNlRGF0YS52YWxpZGF0aW9uX2Vycm9yc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGhhbmRsZUZhaWxlZFJlc3BvbnNlKGNvbW1hbmREYXRhLCBjb21tYW5kUmVzcG9uc2VEYXRhKSB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoU2Vzc2lvblN0YXR1c0Zvck5vQWNjZXNzRXJyb3IoY29tbWFuZFJlc3BvbnNlRGF0YSlcblxuICAgIGxldCBlcnJvclxuXG4gICAgaWYgKGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JfdHlwZSA9PSBcImRlc3Ryb3lfZXJyb3JcIikge1xuICAgICAgZXJyb3IgPSBuZXcgRGVzdHJveUVycm9yKFwiRGVzdHJveSBmYWlsZWRcIiwge3Jlc3BvbnNlOiBjb21tYW5kUmVzcG9uc2VEYXRhfSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JfdHlwZSA9PSBcInZhbGlkYXRpb25fZXJyb3JcIikge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgICAgbW9kZWw6IGRpZ2coY29tbWFuZFJlc3BvbnNlRGF0YSwgXCJtb2RlbFwiKSxcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhjb21tYW5kUmVzcG9uc2VEYXRhLCBcInZhbGlkYXRpb25fZXJyb3JzXCIpXG4gICAgICB9KVxuICAgICAgZXJyb3IgPSBuZXcgVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25FcnJvcnMsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pXG5cbiAgICAgIGV2ZW50cy5lbWl0KFwib25WYWxpZGF0aW9uRXJyb3JzXCIsIHZhbGlkYXRpb25FcnJvcnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2VcblxuICAgICAgaWYgKCFjb21tYW5kUmVzcG9uc2VEYXRhLmVycm9ycykge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBcIkNvbW1hbmQgZmFpbGVkXCJcbiAgICAgIH1cblxuICAgICAgZXJyb3IgPSBuZXcgQ3VzdG9tRXJyb3IoZXJyb3JNZXNzYWdlLCB7cmVzcG9uc2U6IGNvbW1hbmRSZXNwb25zZURhdGF9KVxuICAgIH1cblxuICAgIGNvbW1hbmREYXRhLmNvbW1hbmRFeGVjdXRpb24ucmVqZWN0KGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29tbWFuZFJlc3BvbnNlRGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlZnJlc2hTZXNzaW9uU3RhdHVzRm9yTm9BY2Nlc3NFcnJvcihjb21tYW5kUmVzcG9uc2VEYXRhKSB7XG4gICAgaWYgKGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JfdHlwZSAhPSBcIm5vdF9mb3VuZF9vcl9ub19hY2Nlc3NcIikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVkSW5TY29wZSA9IERldmlzZVxuICAgICAgLnJlZ2lzdGVyZWRTY29wZXMoKVxuICAgICAgLmZpbmQoKHNjb3BlKSA9PiBEZXZpc2UuY3VycmVudCgpLmhhc0N1cnJlbnRTY29wZShzY29wZSkgfHwgRGV2aXNlLmN1cnJlbnQoKS5oYXNHbG9iYWxDdXJyZW50U2NvcGUoc2NvcGUpKVxuXG4gICAgaWYgKCFzaWduZWRJblNjb3BlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCBTZXNzaW9uU3RhdHVzVXBkYXRlci5jdXJyZW50KCkudXBkYXRlU2Vzc2lvblN0YXR1cygpXG4gIH1cblxuICAvKiogaXNBY3RpdmUuICovXG4gIGlzQWN0aXZlKCkge1xuICAgIGlmICh0aGlzLmNvbW1hbmRzQ291bnQoKSA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmx1c2hDb3VudCA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmbHVzaFJ1bkxhc3QgPSBuZXcgUnVuTGFzdCh0aGlzLmZsdXNoKVxufVxuIl19
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMtcG9vbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiY29tbWFuZHMtcG9vbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFBO0FBQzFCLE9BQU8sd0JBQXdCLE1BQU0sd0JBQXdCLENBQUE7QUFDN0QsT0FBTyxpQkFBaUIsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUEsQ0FBQyxtQ0FBbUM7QUFDaEYsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBLENBQUMsbUNBQW1DO0FBQ3ZFLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLGtCQUFrQixNQUFNLHNCQUFzQixDQUFBLENBQUMsbUNBQW1DO0FBQ3pGLE9BQU8sT0FBTyxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLG9CQUFvQixNQUFNLDZCQUE2QixDQUFBO0FBQzlELE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3ZELE9BQU8sc0JBQXNCLE1BQU0sK0JBQStCLENBQUE7QUFFbEU7Ozs7R0FJRztBQUVILDJKQUEySjtBQUUzSixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7QUFFakIsNEJBQTRCO0FBQzVCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQW9CO0lBQ3ZDLGtCQUFrQjtJQUNsQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFB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LE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLG1CQUFtQjtRQUM1RCxJQUFJLG1CQUFtQixDQUFDLFVBQVUsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1lBQy9ELE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTTthQUN6QixnQkFBZ0IsRUFBRTthQUNsQixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFFNUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO0lBQzVELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxZQUFZLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0NBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBBcGkgZnJvbSBcIi4vYXBpLmpzXCJcbmltcG9ydCBBcGlNYWtlckNvbW1hbmRFeGVjdXRpb24gZnJvbSBcIi4vY29tbWFuZC1leGVjdXRpb24uanNcIlxuaW1wb3J0IENvbW1hbmRTdWJtaXREYXRhIGZyb20gXCIuL2NvbW1hbmQtc3VibWl0LWRhdGEuanNcIlxuaW1wb3J0IENvbmZpZyBmcm9tIFwiLi9jb25maWcuanNcIlxuaW1wb3J0IEN1c3RvbUVycm9yIGZyb20gXCIuL2N1c3RvbS1lcnJvci5qc1wiXG5pbXBvcnQgRGVzdHJveUVycm9yIGZyb20gXCIuL2Rlc3Ryb3ktZXJyb3IuanNcIlxuaW1wb3J0IERlc2VyaWFsaXplciBmcm9tIFwiLi9kZXNlcmlhbGl6ZXIuanNcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuaW1wb3J0IERldmlzZSBmcm9tIFwiLi9kZXZpc2UuanNcIlxuaW1wb3J0IHtkaWcsIGRpZ2d9IGZyb20gXCJkaWdnZXJpemVcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuaW1wb3J0IGV2ZW50cyBmcm9tIFwiLi9ldmVudHMuanNcIlxuaW1wb3J0IEZvcm1EYXRhT2JqZWN0aXplciBmcm9tIFwiZm9ybS1kYXRhLW9iamVjdGl6ZXJcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuaW1wb3J0IFJ1bkxhc3QgZnJvbSBcIi4vcnVuLWxhc3QuanNcIlxuaW1wb3J0IFNlcmlhbGl6ZXIgZnJvbSBcIi4vc2VyaWFsaXplci5qc1wiXG5pbXBvcnQgU2Vzc2lvblN0YXR1c1VwZGF0ZXIgZnJvbSBcIi4vc2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qc1wiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3IuanNcIlxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3JzfSBmcm9tIFwiLi92YWxpZGF0aW9uLWVycm9ycy5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdENsaWVudCBmcm9tIFwiLi93ZWJzb2NrZXQtcmVxdWVzdC1jbGllbnQuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbW1hbmREYXRhVHlwZVxuICogQHByb3BlcnR5IHtBcGlNYWtlckNvbW1hbmRFeGVjdXRpb259IGNvbW1hbmRFeGVjdXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGFja1xuICovXG5cbi8qKiBAdHlwZWRlZiB7e1trZXk6IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiB7W2tleTogc3RyaW5nXToge1trZXk6IG51bWJlcl06IHthcmdzOiBvYmplY3QsIHByaW1hcnlfa2V5OiBudW1iZXIgfCBzdHJpbmcsIGlkOiBudW1iZXJ9fX19fX0gUG9vbERhdGFUeXBlICovXG5cbmNvbnN0IHNoYXJlZCA9IHt9XG5cbi8qKiBBcGlNYWtlckNvbW1hbmRzUG9vbC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyQ29tbWFuZHNQb29sIHtcbiAgLyoqIGFkZENvbW1hbmQuICovXG4gIHN0YXRpYyBhZGRDb21tYW5kKGRhdGEsIGFyZ3MgPSB7fSkge1xuICAgIGxldCBwb29sXG4gICAgY29uc3QgdXNlV2Vic29ja2V0UmVxdWVzdHMgPSBDb25maWcuZ2V0V2Vic29ja2V0UmVxdWVzdHMoKVxuXG4gICAgaWYgKGFyZ3MuaW5zdGFudCB8fCB1c2VXZWJzb2NrZXRSZXF1ZXN0cykge1xuICAgICAgcG9vbCA9IG5ldyBBcGlNYWtlckNvbW1hbmRzUG9vbCgpXG4gICAgICBwb29sLmdsb2JhbFJlcXVlc3REYXRhID0gey4uLkFwaU1ha2VyQ29tbWFuZHNQb29sLmN1cnJlbnQoKS5nbG9iYWxSZXF1ZXN0RGF0YX1cbiAgICAgIHBvb2wucmVxdWVzdE9wdGlvbnMgPSB7Li4uYXJnc31cbiAgICB9IGVsc2Uge1xuICAgICAgcG9vbCA9IEFwaU1ha2VyQ29tbWFuZHNQb29sLmN1cnJlbnQoKVxuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VSZXN1bHQgPSBwb29sLmFkZENvbW1hbmQoZGF0YSlcblxuICAgIGlmIChhcmdzLmluc3RhbnQgfHwgdXNlV2Vic29ja2V0UmVxdWVzdHMpIHtcbiAgICAgIHBvb2wuZmx1c2hSdW5MYXN0LnJ1bigpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBvb2wuZmx1c2hSdW5MYXN0LnF1ZXVlKClcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZVJlc3VsdFxuICB9XG5cbiAgLyoqIGN1cnJlbnQuICovXG4gIHN0YXRpYyBjdXJyZW50KCkge1xuICAgIGlmICghc2hhcmVkLmN1cnJlbnRBcGlNYWtlckNvbW1hbmRzUG9vbCkgc2hhcmVkLmN1cnJlbnRBcGlNYWtlckNvbW1hbmRzUG9vbCA9IG5ldyBBcGlNYWtlckNvbW1hbmRzUG9vbCgpXG5cbiAgICByZXR1cm4gc2hhcmVkLmN1cnJlbnRBcGlNYWtlckNvbW1hbmRzUG9vbFxuICB9XG5cbiAgLyoqIGZsdXNoLiAqL1xuICBzdGF0aWMgZmx1c2goKSB7XG4gICAgQXBpTWFrZXJDb21tYW5kc1Bvb2wuY3VycmVudCgpLmZsdXNoKClcbiAgfVxuXG4gIC8qKiBDb25zdHJ1Y3Rvci4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5mbHVzaENvdW50ID0gMFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBDb21tYW5kRGF0YVR5cGU+fSAqL1xuICAgIHRoaXMucG9vbCA9IHt9XG5cbiAgICAvKiogQHR5cGUge1Bvb2xEYXRhVHlwZX0gKi9cbiAgICB0aGlzLnBvb2xEYXRhID0ge31cblxuICAgIHRoaXMuY3VycmVudElkID0gMVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuZ2xvYmFsUmVxdWVzdERhdGEgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMucmVxdWVzdE9wdGlvbnMgPSB7fVxuICB9XG5cbiAgLyoqIGFkZENvbW1hbmQuICovXG4gIGFkZENvbW1hbmQoZGF0YSkge1xuICAgIGNvbnN0IHN0YWNrID0gRXJyb3IoKS5zdGFja1xuICAgIGNvbnN0IGlkID0gdGhpcy5jdXJyZW50SWRcbiAgICBjb25zdCBjb21tYW5kRXhlY3V0aW9uID0gbmV3IEFwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbigpXG4gICAgY29uc3QgY29tbWFuZFR5cGUgPSBkYXRhLnR5cGVcbiAgICBjb25zdCBjb21tYW5kTmFtZSA9IGRhdGEuY29tbWFuZFxuICAgIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gZGF0YS5jb2xsZWN0aW9uTmFtZVxuXG4gICAgdGhpcy5jdXJyZW50SWQgKz0gMVxuICAgIHRoaXMucG9vbFtpZF0gPSB7Y29tbWFuZEV4ZWN1dGlvbiwgc3RhY2t9XG5cbiAgICBpZiAoIXRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdKSB0aGlzLnBvb2xEYXRhW2NvbW1hbmRUeXBlXSA9IHt9XG4gICAgaWYgKCF0aGlzLnBvb2xEYXRhW2NvbW1hbmRUeXBlXVtjb2xsZWN0aW9uTmFtZV0pIHRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXSA9IHt9XG4gICAgaWYgKCF0aGlzLnBvb2xEYXRhW2NvbW1hbmRUeXBlXVtjb2xsZWN0aW9uTmFtZV1bY29tbWFuZE5hbWVdKSB0aGlzLnBvb2xEYXRhW2NvbW1hbmRUeXBlXVtjb2xsZWN0aW9uTmFtZV1bY29tbWFuZE5hbWVdID0ge31cblxuICAgIGxldCBhcmdzXG5cbiAgICBpZiAoZGF0YS5hcmdzPy5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZGF0YS5hcmdzKVxuXG4gICAgICBhcmdzID0gRm9ybURhdGFPYmplY3RpemVyLnRvT2JqZWN0KGZvcm1EYXRhKVxuICAgIH0gZWxzZSBpZiAoZGF0YS5hcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgIGFyZ3MgPSBGb3JtRGF0YU9iamVjdGl6ZXIudG9PYmplY3QoZGF0YS5hcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzID0gU2VyaWFsaXplci5zZXJpYWxpemUoZGF0YS5hcmdzKVxuICAgIH1cblxuICAgIHRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXVtjb21tYW5kTmFtZV1baWRdID0ge1xuICAgICAgYXJncyxcbiAgICAgIHByaW1hcnlfa2V5OiBkYXRhLnByaW1hcnlLZXksXG4gICAgICBpZFxuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kRXhlY3V0aW9uXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgY29tbWFuZHNDb3VudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wb29sKS5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy51cmxcbiAgICogQHBhcmFtIHtDb21tYW5kU3VibWl0RGF0YX0gYXJncy5jb21tYW5kU3VibWl0RGF0YVxuICAgKiBAcGFyYW0ge0FwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbn0gW2FyZ3MuY29tbWFuZEV4ZWN1dGlvbl1cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59XG4gICAqL1xuICBhc3luYyBzZW5kUmVxdWVzdCh7Y29tbWFuZEV4ZWN1dGlvbiwgY29tbWFuZFN1Ym1pdERhdGEsIHVybH0pIHtcbiAgICBpZiAoQ29uZmlnLmdldFdlYnNvY2tldFJlcXVlc3RzKCkgJiYgIXRoaXMucmVxdWVzdE9wdGlvbnMuZm9yY2VIdHRwICYmIGNvbW1hbmRTdWJtaXREYXRhLmdldEZpbGVzQ291bnQoKSA9PSAwKSB7XG4gICAgICByZXR1cm4gYXdhaXQgV2Vic29ja2V0UmVxdWVzdENsaWVudC5jdXJyZW50KCkucGVyZm9ybSh7XG4gICAgICAgIGNhY2hlUmVzcG9uc2U6IHRoaXMucmVxdWVzdE9wdGlvbnMuY2FjaGVSZXNwb25zZSxcbiAgICAgICAgZ2xvYmFsOiB0aGlzLmdsb2JhbFJlcXVlc3REYXRhLFxuICAgICAgICBvbkxvZzogKG1lc3NhZ2UpID0+IGNvbW1hbmRFeGVjdXRpb24/LmFkZExvZyhtZXNzYWdlKSxcbiAgICAgICAgb25Qcm9ncmVzczogKHByb2dyZXNzRGF0YSkgPT4gY29tbWFuZEV4ZWN1dGlvbj8uc2V0UHJvZ3Jlc3MocHJvZ3Jlc3NEYXRhKSxcbiAgICAgICAgb25SZWNlaXZlZDogKHJlY2VpdmVkRGF0YSkgPT4gY29tbWFuZEV4ZWN1dGlvbj8uc2V0UmVjZWl2ZWQocmVjZWl2ZWREYXRhKSxcbiAgICAgICAgcmVxdWVzdDogY29tbWFuZFN1Ym1pdERhdGEuZ2V0SnNvbkRhdGEoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICBpZiAoY29tbWFuZFN1Ym1pdERhdGEuZ2V0RmlsZXNDb3VudCgpID4gMCkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IEFwaS5yZXF1ZXN0TG9jYWwoe3BhdGg6IHVybCwgbWV0aG9kOiBcIlBPU1RcIiwgcmF3RGF0YTogY29tbWFuZFN1Ym1pdERhdGEuZ2V0Rm9ybURhdGEoKX0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBBcGkucmVxdWVzdExvY2FsKHtwYXRoOiB1cmwsIG1ldGhvZDogXCJQT1NUXCIsIGRhdGE6IGNvbW1hbmRTdWJtaXREYXRhLmdldEpzb25EYXRhKCl9KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgPT09IGZhbHNlICYmIHJlc3BvbnNlLnR5cGUgPT0gXCJpbnZhbGlkX2F1dGhlbnRpY2l0eV90b2tlblwiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW52YWxpZCBhdXRoZW50aWNpdHkgdG9rZW4gLSB0cnkgYWdhaW5cIilcbiAgICAgICAgYXdhaXQgU2Vzc2lvblN0YXR1c1VwZGF0ZXIuY3VycmVudCgpLnVwZGF0ZVNlc3Npb25TdGF0dXMoKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgY29udGludWUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250aW51ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG50IHN1Y2Nlc3NmdWxseSBleGVjdXRlIHJlcXVlc3RcIilcbiAgfVxuXG4gIC8qKiBmbHVzaC4gKi9cbiAgZmx1c2ggPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRoaXMuY29tbWFuZHNDb3VudCgpID09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRQb29sID0gdGhpcy5wb29sXG4gICAgY29uc3QgY3VycmVudFBvb2xEYXRhID0gdGhpcy5wb29sRGF0YVxuXG4gICAgdGhpcy5wb29sID0ge31cbiAgICB0aGlzLnBvb2xEYXRhID0ge31cbiAgICB0aGlzLmZsdXNoQ291bnQrK1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN1Ym1pdERhdGEgPSB7cG9vbDogY3VycmVudFBvb2xEYXRhfVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5nbG9iYWxSZXF1ZXN0RGF0YSkubGVuZ3RoID4gMClcbiAgICAgICAgc3VibWl0RGF0YS5nbG9iYWwgPSB0aGlzLmdsb2JhbFJlcXVlc3REYXRhXG5cbiAgICAgIGNvbnN0IGNvbW1hbmRTdWJtaXREYXRhID0gbmV3IENvbW1hbmRTdWJtaXREYXRhKHN1Ym1pdERhdGEpXG4gICAgICBjb25zdCB1cmwgPSBcIi9hcGlfbWFrZXIvY29tbWFuZHNcIlxuICAgICAgY29uc3QgY29tbWFuZEV4ZWN1dGlvbiA9IE9iamVjdC52YWx1ZXMoY3VycmVudFBvb2wpWzBdPy5jb21tYW5kRXhlY3V0aW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe2NvbW1hbmRFeGVjdXRpb24sIGNvbW1hbmRTdWJtaXREYXRhLCB1cmx9KVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhyZXNwb25zZS5yZXNwb25zZXMpLm1hcChhc3luYyhjb21tYW5kSWQpID0+IHtcbiAgICAgICAgY29uc3QgY29tbWFuZFJlc3BvbnNlID0gcmVzcG9uc2UucmVzcG9uc2VzW2NvbW1hbmRJZF1cbiAgICAgICAgY29uc3QgY29tbWFuZFJlc3BvbnNlRGF0YSA9IERlc2VyaWFsaXplci5wYXJzZShjb21tYW5kUmVzcG9uc2UuZGF0YSlcbiAgICAgICAgY29uc3QgY29tbWFuZERhdGEgPSBjdXJyZW50UG9vbFtwYXJzZUludChjb21tYW5kSWQsIDEwKV1cbiAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gY29tbWFuZFJlc3BvbnNlLnR5cGVcblxuICAgICAgICBpZiAoY29tbWFuZFJlc3BvbnNlRGF0YSAmJiB0eXBlb2YgY29tbWFuZFJlc3BvbnNlRGF0YSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgYnVnUmVwb3J0VXJsID0gZGlnKGNvbW1hbmRSZXNwb25zZURhdGEsIFwiYnVnX3JlcG9ydF91cmxcIilcblxuICAgICAgICAgIGlmIChidWdSZXBvcnRVcmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBCdWcgcmVwb3J0IFVSTDogJHtidWdSZXBvcnRVcmx9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgY29tbWFuZERhdGEuY29tbWFuZEV4ZWN1dGlvbi5yZXNvbHZlKGNvbW1hbmRSZXNwb25zZURhdGEpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2VUeXBlID09IFwiZXJyb3JcIikge1xuICAgICAgICAgIHRoaXMucmVqZWN0V2l0aENhbGxlclN0YWNrKGNvbW1hbmREYXRhLCBuZXcgQ3VzdG9tRXJyb3IoXCJDb21tYW5kIGVycm9yXCIsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pKVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PSBcImZhaWxlZFwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGYWlsZWRSZXNwb25zZShjb21tYW5kRGF0YSwgY29tbWFuZFJlc3BvbnNlRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCByZXNwb25zZSB0eXBlOiAke3Jlc3BvbnNlVHlwZX1gKVxuICAgICAgICB9XG4gICAgICB9KSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5mbHVzaENvdW50LS1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtDb21tYW5kRGF0YVR5cGV9IGNvbW1hbmREYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21tYW5kUmVzcG9uc2VEYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kUmVzcG9uc2VEYXRhLmVycm9yX3R5cGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY29tbWFuZFJlc3BvbnNlRGF0YS5lcnJvcnNcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY29tbWFuZFJlc3BvbnNlRGF0YS52YWxpZGF0aW9uX2Vycm9yc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGhhbmRsZUZhaWxlZFJlc3BvbnNlKGNvbW1hbmREYXRhLCBjb21tYW5kUmVzcG9uc2VEYXRhKSB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoU2Vzc2lvblN0YXR1c0Zvck5vQWNjZXNzRXJyb3IoY29tbWFuZFJlc3BvbnNlRGF0YSlcblxuICAgIGxldCBlcnJvclxuXG4gICAgaWYgKGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JfdHlwZSA9PSBcImRlc3Ryb3lfZXJyb3JcIikge1xuICAgICAgZXJyb3IgPSBuZXcgRGVzdHJveUVycm9yKFwiRGVzdHJveSBmYWlsZWRcIiwge3Jlc3BvbnNlOiBjb21tYW5kUmVzcG9uc2VEYXRhfSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JfdHlwZSA9PSBcInZhbGlkYXRpb25fZXJyb3JcIikge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgICAgbW9kZWw6IGRpZ2coY29tbWFuZFJlc3BvbnNlRGF0YSwgXCJtb2RlbFwiKSxcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhjb21tYW5kUmVzcG9uc2VEYXRhLCBcInZhbGlkYXRpb25fZXJyb3JzXCIpXG4gICAgICB9KVxuICAgICAgZXJyb3IgPSBuZXcgVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25FcnJvcnMsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pXG5cbiAgICAgIGV2ZW50cy5lbWl0KFwib25WYWxpZGF0aW9uRXJyb3JzXCIsIHZhbGlkYXRpb25FcnJvcnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JzID8gdW5kZWZpbmVkIDogXCJDb21tYW5kIGZhaWxlZFwiXG5cbiAgICAgIGVycm9yID0gbmV3IEN1c3RvbUVycm9yKGVycm9yTWVzc2FnZSwge3Jlc3BvbnNlOiBjb21tYW5kUmVzcG9uc2VEYXRhfSlcbiAgICB9XG5cbiAgICB0aGlzLnJlamVjdFdpdGhDYWxsZXJTdGFjayhjb21tYW5kRGF0YSwgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0cyB0aGUgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBlcnJvciwgc3BsaWNpbmcgdGhlIGNhbGxlcidzIHN0YWNrIChjYXB0dXJlZCBzeW5jaHJvbm91c2x5IGluIGFkZENvbW1hbmQpIG9udG8gZXJyb3Iuc3RhY2suXG4gICAqIE5lZWRlZCBiZWNhdXNlIGVycm9yLnN0YWNrIGlzIGZyb3plbiBhdCBjb25zdHJ1Y3Rpb24gdGltZSBpbnNpZGUgZmx1c2goKSdzIG1pY3JvdGFzayBhbmQgdGhlcmVmb3JlIGxvc2VzIHRoZSBjYWxsZXIncyBmcmFtZXMuXG4gICAqIEBwYXJhbSB7Q29tbWFuZERhdGFUeXBlfSBjb21tYW5kRGF0YVxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlamVjdFdpdGhDYWxsZXJTdGFjayhjb21tYW5kRGF0YSwgZXJyb3IpIHtcbiAgICBpZiAoY29tbWFuZERhdGEuc3RhY2spIHtcbiAgICAgIC8vIFY4IHByZWZpeGVzIFwiRXJyb3JcXG5cIiBhcyBhIGhlYWRlcjsgSlNDL1NwaWRlck1vbmtleSBzdGFja3Mgc3RhcnQgZGlyZWN0bHkgd2l0aCBhIGZyYW1lLlxuICAgICAgY29uc3QgY2FsbGVyRnJhbWVzID0gY29tbWFuZERhdGEuc3RhY2suc3RhcnRzV2l0aChcIkVycm9yXCIpXG4gICAgICAgID8gY29tbWFuZERhdGEuc3RhY2tcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAuam9pbihcIlxcblwiKVxuICAgICAgICA6IGNvbW1hbmREYXRhLnN0YWNrXG5cbiAgICAgIGlmIChjYWxsZXJGcmFtZXMpIHtcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBgJHtlcnJvci5zdGFjayA/PyBcIlwifVxcbiR7Y2FsbGVyRnJhbWVzfWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21tYW5kRGF0YS5jb21tYW5kRXhlY3V0aW9uLnJlamVjdChlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbW1hbmRSZXNwb25zZURhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZWZyZXNoU2Vzc2lvblN0YXR1c0Zvck5vQWNjZXNzRXJyb3IoY29tbWFuZFJlc3BvbnNlRGF0YSkge1xuICAgIGlmIChjb21tYW5kUmVzcG9uc2VEYXRhLmVycm9yX3R5cGUgIT0gXCJub3RfZm91bmRfb3Jfbm9fYWNjZXNzXCIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZEluU2NvcGUgPSBEZXZpc2VcbiAgICAgIC5yZWdpc3RlcmVkU2NvcGVzKClcbiAgICAgIC5maW5kKChzY29wZSkgPT4gRGV2aXNlLmN1cnJlbnQoKS5oYXNDdXJyZW50U2NvcGUoc2NvcGUpIHx8IERldmlzZS5jdXJyZW50KCkuaGFzR2xvYmFsQ3VycmVudFNjb3BlKHNjb3BlKSlcblxuICAgIGlmICghc2lnbmVkSW5TY29wZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgU2Vzc2lvblN0YXR1c1VwZGF0ZXIuY3VycmVudCgpLnVwZGF0ZVNlc3Npb25TdGF0dXMoKVxuICB9XG5cbiAgLyoqIGlzQWN0aXZlLiAqL1xuICBpc0FjdGl2ZSgpIHtcbiAgICBpZiAodGhpcy5jb21tYW5kc0NvdW50KCkgPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmZsdXNoQ291bnQgPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZmx1c2hSdW5MYXN0ID0gbmV3IFJ1bkxhc3QodGhpcy5mbHVzaClcbn1cbiJdfQ==
@@ -18,6 +18,10 @@ const waitForRealtimeRuntimeIdleAndReset = async ({ timeoutMs = 5000 } = {}) =>
18
18
  await ApiMakerWebsocketRequestClient.current().waitForIdle({ timeoutMs });
19
19
  resetRealtimeRuntimeState();
20
20
  };
21
+ // Auto-register the reset hook so Ruby system-test helpers can call it
22
+ // without downstream projects needing to wire it up manually.
23
+ // eslint-disable-next-line no-underscore-dangle
24
+ globalThis.__apiMakerResetRealtimeRuntimeForSystemSpecs = waitForRealtimeRuntimeIdleAndReset;
21
25
  export { waitForRealtimeRuntimeIdleAndReset };
22
26
  export default resetRealtimeRuntimeState;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcmVhbHRpbWUtcnVudGltZS1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsicmVzZXQtcmVhbHRpbWUtcnVudGltZS1zdGF0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLDJCQUEyQixNQUFNLDRCQUE0QixDQUFBO0FBQ3BFLE9BQU8sOEJBQThCLE1BQU0sK0JBQStCLENBQUE7QUFDMUUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFNUQsc0JBQXNCO0FBQ3RCLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxFQUFFO0lBQ3JDLDhCQUE4QixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzdDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzFDLHFCQUFxQixFQUFFLENBQUE7QUFDekIsQ0FBQyxDQUFBO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxrQ0FBa0MsR0FBRyxLQUFLLEVBQUMsRUFBQyxTQUFTLEdBQUcsSUFBSSxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDMUUsTUFBTSw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZFLHlCQUF5QixFQUFFLENBQUE7QUFDN0IsQ0FBQyxDQUFBO0FBRUQsT0FBTyxFQUFDLGtDQUFrQyxFQUFDLENBQUE7QUFDM0MsZUFBZSx5QkFBeUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBcGlNYWtlckNhYmxlQ29ubmVjdGlvblBvb2wgZnJvbSBcIi4vY2FibGUtY29ubmVjdGlvbi1wb29sLmpzXCJcbmltcG9ydCBBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQgZnJvbSBcIi4vd2Vic29ja2V0LXJlcXVlc3QtY2xpZW50LmpzXCJcbmltcG9ydCB7cmVzZXRDaGFubmVsc0NvbnN1bWVyfSBmcm9tIFwiLi9jaGFubmVscy1jb25zdW1lci5qc1wiXG5cbi8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbmNvbnN0IHJlc2V0UmVhbHRpbWVSdW50aW1lU3RhdGUgPSAoKSA9PiB7XG4gIEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudC5yZXNldEN1cnJlbnQoKVxuICBBcGlNYWtlckNhYmxlQ29ubmVjdGlvblBvb2wucmVzZXRDdXJyZW50KClcbiAgcmVzZXRDaGFubmVsc0NvbnN1bWVyKClcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3Igd2Vic29ja2V0LWJhY2tlZCBBcGkgTWFrZXIgcmVxdWVzdHMgdG8gY29tcGxldGUgYmVmb3JlIHJlc2V0dGluZyB0aGUgcmVhbHRpbWUgcnVudGltZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudGltZW91dE1zXVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0IHdhaXRGb3JSZWFsdGltZVJ1bnRpbWVJZGxlQW5kUmVzZXQgPSBhc3luYyh7dGltZW91dE1zID0gNTAwMH0gPSB7fSkgPT4ge1xuICBhd2FpdCBBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQuY3VycmVudCgpLndhaXRGb3JJZGxlKHt0aW1lb3V0TXN9KVxuICByZXNldFJlYWx0aW1lUnVudGltZVN0YXRlKClcbn1cblxuZXhwb3J0IHt3YWl0Rm9yUmVhbHRpbWVSdW50aW1lSWRsZUFuZFJlc2V0fVxuZXhwb3J0IGRlZmF1bHQgcmVzZXRSZWFsdGltZVJ1bnRpbWVTdGF0ZVxuIl19
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcmVhbHRpbWUtcnVudGltZS1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsicmVzZXQtcmVhbHRpbWUtcnVudGltZS1zdGF0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLDJCQUEyQixNQUFNLDRCQUE0QixDQUFBO0FBQ3BFLE9BQU8sOEJBQThCLE1BQU0sK0JBQStCLENBQUE7QUFDMUUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFNUQsc0JBQXNCO0FBQ3RCLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxFQUFFO0lBQ3JDLDhCQUE4QixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzdDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxDQUFBO0lBQzFDLHFCQUFxQixFQUFFLENBQUE7QUFDekIsQ0FBQyxDQUFBO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxrQ0FBa0MsR0FBRyxLQUFLLEVBQUMsRUFBQyxTQUFTLEdBQUcsSUFBSSxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDMUUsTUFBTSw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZFLHlCQUF5QixFQUFFLENBQUE7QUFDN0IsQ0FBQyxDQUFBO0FBRUQsdUVBQXVFO0FBQ3ZFLDhEQUE4RDtBQUM5RCxnREFBZ0Q7QUFDaEQsVUFBVSxDQUFDLDRDQUE0QyxHQUFHLGtDQUFrQyxDQUFBO0FBRTVGLE9BQU8sRUFBQyxrQ0FBa0MsRUFBQyxDQUFBO0FBQzNDLGVBQWUseUJBQXlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXBpTWFrZXJDYWJsZUNvbm5lY3Rpb25Qb29sIGZyb20gXCIuL2NhYmxlLWNvbm5lY3Rpb24tcG9vbC5qc1wiXG5pbXBvcnQgQXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50IGZyb20gXCIuL3dlYnNvY2tldC1yZXF1ZXN0LWNsaWVudC5qc1wiXG5pbXBvcnQge3Jlc2V0Q2hhbm5lbHNDb25zdW1lcn0gZnJvbSBcIi4vY2hhbm5lbHMtY29uc3VtZXIuanNcIlxuXG4vKiogQHJldHVybnMge3ZvaWR9ICovXG5jb25zdCByZXNldFJlYWx0aW1lUnVudGltZVN0YXRlID0gKCkgPT4ge1xuICBBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQucmVzZXRDdXJyZW50KClcbiAgQXBpTWFrZXJDYWJsZUNvbm5lY3Rpb25Qb29sLnJlc2V0Q3VycmVudCgpXG4gIHJlc2V0Q2hhbm5lbHNDb25zdW1lcigpXG59XG5cbi8qKlxuICogV2FpdHMgZm9yIHdlYnNvY2tldC1iYWNrZWQgQXBpIE1ha2VyIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGJlZm9yZSByZXNldHRpbmcgdGhlIHJlYWx0aW1lIHJ1bnRpbWUuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzXVxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnRpbWVvdXRNc11cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCB3YWl0Rm9yUmVhbHRpbWVSdW50aW1lSWRsZUFuZFJlc2V0ID0gYXN5bmMoe3RpbWVvdXRNcyA9IDUwMDB9ID0ge30pID0+IHtcbiAgYXdhaXQgQXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50LmN1cnJlbnQoKS53YWl0Rm9ySWRsZSh7dGltZW91dE1zfSlcbiAgcmVzZXRSZWFsdGltZVJ1bnRpbWVTdGF0ZSgpXG59XG5cbi8vIEF1dG8tcmVnaXN0ZXIgdGhlIHJlc2V0IGhvb2sgc28gUnVieSBzeXN0ZW0tdGVzdCBoZWxwZXJzIGNhbiBjYWxsIGl0XG4vLyB3aXRob3V0IGRvd25zdHJlYW0gcHJvamVjdHMgbmVlZGluZyB0byB3aXJlIGl0IHVwIG1hbnVhbGx5LlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlXG5nbG9iYWxUaGlzLl9fYXBpTWFrZXJSZXNldFJlYWx0aW1lUnVudGltZUZvclN5c3RlbVNwZWNzID0gd2FpdEZvclJlYWx0aW1lUnVudGltZUlkbGVBbmRSZXNldFxuXG5leHBvcnQge3dhaXRGb3JSZWFsdGltZVJ1bnRpbWVJZGxlQW5kUmVzZXR9XG5leHBvcnQgZGVmYXVsdCByZXNldFJlYWx0aW1lUnVudGltZVN0YXRlXG4iXX0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kaspernj/api-maker",
3
3
  "type": "module",
4
- "version": "1.0.2157",
4
+ "version": "1.0.2158",
5
5
  "description": "My new module",
6
6
  "files": [
7
7
  "build/**"