@kaspernj/api-maker 1.0.2172 → 1.0.2173

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.
@@ -44,6 +44,42 @@ export default class ApiMakerCommandsPool {
44
44
  commandSubmitData: CommandSubmitData;
45
45
  commandExecution?: ApiMakerCommandExecution;
46
46
  }): Promise<CommandsRequestResponse>;
47
+ /**
48
+ * Performs a single command request over websocket or HTTP.
49
+ * @param {object} args
50
+ * @param {string} args.url
51
+ * @param {CommandSubmitData} args.commandSubmitData
52
+ * @param {ApiMakerCommandExecution} [args.commandExecution]
53
+ * @returns {Promise<CommandsRequestResponse>}
54
+ */
55
+ performRequest({ commandExecution, commandSubmitData, url }: {
56
+ url: string;
57
+ commandSubmitData: CommandSubmitData;
58
+ commandExecution?: ApiMakerCommandExecution;
59
+ }): Promise<CommandsRequestResponse>;
60
+ /**
61
+ * The user ids the frontend believes it is signed in as, keyed by Devise
62
+ * scope. Sent with each request so the backend can detect (and let the
63
+ * frontend recover from) a stale session before running commands. Undefined
64
+ * when nothing is signed in, so genuinely anonymous requests send no belief.
65
+ * @returns {Record<string, number | string> | undefined}
66
+ */
67
+ believedDeviseUserIds(): Record<string, number | string> | undefined;
68
+ /**
69
+ * The global request data merged with the believed signed-in identity.
70
+ * @returns {Record<string, unknown>}
71
+ */
72
+ globalDataForRequest(): Record<string, unknown>;
73
+ /**
74
+ * Recovers from an `authentication_changed` response: refreshes the existing
75
+ * websocket connection's auth in-place from the current server session (no
76
+ * reconnect, no password) and reconciles the local session cache. Returns
77
+ * whether a previously signed-in scope is still authenticated, so the request
78
+ * can be retried; false means the user is genuinely signed out (the sign-in
79
+ * form is shown centrally via the Devise sign-out event).
80
+ * @returns {Promise<boolean>}
81
+ */
82
+ recoverAuthentication(): Promise<boolean>;
47
83
  /** Sends the currently queued commands and resolves or rejects their executions. */
48
84
  flush: () => Promise<void>;
49
85
  /**
@@ -119,6 +155,109 @@ export type PoolDataType = {
119
155
  };
120
156
  };
121
157
  };
158
+ export type BaseModelWithId = {
159
+ abilities: import("./base-model.js").ModelAbilityMap;
160
+ changes: import("./base-model.js").ModelDataMap;
161
+ collection: import("./collection.js").default<any>;
162
+ _identifierKey: string | number;
163
+ _markedForDestruction: boolean;
164
+ modelData: import("./base-model.js").ModelDataMap;
165
+ newRecord: boolean;
166
+ previousModelData: any;
167
+ preloadedRelationships: import("./base-model.js").PreloadedRelationshipMap;
168
+ relationshipsCache: import("./base-model.js").LoadedRelationshipMap;
169
+ relationships: import("./base-model.js").LoadedRelationshipMap;
170
+ uniqueKeyValue: number;
171
+ assignAttributes(newAttributes: ModelDataMap): void;
172
+ attributes(): ModelDataMap;
173
+ can(givenAbilityName: string): boolean;
174
+ clone(): /*elided*/ any;
175
+ cacheKey(): number | string;
176
+ localCacheKey(): string;
177
+ fullCacheKey(): string;
178
+ create(attributes?: ModelDataMap, options?: ParseValidationErrorsOptions): Promise<{
179
+ model: /*elided*/ any;
180
+ response: ModelCommandResponse;
181
+ }>;
182
+ createRaw(rawData: RawDataInput, options?: ParseValidationErrorsOptions): Promise<{
183
+ model: /*elided*/ any;
184
+ response: ModelCommandResponse;
185
+ }>;
186
+ destroy(): Promise<{
187
+ model: /*elided*/ any;
188
+ response: ModelCommandResponse;
189
+ }>;
190
+ ensureAbilities(listOfAbilities: string[]): Promise<void>;
191
+ getAttributes(): ModelDataMap;
192
+ handleResponseError(response: ModelCommandResponse): never;
193
+ identifierKey(): number | string;
194
+ isAssociationLoaded(associationName: string): boolean;
195
+ isAssociationLoadedUnderscore(associationNameUnderscore: string): boolean;
196
+ isAssociationPresent(associationName: string): boolean;
197
+ ensureAssociationLoaded(associationName: string): Promise<LoadedRelationshipValue>;
198
+ ensureAssociationLoadedUnderscore(associationNameUnderscore: string): Promise<LoadedRelationshipValue>;
199
+ isAttributeChanged(attributeName: string): boolean;
200
+ isChanged(): boolean;
201
+ isNewRecord(): boolean;
202
+ isPersisted(): boolean;
203
+ savedChangeToAttribute(attributeName: string): boolean;
204
+ setNewModel(model: /*elided*/ any): void;
205
+ setNewModelData(model: /*elided*/ any): void;
206
+ _isDateChanged(oldValue: ModelValue | null | undefined, newValue: ModelValue | null | undefined): boolean | void;
207
+ _isIntegerChanged(oldValue: ModelValue | null | undefined, newValue: ModelValue | null | undefined): boolean | void;
208
+ _isStringChanged(oldValue: ModelValue | null | undefined, newValue: ModelValue | null | undefined): boolean | void;
209
+ modelClassData(): ModelClassDataType;
210
+ reload(): Promise<void>;
211
+ save(): Promise<{
212
+ model: /*elided*/ any;
213
+ response?: object;
214
+ }>;
215
+ saveRaw(rawData: RawDataInput, options?: ParseValidationErrorsOptions & {
216
+ simpleModelErrors?: boolean;
217
+ }): Promise<{
218
+ model: /*elided*/ any;
219
+ response: ModelCommandResponse;
220
+ }>;
221
+ update(newAttributes?: ModelDataMap, options?: ParseValidationErrorsOptions): Promise<{
222
+ model: /*elided*/ any;
223
+ response?: object;
224
+ }>;
225
+ _refreshModelFromResponse(response: ModelCommandResponse): void;
226
+ _refreshModelDataFromResponse(response: ModelCommandResponse): void;
227
+ updateRaw(rawData: RawDataInput, options?: ParseValidationErrorsOptions & {
228
+ simpleModelErrors?: boolean;
229
+ }): Promise<{
230
+ response: ModelCommandResponse;
231
+ model: /*elided*/ any;
232
+ }>;
233
+ isValid(): never;
234
+ isValidOnServer(): Promise<{
235
+ valid: boolean;
236
+ errors: ValidationResponseErrors;
237
+ }>;
238
+ modelClass(): BaseModelClassType;
239
+ preloadRelationship(relationshipName: string, model: /*elided*/ any | /*elided*/ any[] | null): void;
240
+ markForDestruction(): void;
241
+ markedForDestruction(): boolean;
242
+ uniqueKey(): number;
243
+ _callMemberCommand(args: ModelCommandDescriptor, commandArgs: ModelCommandOptions): import("./command-execution.js").default;
244
+ readAttribute(attributeName: string): ModelValue | null | undefined;
245
+ readAttributeUnderscore(attributeName: string): ModelValue | null | undefined;
246
+ isAttributeLoaded(attributeName: string): boolean;
247
+ _isPresent(value: ModelValue | null | undefined): boolean;
248
+ _loadBelongsToReflection(args: RelationshipLoadArgs, queryArgs?: import("./collection.js").QueryArgsType): Promise</*elided*/ any | null>;
249
+ _readBelongsToReflection({ reflectionName }: RelationshipLoadArgs): /*elided*/ any | null;
250
+ _loadHasManyReflection(args: RelationshipLoadArgs, queryArgs?: import("./collection.js").QueryArgsType): Promise</*elided*/ any[]>;
251
+ _loadHasOneReflection(args: RelationshipLoadArgs, queryArgs?: import("./collection.js").QueryArgsType): Promise</*elided*/ any | null>;
252
+ _readHasOneReflection({ reflectionName }: RelationshipLoadArgs): /*elided*/ any | null;
253
+ _readModelDataFromArgs(args?: BaseModelArgsObject): void;
254
+ _readPreloadedRelationships(preloaded: {
255
+ getModel: (relationshipType: string, relationshipId: number | string) => /*elided*/ any;
256
+ }): void;
257
+ primaryKey(): number | string;
258
+ } & {
259
+ id: () => number | string;
260
+ };
122
261
  import ApiMakerCommandExecution from "./command-execution.js";
123
262
  import CommandSubmitData from "./command-submit-data.js";
124
263
  import RunLast from "./run-last.js";
@@ -1 +1 @@
1
- {"version":3,"file":"commands-pool.d.ts","sourceRoot":"/src/","sources":["commands-pool.js"],"names":[],"mappings":"AAkEA,4EAA4E;AAC5E;IACE;;;;;OAKG;IACH,wBAJW,iBAAiB,SACjB,qBAAqB,GACnB,wBAAwB,CAuBpC;IAED;;;OAGG;IACH,kBAFa,oBAAoB,CAMhC;IAED,mDAAmD;IACnD,qBAEC;IAIC,mBAAmB;IAEnB,8CAA8C;IAC9C,MADW,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAC5B;IAEd,2BAA2B;IAC3B,UADW,YAAY,CACL;IAElB,kBAAkB;IAElB,iCAAiC;IACjC,mBADW,kBAAkB,CACF;IAE3B,oCAAoC;IACpC,gBADW,qBAAqB,CACR;IAG1B;;;;OAIG;IACH,iBAHW,iBAAiB,GACf,wBAAwB,CAoCpC;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,uBAAuB,CAAC,CAiC5C;IAED,oFAAoF;IACpF,2BAkDC;IAED;;;;OAIG;IACH,kCAJW,eAAe,uBACf,yBAAyB,GACvB,OAAO,CAAC,IAAI,CAAC,CAwBzB;IAED;;;;;;OAMG;IACH,mCAJW,eAAe,SACf,KAAK,GACH,IAAI,CAkBhB;IAED;;;OAGG;IACH,0DAHW,yBAAyB,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,YAFa,OAAO,CAYnB;IAED,sBAAsC;CACvC;4CArVa,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS;mCACrD,6BAA6B,GAAG,IAAI,GAAG,QAAQ,GAAG,eAAe,GAAG,6BAA6B,EAAE;iCACnG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC;;WAGpC,oBAAoB;oBACpB,MAAM;aACN,MAAM;iBACN,MAAM,GAAG,MAAM;UACf,MAAM;;;oBAIN,OAAO;gBACP,OAAO;cACP,OAAO;;;UAIP,kBAAkB;UAClB,SAAS,GAAG,OAAO,GAAG,QAAQ;;;eAI9B,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC;cACvC,OAAO;WACP,MAAM;;;gBAIN,MAAM;aACN,MAAM,EAAE;wBACR,MAAM,EAAE;YACR,kBAAkB;;;sBAKlB,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;qCA3DrG,wBAAwB;8BAC/B,0BAA0B;oBASpC,eAAe"}
1
+ {"version":3,"file":"commands-pool.d.ts","sourceRoot":"/src/","sources":["commands-pool.js"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ import events from "./events.js";
12
12
  import FormDataObjectizer from "form-data-objectizer"; // eslint-disable-line sort-imports
13
13
  import RunLast from "./run-last.js";
14
14
  import Serializer from "./serializer.js";
15
+ import SessionExpiredError from "./session-expired-error.js";
15
16
  import SessionStatusUpdater from "./session-status-updater.js";
16
17
  import ValidationError from "./validation-error.js";
17
18
  import { ValidationErrors } from "./validation-errors.js";
@@ -57,6 +58,7 @@ import WebsocketRequestClient from "./websocket-request-client.js";
57
58
  * @property {string} stack
58
59
  */
59
60
  /** @typedef {{[key: string]: {[key: string]: {[key: string]: {[key: number]: {args: object, primary_key: number | string, id: number}}}}}} PoolDataType */
61
+ /** @typedef {import("./base-model.js").default & {id: () => number | string}} BaseModelWithId */
60
62
  const shared = {};
61
63
  /** Batches command submissions and flushes them over HTTP or websockets. */
62
64
  export default class ApiMakerCommandsPool {
@@ -162,32 +164,89 @@ export default class ApiMakerCommandsPool {
162
164
  * @returns {Promise<CommandsRequestResponse>}
163
165
  */
164
166
  async sendRequest({ commandExecution, commandSubmitData, url }) {
167
+ for (let attempt = 0; attempt < 3; attempt++) {
168
+ const response = await this.performRequest({ commandExecution, commandSubmitData, url }); // eslint-disable-line no-await-in-loop
169
+ if (response?.success === false && response.type == "invalid_authenticity_token") {
170
+ console.log("Invalid authenticity token - try again");
171
+ await SessionStatusUpdater.current().updateSessionStatus(); // eslint-disable-line no-await-in-loop
172
+ continue; // eslint-disable-line no-continue
173
+ }
174
+ if (response?.success === false && response.type == "authentication_changed") {
175
+ const recovered = await this.recoverAuthentication(); // eslint-disable-line no-await-in-loop
176
+ if (recovered)
177
+ continue; // eslint-disable-line no-continue
178
+ throw new SessionExpiredError();
179
+ }
180
+ return /** @type {CommandsRequestResponse} */ (response);
181
+ }
182
+ throw new Error("Couldnt successfully execute request");
183
+ }
184
+ /**
185
+ * Performs a single command request over websocket or HTTP.
186
+ * @param {object} args
187
+ * @param {string} args.url
188
+ * @param {CommandSubmitData} args.commandSubmitData
189
+ * @param {ApiMakerCommandExecution} [args.commandExecution]
190
+ * @returns {Promise<CommandsRequestResponse>}
191
+ */
192
+ async performRequest({ commandExecution, commandSubmitData, url }) {
165
193
  if (Config.getWebsocketRequests() && !this.requestOptions.forceHttp && commandSubmitData.getFilesCount() == 0) {
166
194
  return /** @type {Promise<CommandsRequestResponse>} */ (WebsocketRequestClient.current().perform({
167
195
  cacheResponse: this.requestOptions.cacheResponse,
168
- global: this.globalRequestData,
196
+ global: this.globalDataForRequest(),
169
197
  onLog: (message) => commandExecution?.addLog(message),
170
198
  onProgress: (progressData) => commandExecution?.setProgress(progressData),
171
199
  onReceived: (receivedData) => commandExecution?.setReceived(receivedData),
172
200
  request: commandSubmitData.getJsonData()
173
201
  }));
174
202
  }
175
- let response;
176
- for (let i = 0; i < 3; i++) {
177
- if (commandSubmitData.getFilesCount() > 0) {
178
- response = await Api.requestLocal({ path: url, method: "POST", rawData: commandSubmitData.getFormData() }); // eslint-disable-line no-await-in-loop
179
- }
180
- else {
181
- response = await Api.requestLocal({ path: url, method: "POST", data: commandSubmitData.getJsonData() }); // eslint-disable-line no-await-in-loop
182
- }
183
- if (response.success === false && response.type == "invalid_authenticity_token") {
184
- console.log("Invalid authenticity token - try again");
185
- await SessionStatusUpdater.current().updateSessionStatus(); // eslint-disable-line no-await-in-loop
186
- continue; // eslint-disable-line no-continue
187
- }
188
- return /** @type {CommandsRequestResponse} */ (response);
203
+ if (commandSubmitData.getFilesCount() > 0) {
204
+ return /** @type {CommandsRequestResponse} */ (await Api.requestLocal({ path: url, method: "POST", rawData: commandSubmitData.getFormData() }));
189
205
  }
190
- throw new Error("Couldnt successfully execute request");
206
+ return /** @type {CommandsRequestResponse} */ (await Api.requestLocal({ path: url, method: "POST", data: commandSubmitData.getJsonData() }));
207
+ }
208
+ /**
209
+ * The user ids the frontend believes it is signed in as, keyed by Devise
210
+ * scope. Sent with each request so the backend can detect (and let the
211
+ * frontend recover from) a stale session before running commands. Undefined
212
+ * when nothing is signed in, so genuinely anonymous requests send no belief.
213
+ * @returns {Record<string, number | string> | undefined}
214
+ */
215
+ believedDeviseUserIds() {
216
+ const believed = /** @type {Record<string, number | string>} */ ({});
217
+ for (const scope of Devise.registeredScopes()) {
218
+ const model = Devise.current().getCurrentScope(scope);
219
+ if (model)
220
+ believed[scope] = /** @type {BaseModelWithId} */ (model).id();
221
+ }
222
+ return Object.keys(believed).length > 0 ? believed : undefined;
223
+ }
224
+ /**
225
+ * The global request data merged with the believed signed-in identity.
226
+ * @returns {Record<string, unknown>}
227
+ */
228
+ globalDataForRequest() {
229
+ const believed = this.believedDeviseUserIds();
230
+ if (!believed)
231
+ return this.globalRequestData;
232
+ return { ...this.globalRequestData, believed_devise_user_ids: believed };
233
+ }
234
+ /**
235
+ * Recovers from an `authentication_changed` response: refreshes the existing
236
+ * websocket connection's auth in-place from the current server session (no
237
+ * reconnect, no password) and reconciles the local session cache. Returns
238
+ * whether a previously signed-in scope is still authenticated, so the request
239
+ * can be retried; false means the user is genuinely signed out (the sign-in
240
+ * form is shown centrally via the Devise sign-out event).
241
+ * @returns {Promise<boolean>}
242
+ */
243
+ async recoverAuthentication() {
244
+ const sessionStatusUpdater = SessionStatusUpdater.current();
245
+ const sessionStatus = await sessionStatusUpdater.sessionStatus();
246
+ const scopes = Devise.registeredScopes();
247
+ await Promise.all(scopes.map((scope) => Devise.refreshWebsocketSession({ scope, shadowSessionToken: sessionStatus?.shadow_session_token })));
248
+ sessionStatusUpdater.applyResult(sessionStatus);
249
+ return scopes.some((scope) => Boolean(sessionStatus?.scopes?.[scope]?.signed_in));
191
250
  }
192
251
  /** Sends the currently queued commands and resolves or rejects their executions. */
193
252
  flush = async () => {
@@ -201,8 +260,9 @@ export default class ApiMakerCommandsPool {
201
260
  this.flushCount++;
202
261
  try {
203
262
  const submitData = { pool: currentPoolData };
204
- if (Object.keys(this.globalRequestData).length > 0)
205
- submitData.global = this.globalRequestData;
263
+ const globalData = this.globalDataForRequest();
264
+ if (Object.keys(globalData).length > 0)
265
+ submitData.global = globalData;
206
266
  const commandSubmitData = new CommandSubmitData(submitData);
207
267
  const url = "/api_maker/commands";
208
268
  const commandExecution = Object.values(currentPool)[0]?.commandExecution;
@@ -232,6 +292,15 @@ export default class ApiMakerCommandsPool {
232
292
  }
233
293
  }));
234
294
  }
295
+ catch (error) {
296
+ // sendRequest (e.g. an unrecoverable SessionExpiredError) or response
297
+ // handling can throw before the per-command promises are settled. Reject
298
+ // every queued command so callers awaiting their execution don't hang
299
+ // forever. Already-settled executions ignore the extra reject.
300
+ for (const commandData of Object.values(currentPool)) {
301
+ commandData.commandExecution.reject(/** @type {Error} */ (error));
302
+ }
303
+ }
235
304
  finally {
236
305
  this.flushCount--;
237
306
  }
@@ -314,4 +383,4 @@ export default class ApiMakerCommandsPool {
314
383
  }
315
384
  flushRunLast = new RunLast(this.flush);
316
385
  }
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMtcG9vbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiY29tbWFuZHMtcG9vbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFBO0FBQzFCLE9BQU8sd0JBQXdCLE1BQU0sd0JBQXdCLENBQUE7QUFDN0QsT0FBTyxpQkFBaUIsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUEsQ0FBQyxtQ0FBbUM7QUFDaEYsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBLENBQUMsbUNBQW1DO0FBQ3ZFLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLGtCQUFrQixNQUFNLHNCQUFzQixDQUFBLENBQUMsbUNBQW1DO0FBQ3pGLE9BQU8sT0FBTyxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLG9CQUFvQixNQUFNLDZCQUE2QixDQUFBO0FBQzlELE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3ZELE9BQU8sc0JBQXNCLE1BQU0sK0JBQStCLENBQUE7QUFFbEUscUdBQXFHO0FBQ3JHLDBJQUEwSTtBQUMxSSx5RUFBeUU7QUFDekU7Ozs7Ozs7R0FPRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUVILDJKQUEySjtBQUUzSixNQUFNLE1B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dGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEFwaSBmcm9tIFwiLi9hcGkuanNcIlxuaW1wb3J0IEFwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbiBmcm9tIFwiLi9jb21tYW5kLWV4ZWN1dGlvbi5qc1wiXG5pbXBvcnQgQ29tbWFuZFN1Ym1pdERhdGEgZnJvbSBcIi4vY29tbWFuZC1zdWJtaXQtZGF0YS5qc1wiXG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuL2NvbmZpZy5qc1wiXG5pbXBvcnQgQ3VzdG9tRXJyb3IgZnJvbSBcIi4vY3VzdG9tLWVycm9yLmpzXCJcbmltcG9ydCBEZXN0cm95RXJyb3IgZnJvbSBcIi4vZGVzdHJveS1lcnJvci5qc1wiXG5pbXBvcnQgRGVzZXJpYWxpemVyIGZyb20gXCIuL2Rlc2VyaWFsaXplci5qc1wiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc29ydC1pbXBvcnRzXG5pbXBvcnQgRGV2aXNlIGZyb20gXCIuL2RldmlzZS5qc1wiXG5pbXBvcnQge2RpZywgZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc29ydC1pbXBvcnRzXG5pbXBvcnQgZXZlbnRzIGZyb20gXCIuL2V2ZW50cy5qc1wiXG5pbXBvcnQgRm9ybURhdGFPYmplY3RpemVyIGZyb20gXCJmb3JtLWRhdGEtb2JqZWN0aXplclwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc29ydC1pbXBvcnRzXG5pbXBvcnQgUnVuTGFzdCBmcm9tIFwiLi9ydW4tbGFzdC5qc1wiXG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwiLi9zZXJpYWxpemVyLmpzXCJcbmltcG9ydCBTZXNzaW9uU3RhdHVzVXBkYXRlciBmcm9tIFwiLi9zZXNzaW9uLXN0YXR1cy11cGRhdGVyLmpzXCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvci5qc1wiXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcnN9IGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3JzLmpzXCJcbmltcG9ydCBXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50IGZyb20gXCIuL3dlYnNvY2tldC1yZXF1ZXN0LWNsaWVudC5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7b2JqZWN0IHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWR9IENvbW1hbmRBcmd1bWVudFNjYWxhck9yT2JqZWN0ICovXG4vKiogQHR5cGVkZWYge0NvbW1hbmRBcmd1bWVudFNjYWxhck9yT2JqZWN0IHwgRmlsZSB8IEZvcm1EYXRhIHwgSFRNTEZvcm1FbGVtZW50IHwgQ29tbWFuZEFyZ3VtZW50U2NhbGFyT3JPYmplY3RbXX0gQ29tbWFuZEFyZ3VtZW50VmFsdWUgKi9cbi8qKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgQ29tbWFuZEFyZ3VtZW50VmFsdWU+fSBDb21tYW5kQXJndW1lbnRNYXAgKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tbWFuZERlc2NyaXB0b3JcbiAqIEBwcm9wZXJ0eSB7Q29tbWFuZEFyZ3VtZW50VmFsdWV9IFthcmdzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbGxlY3Rpb25OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29tbWFuZFxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IFtwcmltYXJ5S2V5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGVcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21tYW5kUmVxdWVzdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhY2hlUmVzcG9uc2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb3JjZUh0dHBdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpbnN0YW50XVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbW1hbmRSZXNwb25zZUVudmVsb3BlXG4gKiBAcHJvcGVydHkge0NvbW1hbmRBcmd1bWVudE1hcH0gZGF0YVxuICogQHByb3BlcnR5IHtcInN1Y2Nlc3NcIiB8IFwiZXJyb3JcIiB8IFwiZmFpbGVkXCJ9IHR5cGVcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21tYW5kc1JlcXVlc3RSZXNwb25zZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBDb21tYW5kUmVzcG9uc2VFbnZlbG9wZT59IHJlc3BvbnNlc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV1cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGYWlsZWRDb21tYW5kUmVzcG9uc2VEYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXJyb3JfdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Vycm9yc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFt2YWxpZGF0aW9uX2Vycm9yc11cbiAqIEBwcm9wZXJ0eSB7Q29tbWFuZEFyZ3VtZW50TWFwfSBbbW9kZWxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21tYW5kRGF0YVR5cGVcbiAqIEBwcm9wZXJ0eSB7QXBpTWFrZXJDb21tYW5kRXhlY3V0aW9ufSBjb21tYW5kRXhlY3V0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RhY2tcbiAqL1xuXG4vKiogQHR5cGVkZWYge3tba2V5OiBzdHJpbmddOiB7W2tleTogc3RyaW5nXToge1trZXk6IHN0cmluZ106IHtba2V5OiBudW1iZXJdOiB7YXJnczogb2JqZWN0LCBwcmltYXJ5X2tleTogbnVtYmVyIHwgc3RyaW5nLCBpZDogbnVtYmVyfX19fX19IFBvb2xEYXRhVHlwZSAqL1xuXG5jb25zdCBzaGFyZWQgPSB7fVxuXG4vKiogQmF0Y2hlcyBjb21tYW5kIHN1Ym1pc3Npb25zIGFuZCBmbHVzaGVzIHRoZW0gb3ZlciBIVFRQIG9yIHdlYnNvY2tldHMuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcGlNYWtlckNvbW1hbmRzUG9vbCB7XG4gIC8qKlxuICAgKiBBZGRzIGEgY29tbWFuZCB0byB0aGUgc2hhcmVkIG9yIG9uZS1vZmYgY29tbWFuZCBwb29sIGFuZCBzY2hlZHVsZXMgYSBmbHVzaC5cbiAgICogQHBhcmFtIHtDb21tYW5kRGVzY3JpcHRvcn0gZGF0YVxuICAgKiBAcGFyYW0ge0NvbW1hbmRSZXF1ZXN0T3B0aW9uc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtBcGlNYWtlckNvbW1hbmRFeGVjdXRpb259XG4gICAqL1xuICBzdGF0aWMgYWRkQ29tbWFuZChkYXRhLCBhcmdzID0ge30pIHtcbiAgICBsZXQgcG9vbFxuICAgIGNvbnN0IHVzZVdlYnNvY2tldFJlcXVlc3RzID0gQ29uZmlnLmdldFdlYnNvY2tldFJlcXVlc3RzKClcblxuICAgIGlmIChhcmdzLmluc3RhbnQgfHwgdXNlV2Vic29ja2V0UmVxdWVzdHMpIHtcbiAgICAgIHBvb2wgPSBuZXcgQXBpTWFrZXJDb21tYW5kc1Bvb2woKVxuICAgICAgcG9vbC5nbG9iYWxSZXF1ZXN0RGF0YSA9IHsuLi5BcGlNYWtlckNvbW1hbmRzUG9vbC5jdXJyZW50KCkuZ2xvYmFsUmVxdWVzdERhdGF9XG4gICAgICBwb29sLnJlcXVlc3RPcHRpb25zID0gey4uLmFyZ3N9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvb2wgPSBBcGlNYWtlckNvbW1hbmRzUG9vbC5jdXJyZW50KClcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlUmVzdWx0ID0gcG9vbC5hZGRDb21tYW5kKGRhdGEpXG5cbiAgICBpZiAoYXJncy5pbnN0YW50IHx8IHVzZVdlYnNvY2tldFJlcXVlc3RzKSB7XG4gICAgICBwb29sLmZsdXNoUnVuTGFzdC5ydW4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBwb29sLmZsdXNoUnVuTGFzdC5xdWV1ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2VSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgY29tbWFuZCBwb29sIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7QXBpTWFrZXJDb21tYW5kc1Bvb2x9XG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICBpZiAoIXNoYXJlZC5jdXJyZW50QXBpTWFrZXJDb21tYW5kc1Bvb2wpIHNoYXJlZC5jdXJyZW50QXBpTWFrZXJDb21tYW5kc1Bvb2wgPSBuZXcgQXBpTWFrZXJDb21tYW5kc1Bvb2woKVxuXG4gICAgcmV0dXJuIHNoYXJlZC5jdXJyZW50QXBpTWFrZXJDb21tYW5kc1Bvb2xcbiAgfVxuXG4gIC8qKiBGbHVzaGVzIHRoZSBzaGFyZWQgY29tbWFuZCBwb29sIGltbWVkaWF0ZWx5LiAqL1xuICBzdGF0aWMgZmx1c2goKSB7XG4gICAgQXBpTWFrZXJDb21tYW5kc1Bvb2wuY3VycmVudCgpLmZsdXNoKClcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBvbmUgY29tbWFuZCBwb29sIGluc3RhbmNlIHdpdGggZW1wdHkgcXVldWVkIHN0YXRlLiAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZsdXNoQ291bnQgPSAwXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIENvbW1hbmREYXRhVHlwZT59ICovXG4gICAgdGhpcy5wb29sID0ge31cblxuICAgIC8qKiBAdHlwZSB7UG9vbERhdGFUeXBlfSAqL1xuICAgIHRoaXMucG9vbERhdGEgPSB7fVxuXG4gICAgdGhpcy5jdXJyZW50SWQgPSAxXG5cbiAgICAvKiogQHR5cGUge0NvbW1hbmRBcmd1bWVudE1hcH0gKi9cbiAgICB0aGlzLmdsb2JhbFJlcXVlc3REYXRhID0ge31cblxuICAgIC8qKiBAdHlwZSB7Q29tbWFuZFJlcXVlc3RPcHRpb25zfSAqL1xuICAgIHRoaXMucmVxdWVzdE9wdGlvbnMgPSB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgb25lIGNvbW1hbmQgZXhlY3V0aW9uIHRvIHRoaXMgcG9vbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtDb21tYW5kRGVzY3JpcHRvcn0gZGF0YVxuICAgKiBAcmV0dXJucyB7QXBpTWFrZXJDb21tYW5kRXhlY3V0aW9ufVxuICAgKi9cbiAgYWRkQ29tbWFuZChkYXRhKSB7XG4gICAgY29uc3Qgc3RhY2sgPSBFcnJvcigpLnN0YWNrXG4gICAgY29uc3QgaWQgPSB0aGlzLmN1cnJlbnRJZFxuICAgIGNvbnN0IGNvbW1hbmRFeGVjdXRpb24gPSBuZXcgQXBpTWFrZXJDb21tYW5kRXhlY3V0aW9uKClcbiAgICBjb25zdCBjb21tYW5kVHlwZSA9IGRhdGEudHlwZVxuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gZGF0YS5jb21tYW5kXG4gICAgY29uc3QgY29sbGVjdGlvbk5hbWUgPSBkYXRhLmNvbGxlY3Rpb25OYW1lXG5cbiAgICB0aGlzLmN1cnJlbnRJZCArPSAxXG4gICAgdGhpcy5wb29sW2lkXSA9IHtjb21tYW5kRXhlY3V0aW9uLCBzdGFja31cblxuICAgIGlmICghdGhpcy5wb29sRGF0YVtjb21tYW5kVHlwZV0pIHRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdID0ge31cbiAgICBpZiAoIXRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXSkgdGhpcy5wb29sRGF0YVtjb21tYW5kVHlwZV1bY29sbGVjdGlvbk5hbWVdID0ge31cbiAgICBpZiAoIXRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXVtjb21tYW5kTmFtZV0pIHRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXVtjb21tYW5kTmFtZV0gPSB7fVxuXG4gICAgbGV0IGFyZ3NcblxuICAgIGlmIChkYXRhLmFyZ3M/Lm5vZGVOYW1lID09IFwiRk9STVwiKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShkYXRhLmFyZ3MpXG5cbiAgICAgIGFyZ3MgPSBGb3JtRGF0YU9iamVjdGl6ZXIudG9PYmplY3QoZm9ybURhdGEpXG4gICAgfSBlbHNlIGlmIChkYXRhLmFyZ3MgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgYXJncyA9IEZvcm1EYXRhT2JqZWN0aXplci50b09iamVjdChkYXRhLmFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBTZXJpYWxpemVyLnNlcmlhbGl6ZShkYXRhLmFyZ3MpXG4gICAgfVxuXG4gICAgdGhpcy5wb29sRGF0YVtjb21tYW5kVHlwZV1bY29sbGVjdGlvbk5hbWVdW2NvbW1hbmROYW1lXVtpZF0gPSB7XG4gICAgICBhcmdzLFxuICAgICAgcHJpbWFyeV9rZXk6IGRhdGEucHJpbWFyeUtleSxcbiAgICAgIGlkXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmRFeGVjdXRpb25cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBjb21tYW5kc0NvdW50KCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnBvb2wpLmxlbmd0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnVybFxuICAgKiBAcGFyYW0ge0NvbW1hbmRTdWJtaXREYXRhfSBhcmdzLmNvbW1hbmRTdWJtaXREYXRhXG4gICAqIEBwYXJhbSB7QXBpTWFrZXJDb21tYW5kRXhlY3V0aW9ufSBbYXJncy5jb21tYW5kRXhlY3V0aW9uXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb21tYW5kc1JlcXVlc3RSZXNwb25zZT59XG4gICAqL1xuICBhc3luYyBzZW5kUmVxdWVzdCh7Y29tbWFuZEV4ZWN1dGlvbiwgY29tbWFuZFN1Ym1pdERhdGEsIHVybH0pIHtcbiAgICBpZiAoQ29uZmlnLmdldFdlYnNvY2tldFJlcXVlc3RzKCkgJiYgIXRoaXMucmVxdWVzdE9wdGlvbnMuZm9yY2VIdHRwICYmIGNvbW1hbmRTdWJtaXREYXRhLmdldEZpbGVzQ291bnQoKSA9PSAwKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPENvbW1hbmRzUmVxdWVzdFJlc3BvbnNlPn0gKi8gKFdlYnNvY2tldFJlcXVlc3RDbGllbnQuY3VycmVudCgpLnBlcmZvcm0oe1xuICAgICAgICBjYWNoZVJlc3BvbnNlOiB0aGlzLnJlcXVlc3RPcHRpb25zLmNhY2hlUmVzcG9uc2UsXG4gICAgICAgIGdsb2JhbDogdGhpcy5nbG9iYWxSZXF1ZXN0RGF0YSxcbiAgICAgICAgb25Mb2c6IChtZXNzYWdlKSA9PiBjb21tYW5kRXhlY3V0aW9uPy5hZGRMb2cobWVzc2FnZSksXG4gICAgICAgIG9uUHJvZ3Jlc3M6IChwcm9ncmVzc0RhdGEpID0+IGNvbW1hbmRFeGVjdXRpb24/LnNldFByb2dyZXNzKHByb2dyZXNzRGF0YSksXG4gICAgICAgIG9uUmVjZWl2ZWQ6IChyZWNlaXZlZERhdGEpID0+IGNvbW1hbmRFeGVjdXRpb24/LnNldFJlY2VpdmVkKHJlY2VpdmVkRGF0YSksXG4gICAgICAgIHJlcXVlc3Q6IGNvbW1hbmRTdWJtaXREYXRhLmdldEpzb25EYXRhKClcbiAgICAgIH0pKVxuICAgIH1cblxuICAgIGxldCByZXNwb25zZVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgIGlmIChjb21tYW5kU3VibWl0RGF0YS5nZXRGaWxlc0NvdW50KCkgPiAwKSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgQXBpLnJlcXVlc3RMb2NhbCh7cGF0aDogdXJsLCBtZXRob2Q6IFwiUE9TVFwiLCByYXdEYXRhOiBjb21tYW5kU3VibWl0RGF0YS5nZXRGb3JtRGF0YSgpfSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IEFwaS5yZXF1ZXN0TG9jYWwoe3BhdGg6IHVybCwgbWV0aG9kOiBcIlBPU1RcIiwgZGF0YTogY29tbWFuZFN1Ym1pdERhdGEuZ2V0SnNvbkRhdGEoKX0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gZmFsc2UgJiYgcmVzcG9uc2UudHlwZSA9PSBcImludmFsaWRfYXV0aGVudGljaXR5X3Rva2VuXCIpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnZhbGlkIGF1dGhlbnRpY2l0eSB0b2tlbiAtIHRyeSBhZ2FpblwiKVxuICAgICAgICBhd2FpdCBTZXNzaW9uU3RhdHVzVXBkYXRlci5jdXJyZW50KCkudXBkYXRlU2Vzc2lvblN0YXR1cygpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBjb250aW51ZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiogQHR5cGUge0NvbW1hbmRzUmVxdWVzdFJlc3BvbnNlfSAqLyAocmVzcG9uc2UpXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRudCBzdWNjZXNzZnVsbHkgZXhlY3V0ZSByZXF1ZXN0XCIpXG4gIH1cblxuICAvKiogU2VuZHMgdGhlIGN1cnJlbnRseSBxdWV1ZWQgY29tbWFuZHMgYW5kIHJlc29sdmVzIG9yIHJlamVjdHMgdGhlaXIgZXhlY3V0aW9ucy4gKi9cbiAgZmx1c2ggPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRoaXMuY29tbWFuZHNDb3VudCgpID09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRQb29sID0gdGhpcy5wb29sXG4gICAgY29uc3QgY3VycmVudFBvb2xEYXRhID0gdGhpcy5wb29sRGF0YVxuXG4gICAgdGhpcy5wb29sID0ge31cbiAgICB0aGlzLnBvb2xEYXRhID0ge31cbiAgICB0aGlzLmZsdXNoQ291bnQrK1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN1Ym1pdERhdGEgPSB7cG9vbDogY3VycmVudFBvb2xEYXRhfVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5nbG9iYWxSZXF1ZXN0RGF0YSkubGVuZ3RoID4gMClcbiAgICAgICAgc3VibWl0RGF0YS5nbG9iYWwgPSB0aGlzLmdsb2JhbFJlcXVlc3REYXRhXG5cbiAgICAgIGNvbnN0IGNvbW1hbmRTdWJtaXREYXRhID0gbmV3IENvbW1hbmRTdWJtaXREYXRhKHN1Ym1pdERhdGEpXG4gICAgICBjb25zdCB1cmwgPSBcIi9hcGlfbWFrZXIvY29tbWFuZHNcIlxuICAgICAgY29uc3QgY29tbWFuZEV4ZWN1dGlvbiA9IE9iamVjdC52YWx1ZXMoY3VycmVudFBvb2wpWzBdPy5jb21tYW5kRXhlY3V0aW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe2NvbW1hbmRFeGVjdXRpb24sIGNvbW1hbmRTdWJtaXREYXRhLCB1cmx9KVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhyZXNwb25zZS5yZXNwb25zZXMpLm1hcChhc3luYyhjb21tYW5kSWQpID0+IHtcbiAgICAgICAgY29uc3QgY29tbWFuZFJlc3BvbnNlID0gcmVzcG9uc2UucmVzcG9uc2VzW2NvbW1hbmRJZF1cbiAgICAgICAgY29uc3QgY29tbWFuZFJlc3BvbnNlRGF0YSA9IERlc2VyaWFsaXplci5wYXJzZShjb21tYW5kUmVzcG9uc2UuZGF0YSlcbiAgICAgICAgY29uc3QgY29tbWFuZERhdGEgPSBjdXJyZW50UG9vbFtwYXJzZUludChjb21tYW5kSWQsIDEwKV1cbiAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gY29tbWFuZFJlc3BvbnNlLnR5cGVcblxuICAgICAgICBpZiAoY29tbWFuZFJlc3BvbnNlRGF0YSAmJiB0eXBlb2YgY29tbWFuZFJlc3BvbnNlRGF0YSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgYnVnUmVwb3J0VXJsID0gZGlnKGNvbW1hbmRSZXNwb25zZURhdGEsIFwiYnVnX3JlcG9ydF91cmxcIilcblxuICAgICAgICAgIGlmIChidWdSZXBvcnRVcmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBCdWcgcmVwb3J0IFVSTDogJHtidWdSZXBvcnRVcmx9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgY29tbWFuZERhdGEuY29tbWFuZEV4ZWN1dGlvbi5yZXNvbHZlKGNvbW1hbmRSZXNwb25zZURhdGEpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2VUeXBlID09IFwiZXJyb3JcIikge1xuICAgICAgICAgIHRoaXMucmVqZWN0V2l0aENhbGxlclN0YWNrKGNvbW1hbmREYXRhLCBuZXcgQ3VzdG9tRXJyb3IoXCJDb21tYW5kIGVycm9yXCIsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pKVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PSBcImZhaWxlZFwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGYWlsZWRSZXNwb25zZShjb21tYW5kRGF0YSwgY29tbWFuZFJlc3BvbnNlRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCByZXNwb25zZSB0eXBlOiAke3Jlc3BvbnNlVHlwZX1gKVxuICAgICAgICB9XG4gICAgICB9KSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5mbHVzaENvdW50LS1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtDb21tYW5kRGF0YVR5cGV9IGNvbW1hbmREYXRhXG4gICAqIEBwYXJhbSB7RmFpbGVkQ29tbWFuZFJlc3BvbnNlRGF0YX0gY29tbWFuZFJlc3BvbnNlRGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGhhbmRsZUZhaWxlZFJlc3BvbnNlKGNvbW1hbmREYXRhLCBjb21tYW5kUmVzcG9uc2VEYXRhKSB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoU2Vzc2lvblN0YXR1c0Zvck5vQWNjZXNzRXJyb3IoY29tbWFuZFJlc3BvbnNlRGF0YSlcblxuICAgIGxldCBlcnJvclxuXG4gICAgaWYgKGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JfdHlwZSA9PSBcImRlc3Ryb3lfZXJyb3JcIikge1xuICAgICAgZXJyb3IgPSBuZXcgRGVzdHJveUVycm9yKFwiRGVzdHJveSBmYWlsZWRcIiwge3Jlc3BvbnNlOiBjb21tYW5kUmVzcG9uc2VEYXRhfSlcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JfdHlwZSA9PSBcInZhbGlkYXRpb25fZXJyb3JcIikge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgICAgbW9kZWw6IGRpZ2coY29tbWFuZFJlc3BvbnNlRGF0YSwgXCJtb2RlbFwiKSxcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhjb21tYW5kUmVzcG9uc2VEYXRhLCBcInZhbGlkYXRpb25fZXJyb3JzXCIpXG4gICAgICB9KVxuICAgICAgZXJyb3IgPSBuZXcgVmFsaWRhdGlvbkVycm9yKHZhbGlkYXRpb25FcnJvcnMsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pXG5cbiAgICAgIGV2ZW50cy5lbWl0KFwib25WYWxpZGF0aW9uRXJyb3JzXCIsIHZhbGlkYXRpb25FcnJvcnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbW1hbmRSZXNwb25zZURhdGEuZXJyb3JzID8gdW5kZWZpbmVkIDogXCJDb21tYW5kIGZhaWxlZFwiXG5cbiAgICAgIGVycm9yID0gbmV3IEN1c3RvbUVycm9yKGVycm9yTWVzc2FnZSwge3Jlc3BvbnNlOiBjb21tYW5kUmVzcG9uc2VEYXRhfSlcbiAgICB9XG5cbiAgICB0aGlzLnJlamVjdFdpdGhDYWxsZXJTdGFjayhjb21tYW5kRGF0YSwgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0cyB0aGUgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBlcnJvciwgc3BsaWNpbmcgdGhlIGNhbGxlcidzIHN0YWNrIChjYXB0dXJlZCBzeW5jaHJvbm91c2x5IGluIGFkZENvbW1hbmQpIG9udG8gZXJyb3Iuc3RhY2suXG4gICAqIE5lZWRlZCBiZWNhdXNlIGVycm9yLnN0YWNrIGlzIGZyb3plbiBhdCBjb25zdHJ1Y3Rpb24gdGltZSBpbnNpZGUgZmx1c2goKSdzIG1pY3JvdGFzayBhbmQgdGhlcmVmb3JlIGxvc2VzIHRoZSBjYWxsZXIncyBmcmFtZXMuXG4gICAqIEBwYXJhbSB7Q29tbWFuZERhdGFUeXBlfSBjb21tYW5kRGF0YVxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlamVjdFdpdGhDYWxsZXJTdGFjayhjb21tYW5kRGF0YSwgZXJyb3IpIHtcbiAgICBpZiAoY29tbWFuZERhdGEuc3RhY2spIHtcbiAgICAgIC8vIFY4IHByZWZpeGVzIFwiRXJyb3JcXG5cIiBhcyBhIGhlYWRlcjsgSlNDL1NwaWRlck1vbmtleSBzdGFja3Mgc3RhcnQgZGlyZWN0bHkgd2l0aCBhIGZyYW1lLlxuICAgICAgY29uc3QgY2FsbGVyRnJhbWVzID0gY29tbWFuZERhdGEuc3RhY2suc3RhcnRzV2l0aChcIkVycm9yXCIpXG4gICAgICAgID8gY29tbWFuZERhdGEuc3RhY2tcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAuam9pbihcIlxcblwiKVxuICAgICAgICA6IGNvbW1hbmREYXRhLnN0YWNrXG5cbiAgICAgIGlmIChjYWxsZXJGcmFtZXMpIHtcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBgJHtlcnJvci5zdGFjayA/PyBcIlwifVxcbiR7Y2FsbGVyRnJhbWVzfWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21tYW5kRGF0YS5jb21tYW5kRXhlY3V0aW9uLnJlamVjdChlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0ZhaWxlZENvbW1hbmRSZXNwb25zZURhdGF9IGNvbW1hbmRSZXNwb25zZURhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZWZyZXNoU2Vzc2lvblN0YXR1c0Zvck5vQWNjZXNzRXJyb3IoY29tbWFuZFJlc3BvbnNlRGF0YSkge1xuICAgIGlmIChjb21tYW5kUmVzcG9uc2VEYXRhLmVycm9yX3R5cGUgIT0gXCJub3RfZm91bmRfb3Jfbm9fYWNjZXNzXCIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZEluU2NvcGUgPSBEZXZpc2VcbiAgICAgIC5yZWdpc3RlcmVkU2NvcGVzKClcbiAgICAgIC5maW5kKChzY29wZSkgPT4gRGV2aXNlLmN1cnJlbnQoKS5oYXNDdXJyZW50U2NvcGUoc2NvcGUpIHx8IERldmlzZS5jdXJyZW50KCkuaGFzR2xvYmFsQ3VycmVudFNjb3BlKHNjb3BlKSlcblxuICAgIGlmICghc2lnbmVkSW5TY29wZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgU2Vzc2lvblN0YXR1c1VwZGF0ZXIuY3VycmVudCgpLnVwZGF0ZVNlc3Npb25TdGF0dXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGlsZSBvbmUgb3IgbW9yZSBmbHVzaGVzIGFyZSBzdGlsbCBpbiBwcm9ncmVzcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0FjdGl2ZSgpIHtcbiAgICBpZiAodGhpcy5jb21tYW5kc0NvdW50KCkgPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmZsdXNoQ291bnQgPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZmx1c2hSdW5MYXN0ID0gbmV3IFJ1bkxhc3QodGhpcy5mbHVzaClcbn1cbiJdfQ==
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMtcG9vbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiY29tbWFuZHMtcG9vbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFBO0FBQzFCLE9BQU8sd0JBQXdCLE1BQU0sd0JBQXdCLENBQUE7QUFDN0QsT0FBTyxpQkFBaUIsTUFBTSwwQkFBMEIsQ0FBQTtBQUN4RCxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUEsQ0FBQyxtQ0FBbUM7QUFDaEYsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBLENBQUMsbUNBQW1DO0FBQ3ZFLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLGtCQUFrQixNQUFNLHNCQUFzQixDQUFBLENBQUMsbUNBQW1DO0FBQ3pGLE9BQU8sT0FBTyxNQUFNLGVBQWUsQ0FBQTtBQUNuQyxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLG1CQUFtQixNQUFNLDRCQUE0QixDQUFBO0FBQzVELE9BQU8sb0JBQW9CLE1BQU0sNkJBQTZCLENBQUE7QUFDOUQsT0FBTyxlQUFlLE1BQU0sdUJBQXVCLENBQUE7QUFDbkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDdkQsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUVsRSxxR0FBcUc7QUFDckcsMElBQTBJO0FBQzFJLHlFQUF5RTtBQUN6RTs7Ozs7OztHQU9HO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7OztHQUlHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7O0dBTUc7QUFF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QUNkLENBQUM7SUFFRCxZQUFZLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0NBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBBcGkgZnJvbSBcIi4vYXBpLmpzXCJcbmltcG9ydCBBcGlNYWtlckNvbW1hbmRFeGVjdXRpb24gZnJvbSBcIi4vY29tbWFuZC1leGVjdXRpb24uanNcIlxuaW1wb3J0IENvbW1hbmRTdWJtaXREYXRhIGZyb20gXCIuL2NvbW1hbmQtc3VibWl0LWRhdGEuanNcIlxuaW1wb3J0IENvbmZpZyBmcm9tIFwiLi9jb25maWcuanNcIlxuaW1wb3J0IEN1c3RvbUVycm9yIGZyb20gXCIuL2N1c3RvbS1lcnJvci5qc1wiXG5pbXBvcnQgRGVzdHJveUVycm9yIGZyb20gXCIuL2Rlc3Ryb3ktZXJyb3IuanNcIlxuaW1wb3J0IERlc2VyaWFsaXplciBmcm9tIFwiLi9kZXNlcmlhbGl6ZXIuanNcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuaW1wb3J0IERldmlzZSBmcm9tIFwiLi9kZXZpc2UuanNcIlxuaW1wb3J0IHtkaWcsIGRpZ2d9IGZyb20gXCJkaWdnZXJpemVcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuaW1wb3J0IGV2ZW50cyBmcm9tIFwiLi9ldmVudHMuanNcIlxuaW1wb3J0IEZvcm1EYXRhT2JqZWN0aXplciBmcm9tIFwiZm9ybS1kYXRhLW9iamVjdGl6ZXJcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuaW1wb3J0IFJ1bkxhc3QgZnJvbSBcIi4vcnVuLWxhc3QuanNcIlxuaW1wb3J0IFNlcmlhbGl6ZXIgZnJvbSBcIi4vc2VyaWFsaXplci5qc1wiXG5pbXBvcnQgU2Vzc2lvbkV4cGlyZWRFcnJvciBmcm9tIFwiLi9zZXNzaW9uLWV4cGlyZWQtZXJyb3IuanNcIlxuaW1wb3J0IFNlc3Npb25TdGF0dXNVcGRhdGVyIGZyb20gXCIuL3Nlc3Npb24tc3RhdHVzLXVwZGF0ZXIuanNcIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tIFwiLi92YWxpZGF0aW9uLWVycm9yLmpzXCJcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yc30gZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvcnMuanNcIlxuaW1wb3J0IFdlYnNvY2tldFJlcXVlc3RDbGllbnQgZnJvbSBcIi4vd2Vic29ja2V0LXJlcXVlc3QtY2xpZW50LmpzXCJcblxuLyoqIEB0eXBlZGVmIHtvYmplY3QgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZH0gQ29tbWFuZEFyZ3VtZW50U2NhbGFyT3JPYmplY3QgKi9cbi8qKiBAdHlwZWRlZiB7Q29tbWFuZEFyZ3VtZW50U2NhbGFyT3JPYmplY3QgfCBGaWxlIHwgRm9ybURhdGEgfCBIVE1MRm9ybUVsZW1lbnQgfCBDb21tYW5kQXJndW1lbnRTY2FsYXJPck9iamVjdFtdfSBDb21tYW5kQXJndW1lbnRWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBDb21tYW5kQXJndW1lbnRWYWx1ZT59IENvbW1hbmRBcmd1bWVudE1hcCAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21tYW5kRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtDb21tYW5kQXJndW1lbnRWYWx1ZX0gW2FyZ3NdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZ30gW3ByaW1hcnlLZXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbW1hbmRSZXF1ZXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbY2FjaGVSZXNwb25zZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvcmNlSHR0cF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2luc3RhbnRdXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tbWFuZFJlc3BvbnNlRW52ZWxvcGVcbiAqIEBwcm9wZXJ0eSB7Q29tbWFuZEFyZ3VtZW50TWFwfSBkYXRhXG4gKiBAcHJvcGVydHkge1wic3VjY2Vzc1wiIHwgXCJlcnJvclwiIHwgXCJmYWlsZWRcIn0gdHlwZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbW1hbmRzUmVxdWVzdFJlc3BvbnNlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIENvbW1hbmRSZXNwb25zZUVudmVsb3BlPn0gcmVzcG9uc2VzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0eXBlXVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZhaWxlZENvbW1hbmRSZXNwb25zZURhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlcnJvcl90eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZXJyb3JzXVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3ZhbGlkYXRpb25fZXJyb3JzXVxuICogQHByb3BlcnR5IHtDb21tYW5kQXJndW1lbnRNYXB9IFttb2RlbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbW1hbmREYXRhVHlwZVxuICogQHByb3BlcnR5IHtBcGlNYWtlckNvbW1hbmRFeGVjdXRpb259IGNvbW1hbmRFeGVjdXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGFja1xuICovXG5cbi8qKiBAdHlwZWRlZiB7e1trZXk6IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiB7W2tleTogc3RyaW5nXToge1trZXk6IG51bWJlcl06IHthcmdzOiBvYmplY3QsIHByaW1hcnlfa2V5OiBudW1iZXIgfCBzdHJpbmcsIGlkOiBudW1iZXJ9fX19fX0gUG9vbERhdGFUeXBlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0ICYge2lkOiAoKSA9PiBudW1iZXIgfCBzdHJpbmd9fSBCYXNlTW9kZWxXaXRoSWQgKi9cblxuY29uc3Qgc2hhcmVkID0ge31cblxuLyoqIEJhdGNoZXMgY29tbWFuZCBzdWJtaXNzaW9ucyBhbmQgZmx1c2hlcyB0aGVtIG92ZXIgSFRUUCBvciB3ZWJzb2NrZXRzLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJDb21tYW5kc1Bvb2wge1xuICAvKipcbiAgICogQWRkcyBhIGNvbW1hbmQgdG8gdGhlIHNoYXJlZCBvciBvbmUtb2ZmIGNvbW1hbmQgcG9vbCBhbmQgc2NoZWR1bGVzIGEgZmx1c2guXG4gICAqIEBwYXJhbSB7Q29tbWFuZERlc2NyaXB0b3J9IGRhdGFcbiAgICogQHBhcmFtIHtDb21tYW5kUmVxdWVzdE9wdGlvbnN9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7QXBpTWFrZXJDb21tYW5kRXhlY3V0aW9ufVxuICAgKi9cbiAgc3RhdGljIGFkZENvbW1hbmQoZGF0YSwgYXJncyA9IHt9KSB7XG4gICAgbGV0IHBvb2xcbiAgICBjb25zdCB1c2VXZWJzb2NrZXRSZXF1ZXN0cyA9IENvbmZpZy5nZXRXZWJzb2NrZXRSZXF1ZXN0cygpXG5cbiAgICBpZiAoYXJncy5pbnN0YW50IHx8IHVzZVdlYnNvY2tldFJlcXVlc3RzKSB7XG4gICAgICBwb29sID0gbmV3IEFwaU1ha2VyQ29tbWFuZHNQb29sKClcbiAgICAgIHBvb2wuZ2xvYmFsUmVxdWVzdERhdGEgPSB7Li4uQXBpTWFrZXJDb21tYW5kc1Bvb2wuY3VycmVudCgpLmdsb2JhbFJlcXVlc3REYXRhfVxuICAgICAgcG9vbC5yZXF1ZXN0T3B0aW9ucyA9IHsuLi5hcmdzfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb29sID0gQXBpTWFrZXJDb21tYW5kc1Bvb2wuY3VycmVudCgpXG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZVJlc3VsdCA9IHBvb2wuYWRkQ29tbWFuZChkYXRhKVxuXG4gICAgaWYgKGFyZ3MuaW5zdGFudCB8fCB1c2VXZWJzb2NrZXRSZXF1ZXN0cykge1xuICAgICAgcG9vbC5mbHVzaFJ1bkxhc3QucnVuKClcbiAgICB9IGVsc2Uge1xuICAgICAgcG9vbC5mbHVzaFJ1bkxhc3QucXVldWUoKVxuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2hhcmVkIGNvbW1hbmQgcG9vbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge0FwaU1ha2VyQ29tbWFuZHNQb29sfVxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFzaGFyZWQuY3VycmVudEFwaU1ha2VyQ29tbWFuZHNQb29sKSBzaGFyZWQuY3VycmVudEFwaU1ha2VyQ29tbWFuZHNQb29sID0gbmV3IEFwaU1ha2VyQ29tbWFuZHNQb29sKClcblxuICAgIHJldHVybiBzaGFyZWQuY3VycmVudEFwaU1ha2VyQ29tbWFuZHNQb29sXG4gIH1cblxuICAvKiogRmx1c2hlcyB0aGUgc2hhcmVkIGNvbW1hbmQgcG9vbCBpbW1lZGlhdGVseS4gKi9cbiAgc3RhdGljIGZsdXNoKCkge1xuICAgIEFwaU1ha2VyQ29tbWFuZHNQb29sLmN1cnJlbnQoKS5mbHVzaCgpXG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZXMgb25lIGNvbW1hbmQgcG9vbCBpbnN0YW5jZSB3aXRoIGVtcHR5IHF1ZXVlZCBzdGF0ZS4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5mbHVzaENvdW50ID0gMFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBDb21tYW5kRGF0YVR5cGU+fSAqL1xuICAgIHRoaXMucG9vbCA9IHt9XG5cbiAgICAvKiogQHR5cGUge1Bvb2xEYXRhVHlwZX0gKi9cbiAgICB0aGlzLnBvb2xEYXRhID0ge31cblxuICAgIHRoaXMuY3VycmVudElkID0gMVxuXG4gICAgLyoqIEB0eXBlIHtDb21tYW5kQXJndW1lbnRNYXB9ICovXG4gICAgdGhpcy5nbG9iYWxSZXF1ZXN0RGF0YSA9IHt9XG5cbiAgICAvKiogQHR5cGUge0NvbW1hbmRSZXF1ZXN0T3B0aW9uc30gKi9cbiAgICB0aGlzLnJlcXVlc3RPcHRpb25zID0ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG9uZSBjb21tYW5kIGV4ZWN1dGlvbiB0byB0aGlzIHBvb2wgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7Q29tbWFuZERlc2NyaXB0b3J9IGRhdGFcbiAgICogQHJldHVybnMge0FwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbn1cbiAgICovXG4gIGFkZENvbW1hbmQoZGF0YSkge1xuICAgIGNvbnN0IHN0YWNrID0gRXJyb3IoKS5zdGFja1xuICAgIGNvbnN0IGlkID0gdGhpcy5jdXJyZW50SWRcbiAgICBjb25zdCBjb21tYW5kRXhlY3V0aW9uID0gbmV3IEFwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbigpXG4gICAgY29uc3QgY29tbWFuZFR5cGUgPSBkYXRhLnR5cGVcbiAgICBjb25zdCBjb21tYW5kTmFtZSA9IGRhdGEuY29tbWFuZFxuICAgIGNvbnN0IGNvbGxlY3Rpb25OYW1lID0gZGF0YS5jb2xsZWN0aW9uTmFtZVxuXG4gICAgdGhpcy5jdXJyZW50SWQgKz0gMVxuICAgIHRoaXMucG9vbFtpZF0gPSB7Y29tbWFuZEV4ZWN1dGlvbiwgc3RhY2t9XG5cbiAgICBpZiAoIXRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdKSB0aGlzLnBvb2xEYXRhW2NvbW1hbmRUeXBlXSA9IHt9XG4gICAgaWYgKCF0aGlzLnBvb2xEYXRhW2NvbW1hbmRUeXBlXVtjb2xsZWN0aW9uTmFtZV0pIHRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXSA9IHt9XG4gICAgaWYgKCF0aGlzLnBvb2xEYXRhW2NvbW1hbmRUeXBlXVtjb2xsZWN0aW9uTmFtZV1bY29tbWFuZE5hbWVdKSB0aGlzLnBvb2xEYXRhW2NvbW1hbmRUeXBlXVtjb2xsZWN0aW9uTmFtZV1bY29tbWFuZE5hbWVdID0ge31cblxuICAgIGxldCBhcmdzXG5cbiAgICBpZiAoZGF0YS5hcmdzPy5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZGF0YS5hcmdzKVxuXG4gICAgICBhcmdzID0gRm9ybURhdGFPYmplY3RpemVyLnRvT2JqZWN0KGZvcm1EYXRhKVxuICAgIH0gZWxzZSBpZiAoZGF0YS5hcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgIGFyZ3MgPSBGb3JtRGF0YU9iamVjdGl6ZXIudG9PYmplY3QoZGF0YS5hcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzID0gU2VyaWFsaXplci5zZXJpYWxpemUoZGF0YS5hcmdzKVxuICAgIH1cblxuICAgIHRoaXMucG9vbERhdGFbY29tbWFuZFR5cGVdW2NvbGxlY3Rpb25OYW1lXVtjb21tYW5kTmFtZV1baWRdID0ge1xuICAgICAgYXJncyxcbiAgICAgIHByaW1hcnlfa2V5OiBkYXRhLnByaW1hcnlLZXksXG4gICAgICBpZFxuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kRXhlY3V0aW9uXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgY29tbWFuZHNDb3VudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wb29sKS5sZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy51cmxcbiAgICogQHBhcmFtIHtDb21tYW5kU3VibWl0RGF0YX0gYXJncy5jb21tYW5kU3VibWl0RGF0YVxuICAgKiBAcGFyYW0ge0FwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbn0gW2FyZ3MuY29tbWFuZEV4ZWN1dGlvbl1cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29tbWFuZHNSZXF1ZXN0UmVzcG9uc2U+fVxuICAgKi9cbiAgYXN5bmMgc2VuZFJlcXVlc3Qoe2NvbW1hbmRFeGVjdXRpb24sIGNvbW1hbmRTdWJtaXREYXRhLCB1cmx9KSB7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAzOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5wZXJmb3JtUmVxdWVzdCh7Y29tbWFuZEV4ZWN1dGlvbiwgY29tbWFuZFN1Ym1pdERhdGEsIHVybH0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuXG4gICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MgPT09IGZhbHNlICYmIHJlc3BvbnNlLnR5cGUgPT0gXCJpbnZhbGlkX2F1dGhlbnRpY2l0eV90b2tlblwiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW52YWxpZCBhdXRoZW50aWNpdHkgdG9rZW4gLSB0cnkgYWdhaW5cIilcbiAgICAgICAgYXdhaXQgU2Vzc2lvblN0YXR1c1VwZGF0ZXIuY3VycmVudCgpLnVwZGF0ZVNlc3Npb25TdGF0dXMoKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgY29udGludWUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MgPT09IGZhbHNlICYmIHJlc3BvbnNlLnR5cGUgPT0gXCJhdXRoZW50aWNhdGlvbl9jaGFuZ2VkXCIpIHtcbiAgICAgICAgY29uc3QgcmVjb3ZlcmVkID0gYXdhaXQgdGhpcy5yZWNvdmVyQXV0aGVudGljYXRpb24oKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWF3YWl0LWluLWxvb3BcblxuICAgICAgICBpZiAocmVjb3ZlcmVkKSBjb250aW51ZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRpbnVlXG5cbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25FeHBpcmVkRXJyb3IoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtDb21tYW5kc1JlcXVlc3RSZXNwb25zZX0gKi8gKHJlc3BvbnNlKVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbnQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGUgcmVxdWVzdFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgc2luZ2xlIGNvbW1hbmQgcmVxdWVzdCBvdmVyIHdlYnNvY2tldCBvciBIVFRQLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy51cmxcbiAgICogQHBhcmFtIHtDb21tYW5kU3VibWl0RGF0YX0gYXJncy5jb21tYW5kU3VibWl0RGF0YVxuICAgKiBAcGFyYW0ge0FwaU1ha2VyQ29tbWFuZEV4ZWN1dGlvbn0gW2FyZ3MuY29tbWFuZEV4ZWN1dGlvbl1cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29tbWFuZHNSZXF1ZXN0UmVzcG9uc2U+fVxuICAgKi9cbiAgYXN5bmMgcGVyZm9ybVJlcXVlc3Qoe2NvbW1hbmRFeGVjdXRpb24sIGNvbW1hbmRTdWJtaXREYXRhLCB1cmx9KSB7XG4gICAgaWYgKENvbmZpZy5nZXRXZWJzb2NrZXRSZXF1ZXN0cygpICYmICF0aGlzLnJlcXVlc3RPcHRpb25zLmZvcmNlSHR0cCAmJiBjb21tYW5kU3VibWl0RGF0YS5nZXRGaWxlc0NvdW50KCkgPT0gMCkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxDb21tYW5kc1JlcXVlc3RSZXNwb25zZT59ICovIChXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50LmN1cnJlbnQoKS5wZXJmb3JtKHtcbiAgICAgICAgY2FjaGVSZXNwb25zZTogdGhpcy5yZXF1ZXN0T3B0aW9ucy5jYWNoZVJlc3BvbnNlLFxuICAgICAgICBnbG9iYWw6IHRoaXMuZ2xvYmFsRGF0YUZvclJlcXVlc3QoKSxcbiAgICAgICAgb25Mb2c6IChtZXNzYWdlKSA9PiBjb21tYW5kRXhlY3V0aW9uPy5hZGRMb2cobWVzc2FnZSksXG4gICAgICAgIG9uUHJvZ3Jlc3M6IChwcm9ncmVzc0RhdGEpID0+IGNvbW1hbmRFeGVjdXRpb24/LnNldFByb2dyZXNzKHByb2dyZXNzRGF0YSksXG4gICAgICAgIG9uUmVjZWl2ZWQ6IChyZWNlaXZlZERhdGEpID0+IGNvbW1hbmRFeGVjdXRpb24/LnNldFJlY2VpdmVkKHJlY2VpdmVkRGF0YSksXG4gICAgICAgIHJlcXVlc3Q6IGNvbW1hbmRTdWJtaXREYXRhLmdldEpzb25EYXRhKClcbiAgICAgIH0pKVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kU3VibWl0RGF0YS5nZXRGaWxlc0NvdW50KCkgPiAwKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtDb21tYW5kc1JlcXVlc3RSZXNwb25zZX0gKi8gKGF3YWl0IEFwaS5yZXF1ZXN0TG9jYWwoe3BhdGg6IHVybCwgbWV0aG9kOiBcIlBPU1RcIiwgcmF3RGF0YTogY29tbWFuZFN1Ym1pdERhdGEuZ2V0Rm9ybURhdGEoKX0pKVxuICAgIH1cblxuICAgIHJldHVybiAvKiogQHR5cGUge0NvbW1hbmRzUmVxdWVzdFJlc3BvbnNlfSAqLyAoYXdhaXQgQXBpLnJlcXVlc3RMb2NhbCh7cGF0aDogdXJsLCBtZXRob2Q6IFwiUE9TVFwiLCBkYXRhOiBjb21tYW5kU3VibWl0RGF0YS5nZXRKc29uRGF0YSgpfSkpXG4gIH1cblxuICAvKipcbiAgICogVGhlIHVzZXIgaWRzIHRoZSBmcm9udGVuZCBiZWxpZXZlcyBpdCBpcyBzaWduZWQgaW4gYXMsIGtleWVkIGJ5IERldmlzZVxuICAgKiBzY29wZS4gU2VudCB3aXRoIGVhY2ggcmVxdWVzdCBzbyB0aGUgYmFja2VuZCBjYW4gZGV0ZWN0IChhbmQgbGV0IHRoZVxuICAgKiBmcm9udGVuZCByZWNvdmVyIGZyb20pIGEgc3RhbGUgc2Vzc2lvbiBiZWZvcmUgcnVubmluZyBjb21tYW5kcy4gVW5kZWZpbmVkXG4gICAqIHdoZW4gbm90aGluZyBpcyBzaWduZWQgaW4sIHNvIGdlbnVpbmVseSBhbm9ueW1vdXMgcmVxdWVzdHMgc2VuZCBubyBiZWxpZWYuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+IHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgYmVsaWV2ZWREZXZpc2VVc2VySWRzKCkge1xuICAgIGNvbnN0IGJlbGlldmVkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSAqLyAoe30pXG5cbiAgICBmb3IgKGNvbnN0IHNjb3BlIG9mIERldmlzZS5yZWdpc3RlcmVkU2NvcGVzKCkpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gRGV2aXNlLmN1cnJlbnQoKS5nZXRDdXJyZW50U2NvcGUoc2NvcGUpXG5cbiAgICAgIGlmIChtb2RlbCkgYmVsaWV2ZWRbc2NvcGVdID0gLyoqIEB0eXBlIHtCYXNlTW9kZWxXaXRoSWR9ICovIChtb2RlbCkuaWQoKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhiZWxpZXZlZCkubGVuZ3RoID4gMCA/IGJlbGlldmVkIDogdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogVGhlIGdsb2JhbCByZXF1ZXN0IGRhdGEgbWVyZ2VkIHdpdGggdGhlIGJlbGlldmVkIHNpZ25lZC1pbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fVxuICAgKi9cbiAgZ2xvYmFsRGF0YUZvclJlcXVlc3QoKSB7XG4gICAgY29uc3QgYmVsaWV2ZWQgPSB0aGlzLmJlbGlldmVkRGV2aXNlVXNlcklkcygpXG5cbiAgICBpZiAoIWJlbGlldmVkKSByZXR1cm4gdGhpcy5nbG9iYWxSZXF1ZXN0RGF0YVxuXG4gICAgcmV0dXJuIHsuLi50aGlzLmdsb2JhbFJlcXVlc3REYXRhLCBiZWxpZXZlZF9kZXZpc2VfdXNlcl9pZHM6IGJlbGlldmVkfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXJzIGZyb20gYW4gYGF1dGhlbnRpY2F0aW9uX2NoYW5nZWRgIHJlc3BvbnNlOiByZWZyZXNoZXMgdGhlIGV4aXN0aW5nXG4gICAqIHdlYnNvY2tldCBjb25uZWN0aW9uJ3MgYXV0aCBpbi1wbGFjZSBmcm9tIHRoZSBjdXJyZW50IHNlcnZlciBzZXNzaW9uIChub1xuICAgKiByZWNvbm5lY3QsIG5vIHBhc3N3b3JkKSBhbmQgcmVjb25jaWxlcyB0aGUgbG9jYWwgc2Vzc2lvbiBjYWNoZS4gUmV0dXJuc1xuICAgKiB3aGV0aGVyIGEgcHJldmlvdXNseSBzaWduZWQtaW4gc2NvcGUgaXMgc3RpbGwgYXV0aGVudGljYXRlZCwgc28gdGhlIHJlcXVlc3RcbiAgICogY2FuIGJlIHJldHJpZWQ7IGZhbHNlIG1lYW5zIHRoZSB1c2VyIGlzIGdlbnVpbmVseSBzaWduZWQgb3V0ICh0aGUgc2lnbi1pblxuICAgKiBmb3JtIGlzIHNob3duIGNlbnRyYWxseSB2aWEgdGhlIERldmlzZSBzaWduLW91dCBldmVudCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckF1dGhlbnRpY2F0aW9uKCkge1xuICAgIGNvbnN0IHNlc3Npb25TdGF0dXNVcGRhdGVyID0gU2Vzc2lvblN0YXR1c1VwZGF0ZXIuY3VycmVudCgpXG4gICAgY29uc3Qgc2Vzc2lvblN0YXR1cyA9IGF3YWl0IHNlc3Npb25TdGF0dXNVcGRhdGVyLnNlc3Npb25TdGF0dXMoKVxuICAgIGNvbnN0IHNjb3BlcyA9IERldmlzZS5yZWdpc3RlcmVkU2NvcGVzKClcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc2NvcGVzLm1hcCgoc2NvcGUpID0+IERldmlzZS5yZWZyZXNoV2Vic29ja2V0U2Vzc2lvbih7c2NvcGUsIHNoYWRvd1Nlc3Npb25Ub2tlbjogc2Vzc2lvblN0YXR1cz8uc2hhZG93X3Nlc3Npb25fdG9rZW59KSlcbiAgICApXG5cbiAgICBzZXNzaW9uU3RhdHVzVXBkYXRlci5hcHBseVJlc3VsdChzZXNzaW9uU3RhdHVzKVxuXG4gICAgcmV0dXJuIHNjb3Blcy5zb21lKChzY29wZSkgPT4gQm9vbGVhbihzZXNzaW9uU3RhdHVzPy5zY29wZXM/LltzY29wZV0/LnNpZ25lZF9pbikpXG4gIH1cblxuICAvKiogU2VuZHMgdGhlIGN1cnJlbnRseSBxdWV1ZWQgY29tbWFuZHMgYW5kIHJlc29sdmVzIG9yIHJlamVjdHMgdGhlaXIgZXhlY3V0aW9ucy4gKi9cbiAgZmx1c2ggPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRoaXMuY29tbWFuZHNDb3VudCgpID09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRQb29sID0gdGhpcy5wb29sXG4gICAgY29uc3QgY3VycmVudFBvb2xEYXRhID0gdGhpcy5wb29sRGF0YVxuXG4gICAgdGhpcy5wb29sID0ge31cbiAgICB0aGlzLnBvb2xEYXRhID0ge31cbiAgICB0aGlzLmZsdXNoQ291bnQrK1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN1Ym1pdERhdGEgPSB7cG9vbDogY3VycmVudFBvb2xEYXRhfVxuICAgICAgY29uc3QgZ2xvYmFsRGF0YSA9IHRoaXMuZ2xvYmFsRGF0YUZvclJlcXVlc3QoKVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoZ2xvYmFsRGF0YSkubGVuZ3RoID4gMClcbiAgICAgICAgc3VibWl0RGF0YS5nbG9iYWwgPSBnbG9iYWxEYXRhXG5cbiAgICAgIGNvbnN0IGNvbW1hbmRTdWJtaXREYXRhID0gbmV3IENvbW1hbmRTdWJtaXREYXRhKHN1Ym1pdERhdGEpXG4gICAgICBjb25zdCB1cmwgPSBcIi9hcGlfbWFrZXIvY29tbWFuZHNcIlxuICAgICAgY29uc3QgY29tbWFuZEV4ZWN1dGlvbiA9IE9iamVjdC52YWx1ZXMoY3VycmVudFBvb2wpWzBdPy5jb21tYW5kRXhlY3V0aW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe2NvbW1hbmRFeGVjdXRpb24sIGNvbW1hbmRTdWJtaXREYXRhLCB1cmx9KVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhyZXNwb25zZS5yZXNwb25zZXMpLm1hcChhc3luYyhjb21tYW5kSWQpID0+IHtcbiAgICAgICAgY29uc3QgY29tbWFuZFJlc3BvbnNlID0gcmVzcG9uc2UucmVzcG9uc2VzW2NvbW1hbmRJZF1cbiAgICAgICAgY29uc3QgY29tbWFuZFJlc3BvbnNlRGF0YSA9IERlc2VyaWFsaXplci5wYXJzZShjb21tYW5kUmVzcG9uc2UuZGF0YSlcbiAgICAgICAgY29uc3QgY29tbWFuZERhdGEgPSBjdXJyZW50UG9vbFtwYXJzZUludChjb21tYW5kSWQsIDEwKV1cbiAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gY29tbWFuZFJlc3BvbnNlLnR5cGVcblxuICAgICAgICBpZiAoY29tbWFuZFJlc3BvbnNlRGF0YSAmJiB0eXBlb2YgY29tbWFuZFJlc3BvbnNlRGF0YSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgY29uc3QgYnVnUmVwb3J0VXJsID0gZGlnKGNvbW1hbmRSZXNwb25zZURhdGEsIFwiYnVnX3JlcG9ydF91cmxcIilcblxuICAgICAgICAgIGlmIChidWdSZXBvcnRVcmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBCdWcgcmVwb3J0IFVSTDogJHtidWdSZXBvcnRVcmx9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgY29tbWFuZERhdGEuY29tbWFuZEV4ZWN1dGlvbi5yZXNvbHZlKGNvbW1hbmRSZXNwb25zZURhdGEpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2VUeXBlID09IFwiZXJyb3JcIikge1xuICAgICAgICAgIHRoaXMucmVqZWN0V2l0aENhbGxlclN0YWNrKGNvbW1hbmREYXRhLCBuZXcgQ3VzdG9tRXJyb3IoXCJDb21tYW5kIGVycm9yXCIsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pKVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PSBcImZhaWxlZFwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGYWlsZWRSZXNwb25zZShjb21tYW5kRGF0YSwgY29tbWFuZFJlc3BvbnNlRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCByZXNwb25zZSB0eXBlOiAke3Jlc3BvbnNlVHlwZX1gKVxuICAgICAgICB9XG4gICAgICB9KSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gc2VuZFJlcXVlc3QgKGUuZy4gYW4gdW5yZWNvdmVyYWJsZSBTZXNzaW9uRXhwaXJlZEVycm9yKSBvciByZXNwb25zZVxuICAgICAgLy8gaGFuZGxpbmcgY2FuIHRocm93IGJlZm9yZSB0aGUgcGVyLWNvbW1hbmQgcHJvbWlzZXMgYXJlIHNldHRsZWQuIFJlamVjdFxuICAgICAgLy8gZXZlcnkgcXVldWVkIGNvbW1hbmQgc28gY2FsbGVycyBhd2FpdGluZyB0aGVpciBleGVjdXRpb24gZG9uJ3QgaGFuZ1xuICAgICAgLy8gZm9yZXZlci4gQWxyZWFkeS1zZXR0bGVkIGV4ZWN1dGlvbnMgaWdub3JlIHRoZSBleHRyYSByZWplY3QuXG4gICAgICBmb3IgKGNvbnN0IGNvbW1hbmREYXRhIG9mIE9iamVjdC52YWx1ZXMoY3VycmVudFBvb2wpKSB7XG4gICAgICAgIGNvbW1hbmREYXRhLmNvbW1hbmRFeGVjdXRpb24ucmVqZWN0KC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZmx1c2hDb3VudC0tXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Q29tbWFuZERhdGFUeXBlfSBjb21tYW5kRGF0YVxuICAgKiBAcGFyYW0ge0ZhaWxlZENvbW1hbmRSZXNwb25zZURhdGF9IGNvbW1hbmRSZXNwb25zZURhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBoYW5kbGVGYWlsZWRSZXNwb25zZShjb21tYW5kRGF0YSwgY29tbWFuZFJlc3BvbnNlRGF0YSkge1xuICAgIGF3YWl0IHRoaXMucmVmcmVzaFNlc3Npb25TdGF0dXNGb3JOb0FjY2Vzc0Vycm9yKGNvbW1hbmRSZXNwb25zZURhdGEpXG5cbiAgICBsZXQgZXJyb3JcblxuICAgIGlmIChjb21tYW5kUmVzcG9uc2VEYXRhLmVycm9yX3R5cGUgPT0gXCJkZXN0cm95X2Vycm9yXCIpIHtcbiAgICAgIGVycm9yID0gbmV3IERlc3Ryb3lFcnJvcihcIkRlc3Ryb3kgZmFpbGVkXCIsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pXG4gICAgfSBlbHNlIGlmIChjb21tYW5kUmVzcG9uc2VEYXRhLmVycm9yX3R5cGUgPT0gXCJ2YWxpZGF0aW9uX2Vycm9yXCIpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSBuZXcgVmFsaWRhdGlvbkVycm9ycyh7XG4gICAgICAgIG1vZGVsOiBkaWdnKGNvbW1hbmRSZXNwb25zZURhdGEsIFwibW9kZWxcIiksXG4gICAgICAgIHZhbGlkYXRpb25FcnJvcnM6IGRpZ2coY29tbWFuZFJlc3BvbnNlRGF0YSwgXCJ2YWxpZGF0aW9uX2Vycm9yc1wiKVxuICAgICAgfSlcbiAgICAgIGVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcih2YWxpZGF0aW9uRXJyb3JzLCB7cmVzcG9uc2U6IGNvbW1hbmRSZXNwb25zZURhdGF9KVxuXG4gICAgICBldmVudHMuZW1pdChcIm9uVmFsaWRhdGlvbkVycm9yc1wiLCB2YWxpZGF0aW9uRXJyb3JzKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBjb21tYW5kUmVzcG9uc2VEYXRhLmVycm9ycyA/IHVuZGVmaW5lZCA6IFwiQ29tbWFuZCBmYWlsZWRcIlxuXG4gICAgICBlcnJvciA9IG5ldyBDdXN0b21FcnJvcihlcnJvck1lc3NhZ2UsIHtyZXNwb25zZTogY29tbWFuZFJlc3BvbnNlRGF0YX0pXG4gICAgfVxuXG4gICAgdGhpcy5yZWplY3RXaXRoQ2FsbGVyU3RhY2soY29tbWFuZERhdGEsIGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdHMgdGhlIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IsIHNwbGljaW5nIHRoZSBjYWxsZXIncyBzdGFjayAoY2FwdHVyZWQgc3luY2hyb25vdXNseSBpbiBhZGRDb21tYW5kKSBvbnRvIGVycm9yLnN0YWNrLlxuICAgKiBOZWVkZWQgYmVjYXVzZSBlcnJvci5zdGFjayBpcyBmcm96ZW4gYXQgY29uc3RydWN0aW9uIHRpbWUgaW5zaWRlIGZsdXNoKCkncyBtaWNyb3Rhc2sgYW5kIHRoZXJlZm9yZSBsb3NlcyB0aGUgY2FsbGVyJ3MgZnJhbWVzLlxuICAgKiBAcGFyYW0ge0NvbW1hbmREYXRhVHlwZX0gY29tbWFuZERhdGFcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWplY3RXaXRoQ2FsbGVyU3RhY2soY29tbWFuZERhdGEsIGVycm9yKSB7XG4gICAgaWYgKGNvbW1hbmREYXRhLnN0YWNrKSB7XG4gICAgICAvLyBWOCBwcmVmaXhlcyBcIkVycm9yXFxuXCIgYXMgYSBoZWFkZXI7IEpTQy9TcGlkZXJNb25rZXkgc3RhY2tzIHN0YXJ0IGRpcmVjdGx5IHdpdGggYSBmcmFtZS5cbiAgICAgIGNvbnN0IGNhbGxlckZyYW1lcyA9IGNvbW1hbmREYXRhLnN0YWNrLnN0YXJ0c1dpdGgoXCJFcnJvclwiKVxuICAgICAgICA/IGNvbW1hbmREYXRhLnN0YWNrXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgLmpvaW4oXCJcXG5cIilcbiAgICAgICAgOiBjb21tYW5kRGF0YS5zdGFja1xuXG4gICAgICBpZiAoY2FsbGVyRnJhbWVzKSB7XG4gICAgICAgIGVycm9yLnN0YWNrID0gYCR7ZXJyb3Iuc3RhY2sgPz8gXCJcIn1cXG4ke2NhbGxlckZyYW1lc31gXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tbWFuZERhdGEuY29tbWFuZEV4ZWN1dGlvbi5yZWplY3QoZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGYWlsZWRDb21tYW5kUmVzcG9uc2VEYXRhfSBjb21tYW5kUmVzcG9uc2VEYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaFNlc3Npb25TdGF0dXNGb3JOb0FjY2Vzc0Vycm9yKGNvbW1hbmRSZXNwb25zZURhdGEpIHtcbiAgICBpZiAoY29tbWFuZFJlc3BvbnNlRGF0YS5lcnJvcl90eXBlICE9IFwibm90X2ZvdW5kX29yX25vX2FjY2Vzc1wiKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRJblNjb3BlID0gRGV2aXNlXG4gICAgICAucmVnaXN0ZXJlZFNjb3BlcygpXG4gICAgICAuZmluZCgoc2NvcGUpID0+IERldmlzZS5jdXJyZW50KCkuaGFzQ3VycmVudFNjb3BlKHNjb3BlKSB8fCBEZXZpc2UuY3VycmVudCgpLmhhc0dsb2JhbEN1cnJlbnRTY29wZShzY29wZSkpXG5cbiAgICBpZiAoIXNpZ25lZEluU2NvcGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IFNlc3Npb25TdGF0dXNVcGRhdGVyLmN1cnJlbnQoKS51cGRhdGVTZXNzaW9uU3RhdHVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hpbGUgb25lIG9yIG1vcmUgZmx1c2hlcyBhcmUgc3RpbGwgaW4gcHJvZ3Jlc3MuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBY3RpdmUoKSB7XG4gICAgaWYgKHRoaXMuY29tbWFuZHNDb3VudCgpID4gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mbHVzaENvdW50ID4gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZsdXNoUnVuTGFzdCA9IG5ldyBSdW5MYXN0KHRoaXMuZmx1c2gpXG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Raised by the commands pool when a request could not run because the session
3
+ * had expired (the frontend's believed user diverged from the backend's actual
4
+ * user) and could not be renewed. Callers can treat this as a benign "please
5
+ * sign in again" signal — the sign-in form is shown centrally via the Devise
6
+ * sign-out event — rather than a real command failure.
7
+ */
8
+ export default class ApiMakerSessionExpiredError extends Error {
9
+ static apiMakerType: string;
10
+ /** @param {string} [message] */
11
+ constructor(message?: string);
12
+ apiMakerType: string;
13
+ }
14
+ //# sourceMappingURL=session-expired-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-expired-error.d.ts","sourceRoot":"/src/","sources":["session-expired-error.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH;IACE,4BAA2C;IAG3C,gCAAgC;IAChC,sBADY,MAAM,EAKjB;IAPD,qBAAoC;CAQrC"}
@@ -0,0 +1,19 @@
1
+ // @ts-check
2
+ /**
3
+ * Raised by the commands pool when a request could not run because the session
4
+ * had expired (the frontend's believed user diverged from the backend's actual
5
+ * user) and could not be renewed. Callers can treat this as a benign "please
6
+ * sign in again" signal — the sign-in form is shown centrally via the Devise
7
+ * sign-out event — rather than a real command failure.
8
+ */
9
+ export default class ApiMakerSessionExpiredError extends Error {
10
+ static apiMakerType = "SessionExpiredError";
11
+ apiMakerType = "SessionExpiredError";
12
+ /** @param {string} [message] */
13
+ constructor(message = "The session has expired") {
14
+ super(message);
15
+ if (Error.captureStackTrace)
16
+ Error.captureStackTrace(this, ApiMakerSessionExpiredError);
17
+ }
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1leHBpcmVkLWVycm9yLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJzZXNzaW9uLWV4cGlyZWQtZXJyb3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sMkJBQTRCLFNBQVEsS0FBSztJQUM1RCxNQUFNLENBQUMsWUFBWSxHQUFHLHFCQUFxQixDQUFBO0lBQzNDLFlBQVksR0FBRyxxQkFBcUIsQ0FBQTtJQUVwQyxnQ0FBZ0M7SUFDaEMsWUFBWSxPQUFPLEdBQUcseUJBQXlCO1FBQzdDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVkLElBQUksS0FBSyxDQUFDLGlCQUFpQjtZQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLENBQUMsQ0FBQTtJQUN6RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogUmFpc2VkIGJ5IHRoZSBjb21tYW5kcyBwb29sIHdoZW4gYSByZXF1ZXN0IGNvdWxkIG5vdCBydW4gYmVjYXVzZSB0aGUgc2Vzc2lvblxuICogaGFkIGV4cGlyZWQgKHRoZSBmcm9udGVuZCdzIGJlbGlldmVkIHVzZXIgZGl2ZXJnZWQgZnJvbSB0aGUgYmFja2VuZCdzIGFjdHVhbFxuICogdXNlcikgYW5kIGNvdWxkIG5vdCBiZSByZW5ld2VkLiBDYWxsZXJzIGNhbiB0cmVhdCB0aGlzIGFzIGEgYmVuaWduIFwicGxlYXNlXG4gKiBzaWduIGluIGFnYWluXCIgc2lnbmFsIOKAlCB0aGUgc2lnbi1pbiBmb3JtIGlzIHNob3duIGNlbnRyYWxseSB2aWEgdGhlIERldmlzZVxuICogc2lnbi1vdXQgZXZlbnQg4oCUIHJhdGhlciB0aGFuIGEgcmVhbCBjb21tYW5kIGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyU2Vzc2lvbkV4cGlyZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdGljIGFwaU1ha2VyVHlwZSA9IFwiU2Vzc2lvbkV4cGlyZWRFcnJvclwiXG4gIGFwaU1ha2VyVHlwZSA9IFwiU2Vzc2lvbkV4cGlyZWRFcnJvclwiXG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiVGhlIHNlc3Npb24gaGFzIGV4cGlyZWRcIikge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEFwaU1ha2VyU2Vzc2lvbkV4cGlyZWRFcnJvcilcbiAgfVxufVxuIl19
@@ -6,6 +6,7 @@
6
6
  * @typedef {object} SessionStatusResult
7
7
  * @property {string} [csrf_token]
8
8
  * @property {Record<string, SessionStatusScope>} scopes
9
+ * @property {string} [shadow_session_token]
9
10
  */
10
11
  /**
11
12
  * @typedef {object} SessionStatusUpdaterArgs
@@ -32,6 +33,20 @@ export default class ApiMakerSessionStatusUpdater {
32
33
  connectOnlineEvent(): void;
33
34
  /** Re-checks session state when the device wakes from sleep. */
34
35
  connectWakeEvent(): void;
36
+ /**
37
+ * Re-checks session state when the user returns to a backgrounded tab/app.
38
+ * The `wake-event` package only fires on multi-second device-sleep drift, so
39
+ * it misses iOS Safari tab suspension; visibilitychange/focus/pageshow cover
40
+ * that, surfacing an expired session the moment the user returns.
41
+ */
42
+ connectVisibilityEvents(): void;
43
+ /**
44
+ * Schedules a debounced session-status refresh when the page becomes visible
45
+ * again. visibilitychange, focus and pageshow can fire together on return, so
46
+ * the refresh is collapsed into a single request.
47
+ */
48
+ refreshOnReturnToForeground: () => void;
49
+ returnRefreshTimeout: any;
35
50
  getCsrfToken(): Promise<string>;
36
51
  csrfToken: string;
37
52
  /**
@@ -79,6 +94,7 @@ export type SessionStatusScope = {
79
94
  export type SessionStatusResult = {
80
95
  csrf_token?: string;
81
96
  scopes: Record<string, SessionStatusScope>;
97
+ shadow_session_token?: string;
82
98
  };
83
99
  export type SessionStatusUpdaterArgs = {
84
100
  timeout?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"session-status-updater.d.ts","sourceRoot":"/src/","sources":["session-status-updater.js"],"names":[],"mappings":"AAYA;;;GAGG;AAEH;;;;GAIG;AAEH;;;;GAIG;AAEH,+CAA+C;AAC/C;IACE;;;;OAIG;IACH,sBAHW,wBAAwB,GACtB,4BAA4B,CAQxC;IAED;;;OAGG;IACH,mBAFW,wBAAwB,EAmBlC;IAhBC,WAAgB;IAChB,gBAAqC;IAGnC,wBAAyC;IAc7C,kEAAkE;IAClE,2BAEC;IAED,gEAAgE;IAChE,yBAEC;IAED,gCA+BC;IAlBK,kBAAyD;IAoB/D;;;OAGG;IACH,iBAFa,OAAO,CAAC,mBAAmB,CAAC,CAmBxC;IAED;;;OAGG;IACH,sCAGC;IAED,6DAA6D;IAC7D,qBAaC;IAPC,8BAMC;IAGH,gEAAgE;IAChE,oBAGC;IAED,gEAAgE;IAChE,yCAMC;IAED;;;OAGG;IACH,oBAHW,mBAAmB,GACjB,IAAI,CAOhB;IAED;;;OAGG;IACH,qCAFW,mBAAmB,QAqB7B;IAED;;;OAGG;IACH,qCAFW,mBAAmB,QAM7B;IAED;;;;OAIG;IACH,4CAHW,MAAM,SACN,kBAAkB,QAkB5B;CACF;;eAnOa,OAAO;;;iBAKP,MAAM;YACN,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC;;;cAKlC,MAAM;qBACN,OAAO"}
1
+ {"version":3,"file":"session-status-updater.d.ts","sourceRoot":"/src/","sources":["session-status-updater.js"],"names":[],"mappings":"AAYA;;;GAGG;AAEH;;;;;GAKG;AAEH;;;;GAIG;AAEH,+CAA+C;AAC/C;IACE;;;;OAIG;IACH,sBAHW,wBAAwB,GACtB,4BAA4B,CAQxC;IAED;;;OAGG;IACH,mBAFW,wBAAwB,EAuBlC;IApBC,WAAgB;IAChB,gBAAqC;IAGnC,wBAAyC;IAkB7C,kEAAkE;IAClE,2BAEC;IAED,gEAAgE;IAChE,yBAEC;IAED;;;;;OAKG;IACH,gCAOC;IAED;;;;OAIG;IACH,wCAWC;IAJC,0BAGM;IAGR,gCA+BC;IAlBK,kBAAyD;IAoB/D;;;OAGG;IACH,iBAFa,OAAO,CAAC,mBAAmB,CAAC,CAmBxC;IAED;;;OAGG;IACH,sCAGC;IAED,6DAA6D;IAC7D,qBAaC;IAPC,8BAMC;IAGH,gEAAgE;IAChE,oBAGC;IAED,gEAAgE;IAChE,yCAMC;IAED;;;OAGG;IACH,oBAHW,mBAAmB,GACjB,IAAI,CAOhB;IAED;;;OAGG;IACH,qCAFW,mBAAmB,QAqB7B;IAED;;;OAGG;IACH,qCAFW,mBAAmB,QAM7B;IAED;;;;OAIG;IACH,4CAHW,MAAM,SACN,kBAAkB,QAkB5B;CACF;;eAzQa,OAAO;;;iBAKP,MAAM;YACN,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC;2BAClC,MAAM;;;cAKN,MAAM;qBACN,OAAO"}
@@ -15,6 +15,7 @@ const shared = {};
15
15
  * @typedef {object} SessionStatusResult
16
16
  * @property {string} [csrf_token]
17
17
  * @property {Record<string, SessionStatusScope>} scopes
18
+ * @property {string} [shadow_session_token]
18
19
  */
19
20
  /**
20
21
  * @typedef {object} SessionStatusUpdaterArgs
@@ -53,6 +54,9 @@ export default class ApiMakerSessionStatusUpdater {
53
54
  if (typeof window != "undefined") {
54
55
  this.connectOnlineEvent();
55
56
  }
57
+ if (typeof document != "undefined") {
58
+ this.connectVisibilityEvents();
59
+ }
56
60
  this.connectWakeEvent();
57
61
  }
58
62
  /** Re-checks session state when the browser comes back online. */
@@ -63,6 +67,35 @@ export default class ApiMakerSessionStatusUpdater {
63
67
  connectWakeEvent() {
64
68
  wakeEvent(this.updateSessionStatus);
65
69
  }
70
+ /**
71
+ * Re-checks session state when the user returns to a backgrounded tab/app.
72
+ * The `wake-event` package only fires on multi-second device-sleep drift, so
73
+ * it misses iOS Safari tab suspension; visibilitychange/focus/pageshow cover
74
+ * that, surfacing an expired session the moment the user returns.
75
+ */
76
+ connectVisibilityEvents() {
77
+ document.addEventListener("visibilitychange", this.refreshOnReturnToForeground, false);
78
+ if (typeof window != "undefined") {
79
+ window.addEventListener("focus", this.refreshOnReturnToForeground, false);
80
+ window.addEventListener("pageshow", this.refreshOnReturnToForeground, false);
81
+ }
82
+ }
83
+ /**
84
+ * Schedules a debounced session-status refresh when the page becomes visible
85
+ * again. visibilitychange, focus and pageshow can fire together on return, so
86
+ * the refresh is collapsed into a single request.
87
+ */
88
+ refreshOnReturnToForeground = () => {
89
+ if (typeof document != "undefined" && document.visibilityState && document.visibilityState != "visible") {
90
+ return;
91
+ }
92
+ if (this.returnRefreshTimeout)
93
+ return;
94
+ this.returnRefreshTimeout = setTimeout(() => {
95
+ this.returnRefreshTimeout = undefined;
96
+ this.updateSessionStatus();
97
+ }, 50);
98
+ };
66
99
  async getCsrfToken() {
67
100
  if (this.csrfToken) {
68
101
  logger.debug(`Get CSRF token from set variable: ${this.csrfToken}`);
@@ -192,4 +225,4 @@ export default class ApiMakerSessionStatusUpdater {
192
225
  }
193
226
  }
194
227
  }
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsic2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBRWxDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFDLENBQUMsQ0FBQTtBQUNwRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7QUFFakIsd0JBQXdCO0FBRXhCOzs7R0FHRztBQUVIOzs7O0dBSUc7QUFFSDs7OztHQUlHO0FBRUgsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxPQUFPLE9BQU8sNEJBQTRCO0lBQy9DOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlFLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQTtJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQTtRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFBO1FBRXJDLElBQUksZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJ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Q0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQTtRQUVoRixJQUFJLENBQUMsQ0FBQywwQkFBMEIsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLDBCQUEwQixFQUFFLENBQUMsQ0FBQTtRQUM1RSxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFBO1FBQzlELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQTtRQUV6QyxJQUFJLGlCQUFpQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsNENBQTRDLENBQUMsQ0FBQTtZQUVqRyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7WUFDdkMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7UUFDN0MsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgRGV2aXNlIGZyb20gXCIuL2RldmlzZS5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuL2xvZ2dlci5qc1wiXG5pbXBvcnQgY29uZmlnIGZyb20gXCIuL2NvbmZpZy5qc1wiXG5pbXBvcnQgd2FrZUV2ZW50IGZyb20gXCJ3YWtlLWV2ZW50XCJcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7bmFtZTogXCJBcGlNYWtlciAvIFNlc3Npb25TdGF0dXNVcGRhdGVyXCJ9KVxuY29uc3Qgc2hhcmVkID0ge31cblxuLy8gbG9nZ2VyLnNldERlYnVnKHRydWUpXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2Vzc2lvblN0YXR1c1Njb3BlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNpZ25lZF9pblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2Vzc2lvblN0YXR1c1Jlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjc3JmX3Rva2VuXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTZXNzaW9uU3RhdHVzU2NvcGU+fSBzY29wZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlc3Npb25TdGF0dXNVcGRhdGVyQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlTWV0YUVsZW1lbnRdXG4gKi9cblxuLyoqIFRyYWNrcyBzZXNzaW9uIGFuZCBDU1JGIHRva2VuIGZyZXNobmVzcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXIge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2hhcmVkIHNlc3Npb24tc3RhdHVzIHVwZGF0ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7U2Vzc2lvblN0YXR1c1VwZGF0ZXJBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge0FwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXJ9XG4gICAqL1xuICBzdGF0aWMgY3VycmVudChhcmdzKSB7XG4gICAgaWYgKCFzaGFyZWQuYXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlcikge1xuICAgICAgc2hhcmVkLmFwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXIgPSBuZXcgQXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlcihhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBzaGFyZWQuYXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlclxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgc2Vzc2lvbi1zdGF0dXMgcG9sbGluZyBhbmQgYnJvd3NlciB3YWtlL29ubGluZSBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSB7U2Vzc2lvblN0YXR1c1VwZGF0ZXJBcmdzfSBbYXJnc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuZXZlbnRzID0ge31cbiAgICB0aGlzLnRpbWVvdXQgPSBhcmdzLnRpbWVvdXQgfHwgNjAwMDAwXG5cbiAgICBpZiAoXCJ1c2VNZXRhRWxlbWVudFwiIGluIGFyZ3MpIHtcbiAgICAgIHRoaXMudXNlTWV0YUVsZW1lbnQgPSBhcmdzLnVzZU1ldGFFbGVtZW50XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMudXNlTWV0YUVsZW1lbnQgPSBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZU1ldGFFbGVtZW50ID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuY29ubmVjdE9ubGluZUV2ZW50KClcbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3RXYWtlRXZlbnQoKVxuICB9XG5cbiAgLyoqIFJlLWNoZWNrcyBzZXNzaW9uIHN0YXRlIHdoZW4gdGhlIGJyb3dzZXIgY29tZXMgYmFjayBvbmxpbmUuICovXG4gIGNvbm5lY3RPbmxpbmVFdmVudCgpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMsIGZhbHNlKVxuICB9XG5cbiAgLyoqIFJlLWNoZWNrcyBzZXNzaW9uIHN0YXRlIHdoZW4gdGhlIGRldmljZSB3YWtlcyBmcm9tIHNsZWVwLiAqL1xuICBjb25uZWN0V2FrZUV2ZW50KCkge1xuICAgIHdha2VFdmVudCh0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMpXG4gIH1cblxuICBhc3luYyBnZXRDc3JmVG9rZW4oKSB7XG4gICAgaWYgKHRoaXMuY3NyZlRva2VuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEdldCBDU1JGIHRva2VuIGZyb20gc2V0IHZhcmlhYmxlOiAke3RoaXMuY3NyZlRva2VufWApXG5cbiAgICAgIHJldHVybiB0aGlzLmNzcmZUb2tlblxuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZU1ldGFFbGVtZW50KSB7XG4gICAgICBjb25zdCBjc3JmVG9rZW5FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nY3NyZi10b2tlbiddXCIpXG5cbiAgICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgR2V0IENTUkYgdG9rZW4gZnJvbSBtZXRhIGVsZW1lbnQ6ICR7Y3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpfWApXG5cbiAgICAgICAgdGhpcy5jc3JmVG9rZW4gPSBjc3JmVG9rZW5FbGVtZW50LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIilcblxuICAgICAgICByZXR1cm4gdGhpcy5jc3JmVG9rZW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXCJVcGRhdGluZyBzZXNzaW9uIHN0YXR1cyBiZWNhdXNlIG5vIENTUkYgdG9rZW4gc2V0IHlldFwiKVxuICAgIGF3YWl0IHRoaXMudXBkYXRlU2Vzc2lvblN0YXR1cygpXG5cbiAgICBpZiAodGhpcy5jc3JmVG9rZW4pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgUmV0dXJuaW5nIENTUkYgdG9rZW4gYWZ0ZXIgdXBkYXRpbmcgc2Vzc2lvbiBzdGF0dXM6ICR7dGhpcy5jc3JmVG9rZW59YClcblxuICAgICAgcmV0dXJuIHRoaXMuY3NyZlRva2VuXG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKFwiTm8gQ1NSRiB0b2tlbiBhdmFpbGFibGUgYWZ0ZXIgdXBkYXRpbmcgc2Vzc2lvbiBzdGF0dXNcIilcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgbGF0ZXN0IGJhY2tlbmQgc2Vzc2lvbi1zdGF0dXMgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2Vzc2lvblN0YXR1c1Jlc3VsdD59XG4gICAqL1xuICBzZXNzaW9uU3RhdHVzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IGNvbmZpZy5nZXRIb3N0KClcbiAgICAgIGxldCByZXF1ZXN0UGF0aCA9IFwiXCJcblxuICAgICAgaWYgKGhvc3QpIHJlcXVlc3RQYXRoICs9IGhvc3RcblxuICAgICAgcmVxdWVzdFBhdGggKz0gXCIvYXBpX21ha2VyL3Nlc3Npb25fc3RhdHVzZXNcIlxuXG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIHJlcXVlc3RQYXRoLCB0cnVlKVxuICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpXG4gICAgICAgIHJlc29sdmUocmVzcG9uc2UpXG4gICAgICB9XG4gICAgICB4aHIuc2VuZCgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmb3IgZnJvbnRlbmQgc2lnbi1vdXQgZGV0ZWN0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25TaWduZWRPdXQoY2FsbGJhY2spIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5hZGRFdmVudChcIm9uU2lnbmVkT3V0XCIsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqIFN0YXJ0cyBvciByZWZyZXNoZXMgdGhlIHBlcmlvZGljIHNlc3Npb24tc3RhdHVzIHRpbWVyLiAqL1xuICBzdGFydFRpbWVvdXQoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic3RhcnRUaW1lb3V0XCIpXG5cbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0KVxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudXBkYXRlVGltZW91dClcblxuICAgIHRoaXMudXBkYXRlVGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICAgICAgdGhpcy51cGRhdGVTZXNzaW9uU3RhdHVzKClcbiAgICAgIH0sXG4gICAgICB0aGlzLnRpbWVvdXRcbiAgICApXG4gIH1cblxuICAvKiogU3RvcHMgdGhlIHBlcmlvZGljIHNlc3Npb24tc3RhdHVzIHRpbWVyIGlmIGl0IGlzIHJ1bm5pbmcuICovXG4gIHN0b3BUaW1lb3V0KCkge1xuICAgIGlmICh0aGlzLnVwZGF0ZVRpbWVvdXQpXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0KVxuICB9XG5cbiAgLyoqIEZldGNoZXMgdGhlIGxhdGVzdCBzZXNzaW9uIHN0YXR1cyBhbmQgYXBwbGllcyBpdCBsb2NhbGx5LiAqL1xuICB1cGRhdGVTZXNzaW9uU3RhdHVzID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInVwZGF0ZVNlc3Npb25TdGF0dXNcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2Vzc2lvblN0YXR1cygpXG5cbiAgICB0aGlzLmFwcGx5UmVzdWx0KHJlc3VsdClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Nlc3Npb25TdGF0dXNSZXN1bHR9IHJlc3VsdFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5UmVzdWx0KHJlc3VsdCkge1xuICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMil9YClcblxuICAgIHRoaXMudXBkYXRlTWV0YUVsZW1lbnRzRnJvbVJlc3VsdChyZXN1bHQpXG4gICAgdGhpcy51cGRhdGVVc2VyU2Vzc2lvbnNGcm9tUmVzdWx0KHJlc3VsdClcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjYWNoZWQgYW5kIERPTSBDU1JGIHRva2VuIGZyb20gb25lIHNlc3Npb24tc3RhdHVzIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge1Nlc3Npb25TdGF0dXNSZXN1bHR9IHJlc3VsdFxuICAgKi9cbiAgdXBkYXRlTWV0YUVsZW1lbnRzRnJvbVJlc3VsdChyZXN1bHQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJ1cGRhdGVNZXRhRWxlbWVudHNGcm9tUmVzdWx0XCIpXG5cbiAgICBpZiAoIXJlc3VsdC5jc3JmX3Rva2VuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNzcmZUb2tlbiA9IHJlc3VsdC5jc3JmX3Rva2VuXG5cbiAgICBpZiAodGhpcy51c2VNZXRhRWxlbWVudCkge1xuICAgICAgY29uc3QgY3NyZlRva2VuRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuXG4gICAgICBpZiAoY3NyZlRva2VuRWxlbWVudCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYENoYW5naW5nIHRva2VuIGZyb20gXCIke2NzcmZUb2tlbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKX1cIiB0byBcIiR7cmVzdWx0LmNzcmZfdG9rZW59XCJgKVxuICAgICAgICBjc3JmVG9rZW5FbGVtZW50LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgcmVzdWx0LmNzcmZfdG9rZW4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJjc3JmIHRva2VuIGVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmRcIilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBlYWNoIHJldHVybmVkIHNjb3BlIHN0YXR1cyB0byB0aGUgZnJvbnRlbmQgRGV2aXNlIGNhY2hlLlxuICAgKiBAcGFyYW0ge1Nlc3Npb25TdGF0dXNSZXN1bHR9IHJlc3VsdFxuICAgKi9cbiAgdXBkYXRlVXNlclNlc3Npb25zRnJvbVJlc3VsdChyZXN1bHQpIHtcbiAgICBmb3IgKGNvbnN0IHNjb3BlTmFtZSBpbiByZXN1bHQuc2NvcGVzKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJTZXNzaW9uU2NvcGVGcm9tUmVzdWx0KHNjb3BlTmFtZSwgcmVzdWx0LnNjb3Blc1tzY29wZU5hbWVdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG9uZSBzY29wZSdzIHNpZ25lZC1pbiBzdGF0ZSB0byB0aGUgZnJvbnRlbmQgRGV2aXNlIGNhY2hlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVOYW1lXG4gICAqIEBwYXJhbSB7U2Vzc2lvblN0YXR1c1Njb3BlfSBzY29wZVxuICAgKi9cbiAgdXBkYXRlVXNlclNlc3Npb25TY29wZUZyb21SZXN1bHQoc2NvcGVOYW1lLCBzY29wZSkge1xuICAgIGNvbnN0IGRldmlzZUlzU2lnbmVkSW5NZXRob2ROYW1lID0gYGlzJHtpbmZsZWN0aW9uLmNhbWVsaXplKHNjb3BlTmFtZSl9U2lnbmVkSW5gXG5cbiAgICBpZiAoIShkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZSBpbiBEZXZpc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggbWV0aG9kIGluIERldmlzZTogJHtkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRseVNpZ25lZEluID0gRGV2aXNlW2RldmlzZUlzU2lnbmVkSW5NZXRob2ROYW1lXSgpXG4gICAgY29uc3Qgc2lnbmVkSW5PbkJhY2tlbmQgPSBzY29wZS5zaWduZWRfaW5cblxuICAgIGlmIChjdXJyZW50bHlTaWduZWRJbiAmJiAhc2lnbmVkSW5PbkJhY2tlbmQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgJHtpbmZsZWN0aW9uLmNhbWVsaXplKHNjb3BlTmFtZSl9IHNpZ25lZCBpbiBvbiBmcm9udGVuZCBidXQgbm90IGluIGJhY2tlbmQhYClcblxuICAgICAgRGV2aXNlLnNldFNpZ25lZE91dCh7c2NvcGU6IHNjb3BlTmFtZX0pXG4gICAgICBEZXZpc2UuY2FsbFNpZ25PdXRFdmVudCh7c2NvcGU6IHNjb3BlTmFtZX0pXG4gICAgfVxuICB9XG59XG4iXX0=
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsic2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBRWxDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFDLENBQUMsQ0FBQTtBQUNwRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7QUFFakIsd0JBQXdCO0FBRXhCOzs7R0FHRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVILCtDQUErQztBQUMvQyxNQUFNLENBQUMsT0FBTyxPQUFPLDRCQUE0QjtJQUMvQzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLENBQUMsNEJBQTRCLEdBQUcsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5RSxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsNEJBQTRCLENBQUE7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksSUFBSSxHQUFHLEVBQUU7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQTtRQUVyQyxJQUFJLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFB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NUUsQ0FBQztRQUVELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQTtRQUM5RCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUE7UUFFekMsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7WUFFakcsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO1FBQzdDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IERldmlzZSBmcm9tIFwiLi9kZXZpc2UuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi9sb2dnZXIuanNcIlxuaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWcuanNcIlxuaW1wb3J0IHdha2VFdmVudCBmcm9tIFwid2FrZS1ldmVudFwiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoe25hbWU6IFwiQXBpTWFrZXIgLyBTZXNzaW9uU3RhdHVzVXBkYXRlclwifSlcbmNvbnN0IHNoYXJlZCA9IHt9XG5cbi8vIGxvZ2dlci5zZXREZWJ1Zyh0cnVlKVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlc3Npb25TdGF0dXNTY29wZVxuICogQHByb3BlcnR5IHtib29sZWFufSBzaWduZWRfaW5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlc3Npb25TdGF0dXNSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY3NyZl90b2tlbl1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgU2Vzc2lvblN0YXR1c1Njb3BlPn0gc2NvcGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NoYWRvd19zZXNzaW9uX3Rva2VuXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2Vzc2lvblN0YXR1c1VwZGF0ZXJBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VNZXRhRWxlbWVudF1cbiAqL1xuXG4vKiogVHJhY2tzIHNlc3Npb24gYW5kIENTUkYgdG9rZW4gZnJlc2huZXNzLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgc2Vzc2lvbi1zdGF0dXMgdXBkYXRlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzVXBkYXRlckFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7QXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlcn1cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KGFyZ3MpIHtcbiAgICBpZiAoIXNoYXJlZC5hcGlNYWtlclNlc3Npb25TdGF0dXNVcGRhdGVyKSB7XG4gICAgICBzaGFyZWQuYXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlciA9IG5ldyBBcGlNYWtlclNlc3Npb25TdGF0dXNVcGRhdGVyKGFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYXJlZC5hcGlNYWtlclNlc3Npb25TdGF0dXNVcGRhdGVyXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBzZXNzaW9uLXN0YXR1cyBwb2xsaW5nIGFuZCBicm93c2VyIHdha2Uvb25saW5lIGxpc3RlbmVycy5cbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzVXBkYXRlckFyZ3N9IFthcmdzXVxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5ldmVudHMgPSB7fVxuICAgIHRoaXMudGltZW91dCA9IGFyZ3MudGltZW91dCB8fCA2MDAwMDBcblxuICAgIGlmIChcInVzZU1ldGFFbGVtZW50XCIgaW4gYXJncykge1xuICAgICAgdGhpcy51c2VNZXRhRWxlbWVudCA9IGFyZ3MudXNlTWV0YUVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy51c2VNZXRhRWxlbWVudCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlTWV0YUVsZW1lbnQgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5jb25uZWN0T25saW5lRXZlbnQoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5jb25uZWN0VmlzaWJpbGl0eUV2ZW50cygpXG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0V2FrZUV2ZW50KClcbiAgfVxuXG4gIC8qKiBSZS1jaGVja3Mgc2Vzc2lvbiBzdGF0ZSB3aGVuIHRoZSBicm93c2VyIGNvbWVzIGJhY2sgb25saW5lLiAqL1xuICBjb25uZWN0T25saW5lRXZlbnQoKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy51cGRhdGVTZXNzaW9uU3RhdHVzLCBmYWxzZSlcbiAgfVxuXG4gIC8qKiBSZS1jaGVja3Mgc2Vzc2lvbiBzdGF0ZSB3aGVuIHRoZSBkZXZpY2Ugd2FrZXMgZnJvbSBzbGVlcC4gKi9cbiAgY29ubmVjdFdha2VFdmVudCgpIHtcbiAgICB3YWtlRXZlbnQodGhpcy51cGRhdGVTZXNzaW9uU3RhdHVzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWNoZWNrcyBzZXNzaW9uIHN0YXRlIHdoZW4gdGhlIHVzZXIgcmV0dXJucyB0byBhIGJhY2tncm91bmRlZCB0YWIvYXBwLlxuICAgKiBUaGUgYHdha2UtZXZlbnRgIHBhY2thZ2Ugb25seSBmaXJlcyBvbiBtdWx0aS1zZWNvbmQgZGV2aWNlLXNsZWVwIGRyaWZ0LCBzb1xuICAgKiBpdCBtaXNzZXMgaU9TIFNhZmFyaSB0YWIgc3VzcGVuc2lvbjsgdmlzaWJpbGl0eWNoYW5nZS9mb2N1cy9wYWdlc2hvdyBjb3ZlclxuICAgKiB0aGF0LCBzdXJmYWNpbmcgYW4gZXhwaXJlZCBzZXNzaW9uIHRoZSBtb21lbnQgdGhlIHVzZXIgcmV0dXJucy5cbiAgICovXG4gIGNvbm5lY3RWaXNpYmlsaXR5RXZlbnRzKCkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMucmVmcmVzaE9uUmV0dXJuVG9Gb3JlZ3JvdW5kLCBmYWxzZSlcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy5yZWZyZXNoT25SZXR1cm5Ub0ZvcmVncm91bmQsIGZhbHNlKVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlc2hvd1wiLCB0aGlzLnJlZnJlc2hPblJldHVyblRvRm9yZWdyb3VuZCwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGRlYm91bmNlZCBzZXNzaW9uLXN0YXR1cyByZWZyZXNoIHdoZW4gdGhlIHBhZ2UgYmVjb21lcyB2aXNpYmxlXG4gICAqIGFnYWluLiB2aXNpYmlsaXR5Y2hhbmdlLCBmb2N1cyBhbmQgcGFnZXNob3cgY2FuIGZpcmUgdG9nZXRoZXIgb24gcmV0dXJuLCBzb1xuICAgKiB0aGUgcmVmcmVzaCBpcyBjb2xsYXBzZWQgaW50byBhIHNpbmdsZSByZXF1ZXN0LlxuICAgKi9cbiAgcmVmcmVzaE9uUmV0dXJuVG9Gb3JlZ3JvdW5kID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgJiYgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlICE9IFwidmlzaWJsZVwiKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXR1cm5SZWZyZXNoVGltZW91dCkgcmV0dXJuXG5cbiAgICB0aGlzLnJldHVyblJlZnJlc2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJldHVyblJlZnJlc2hUaW1lb3V0ID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMoKVxuICAgIH0sIDUwKVxuICB9XG5cbiAgYXN5bmMgZ2V0Q3NyZlRva2VuKCkge1xuICAgIGlmICh0aGlzLmNzcmZUb2tlbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBHZXQgQ1NSRiB0b2tlbiBmcm9tIHNldCB2YXJpYWJsZTogJHt0aGlzLmNzcmZUb2tlbn1gKVxuXG4gICAgICByZXR1cm4gdGhpcy5jc3JmVG9rZW5cbiAgICB9XG5cbiAgICBpZiAodGhpcy51c2VNZXRhRWxlbWVudCkge1xuICAgICAgY29uc3QgY3NyZlRva2VuRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuXG4gICAgICBpZiAoY3NyZlRva2VuRWxlbWVudCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYEdldCBDU1JGIHRva2VuIGZyb20gbWV0YSBlbGVtZW50OiAke2NzcmZUb2tlbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKX1gKVxuXG4gICAgICAgIHRoaXMuY3NyZlRva2VuID0gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3NyZlRva2VuXG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKFwiVXBkYXRpbmcgc2Vzc2lvbiBzdGF0dXMgYmVjYXVzZSBubyBDU1JGIHRva2VuIHNldCB5ZXRcIilcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMoKVxuXG4gICAgaWYgKHRoaXMuY3NyZlRva2VuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYFJldHVybmluZyBDU1JGIHRva2VuIGFmdGVyIHVwZGF0aW5nIHNlc3Npb24gc3RhdHVzOiAke3RoaXMuY3NyZlRva2VufWApXG5cbiAgICAgIHJldHVybiB0aGlzLmNzcmZUb2tlblxuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhcIk5vIENTUkYgdG9rZW4gYXZhaWxhYmxlIGFmdGVyIHVwZGF0aW5nIHNlc3Npb24gc3RhdHVzXCIpXG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgdGhlIGxhdGVzdCBiYWNrZW5kIHNlc3Npb24tc3RhdHVzIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlc3Npb25TdGF0dXNSZXN1bHQ+fVxuICAgKi9cbiAgc2Vzc2lvblN0YXR1cygpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBjb25maWcuZ2V0SG9zdCgpXG4gICAgICBsZXQgcmVxdWVzdFBhdGggPSBcIlwiXG5cbiAgICAgIGlmIChob3N0KSByZXF1ZXN0UGF0aCArPSBob3N0XG5cbiAgICAgIHJlcXVlc3RQYXRoICs9IFwiL2FwaV9tYWtlci9zZXNzaW9uX3N0YXR1c2VzXCJcblxuICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCByZXF1ZXN0UGF0aCwgdHJ1ZSlcbiAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KVxuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgfVxuICAgICAgeGhyLnNlbmQoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZm9yIGZyb250ZW5kIHNpZ24tb3V0IGRldGVjdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uU2lnbmVkT3V0KGNhbGxiYWNrKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMuYWRkRXZlbnQoXCJvblNpZ25lZE91dFwiLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKiBTdGFydHMgb3IgcmVmcmVzaGVzIHRoZSBwZXJpb2RpYyBzZXNzaW9uLXN0YXR1cyB0aW1lci4gKi9cbiAgc3RhcnRUaW1lb3V0KCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInN0YXJ0VGltZW91dFwiKVxuXG4gICAgaWYgKHRoaXMudXBkYXRlVGltZW91dClcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZGF0ZVRpbWVvdXQpXG5cbiAgICB0aGlzLnVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXJ0VGltZW91dCgpXG4gICAgICAgIHRoaXMudXBkYXRlU2Vzc2lvblN0YXR1cygpXG4gICAgICB9LFxuICAgICAgdGhpcy50aW1lb3V0XG4gICAgKVxuICB9XG5cbiAgLyoqIFN0b3BzIHRoZSBwZXJpb2RpYyBzZXNzaW9uLXN0YXR1cyB0aW1lciBpZiBpdCBpcyBydW5uaW5nLiAqL1xuICBzdG9wVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0KVxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudXBkYXRlVGltZW91dClcbiAgfVxuXG4gIC8qKiBGZXRjaGVzIHRoZSBsYXRlc3Qgc2Vzc2lvbiBzdGF0dXMgYW5kIGFwcGxpZXMgaXQgbG9jYWxseS4gKi9cbiAgdXBkYXRlU2Vzc2lvblN0YXR1cyA9IGFzeW5jICgpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJ1cGRhdGVTZXNzaW9uU3RhdHVzXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlc3Npb25TdGF0dXMoKVxuXG4gICAgdGhpcy5hcHBseVJlc3VsdChyZXN1bHQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzUmVzdWx0fSByZXN1bHRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseVJlc3VsdChyZXN1bHQpIHtcbiAgICBsb2dnZXIuZGVidWcoKCkgPT4gYFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpfWApXG5cbiAgICB0aGlzLnVwZGF0ZU1ldGFFbGVtZW50c0Zyb21SZXN1bHQocmVzdWx0KVxuICAgIHRoaXMudXBkYXRlVXNlclNlc3Npb25zRnJvbVJlc3VsdChyZXN1bHQpXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2FjaGVkIGFuZCBET00gQ1NSRiB0b2tlbiBmcm9tIG9uZSBzZXNzaW9uLXN0YXR1cyByZXNwb25zZS5cbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzUmVzdWx0fSByZXN1bHRcbiAgICovXG4gIHVwZGF0ZU1ldGFFbGVtZW50c0Zyb21SZXN1bHQocmVzdWx0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwidXBkYXRlTWV0YUVsZW1lbnRzRnJvbVJlc3VsdFwiKVxuXG4gICAgaWYgKCFyZXN1bHQuY3NyZl90b2tlbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5jc3JmVG9rZW4gPSByZXN1bHQuY3NyZl90b2tlblxuXG4gICAgaWYgKHRoaXMudXNlTWV0YUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgICAgaWYgKGNzcmZUb2tlbkVsZW1lbnQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCgpID0+IGBDaGFuZ2luZyB0b2tlbiBmcm9tIFwiJHtjc3JmVG9rZW5FbGVtZW50LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIil9XCIgdG8gXCIke3Jlc3VsdC5jc3JmX3Rva2VufVwiYClcbiAgICAgICAgY3NyZlRva2VuRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIsIHJlc3VsdC5jc3JmX3Rva2VuKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiY3NyZiB0b2tlbiBlbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kXCIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZWFjaCByZXR1cm5lZCBzY29wZSBzdGF0dXMgdG8gdGhlIGZyb250ZW5kIERldmlzZSBjYWNoZS5cbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzUmVzdWx0fSByZXN1bHRcbiAgICovXG4gIHVwZGF0ZVVzZXJTZXNzaW9uc0Zyb21SZXN1bHQocmVzdWx0KSB7XG4gICAgZm9yIChjb25zdCBzY29wZU5hbWUgaW4gcmVzdWx0LnNjb3Blcykge1xuICAgICAgdGhpcy51cGRhdGVVc2VyU2Vzc2lvblNjb3BlRnJvbVJlc3VsdChzY29wZU5hbWUsIHJlc3VsdC5zY29wZXNbc2NvcGVOYW1lXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBvbmUgc2NvcGUncyBzaWduZWQtaW4gc3RhdGUgdG8gdGhlIGZyb250ZW5kIERldmlzZSBjYWNoZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlTmFtZVxuICAgKiBAcGFyYW0ge1Nlc3Npb25TdGF0dXNTY29wZX0gc2NvcGVcbiAgICovXG4gIHVwZGF0ZVVzZXJTZXNzaW9uU2NvcGVGcm9tUmVzdWx0KHNjb3BlTmFtZSwgc2NvcGUpIHtcbiAgICBjb25zdCBkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZSA9IGBpcyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShzY29wZU5hbWUpfVNpZ25lZEluYFxuXG4gICAgaWYgKCEoZGV2aXNlSXNTaWduZWRJbk1ldGhvZE5hbWUgaW4gRGV2aXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIG1ldGhvZCBpbiBEZXZpc2U6ICR7ZGV2aXNlSXNTaWduZWRJbk1ldGhvZE5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50bHlTaWduZWRJbiA9IERldmlzZVtkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZV0oKVxuICAgIGNvbnN0IHNpZ25lZEluT25CYWNrZW5kID0gc2NvcGUuc2lnbmVkX2luXG5cbiAgICBpZiAoY3VycmVudGx5U2lnbmVkSW4gJiYgIXNpZ25lZEluT25CYWNrZW5kKSB7XG4gICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShzY29wZU5hbWUpfSBzaWduZWQgaW4gb24gZnJvbnRlbmQgYnV0IG5vdCBpbiBiYWNrZW5kIWApXG5cbiAgICAgIERldmlzZS5zZXRTaWduZWRPdXQoe3Njb3BlOiBzY29wZU5hbWV9KVxuICAgICAgRGV2aXNlLmNhbGxTaWduT3V0RXZlbnQoe3Njb3BlOiBzY29wZU5hbWV9KVxuICAgIH1cbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kaspernj/api-maker",
3
3
  "type": "module",
4
- "version": "1.0.2172",
4
+ "version": "1.0.2173",
5
5
  "description": "My new module",
6
6
  "files": [
7
7
  "build/**"
@@ -11,7 +11,7 @@
11
11
  "scripts": {
12
12
  "build": "rm -rf build && tsc",
13
13
  "clean": "expo-module clean",
14
- "lint": "expo-module lint -- --max-warnings 0",
14
+ "lint": "npm run eslint && npm run lint:eslint && npm run typecheck",
15
15
  "test": "NODE_OPTIONS=--experimental-vm-modules expo-module test",
16
16
  "prepare": "npm run clean && npm run build",
17
17
  "prepublishOnly": "expo-module prepublishOnly && npm run build",
@@ -22,7 +22,8 @@
22
22
  "release:patch-master": "node scripts/release-patch.js --require-master",
23
23
  "typecheck": "tsc --noEmit",
24
24
  "typecheck:file": "sh -c 'file=\"${npm_config_file:-${FILE:-}}\"; if [ -z \"$file\" ] && [ \"${0#--file=}\" != \"$0\" ]; then file=\"${0#--file=}\"; fi; if [ -z \"$file\" ] && [ \"${1#--file=}\" != \"$1\" ]; then file=\"${1#--file=}\"; fi; file=\"${file#npm-api-maker/}\"; file=\"${file#./}\"; if [ -z \"$file\" ]; then echo \"Missing --file=src/path/to/file.js\"; exit 2; fi; tmp=$(mktemp); tsc --noEmit -p tsconfig.json --pretty false >\"$tmp\" 2>&1; if rg --fixed-strings \"$file\" \"$tmp\" >/dev/null; then rg --fixed-strings \"$file\" \"$tmp\"; rm -f \"$tmp\"; exit 1; else rm -f \"$tmp\"; exit 0; fi'",
25
- "watch": "tsc -w"
25
+ "watch": "tsc -w",
26
+ "eslint": "expo-module lint -- --max-warnings 0"
26
27
  },
27
28
  "keywords": [
28
29
  "react-native",