velocious 1.0.701 → 1.0.702

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +1 -0
  2. package/build/configuration-types.js +72 -2
  3. package/build/configuration.js +61 -3
  4. package/build/frontend-model-resource/base-resource.js +150 -2
  5. package/build/frontend-models/resource-definition.js +47 -0
  6. package/build/src/configuration-types.d.ts +166 -5
  7. package/build/src/configuration-types.d.ts.map +1 -1
  8. package/build/src/configuration-types.js +67 -3
  9. package/build/src/configuration.d.ts +11 -2
  10. package/build/src/configuration.d.ts.map +1 -1
  11. package/build/src/configuration.js +61 -4
  12. package/build/src/frontend-model-resource/base-resource.d.ts +76 -3
  13. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  14. package/build/src/frontend-model-resource/base-resource.js +127 -3
  15. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  16. package/build/src/frontend-models/resource-definition.js +43 -1
  17. package/build/src/sync/local-mutation-log.d.ts +6 -3
  18. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  19. package/build/src/sync/local-mutation-log.js +11 -4
  20. package/build/src/sync/peer-mutation-bundle.d.ts +26 -0
  21. package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
  22. package/build/src/sync/peer-mutation-bundle.js +7 -1
  23. package/build/src/sync/sync-api-client.d.ts +3 -1
  24. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  25. package/build/src/sync/sync-api-client.js +46 -8
  26. package/build/src/sync/sync-client-types.d.ts +24 -12
  27. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  28. package/build/src/sync/sync-client-types.js +7 -5
  29. package/build/src/sync/sync-client.d.ts +101 -0
  30. package/build/src/sync/sync-client.d.ts.map +1 -1
  31. package/build/src/sync/sync-client.js +236 -24
  32. package/build/src/sync/sync-offline-session.d.ts +328 -0
  33. package/build/src/sync/sync-offline-session.d.ts.map +1 -0
  34. package/build/src/sync/sync-offline-session.js +617 -0
  35. package/build/src/sync/sync-resource-base.d.ts +26 -28
  36. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  37. package/build/src/sync/sync-resource-base.js +11 -45
  38. package/build/sync/local-mutation-log.js +10 -3
  39. package/build/sync/peer-mutation-bundle.js +6 -0
  40. package/build/sync/sync-api-client.js +53 -7
  41. package/build/sync/sync-client-types.js +6 -4
  42. package/build/sync/sync-client.js +264 -21
  43. package/build/sync/sync-offline-session.js +713 -0
  44. package/build/sync/sync-resource-base.js +10 -53
  45. package/package.json +1 -1
  46. package/src/configuration-types.js +72 -2
  47. package/src/configuration.js +61 -3
  48. package/src/frontend-model-resource/base-resource.js +150 -2
  49. package/src/frontend-models/resource-definition.js +47 -0
  50. package/src/sync/local-mutation-log.js +10 -3
  51. package/src/sync/peer-mutation-bundle.js +6 -0
  52. package/src/sync/sync-api-client.js +53 -7
  53. package/src/sync/sync-client-types.js +6 -4
  54. package/src/sync/sync-client.js +264 -21
  55. package/src/sync/sync-offline-session.js +713 -0
  56. package/src/sync/sync-resource-base.js +10 -53
@@ -25,13 +25,14 @@ export default class SyncApiClient {
25
25
  * @param {string | number | null} args.baseVersion - Authoritative version observed before the local mutation.
26
26
  * @param {import("./sync-client-types.js").SyncClientConflictTrackingConfig} args.conflictTracking - Durable tracking configuration.
27
27
  * @param {Record<string, unknown>} args.data - Backend-safe mutation attributes.
28
+ * @param {import("./sync-offline-session.js").default} [args.offlineSession] - Active long-offline session: the mutation identity (actor ids, grant id, policy hash) is supplied by the session and the appended record carries the device-signed envelope.
28
29
  * @param {"create" | "update" | "destroy"} args.operation - Local operation.
29
30
  * @param {ReturnType<typeof JSON.parse>} args.resource - Local resource.
30
31
  * @param {string} args.resourceType - Resource type.
31
32
  * @param {string} args.syncType - Wire operation.
32
33
  * @returns {Promise<import("./local-mutation-log.js").LocalMutationLogRecord>} Appended intent.
33
34
  */
34
- static async queueConflictTrackedSync({ baseVersion, conflictTracking, data, operation, resource, resourceType, syncType }) {
35
+ static async queueConflictTrackedSync({ baseVersion, conflictTracking, data, offlineSession, operation, resource, resourceType, syncType }) {
35
36
  const resourceId = String(scalarModelPrimaryKeyValue(resource.id(), `Conflict-tracked sync for ${resourceType}`));
36
37
  const records = await conflictTracking.mutationLog.records();
37
38
  const predecessor = records
@@ -41,20 +42,37 @@ export default class SyncApiClient {
41
42
  const now = conflictTracking.now ? conflictTracking.now() : new Date();
42
43
  const predecessorTime = predecessor ? new Date(predecessor.mutation.occurredAt).getTime() : Number.NEGATIVE_INFINITY;
43
44
  const occurredAt = new Date(Math.max(now.getTime(), predecessorTime + 1)).toISOString();
45
+ const dependencies = predecessor ? [{ clientMutationId: predecessor.mutation.clientMutationId, model: resourceType }] : [];
46
+ const attributes = /** @type {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} */ (data);
47
+ if (offlineSession) {
48
+ // Long-offline queueing: the session supplies the rotating identity
49
+ // (actor ids, live grant id, current policy hash) and signs the intent
50
+ // with the device key so it can replay without a live session.
51
+ const signedMutation = await offlineSession.signMutation({
52
+ attributes,
53
+ baseVersion,
54
+ clientMutationId,
55
+ model: resourceType,
56
+ occurredAt,
57
+ operation,
58
+ payload: { resourceId, syncType }
59
+ });
60
+ return await conflictTracking.mutationLog.append({ dependencies, mutation: signedMutation.mutation, signedMutation });
61
+ }
44
62
  return await conflictTracking.mutationLog.append({
45
- dependencies: predecessor ? [{ clientMutationId: predecessor.mutation.clientMutationId, model: resourceType }] : [],
63
+ dependencies,
46
64
  mutation: {
47
- actorDeviceId: conflictTracking.actorDeviceId,
48
- actorUserId: conflictTracking.actorUserId,
49
- attributes: /** @type {Record<string, import("../configuration-types.js").FrontendModelSyncJsonValue>} */ (data),
65
+ actorDeviceId: await resolveConflictTrackingIdentityValue({ conflictTracking, key: "actorDeviceId", resourceType }),
66
+ actorUserId: await resolveConflictTrackingIdentityValue({ conflictTracking, key: "actorUserId", resourceType }),
67
+ attributes,
50
68
  baseVersion,
51
69
  clientMutationId,
52
70
  model: resourceType,
53
71
  occurredAt,
54
- offlineGrantId: conflictTracking.offlineGrantId,
72
+ offlineGrantId: await resolveConflictTrackingIdentityValue({ conflictTracking, key: "offlineGrantId", resourceType }),
55
73
  operation,
56
74
  payload: { resourceId, syncType },
57
- policyHash: conflictTracking.policyHash
75
+ policyHash: await resolveConflictTrackingIdentityValue({ conflictTracking, key: "policyHash", resourceType })
58
76
  }
59
77
  });
60
78
  }
@@ -857,4 +875,24 @@ function throwIfSyncAborted(signal) {
857
875
  return;
858
876
  throw signal.reason instanceof Error ? signal.reason : new Error("Sync operation aborted");
859
877
  }
860
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hcGktY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1hcGktY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUV4RCxPQUFPLGFBQWEsTUFBTSwrQkFBK0IsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUN4RSxPQUFPLEVBQUMsdUNBQXVDLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUU5RSxrR0FBa0c7QUFDbEcsNEZBQTRGO0FBQzVGLDRGQUE0RjtBQUM1Riw4RkFBOEY7QUFDOUYsMEZBQTBGO0FBQzFGLDRFQUE0RTtBQUM1RSxvRkFBb0Y7QUFDcEYsNEZBQTRGO0FBQzVGLDRGQUE0RjtBQUM1RixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsRUFBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBQztRQUN0SCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLDZCQUE2QixZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDakgsTUFBTSxPQUFPLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDNUQsTUFBTSxXQUFXLEdBQUcsT0FBTzthQUN4QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENB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QyxNQUFNLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtvcHRpb25hbEJvb2xlYW4sIG9wdGlvbmFsSW50ZWdlcn0gZnJvbSBcInR5cGFuaWNcIlxuXG5pbXBvcnQgcmVjb3JkQ2hhbmdlcyBmcm9tIFwiLi4vZGF0YWJhc2UvcmVjb3JkLWNoYW5nZXMuanNcIlxuaW1wb3J0IHtzY2FsYXJNb2RlbFByaW1hcnlLZXlWYWx1ZX0gZnJvbSBcIi4uL3V0aWxzL21vZGVsLXByaW1hcnkta2V5LmpzXCJcbmltcG9ydCB7YXBwbHlTeW5jUmVwbGF5UmVzdWx0VG9Mb2NhbE11dGF0aW9uTG9nfSBmcm9tIFwiLi9jb25mbGljdC1zdHJhdGVneS5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUFwcGx5UmVzdWx0fSBTeW5jQ2hhbmdlQXBwbHlSZXN1bHQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUVudmVsb3BlfSBTeW5jQ2hhbmdlRW52ZWxvcGUgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXF1ZXN0fSBTeW5jQ2hhbmdlc1JlcXVlc3QgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXNwb25zZX0gU3luY0NoYW5nZXNSZXNwb25zZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdH0gU3luY0NoYW5nZXNSZXN1bHQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0N1cnNvcn0gU3luY0N1cnNvciAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVwbGF5SXRlbX0gU3luY1JlcGxheUl0ZW0gKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1JlcGxheVJlc3BvbnNlfSBTeW5jUmVwbGF5UmVzcG9uc2UgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnfSBTeW5jUmVzb3VyY2VDb25maWcgKi9cbmNvbnN0IHN5bmNUYXNrUHJvbWlzZXMgPSBuZXcgTWFwKClcblxuLyoqXG4gKiBHZW5lcmljIGNsaWVudC1zaWRlIGhlbHBlciBmb3IgcmVwbGF5aW5nIHBlbmRpbmcgc3luYyBlbnZlbG9wZXMgdGhyb3VnaCB0aGVcbiAqIGZyYW1ld29yay1vd25lZCBgL3ZlbG9jaW91cy9zeW5jL3JlcGxheWAgZW5kcG9pbnQuIEFwcHMgcHJvdmlkZSBvbmx5IGxvY2FsXG4gKiBwZXJzaXN0ZW5jZS9hdXRoIGhvb2tzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jQXBpQ2xpZW50IHtcbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIGNvbmZsaWN0LXRyYWNrZWQgaW50ZW50IHRvIHRoZSBleGlzdGluZyBkdXJhYmxlIG11dGF0aW9uIGxvZy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBRdWV1ZSBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gYXJncy5iYXNlVmVyc2lvbiAtIEF1dGhvcml0YXRpdmUgdmVyc2lvbiBvYnNlcnZlZCBiZWZvcmUgdGhlIGxvY2FsIG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudENvbmZsaWN0VHJhY2tpbmdDb25maWd9IGFyZ3MuY29uZmxpY3RUcmFja2luZyAtIER1cmFibGUgdHJhY2tpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYXJncy5kYXRhIC0gQmFja2VuZC1zYWZlIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIn0gYXJncy5vcGVyYXRpb24gLSBMb2NhbCBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucmVzb3VyY2UgLSBMb2NhbCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VUeXBlIC0gUmVzb3VyY2UgdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3luY1R5cGUgLSBXaXJlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59IEFwcGVuZGVkIGludGVudC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBxdWV1ZUNvbmZsaWN0VHJhY2tlZFN5bmMoe2Jhc2VWZXJzaW9uLCBjb25mbGljdFRyYWNraW5nLCBkYXRhLCBvcGVyYXRpb24sIHJlc291cmNlLCByZXNvdXJjZVR5cGUsIHN5bmNUeXBlfSkge1xuICAgIGNvbnN0IHJlc291cmNlSWQgPSBTdHJpbmcoc2NhbGFyTW9kZWxQcmltYXJ5S2V5VmFsdWUocmVzb3VyY2UuaWQoKSwgYENvbmZsaWN0LXRyYWNrZWQgc3luYyBmb3IgJHtyZXNvdXJjZVR5cGV9YCkpXG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cucmVjb3JkcygpXG4gICAgY29uc3QgcHJlZGVjZXNzb3IgPSByZWNvcmRzXG4gICAgICAuZmlsdGVyKChyZWNvcmQpID0+IHJlY29yZC5tdXRhdGlvbi5tb2RlbCA9PT0gcmVzb3VyY2VUeXBlICYmIHJlY29yZC5tdXRhdGlvbi5wYXlsb2FkPy5yZXNvdXJjZUlkID09PSByZXNvdXJjZUlkKVxuICAgICAgLmF0KC0xKVxuICAgIGNvbnN0IGNsaWVudE11dGF0aW9uSWQgPSBjb25mbGljdFRyYWNraW5nLmNsaWVudE11dGF0aW9uSWQoKVxuICAgIGNvbnN0IG5vdyA9IGNvbmZsaWN0VHJhY2tpbmcubm93ID8gY29uZmxpY3RUcmFja2luZy5ub3coKSA6IG5ldyBEYXRlKClcbiAgICBjb25zdCBwcmVkZWNlc3NvclRpbWUgPSBwcmVkZWNlc3NvciA/IG5ldyBEYXRlKHByZWRlY2Vzc29yLm11dGF0aW9uLm9jY3VycmVkQXQpLmdldFRpbWUoKSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgIGNvbnN0IG9jY3VycmVkQXQgPSBuZXcgRGF0ZShNYXRoLm1heChub3cuZ2V0VGltZSgpLCBwcmVkZWNlc3NvclRpbWUgKyAxKSkudG9JU09TdHJpbmcoKVxuXG4gICAgcmV0dXJuIGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cuYXBwZW5kKHtcbiAgICAgIGRlcGVuZGVuY2llczogcHJlZGVjZXNzb3IgPyBbe2NsaWVudE11dGF0aW9uSWQ6IHByZWRlY2Vzc29yLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIG1vZGVsOiByZXNvdXJjZVR5cGV9XSA6IFtdLFxuICAgICAgbXV0YXRpb246IHtcbiAgICAgICAgYWN0b3JEZXZpY2VJZDogY29uZmxpY3RUcmFja2luZy5hY3RvckRldmljZUlkLFxuICAgICAgICBhY3RvclVzZXJJZDogY29uZmxpY3RUcmFja2luZy5hY3RvclVzZXJJZCxcbiAgICAgICAgYXR0cmlidXRlczogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKGRhdGEpLFxuICAgICAgICBiYXNlVmVyc2lvbixcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZCxcbiAgICAgICAgbW9kZWw6IHJlc291cmNlVHlwZSxcbiAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgb2ZmbGluZUdyYW50SWQ6IGNvbmZsaWN0VHJhY2tpbmcub2ZmbGluZUdyYW50SWQsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgcGF5bG9hZDoge3Jlc291cmNlSWQsIHN5bmNUeXBlfSxcbiAgICAgICAgcG9saWN5SGFzaDogY29uZmxpY3RUcmFja2luZy5wb2xpY3lIYXNoXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbnMgdGhlIGV4aXN0aW5nIG11dGF0aW9uIGxvZyBpbiBwcmVkZWNlc3NvciBvcmRlci4gSW5kZXBlbmRlbnQgcmVjb3Jkc1xuICAgKiBjb250aW51ZSBhZnRlciBkdXJhYmxlIGNvbmZsaWN0cy9yZWplY3Rpb25zOyBzdWNjZXNzb3JzIHN0YXkgYmxvY2tlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZXBsYXkgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aGVudGljYXRpb24gdG9rZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5iYXRjaFNpemVdIC0gQmF0Y2ggc2l6ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25mbGljdFRyYWNraW5nQ29uZmlnfSBhcmdzLmNvbmZsaWN0VHJhY2tpbmcgLSBUcmFja2luZyBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0sIG9wdGlvbnM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWx9KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFRyYW5zcG9ydCBib3VuZGFyeS5cbiAgICogQHBhcmFtIHsoYXJnczoge3JlY29yZDogaW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZCwgcmVzdWx0OiBTeW5jUmVwbGF5SXRlbX0pID0+IFByb21pc2U8dm9pZD59IFthcmdzLmFwcGx5Q29uZmxpY3RdIC0gQXBwbGllcyBhdXRob3JpdGF0aXZlIGNvbmZsaWN0IHN0YXRlIHRvIHRoZSBsb2NhbCByZXBsaWNhIGJlZm9yZSBwcmVzZXJ2aW5nIHRoZSByZWplY3RlZCBpbnRlbnQuXG4gICAqIEBwYXJhbSB7KGlkZW50aXR5OiBzdHJpbmcpID0+IG51bWJlcn0gYXJncy5yZW1vdGVHZW5lcmF0aW9uIC0gQ3VycmVudCByZW1vdGUgZ2VuZXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VUeXBlIC0gUmVzb3VyY2Ugd2hvc2UgbG9nIHJlY29yZHMgc2hvdWxkIGRyYWluLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIG5vIHJlYWR5IGludGVudCByZW1haW5zLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUNvbmZsaWN0VHJhY2tlZFN5bmNzKHthcHBseUNvbmZsaWN0LCBhdXRoZW50aWNhdGlvblRva2VuLCBiYXRjaFNpemUsIGNvbmZsaWN0VHJhY2tpbmcsIHBvc3RSZXBsYXksIHJlbW90ZUdlbmVyYXRpb24sIHJlc291cmNlVHlwZSwgc2lnbmFsfSkge1xuICAgIGNvbnN0IG1heEJhdGNoU2l6ZSA9IHRoaXMubm9ybWFsaXplZEJhdGNoU2l6ZShiYXRjaFNpemUpXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBjb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nLnJlY29yZHMoKVxuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICAgIGNvbnN0IHN0YXR1c2VzID0gbmV3IE1hcChyZWNvcmRzLm1hcCgocmVjb3JkKSA9PiBbcmVjb3JkLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIHJlY29yZC5zdGF0dXNdKSlcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSByZWNvcmRzLmZpbHRlcigocmVjb3JkKSA9PiByZWNvcmQuc3RhdHVzID09PSBcInBlbmRpbmdcIiAmJiByZWNvcmQubXV0YXRpb24ubW9kZWwgPT09IHJlc291cmNlVHlwZSlcbiAgICAgIGNvbnN0IHJlYWR5ID0gcGVuZGluZy5maWx0ZXIoKHJlY29yZCkgPT4gcmVjb3JkLmRlcGVuZGVuY2llcy5ldmVyeSgoZGVwZW5kZW5jeSkgPT4gc3RhdHVzZXMuZ2V0KGRlcGVuZGVuY3kuY2xpZW50TXV0YXRpb25JZCkgPT09IFwic3luY2VkXCIpKVxuXG4gICAgICBpZiAocmVhZHkubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5jb25mbGljdFJlcGxheUdyb3Vwcyh7cGVuZGluZywgcmVhZHl9KS5zbGljZSgwLCBtYXhCYXRjaFNpemUpXG4gICAgICBjb25zdCBnZW5lcmF0aW9ucyA9IG5ldyBNYXAoZ3JvdXBzLm1hcCgoZ3JvdXApID0+IFtncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkLCByZW1vdGVHZW5lcmF0aW9uKHRoaXMuY29uZmxpY3RSZWNvcmRJZGVudGl0eShncm91cFswXSkpXSkpXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RSZXBsYXkoe1xuICAgICAgICBhdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgICBzeW5jczogZ3JvdXBzLm1hcCgoZ3JvdXApID0+IHRoaXMuY29uZmxpY3RSZXBsYXlQYXlsb2FkKGdyb3VwKSlcbiAgICAgIH0sIHtzaWduYWx9KVxuXG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgICAgdGhpcy5lbnN1cmVTdWNjZXNzZnVsUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlc0J5SWQgPSBuZXcgTWFwKChyZXNwb25zZS5zeW5jcyB8fCBbXSkubWFwKChyZXN1bHQpID0+IFtTdHJpbmcocmVzdWx0LmlkKSwgcmVzdWx0XSkpXG5cbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlc0J5SWQuZ2V0KGdyb3VwWzBdLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQpXG5cbiAgICAgICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihgU3luYyByZXNwb25zZSBtaXNzaW5nIHJlc3VsdCBmb3IgbXV0YXRpb24gJHtncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkfWApXG4gICAgICAgIGlmICghW1wic3VjY2Vzc2Z1bFwiLCBcImR1cGxpY2F0ZVwiLCBcImNvbmZsaWN0XCIsIFwiZmFpbGVkXCIsIFwicmVqZWN0ZWRcIl0uaW5jbHVkZXMocmVzdWx0LnN5bmNTdGF0ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luYyBzdGF0ZSByZXR1cm5lZCBmb3IgbXV0YXRpb24gJHtncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkfTogJHtyZXN1bHQuc3luY1N0YXRlfWApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LnN5bmNTdGF0ZSA9PT0gXCJjb25mbGljdFwiICYmIGFwcGx5Q29uZmxpY3QpIHtcbiAgICAgICAgICBhd2FpdCBhcHBseUNvbmZsaWN0KHtyZWNvcmQ6IGdyb3VwWzBdLCByZXN1bHR9KVxuICAgICAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBncm91cCkge1xuICAgICAgICAgIGF3YWl0IGFwcGx5U3luY1JlcGxheVJlc3VsdFRvTG9jYWxNdXRhdGlvbkxvZyh7bXV0YXRpb25Mb2c6IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2csIHJlY29yZCwgcmVzdWx0OiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHJlc3VsdCl9KVxuICAgICAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoW1wic3VjY2Vzc2Z1bFwiLCBcImR1cGxpY2F0ZVwiXS5pbmNsdWRlcyhyZXN1bHQuc3luY1N0YXRlKSAmJiByZXN1bHQuc2VydmVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmNvbmZsaWN0UmVjb3JkSWRlbnRpdHkoZ3JvdXBbMF0pXG5cbiAgICAgICAgICBpZiAocmVtb3RlR2VuZXJhdGlvbihpZGVudGl0eSkgPT09IGdlbmVyYXRpb25zLmdldChncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWJhc2VDb25mbGljdFN1Y2Nlc3Nvcih7Y29uZmxpY3RUcmFja2luZywgcHJlZGVjZXNzb3I6IGdyb3VwW2dyb3VwLmxlbmd0aCAtIDFdLCBzZXJ2ZXJWZXJzaW9uOiByZXN1bHQuc2VydmVyVmVyc2lvbn0pXG4gICAgICAgICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgc2FmZSB0cmFuc3BvcnQgZ3JvdXBzIGZyb20gcm9vdC1yZWFkeSByZWNvcmRzIGFuZCB0aGVpciBzdWNjZXNzb3JzLlxuICAgKiBAcGFyYW0ge3twZW5kaW5nOiBBcnJheTxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkPiwgcmVhZHk6IEFycmF5PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fX0gYXJncyAtIFBlbmRpbmcgYW5kIHJvb3QtcmVhZHkgcmVjb3Jkcy5cbiAgICogQHJldHVybnMge0FycmF5PEFycmF5PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+Pn0gU2FmZSB0cmFuc3BvcnQgZ3JvdXBzLlxuICAgKi9cbiAgc3RhdGljIGNvbmZsaWN0UmVwbGF5R3JvdXBzKHtwZW5kaW5nLCByZWFkeX0pIHtcbiAgICBjb25zdCBncm91cHMgPSBbXVxuICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpdGllcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVhZHkpIHtcbiAgICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KHJlY29yZClcblxuICAgICAgaWYgKHNlbGVjdGVkSWRlbnRpdGllcy5oYXMoaWRlbnRpdHkpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBncm91cCA9IFtyZWNvcmRdXG4gICAgICBsZXQgdGFpbCA9IHJlY29yZFxuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBzdWNjZXNzb3IgPSBwZW5kaW5nLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmRlcGVuZGVuY2llcy5zb21lKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LmNsaWVudE11dGF0aW9uSWQgPT09IHRhaWwubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCkpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzb3IgfHwgIXRoaXMuY2FuQ29hbGVzY2VDb25mbGljdFJlY29yZHModGFpbCwgc3VjY2Vzc29yKSkgYnJlYWtcbiAgICAgICAgZ3JvdXAucHVzaChzdWNjZXNzb3IpXG4gICAgICAgIHRhaWwgPSBzdWNjZXNzb3JcbiAgICAgIH1cblxuICAgICAgZ3JvdXBzLnB1c2goZ3JvdXApXG4gICAgICBzZWxlY3RlZElkZW50aXRpZXMuYWRkKGlkZW50aXR5KVxuICAgIH1cblxuICAgIHJldHVybiBncm91cHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0d28gZHVyYWJsZSBpbnRlbnRzIGNhbiBzaGFyZSBvbmUgdHJhbnNwb3J0IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IGxlZnQgLSBFYXJsaWVyIGludGVudC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByaWdodCAtIExhdGVyIGludGVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgc2NhbGFyIHVwZGF0ZXMgY2FuIHNoYXJlIG9uZSB0cmFuc3BvcnQgbXV0YXRpb24uXG4gICAqL1xuICBzdGF0aWMgY2FuQ29hbGVzY2VDb25mbGljdFJlY29yZHMobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAobGVmdC5tdXRhdGlvbi5vcGVyYXRpb24gIT09IFwidXBkYXRlXCIgfHwgcmlnaHQubXV0YXRpb24ub3BlcmF0aW9uICE9PSBcInVwZGF0ZVwiKSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KGxlZnQpICE9PSB0aGlzLmNvbmZsaWN0UmVjb3JkSWRlbnRpdHkocmlnaHQpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAobGVmdC5tdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gcmlnaHQubXV0YXRpb24uYmFzZVZlcnNpb24pIHJldHVybiBmYWxzZVxuICAgIGlmICghdGhpcy5zY2FsYXJTeW5jQXR0cmlidXRlcyhsZWZ0Lm11dGF0aW9uLmF0dHJpYnV0ZXMpIHx8ICF0aGlzLnNjYWxhclN5bmNBdHRyaWJ1dGVzKHJpZ2h0Lm11dGF0aW9uLmF0dHJpYnV0ZXMpKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiAhT2JqZWN0LmtleXMobGVmdC5tdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHt9KS5zb21lKChrZXkpID0+IE9iamVjdC5oYXNPd24ocmlnaHQubXV0YXRpb24uYXR0cmlidXRlcyB8fCB7fSwga2V5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhdHRyaWJ1dGVzIGNvbnRhaW4gc2NhbGFyIEpTT04gdmFsdWVzIG9ubHkuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT4gfCB1bmRlZmluZWR9IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBldmVyeSB2YWx1ZSBpcyBzY2FsYXIuXG4gICAqL1xuICBzdGF0aWMgc2NhbGFyU3luY0F0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIHJldHVybiBCb29sZWFuKGF0dHJpYnV0ZXMpICYmIE9iamVjdC52YWx1ZXMoYXR0cmlidXRlcyB8fCB7fSkuZXZlcnkoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCB8fCBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIG9uZSByZXBsYXkgZW52ZWxvcGUgZm9yIGEgc2FmZSB0cmFuc3BvcnQgZ3JvdXAuXG4gICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59IGdyb3VwIC0gVHJhbnNwb3J0IGdyb3VwLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBSZXBsYXkgZW52ZWxvcGUuXG4gICAqL1xuICBzdGF0aWMgY29uZmxpY3RSZXBsYXlQYXlsb2FkKGdyb3VwKSB7XG4gICAgY29uc3QgZmlyc3QgPSBncm91cFswXVxuICAgIGNvbnN0IHBheWxvYWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHtcbiAgICAgIGJhc2VWZXJzaW9uOiBmaXJzdC5tdXRhdGlvbi5iYXNlVmVyc2lvbixcbiAgICAgIGNsaWVudFVwZGF0ZWRBdDogZmlyc3QubXV0YXRpb24ub2NjdXJyZWRBdCxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIC4uLmdyb3VwLm1hcCgocmVjb3JkKSA9PiByZWNvcmQubXV0YXRpb24uYXR0cmlidXRlcyB8fCB7fSkpLFxuICAgICAgaWQ6IGZpcnN0Lm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsXG4gICAgICByZXNvdXJjZUlkOiBmaXJzdC5tdXRhdGlvbi5wYXlsb2FkPy5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VUeXBlOiBmaXJzdC5tdXRhdGlvbi5tb2RlbCxcbiAgICAgIHN5bmNUeXBlOiBmaXJzdC5tdXRhdGlvbi5wYXlsb2FkPy5zeW5jVHlwZVxuICAgIH0pXG5cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN0YWJsZSByZXNvdXJjZSBpZGVudGl0eSBmb3Igb3JkZXJpbmcgYW5kIHJlbW90ZSBnZW5lcmF0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByZWNvcmQgLSBSZWNvcmQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJlc291cmNlIGlkZW50aXR5LlxuICAgKi9cbiAgc3RhdGljIGNvbmZsaWN0UmVjb3JkSWRlbnRpdHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIGAke3JlY29yZC5tdXRhdGlvbi5tb2RlbH06JHtTdHJpbmcocmVjb3JkLm11dGF0aW9uLnBheWxvYWQ/LnJlc291cmNlSWQpfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJhc2VzIHRoZSBkaXJlY3QgcGVuZGluZyBzdWNjZXNzb3IgZnJvbSBhbiBhdXRob3JpdGF0aXZlIGFja25vd2xlZGdlbWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZWJhc2UgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25mbGljdFRyYWNraW5nQ29uZmlnfSBhcmdzLmNvbmZsaWN0VHJhY2tpbmcgLSBUcmFja2luZyBjb25maWcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gYXJncy5wcmVkZWNlc3NvciAtIEFja25vd2xlZGdlZCBwcmVkZWNlc3Nvci5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBhcmdzLnNlcnZlclZlcnNpb24gLSBBdXRob3JpdGF0aXZlIHNlcnZlciB2ZXJzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZWJhc2VDb25mbGljdFN1Y2Nlc3Nvcih7Y29uZmxpY3RUcmFja2luZywgcHJlZGVjZXNzb3IsIHNlcnZlclZlcnNpb259KSB7XG4gICAgY29uc3Qgc3VjY2Vzc29yID0gKGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cucGVuZGluZ1JlY29yZHMoKSlcbiAgICAgIC5maW5kKChyZWNvcmQpID0+IHJlY29yZC5kZXBlbmRlbmNpZXMuc29tZSgoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5jbGllbnRNdXRhdGlvbklkID09PSBwcmVkZWNlc3Nvci5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkKSlcblxuICAgIGlmICghc3VjY2Vzc29yKSByZXR1cm5cblxuICAgIGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cudXBkYXRlTXV0YXRpb24oe1xuICAgICAgaWQ6IHN1Y2Nlc3Nvci5pZCxcbiAgICAgIG11dGF0aW9uOiB7Li4uc3VjY2Vzc29yLm11dGF0aW9uLCBiYXNlVmVyc2lvbjogc2VydmVyVmVyc2lvbn1cbiAgICB9KVxuICB9XG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHN5bmMgd29yayB3aXRoIHRoZSBzYW1lIGtleSBzbyBjYWxsZXJzIGRvIG5vdCBoYXZlIHRvIGtlZXAgYXBwLWxvY2FsIGxvY2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTG9jayBrZXkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBXb3JrIHRvIHJ1biBvbmNlIHByZXZpb3VzIHdvcmsgZmluaXNoZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNpbmdsZUZsaWdodChrZXksIGNhbGxiYWNrKSB7XG4gICAgd2hpbGUgKHN5bmNUYXNrUHJvbWlzZXMuaGFzKGtleSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN5bmNUYXNrUHJvbWlzZXMuZ2V0KGtleSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBUaGUgZmFpbGVkIGZsaWdodCdzIG93biBjYWxsZXIgb2JzZXJ2ZXMgdGhhdCByZWplY3Rpb247IGNhbGxlcnMgcXVldWVkXG4gICAgICAgIC8vIGJlaGluZCBpdCBzdGlsbCBydW4gdGhlaXIgb3duIHdvcmsgc28gcGVuZGluZyByb3dzIHJldHJ5IGFmdGVyIHRoZSBsb2NrIGNsZWFycy5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gY2FsbGJhY2soKVxuICAgIHN5bmNUYXNrUHJvbWlzZXMuc2V0KGtleSwgcHJvbWlzZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzeW5jVGFza1Byb21pc2VzLmdldChrZXkpID09PSBwcm9taXNlKSBzeW5jVGFza1Byb21pc2VzLmRlbGV0ZShrZXkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGJhY2tlbmQgc3luYyBjaGFuZ2VzIHdpdGggYSBmcmFtZXdvcmstbWFuYWdlZCBjdXJzb3Igcm93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFB1bGwgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4gdG8gc2VuZCB3aXRoIGNoYW5nZSByZXF1ZXN0cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmJhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MuY3Vyc29yTW9kZWwgLSBNb2RlbCB0aGF0IHJlc3BvbmRzIHRvIGZpbmRCeS9maW5kT3JJbml0aWFsaXplQnkgZm9yIGN1cnNvciBwZXJzaXN0ZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY3Vyc29yS2V5IC0gQ3Vyc29yIG9wdGlvbiBrZXkuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IFN5bmNDaGFuZ2VzUmVxdWVzdCkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gYXJncy5wb3N0Q2hhbmdlcyAtIFBvc3RzIG9uZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY1Jlc291cmNlQ29uZmlnPn0gYXJncy5yZXNvdXJjZXMgLSBSZXNvdXJjZSBwb2xpY2llcy5cbiAgICogQHBhcmFtIHsocHJvZ3Jlc3M6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNQdWxsUHJvZ3Jlc3MpID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gUHJvZ3Jlc3MgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFthcmdzLnNpZ25hbF0gLSBMaWZlY3ljbGUgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U3luY0NoYW5nZXNSZXN1bHQ+fSBQdWxsIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBwdWxsQ2hhbmdlc1dpdGhDdXJzb3IoYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnB1bGxDaGFuZ2VzKHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGJhdGNoU2l6ZTogYXJncy5iYXRjaFNpemUsXG4gICAgICBsb2FkQ3Vyc29yOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmxvYWRTeW5jQ3Vyc29yKHtjdXJzb3JLZXk6IGFyZ3MuY3Vyc29yS2V5LCBjdXJzb3JNb2RlbDogYXJncy5jdXJzb3JNb2RlbH0pLFxuICAgICAgc2F2ZUN1cnNvcjogYXN5bmMgKGN1cnNvcikgPT4gYXdhaXQgdGhpcy5zYXZlU3luY0N1cnNvcih7Y3Vyc29yLCBjdXJzb3JLZXk6IGFyZ3MuY3Vyc29yS2V5LCBjdXJzb3JNb2RlbDogYXJncy5jdXJzb3JNb2RlbH0pLFxuICAgICAgcG9zdENoYW5nZXM6IGFyZ3MucG9zdENoYW5nZXMsXG4gICAgICBhcHBseVN5bmM6IHRoaXMucmVzb3VyY2VBcHBsaWVyKGFyZ3MucmVzb3VyY2VzKSxcbiAgICAgIG9uUHJvZ3Jlc3M6IGFyZ3Mub25Qcm9ncmVzcyxcbiAgICAgIHNpZ25hbDogYXJncy5zaWduYWxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgcGVyc2lzdGVkIHN5bmMgY3Vyc29yIGZyb20gYSBtb2RlbCByb3cgd2l0aCBhIHZhbHVlIGNvbHVtbi5cbiAgICogQHBhcmFtIHt7Y3Vyc29yS2V5OiBzdHJpbmcsIGN1cnNvck1vZGVsOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn19IGFyZ3MgLSBDdXJzb3IgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IFBlcnNpc3RlZCBjdXJzb3IgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkU3luY0N1cnNvcih7Y3Vyc29yS2V5LCBjdXJzb3JNb2RlbH0pIHtcbiAgICBjb25zdCBvcHRpb24gPSBhd2FpdCBjdXJzb3JNb2RlbC5maW5kQnkoe2tleTogY3Vyc29yS2V5fSlcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24udmFsdWUoKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHBlcnNpc3RlZCBzeW5jIGN1cnNvciB0byBhIG1vZGVsIHJvdyB3aXRoIGEgdmFsdWUgY29sdW1uLlxuICAgKiBAcGFyYW0ge3tjdXJzb3I6IFN5bmNDdXJzb3IsIGN1cnNvcktleTogc3RyaW5nLCBjdXJzb3JNb2RlbDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59fSBhcmdzIC0gQ3Vyc29yIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNhdmVTeW5jQ3Vyc29yKHtjdXJzb3IsIGN1cnNvcktleSwgY3Vyc29yTW9kZWx9KSB7XG4gICAgaWYgKCFjdXJzb3IpIHJldHVyblxuXG4gICAgY29uc3Qgb3B0aW9uID0gYXdhaXQgY3Vyc29yTW9kZWwuZmluZE9ySW5pdGlhbGl6ZUJ5KHtrZXk6IGN1cnNvcktleX0pXG5cbiAgICBvcHRpb24uYXNzaWduKHt2YWx1ZTogSlNPTi5zdHJpbmdpZnkoY3Vyc29yKX0pXG4gICAgaWYgKG9wdGlvbi5pc0NoYW5nZWQoKSkgYXdhaXQgb3B0aW9uLnNhdmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGJhY2tlbmQgc3luYyBjaGFuZ2VzIGluIHN0YWJsZSBwYWdlcywgYXBwbGllcyB0aGVtIGxvY2FsbHksIGFuZCBzdG9yZXNcbiAgICogdGhlIGFja25vd2xlZGdlZCBjdXJzb3IuIEFwcHMgcHJvdmlkZSBvbmx5IGF1dGgsIHBlcnNpc3RlbmNlLCB0cmFuc3BvcnQsIGFuZFxuICAgKiByZXNvdXJjZSBwb2xpY3kgaG9va3MuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUHVsbCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggY2hhbmdlIHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8U3luY0N1cnNvciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSBhcmdzLmxvYWRDdXJzb3IgLSBMb2FkcyB0aGUgcGVyc2lzdGVkIGxvY2FsIGN1cnNvci5cbiAgICogQHBhcmFtIHsoY3Vyc29yOiBTeW5jQ3Vyc29yKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLnNhdmVDdXJzb3IgLSBQZXJzaXN0cyB0aGUgZmluYWwgYWNrbm93bGVkZ2VkIGN1cnNvci5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogU3luY0NoYW5nZXNSZXF1ZXN0LCBvcHRpb25zPzoge3NpZ25hbD86IEFib3J0U2lnbmFsfSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gYXJncy5wb3N0Q2hhbmdlcyAtIFBvc3RzIG9uZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7KHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBhcmdzLmFwcGx5U3luYyAtIEFwcGxpZXMgb25lIG5vcm1hbGl6ZWQgc3luYyByb3cgbG9jYWxseS5cbiAgICogQHBhcmFtIHsocHJvZ3Jlc3M6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNQdWxsUHJvZ3Jlc3MpID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gUHJvZ3Jlc3MgY2FsbGJhY2sgaW52b2tlZCBwZXIgYXBwbGllZCBwYWdlIChhbmQgb25jZSBmb3IgYW4gZW1wdHkgcHVsbCkgd2l0aCB0aGUgYXBwbGllZCBjb3VudHMgYW5kIHRoZSBzdGFibGUgc2VydmVyIHRvdGFsLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDaGFuZ2VzUmVzdWx0Pn0gUHVsbCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHVsbENoYW5nZXMoYXJncykge1xuICAgIHRocm93SWZTeW5jQWJvcnRlZChhcmdzLnNpZ25hbClcbiAgICBsZXQgYWZ0ZXJDdXJzb3IgPSB0aGlzLnN5bmNDdXJzb3JGcm9tUGF5bG9hZChhd2FpdCBhcmdzLmxvYWRDdXJzb3IoKSlcbiAgICBsZXQgdXBUb0N1cnNvciA9IG51bGxcbiAgICBsZXQgcGFnZXMgPSAwXG4gICAgbGV0IHN5bmNlZENvdW50ID0gMFxuICAgIGxldCB0b3RhbCA9IDBcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlXG4gICAgY29uc3QgcmVzb3VyY2VDb3VudHMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovICh7fSlcbiAgICBjb25zdCByZXNvdXJjZUNoYW5nZWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSAqLyAoe30pXG4gICAgY29uc3QgYmF0Y2hTaXplID0gdGhpcy5ub3JtYWxpemVkQmF0Y2hTaXplKGFyZ3MuYmF0Y2hTaXplKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRocm93SWZTeW5jQWJvcnRlZChhcmdzLnNpZ25hbClcbiAgICAgIGNvbnN0IGNoYW5nZXNSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2hhbmdlc1BhZ2Uoey4uLmFyZ3MsIGFmdGVyQ3Vyc29yLCBiYXRjaFNpemUsIHVwVG9DdXJzb3J9KVxuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgY29uc3Qgc3luY3MgPSBjaGFuZ2VzUmVzcG9uc2Uuc3luY3NcblxuICAgICAgaWYgKCF1cFRvQ3Vyc29yKSB1cFRvQ3Vyc29yID0gY2hhbmdlc1Jlc3BvbnNlLnVwVG9DdXJzb3JcblxuICAgICAgLy8gVGhlIHNlcnZlciBjb3VudHMgcGVuZGluZyByb3dzIGZyb20gdGhpcyByZXF1ZXN0J3MgY3Vyc29yLCBzbyBhbHJlYWR5LWFwcGxpZWRcbiAgICAgIC8vIHBhZ2VzIHBsdXMgdGhpcyByZXF1ZXN0J3MgY291bnQgc3RheXMgdGhlIHNhbWUgdG90YWwgYWNyb3NzIGV2ZXJ5IHBhZ2U6IGEgc3RhYmxlXG4gICAgICAvLyBcIm9mIFlcIiBkZW5vbWluYXRvciBldmVuIGFzIHRoZSBjdXJzb3IgYWR2YW5jZXMuIEEgc2VydmVyIHRoYXQgZG9lc24ndCByZXBvcnQgdGhlXG4gICAgICAvLyBjb3VudCBhdCBhbGwgbGVhdmVzIHRoZSB0b3RhbCBhdCAwIGZvciBldmVyeSBwYWdlIHJhdGhlciB0aGFuIGRyaWZ0aW5nIHVwd2FyZHNcbiAgICAgIC8vIHdpdGggdGhlIGFwcGxpZWQgcm93cy5cbiAgICAgIGlmIChjaGFuZ2VzUmVzcG9uc2UudG90YWwgIT09IG51bGwpIHRvdGFsID0gc3luY2VkQ291bnQgKyBjaGFuZ2VzUmVzcG9uc2UudG90YWxcblxuICAgICAgaWYgKHN5bmNzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBSZXBvcnQgdGhlIHRlcm1pbmFsIHByb2dyZXNzIG9uY2UgZm9yIGFuIGVudGlyZWx5IGVtcHR5IHB1bGwgc28gY29uc3VtZXJzIG9ic2VydmVcbiAgICAgICAgLy8gdG90YWwgMDsgYSBwdWxsIHRoYXQgYWxyZWFkeSBhcHBsaWVkIHBhZ2VzIHJlcG9ydGVkIGl0cyBmaW5hbCBjb3VudHMgb24gaXRzIGxhc3QgcGFnZS5cbiAgICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgICBpZiAocGFnZXMgPT09IDAgJiYgYXJncy5vblByb2dyZXNzKSBhcmdzLm9uUHJvZ3Jlc3Moe3BhZ2VzLCBzeW5jZWRDb3VudCwgdG90YWx9KVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIHBhZ2VzICs9IDFcblxuICAgICAgLy8gQ29hbGVzY2UgcmVjb3JkLWNoYW5nZSBldmVudHMgYWNyb3NzIHRoaXMgcGFnZSdzIGFwcGxpZXMgc28gTiBhcHBsaWVkIHJvd3MgdHJpZ2dlciBvbmVcbiAgICAgIC8vIGxpdmUtcXVlcnkgcmUtcnVuLiBPbmx5IHRoZSBhcHBseSBsb29wIGlzIGJhdGNoZWQ6IHRoZSBuZXR3b3JrIHBhZ2UgZmV0Y2ggYWJvdmUgYW5kIHRoZVxuICAgICAgLy8gY3Vyc29yIHNhdmUgYmVsb3cgc3RheSBvdXRzaWRlLCBzbyBsaXZlIHF1ZXJpZXMgZmx1c2ggcmlnaHQgYWZ0ZXIgdGhlIGFwcGxpZXMgaW5zdGVhZCBvZlxuICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHB1bGwuXG4gICAgICBhd2FpdCByZWNvcmRDaGFuZ2VzLmJhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBzeW5jIG9mIHN5bmNzKSB7XG4gICAgICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgICAgIGNvbnN0IGFwcGx5UmVzdWx0ID0gYXdhaXQgYXJncy5hcHBseVN5bmMoc3luYylcbiAgICAgICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gYXBwbHlSZXN1bHQucmVzb3VyY2VUeXBlID8/IHN5bmMucmVzb3VyY2VUeXBlKClcblxuICAgICAgICAgIGNoYW5nZWQgfHw9IGFwcGx5UmVzdWx0LmNoYW5nZWQgPT09IHRydWVcbiAgICAgICAgICBzeW5jZWRDb3VudCArPSAxXG5cbiAgICAgICAgICBpZiAocmVzb3VyY2VUeXBlKSB7XG4gICAgICAgICAgICByZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdID0gKHJlc291cmNlQ291bnRzW3Jlc291cmNlVHlwZV0gfHwgMCkgKyAxXG4gICAgICAgICAgICByZXNvdXJjZUNoYW5nZWRbcmVzb3VyY2VUeXBlXSB8fD0gYXBwbHlSZXN1bHQuY2hhbmdlZCA9PT0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYWZ0ZXJDdXJzb3IgPSBjaGFuZ2VzUmVzcG9uc2UubmV4dEN1cnNvclxuXG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgICBpZiAoYXJncy5vblByb2dyZXNzKSBhcmdzLm9uUHJvZ3Jlc3Moe3BhZ2VzLCBzeW5jZWRDb3VudCwgdG90YWx9KVxuICAgICAgaWYgKHN5bmNzLmxlbmd0aCA8IGJhdGNoU2l6ZSkgYnJlYWtcbiAgICB9XG5cbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgaWYgKGFmdGVyQ3Vyc29yKSBhd2FpdCBhcmdzLnNhdmVDdXJzb3IoYWZ0ZXJDdXJzb3IpXG4gICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuXG4gICAgcmV0dXJuIHtjaGFuZ2VkLCBwYWdlcywgcmVzb3VyY2VDaGFuZ2VkLCByZXNvdXJjZUNvdW50cywgc3luY2VkQ291bnQsIHRvdGFsfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHZhbGlkYXRlcyBvbmUgYmFja2VuZCBzeW5jIGNoYW5nZXMgcGFnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQYWdlIGFyZ3MuXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvcn0gYXJncy5hZnRlckN1cnNvciAtIExhc3QgYWNrbm93bGVkZ2VkIGN1cnNvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmJhdGNoU2l6ZSAtIFBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogU3luY0NoYW5nZXNSZXF1ZXN0LCBvcHRpb25zPzoge3NpZ25hbD86IEFib3J0U2lnbmFsfSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gYXJncy5wb3N0Q2hhbmdlcyAtIENoYW5nZXMgcG9zdGVyLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvcn0gYXJncy51cFRvQ3Vyc29yIC0gU25hcHNob3QgdXBwZXItYm91bmQgY3Vyc29yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bmV4dEN1cnNvcjogU3luY0N1cnNvciwgc3luY3M6IFN5bmNDaGFuZ2VFbnZlbG9wZVtdLCB0b3RhbDogbnVtYmVyIHwgbnVsbCwgdXBUb0N1cnNvcjogU3luY0N1cnNvcn0+fSBOb3JtYWxpemVkIGNoYW5nZXMgcGFnZS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjaGFuZ2VzUGFnZSh7YWZ0ZXJDdXJzb3IsIGF1dGhlbnRpY2F0aW9uVG9rZW4sIGJhdGNoU2l6ZSwgcG9zdENoYW5nZXMsIHNpZ25hbCwgdXBUb0N1cnNvcn0pIHtcbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdENoYW5nZXMoe1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGxpbWl0OiBiYXRjaFNpemUsXG4gICAgICAuLi50aGlzLmN1cnNvclBheWxvYWQoXCJhZnRlclwiLCBhZnRlckN1cnNvciksXG4gICAgICAuLi50aGlzLmN1cnNvclBheWxvYWQoXCJ1cFRvXCIsIHVwVG9DdXJzb3IpXG4gICAgfSwge3NpZ25hbH0pXG5cbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgIHRoaXMuZW5zdXJlU3VjY2Vzc2Z1bENoYW5nZXNSZXNwb25zZShyZXNwb25zZSlcblxuICAgIGNvbnN0IHN5bmNzID0gLyoqIEB0eXBlIHt1bmtub3duW119ICovIChyZXNwb25zZS5zeW5jcylcblxuICAgIHJldHVybiB7XG4gICAgICBuZXh0Q3Vyc29yOiB0aGlzLnN5bmNDdXJzb3JGcm9tUGF5bG9hZChyZXNwb25zZS5uZXh0Q3Vyc29yID8/IG51bGwpLFxuICAgICAgc3luY3M6IHN5bmNzLm1hcCgoc3luY1BheWxvYWQpID0+IHRoaXMuc3luY0VudmVsb3BlRnJvbVBheWxvYWQoc3luY1BheWxvYWQpKSxcbiAgICAgIHRvdGFsOiBvcHRpb25hbEludGVnZXIocmVzcG9uc2UudG90YWwpLFxuICAgICAgdXBUb0N1cnNvcjogdGhpcy5zeW5jQ3Vyc29yRnJvbVBheWxvYWQocmVzcG9uc2UudXBUb0N1cnNvciA/PyBudWxsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgQVBJIHJlc3BvbnNlIHN0YXR1cyBhbmQgc2hhcGUgZm9yIGNoYW5nZS1mZWVkIHB1bGxzLlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VzUmVzcG9uc2V9IHJlc3BvbnNlIC0gQ2hhbmdlcyByZXNwb25zZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgZW5zdXJlU3VjY2Vzc2Z1bENoYW5nZXNSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IFwiZXJyb3JcIikgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yTWVzc2FnZSB8fCBcIlN5bmMgY2hhbmdlcyBmYWlsZWRcIilcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2Uuc3luY3MpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNoYW5nZXMgcmVzcG9uc2UgbWlzc2luZyBzeW5jc1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY3Vyc29yIGludG8gcmVxdWVzdCBwYXJhbXMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LlxuICAgKiBAcGFyYW0ge1wiYWZ0ZXJcIiB8IFwidXBUb1wifSBwcmVmaXggLSBSZXF1ZXN0IGZpZWxkIHByZWZpeC5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yfSBjdXJzb3IgLSBDdXJzb3IgdG8gc2VyaWFsaXplLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbD59IFJlcXVlc3QgcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGN1cnNvclBheWxvYWQocHJlZml4LCBjdXJzb3IpIHtcbiAgICBpZiAoIWN1cnNvcikgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgW2Ake3ByZWZpeH1JZGBdOiBjdXJzb3IuaWQsXG4gICAgICAuLi4oY3Vyc29yLnNlcnZlclNlcXVlbmNlID8ge1tgJHtwcmVmaXh9U2VydmVyU2VxdWVuY2VgXTogY3Vyc29yLnNlcnZlclNlcXVlbmNlfSA6IHt9KSxcbiAgICAgIFtgJHtwcmVmaXh9VXBkYXRlZEF0YF06IGN1cnNvci51cGRhdGVkQXRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgcGVyc2lzdGVkIG9yIHJlc3BvbnNlIGN1cnNvciBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge1N5bmNDdXJzb3IgfCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsIHwgdW5kZWZpbmVkfSBwYXlsb2FkIC0gQ3Vyc29yIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ3Vyc29yfSBQYXJzZWQgY3Vyc29yLlxuICAgKi9cbiAgc3RhdGljIHN5bmNDdXJzb3JGcm9tUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKCFwYXlsb2FkKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jQ3Vyc29yRnJvbVBheWxvYWQoSlNPTi5wYXJzZShwYXlsb2FkKSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICByZXR1cm4ge2lkOiBudWxsLCBzZXJ2ZXJTZXF1ZW5jZTogbnVsbCwgdXBkYXRlZEF0OiBwYXlsb2FkfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHBheWxvYWQpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdXBkYXRlZEF0ID0gdHlwZW9mIHBheWxvYWQudXBkYXRlZEF0ID09PSBcInN0cmluZ1wiID8gcGF5bG9hZC51cGRhdGVkQXQgOiBudWxsXG5cbiAgICBpZiAoIXVwZGF0ZWRBdCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogcGF5bG9hZC5pZCA9PT0gbnVsbCB8fCBwYXlsb2FkLmlkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKHBheWxvYWQuaWQpLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IG9wdGlvbmFsSW50ZWdlcihwYXlsb2FkLnNlcnZlclNlcXVlbmNlID09PSBcIlwiID8gbnVsbCA6IHBheWxvYWQuc2VydmVyU2VxdWVuY2UpLFxuICAgICAgdXBkYXRlZEF0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG5vcm1hbGl6ZWQgc3luYyByb3cgYWRhcHRlci5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcGF5bG9hZCAtIFJhdyBzeW5jIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2hhbmdlRW52ZWxvcGV9IFN5bmMgcm93IGFkYXB0ZXIuXG4gICAqL1xuICBzdGF0aWMgc3luY0VudmVsb3BlRnJvbVBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmICghcGF5bG9hZCB8fCB0eXBlb2YgcGF5bG9hZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHBheWxvYWQpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNoYW5nZXMgZW50cnkgbXVzdCBiZSBhbiBvYmplY3RcIilcblxuICAgIGNvbnN0IHN5bmNQYXlsb2FkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChwYXlsb2FkKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6ICgpID0+IHN5bmNQYXlsb2FkLmRhdGEsXG4gICAgICBpZDogKCkgPT4gc3luY1BheWxvYWQuaWQsXG4gICAgICByZXNvdXJjZUlkOiAoKSA9PiBzeW5jUGF5bG9hZC5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VUeXBlOiAoKSA9PiBzeW5jUGF5bG9hZC5yZXNvdXJjZVR5cGUgPT09IG51bGwgfHwgc3luY1BheWxvYWQucmVzb3VyY2VUeXBlID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKHN5bmNQYXlsb2FkLnJlc291cmNlVHlwZSksXG4gICAgICBzeW5jVHlwZTogKCkgPT4gc3luY1BheWxvYWQuc3luY1R5cGUgPT09IG51bGwgfHwgc3luY1BheWxvYWQuc3luY1R5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBTdHJpbmcoc3luY1BheWxvYWQuc3luY1R5cGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBhcHAtY29uZmlndXJlZCByZXNvdXJjZSBhcHBsaWVyIGZvciBwdWxsZWQgc3luYyByb3dzLiBUaGUgc3luY1xuICAgKiBtZWNoYW5pY3Mgc3RheSBoZXJlOyBhcHBzIG9ubHkgZGVjbGFyZSB3aGljaCBtb2RlbHMvYXR0cmlidXRlcy9ob29rcyBhcmVcbiAgICogYWxsb3dlZCBmb3IgZWFjaCByZXNvdXJjZSB0eXBlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFN5bmNSZXNvdXJjZUNvbmZpZz59IHJlc291cmNlcyAtIFJlc291cmNlIHBvbGljeSBtYXAuXG4gICAqIEBwYXJhbSB7KHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+ICgpID0+IHZvaWR9IFtvblJlY29yZF0gLSBDYWxsZWQgd2l0aCBlYWNoIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuOyByZXR1cm5zIGEgcmVsZWFzZSBjYWxsYmFjayBpbnZva2VkIGFmdGVyIHRoZSB3cml0ZSAodXNlZCBmb3IgZWNobyBzdXBwcmVzc2lvbikuXG4gICAqIEByZXR1cm5zIHsoc3luYzogU3luY0NoYW5nZUVudmVsb3BlKSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VBcHBseVJlc3VsdD59IFN5bmMgYXBwbHkgY2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgcmVzb3VyY2VBcHBsaWVyKHJlc291cmNlcywgb25SZWNvcmQpIHtcbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IGF3YWl0IHRoaXMuYXBwbHlSZXNvdXJjZVN5bmMoe29uUmVjb3JkLCByZXNvdXJjZXMsIHN5bmN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgb25lIHN5bmMgcm93IHVzaW5nIGRlY2xhcmF0aXZlIHJlc291cmNlIHBvbGljeS5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTeW5jUmVzb3VyY2VDb25maWc+LCBzeW5jOiBTeW5jQ2hhbmdlRW52ZWxvcGUsIG9uUmVjb3JkPzogKHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+ICgpID0+IHZvaWR9fSBhcmdzIC0gQXBwbHkgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gQXBwbHkgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFwcGx5UmVzb3VyY2VTeW5jKHtvblJlY29yZCwgcmVzb3VyY2VzLCBzeW5jfSkge1xuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcbiAgICBjb25zdCByZXNvdXJjZSA9IHJlc291cmNlVHlwZSA/IHJlc291cmNlc1tyZXNvdXJjZVR5cGVdIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIXJlc291cmNlIHx8ICFyZXNvdXJjZS5lbmFibGVkKSByZXR1cm4ge2NoYW5nZWQ6IGZhbHNlLCByZXNvdXJjZVR5cGV9XG5cbiAgICBpZiAoc3luYy5zeW5jVHlwZSgpID09PSBcImRlbGV0ZVwiKSB7XG4gICAgICByZXR1cm4ge2NoYW5nZWQ6IGF3YWl0IHRoaXMuZGVzdHJveVN5bmNlZFJlc291cmNlKHtvblJlY29yZCwgcmVzb3VyY2UsIHN5bmN9KSwgcmVzb3VyY2VUeXBlfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN5bmNEYXRhKHN5bmMpXG4gICAgY29uc3QgcmVjb3JkID0gcmVzb3VyY2UuZmluZFJlY29yZCA/IGF3YWl0IHJlc291cmNlLmZpbmRSZWNvcmQoe2RhdGEsIHJlc291cmNlSWQ6IHN5bmMucmVzb3VyY2VJZCgpLCBzeW5jfSkgOiBhd2FpdCByZXNvdXJjZS5tb2RlbENsYXNzLmZpbmRPckluaXRpYWxpemVCeSh7aWQ6IGRhdGEuaWQgPz8gc3luYy5yZXNvdXJjZUlkKCl9KVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBhd2FpdCByZXNvdXJjZS5hdHRyaWJ1dGVzKHtkYXRhLCByZWNvcmQsIHN5bmN9KVxuICAgIGNvbnN0IHJlbGVhc2VSZWNvcmQgPSBvblJlY29yZCA/IG9uUmVjb3JkKHJlY29yZCkgOiBudWxsXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZC5hc3NpZ24oYXR0cmlidXRlcylcblxuICAgICAgaWYgKHJlY29yZC5pc0NoYW5nZWQoKSkge1xuICAgICAgICBhd2FpdCByZWNvcmQuc2F2ZSgpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZS5hZnRlckFwcGx5KSB7XG4gICAgICAgIGNvbnN0IGhvb2tDaGFuZ2VkID0gYXdhaXQgcmVzb3VyY2UuYWZ0ZXJBcHBseSh7YXR0cmlidXRlcywgZGF0YSwgcmVjb3JkLCBzeW5jfSlcblxuICAgICAgICBjaGFuZ2VkIHx8PSBob29rQ2hhbmdlZCA9PT0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocmVsZWFzZVJlY29yZCkgcmVsZWFzZVJlY29yZCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtjaGFuZ2VkLCByZXNvdXJjZVR5cGV9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgYSBzeW5jZWQgcmVzb3VyY2UgdmlhIGl0cyBkZWNsYXJlZCBtb2RlbCBwb2xpY3kuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiBTeW5jUmVzb3VyY2VDb25maWcsIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSwgb25SZWNvcmQ/OiAocmVjb3JkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gKCkgPT4gdm9pZH19IGFyZ3MgLSBEZXN0cm95IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGEgbG9jYWwgcm93IHdhcyBkZXN0cm95ZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVzdHJveVN5bmNlZFJlc291cmNlKHtvblJlY29yZCwgcmVzb3VyY2UsIHN5bmN9KSB7XG4gICAgY29uc3QgaWQgPSBzeW5jLnJlc291cmNlSWQoKVxuICAgIGNvbnN0IHJlY29yZCA9IHJlc291cmNlLmZpbmRSZWNvcmRGb3JEZWxldGUgPyBhd2FpdCByZXNvdXJjZS5maW5kUmVjb3JkRm9yRGVsZXRlKHtyZXNvdXJjZUlkOiBpZCwgc3luY30pIDogYXdhaXQgcmVzb3VyY2UubW9kZWxDbGFzcy5maW5kQnkoe2lkfSlcblxuICAgIGlmICghcmVjb3JkKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHJlbGVhc2VSZWNvcmQgPSBvblJlY29yZCA/IG9uUmVjb3JkKHJlY29yZCkgOiBudWxsXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVjb3JkLmRlc3Ryb3koKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocmVsZWFzZVJlY29yZCkgcmVsZWFzZVJlY29yZCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIGVtYmVkZGVkIHN5bmMgZGF0YSBKU09OL29iamVjdC5cbiAgICogQHBhcmFtIHtTeW5jQ2hhbmdlRW52ZWxvcGV9IHN5bmMgLSBTeW5jIHJvdy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBTeW5jIGRhdGEgb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIHN5bmNEYXRhKHN5bmMpIHtcbiAgICBjb25zdCBkYXRhID0gc3luYy5kYXRhKClcblxuICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKGBTeW5jICR7c3luYy5pZCgpfSBpcyBtaXNzaW5nIGRhdGFgKVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChKU09OLnBhcnNlKGRhdGEpKVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChkYXRhKVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jICR7c3luYy5pZCgpfSBoYXMgaW52YWxpZCBkYXRhYClcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbnMgcGVuZGluZyBzeW5jIHJlY29yZHMgZnJvbSBhIGxvY2FsIFZlbG9jaW91cyBtb2RlbCBpbiBzdGFibGUgb3JkZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVwbGF5IGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuIHRvIHNlbmQgd2l0aCByZXBsYXkgcmVxdWVzdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5iYXRjaFNpemVdIC0gTWF4IHN5bmNzIHBlciByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnN5bmNNb2RlbCAtIExvY2FsIFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHthdXRoZW50aWNhdGlvblRva2VuOiBzdHJpbmcsIHN5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSwgb3B0aW9ucz86IHtzaWduYWw/OiBBYm9ydFNpZ25hbH0pID0+IFByb21pc2U8U3luY1JlcGxheVJlc3BvbnNlPn0gYXJncy5wb3N0UmVwbGF5IC0gUmVwbGF5IHBvc3Rlci5cbiAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gW2FyZ3Muc2lnbmFsXSAtIExpZmVjeWNsZSBjYW5jZWxsYXRpb24gc2lnbmFsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXBsYXlMb2NhbFN5bmNzKGFyZ3MpIHtcbiAgICBjb25zdCBwb3N0ZWRTbmFwc2hvdHNCeVN5bmNJZCA9IG5ldyBNYXAoKVxuXG4gICAgYXdhaXQgdGhpcy5yZXBsYXlQZW5kaW5nKHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGJhdGNoU2l6ZTogYXJncy5iYXRjaFNpemUsXG4gICAgICBtYXJrU3VjY2Vzc2Z1bDogYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgICAgY29uc3Qgc3luY0lkID0gKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpXG4gICAgICAgIC8vIFJlbG9hZCB3aXRoIHRoZSByZXNvdXJjZSBwcmVsb2FkZWQgc28gcm93cyByZWx5aW5nIG9uIHRoZSByZXNvdXJjZS1hdHRyaWJ1dGVzXG4gICAgICAgIC8vIGZhbGxiYWNrIGluIGxvY2FsU3luY0RhdGEgY29tcGFyZSBhZ2FpbnN0IHRoZSBzYW1lIHNuYXBzaG90IHRoZXkgcG9zdGVkLlxuICAgICAgICBjb25zdCBjdXJyZW50U3luYyA9IGF3YWl0IGFyZ3Muc3luY01vZGVsLnByZWxvYWQoe3Jlc291cmNlOiB0cnVlfSkud2hlcmUoe2lkOiBzeW5jSWR9KS5maXJzdCgpXG5cbiAgICAgICAgaWYgKCFjdXJyZW50U3luYykgcmV0dXJuXG4gICAgICAgIC8vIEEgcm93IGVkaXRlZCB3aGlsZSBpdHMgb2xkIHBheWxvYWQgd2FzIGluIGZsaWdodCBzdGF5cyBwZW5kaW5nLCBzbyB0aGVcbiAgICAgICAgLy8gbmV3ZXIgbG9jYWwgY2hhbmdlIHJlcGxheXMgb24gdGhlIG5leHQgZHJhaW4gaW5zdGVhZCBvZiBiZWluZyBsb3N0LlxuICAgICAgICBpZiAodGhpcy5sb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChjdXJyZW50U3luYykgIT09IHBvc3RlZFNuYXBzaG90c0J5U3luY0lkLmdldChTdHJpbmcoc3luY0lkKSkpIHJldHVyblxuXG4gICAgICAgIGF3YWl0IGN1cnJlbnRTeW5jLnVwZGF0ZSh7c3RhdGU6IFwic3VjY2Vzc1wifSlcbiAgICAgIH0sXG4gICAgICBwZW5kaW5nU3luY3M6IGFzeW5jICgpID0+IGF3YWl0IGFyZ3Muc3luY01vZGVsLnByZWxvYWQoe3Jlc291cmNlOiB0cnVlfSkud2hlcmUoe3N0YXRlOiBcInBlbmRpbmdcIn0pLm9yZGVyKFwiY3JlYXRlZF9hdFwiKS50b0FycmF5KCksXG4gICAgICBwb3N0UmVwbGF5OiBhcmdzLnBvc3RSZXBsYXksXG4gICAgICBzaWduYWw6IGFyZ3Muc2lnbmFsLFxuICAgICAgc3luY0lkOiAoc3luYykgPT4gKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpLFxuICAgICAgc3luY1BheWxvYWQ6IChzeW5jKSA9PiB7XG4gICAgICAgIHBvc3RlZFNuYXBzaG90c0J5U3luY0lkLnNldChTdHJpbmcoKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpKSwgdGhpcy5sb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChzeW5jKSlcblxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFN5bmNQYXlsb2FkKHN5bmMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoZSByZXBsYXktcmVsZXZhbnQgc3RhdGUgb2YgYSBsb2NhbCBzeW5jIHJvdyBmb3IgaW4tZmxpZ2h0IGNvbXBhcmlzb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBzeW5jIC0gTG9jYWwgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSBzbmFwc2hvdCBvZiB0aGUgcm93J3MgcmVwbGF5ZWQgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChzeW5jKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtkYXRhOiB0aGlzLmxvY2FsU3luY0RhdGEoc3luYyksIHN5bmNUeXBlOiBzeW5jLnN5bmNUeXBlKCl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBvbmUgcmVwbGF5IGVudmVsb3BlIGZyb20gYSBsb2NhbCBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc3luYyAtIExvY2FsIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7e2NsaWVudFVwZGF0ZWRBdD86IHN0cmluZywgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGlkOiBudW1iZXIsIHJlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmcsIHN5bmNUeXBlOiBzdHJpbmd9fSBTeW5jIHJlcGxheSBlbnZlbG9wZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNQYXlsb2FkKHN5bmMpIHtcbiAgICBjb25zdCBjbGllbnRVcGRhdGVkQXQgPSBzeW5jLnVwZGF0ZWRBdCgpIHx8IHN5bmMuY3JlYXRlZEF0KClcblxuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRVcGRhdGVkQXQ6IGNsaWVudFVwZGF0ZWRBdCA/IGNsaWVudFVwZGF0ZWRBdC50b0lTT1N0cmluZygpIDogdW5kZWZpbmVkLFxuICAgICAgZGF0YTogdGhpcy5sb2NhbFN5bmNEYXRhKHN5bmMpLFxuICAgICAgaWQ6IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoc3luYy5pZCgpKSksXG4gICAgICByZXNvdXJjZUlkOiBTdHJpbmcoc3luYy5yZXNvdXJjZUlkKCkpLFxuICAgICAgcmVzb3VyY2VUeXBlOiBzeW5jLnJlc291cmNlVHlwZSgpIHx8IFwiXCIsXG4gICAgICBzeW5jVHlwZTogc3luYy5zeW5jVHlwZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uZSBsb2NhbCBzeW5jIHJvdyBwYXlsb2FkLCBmYWxsaW5nIGJhY2sgdG8gcHJlbG9hZGVkIHJlc291cmNlIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHN5bmMgLSBMb2NhbCBzeW5jIHJvdy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBTeW5jIGRhdGEuXG4gICAqL1xuICBzdGF0aWMgbG9jYWxTeW5jRGF0YShzeW5jKSB7XG4gICAgbGV0IHN5bmNEYXRhID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHN5bmMuZGF0YSgpIHx8IHt9KVxuXG4gICAgaWYgKHR5cGVvZiBzeW5jRGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3luY0RhdGEgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoSlNPTi5wYXJzZShzeW5jRGF0YSkpXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgc3luY0RhdGEgPSB7fVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhzeW5jRGF0YSkubGVuZ3RoID4gMCkgcmV0dXJuIHN5bmNEYXRhXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChzeW5jLnJlc291cmNlKCkuYXR0cmlidXRlcygpKVxuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIGxvY2FsIHN5bmMgcm93IGZvciBhIFZlbG9jaW91cyBtb2RlbCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBRdWV1ZSBhcmdzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnJlc291cmNlIC0gUmVzb3VyY2UgYmVpbmcgc3luY2VkLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnN5bmNNb2RlbCAtIExvY2FsIFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLmRhdGFdIC0gRXhwbGljaXQgc3luYyBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3luY1R5cGVdIC0gU3luYyBvcGVyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MubG9jYWxPbmx5QXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIHRvIHN0cmlwIGZyb20gcXVldWVkIHBheWxvYWRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5ib29sZWFuQXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIHRvIGNvZXJjZSB0aHJvdWdoIHN5bmMgYm9vbGVhbiBwYXJzaW5nLlxuICAgKiBAcGFyYW0geyhkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLm5vcm1hbGl6ZURhdGFdIC0gQXBwLXNwZWNpZmljIGRhdGEgbm9ybWFsaXplci5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBMb2NhbCBzeW5jIHJvdy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBxdWV1ZUxvY2FsU3luYyhhcmdzKSB7XG4gICAgY29uc3QgcmVzb3VyY2VSZWNvcmRJZCA9IHNjYWxhck1vZGVsUHJpbWFyeUtleVZhbHVlKGFyZ3MucmVzb3VyY2UuaWQoKSwgXCJMb2NhbCBzeW5jIHF1ZXVlaW5nXCIpXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IGFyZ3MucmVzb3VyY2UuY29uc3RydWN0b3JcblxuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlc291cmNlIG1vZGVsIGNsYXNzIG11c3QgaW1wbGVtZW50IHN0YXRpYyBnZXRNb2RlbE5hbWUoKSB0byBxdWV1ZSBzeW5jIGRhdGEgLSBjbGFzcyBuYW1lcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3MgZXhwbGljaXQgbW9kZWwgbmFtZXMgYW5kIG1pbmlmaWVkIGJ1bmRsZXNcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG4gICAgY29uc3Qgc3luY0RhdGEgPSB0aGlzLnF1ZXVlZFN5bmNEYXRhKGFyZ3MpXG4gICAgY29uc3Qgc3luY1R5cGUgPSBhcmdzLnN5bmNUeXBlIHx8IFwidXBkYXRlXCJcblxuICAgIGlmICghcmVzb3VyY2VSZWNvcmRJZCkgdGhyb3cgbmV3IEVycm9yKFwicmVzb3VyY2UuaWQoKSBpcyByZXF1aXJlZCB0byBxdWV1ZSBzeW5jIGRhdGFcIilcblxuICAgIGNvbnN0IHJlc291cmNlSWQgPSBTdHJpbmcocmVzb3VyY2VSZWNvcmRJZClcbiAgICBjb25zdCBleGlzdGluZ1N5bmMgPSBhd2FpdCBhcmdzLnN5bmNNb2RlbC5maW5kQnkoe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZX0pXG5cbiAgICBpZiAoZXhpc3RpbmdTeW5jKSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1N5bmMudXBkYXRlKHtcbiAgICAgICAgZGF0YTogc3luY0RhdGEsXG4gICAgICAgIHN0YXRlOiBcInBlbmRpbmdcIixcbiAgICAgICAgc3luY1R5cGVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBleGlzdGluZ1N5bmNcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgYXJncy5zeW5jTW9kZWwuY3JlYXRlKHtcbiAgICAgIGRhdGE6IHN5bmNEYXRhLFxuICAgICAgcmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIHN0YXRlOiBcInBlbmRpbmdcIixcbiAgICAgIHN5bmNUeXBlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYmFja2VuZC1zYWZlIHF1ZXVlZCBzeW5jIGRhdGEgd2l0aG91dCBtdXRhdGluZyBjYWxsZXIgZGF0YS4gVGhlIGRlZmF1bHRcbiAgICogKG5vIGV4cGxpY2l0IGBkYXRhYCkgaXMgdGhlIHJlc291cmNlJ3MgYXR0cmlidXRlcyBtaW51cyBsb2NhbC1vbmx5IGF0dHJpYnV0ZXMsXG4gICAqIHdpdGggYm9vbGVhbnMgY29lcmNlZCBhbmQgRGF0ZSB2YWx1ZXMgc2VyaWFsaXplZCB0byBJU08gc3RyaW5ncywgc28gYXBwcyBkb24ndFxuICAgKiBuZWVkIHBlci1tb2RlbCB0cmFja2VkLXBheWxvYWQgYnVpbGRlcnMuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBsb2NhbE9ubHlBdHRyaWJ1dGVzPzogc3RyaW5nW10sIGJvb2xlYW5BdHRyaWJ1dGVzPzogc3RyaW5nW10sIG5vcm1hbGl6ZURhdGE/OiAoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fX0gYXJncyAtIERhdGEgYXJncy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBRdWV1ZWQgZGF0YS5cbiAgICovXG4gIHN0YXRpYyBxdWV1ZWRTeW5jRGF0YShhcmdzKSB7XG4gICAgY29uc3QgaW5wdXREYXRhID0gYXJncy5kYXRhID8/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChhcmdzLnJlc291cmNlLmF0dHJpYnV0ZXMoKSlcbiAgICBjb25zdCBub3JtYWxpemVkRGF0YSA9IGFyZ3Mubm9ybWFsaXplRGF0YSA/IGFyZ3Mubm9ybWFsaXplRGF0YShpbnB1dERhdGEpIDogaW5wdXREYXRhXG4gICAgY29uc3Qgc3luY0RhdGEgPSB7Li4ubm9ybWFsaXplZERhdGF9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzIHx8IFtdKSBkZWxldGUgc3luY0RhdGFbYXR0cmlidXRlTmFtZV1cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXJncy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSkge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24oc3luY0RhdGEsIGF0dHJpYnV0ZU5hbWUpKSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXSA9IHRoaXMub3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHN5bmNEYXRhW2F0dHJpYnV0ZU5hbWVdLCBhdHRyaWJ1dGVOYW1lKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3luY0RhdGEpKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXSA9IHZhbHVlLnRvSVNPU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY0RhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzbWFsbCBhcHAtZmFjaW5nIGxvY2FsIHN5bmMgcXVldWUgZmFjYWRlIGZyb20gZGVjbGFyYXRpdmUgbW9kZWwgY29uZmlnLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFF1ZXVlIGNvbmZpZy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5zeW5jTW9kZWwgLSBMb2NhbCBTeW5jIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zaW5nbGVGbGlnaHRLZXkgLSBLZXkgdXNlZCB0byBzZXJpYWxpemUgYmFja2VuZCByZXBsYXkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gYXJncy5zeW5jUGVuZGluZyAtIEJhY2tlbmQgcmVwbGF5IGNhbGxiYWNrLlxuICAgKiBAcGFyYW0geyhyZXNvdXJjZTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IHN0cmluZ1tdfSBbYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzXSAtIFJlc291cmNlLXNwZWNpZmljIGxvY2FsLW9ubHkgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHsocmVzb3VyY2U6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiBzdHJpbmdbXX0gW2FyZ3MuYm9vbGVhbkF0dHJpYnV0ZXNdIC0gUmVzb3VyY2Utc3BlY2lmaWMgU1FMaXRlIGJvb2xlYW4gYXR0cmlidXRlcy5cbiAgICogQHJldHVybnMge3txdWV1ZTogKHF1ZXVlQXJnczoge3Jlc291cmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzeW5jVHlwZT86IHN0cmluZ30pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzeW5jUGVuZGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPn19IENvbmZpZ3VyZWQgbG9jYWwgc3luYyBxdWV1ZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNRdWV1ZShhcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlOiBhc3luYyAocXVldWVBcmdzKSA9PiBhd2FpdCB0aGlzLnF1ZXVlTG9jYWxTeW5jKHtcbiAgICAgICAgLi4ucXVldWVBcmdzLFxuICAgICAgICBib29sZWFuQXR0cmlidXRlczogYXJncy5ib29sZWFuQXR0cmlidXRlcyA/IGFyZ3MuYm9vbGVhbkF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMgPyBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBzeW5jTW9kZWw6IGFyZ3Muc3luY01vZGVsXG4gICAgICB9KSxcbiAgICAgIHN5bmNQZW5kaW5nOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNpbmdsZUZsaWdodChhcmdzLnNpbmdsZUZsaWdodEtleSwgYXJncy5zeW5jUGVuZGluZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGJvb2xlYW5zIGNvbW1vbmx5IHVzZWQgYnkgU1FMaXRlL29mZmxpbmUgc3luYyBwYXlsb2Fkcy5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFN5bmMgZGVjaXNpb24gdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIC0gRXJyb3IgY29udGV4dC5cbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSBQYXJzZWQgYm9vbGVhbi1saWtlIGJhY2tlbmQvbG9jYWwgdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgb3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHZhbHVlLCBkZXNjcmlwdGlvbiA9IFwic3luYyBib29sZWFuXCIpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlXG4gICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBvcHRpb25hbEJvb2xlYW4odmFsdWUsIGRlc2NyaXB0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYm9vbGVhbiBzeW5jIHZhbHVlIHRvIFNRTGl0ZSBib29sZWFuIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGx9IHZhbHVlIC0gU3luYyBib29sZWFuIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7MCB8IDF9IFNRTGl0ZS1jb21wYXRpYmxlIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgc3FsaXRlQm9vbGVhblN5bmNWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IDEgOiAwXG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdHMgZ2VuZXJpYyBzeW5jIGNvdW50ZXJzIGludG8gYXBwLXNwZWNpZmljIHJlc3VsdCBrZXlzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlc3VsdCBhcmdzLlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VzUmVzdWx0fSBhcmdzLnJlc3VsdCAtIEdlbmVyaWMgVmVsb2Npb3VzIHN5bmMgcmVzdWx0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHtjaGFuZ2VkS2V5OiBzdHJpbmcsIGNvdW50S2V5OiBzdHJpbmd9Pn0gYXJncy5yZXNvdXJjZXMgLSBSZXNvdXJjZSByZXN1bHQga2V5IG1hcC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBQcm9qZWN0ZWQgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIHN5bmNSZXN1bHRGb3JSZXNvdXJjZXMoe3Jlc3VsdCwgcmVzb3VyY2VzfSkge1xuICAgIGNvbnN0IHN5bmNSZXN1bHQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoe1xuICAgICAgY2hhbmdlZDogcmVzdWx0LmNoYW5nZWQsXG4gICAgICBwYWdlczogcmVzdWx0LnBhZ2VzLFxuICAgICAgc3luY2VkQ291bnQ6IHJlc3VsdC5zeW5jZWRDb3VudFxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGtleXNdIG9mIE9iamVjdC5lbnRyaWVzKHJlc291cmNlcykpIHtcbiAgICAgIHN5bmNSZXN1bHRba2V5cy5jb3VudEtleV0gPSByZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwXG4gICAgICBzeW5jUmVzdWx0W2tleXMuY2hhbmdlZEtleV0gPSByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHwgZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY1Jlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIHN5bmMgcmVjb3JkcyBpbiBzdGFibGUgb3JkZXIgYW5kIG1hcmtzIGFja25vd2xlZGdlZCByb3dzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcGxheSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggcmVwbGF5IHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8QXJyYXk8dW5rbm93bj4+fSBhcmdzLnBlbmRpbmdTeW5jcyAtIExvYWRzIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIGluIHJlcGxheSBvcmRlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5zeW5jSWQgLSBSZXR1cm5zIHRoZSBsb2NhbCBzeW5jIGlkLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3Muc3luY1BheWxvYWQgLSBCdWlsZHMgdGhlIEFQSSBzeW5jIGVudmVsb3BlLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0sIG9wdGlvbnM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWx9KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFBvc3RzIG9uZSByZXBsYXkgcmVxdWVzdC5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93biwgcmVzcG9uc2U6IFN5bmNSZXBsYXlJdGVtKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLm1hcmtTdWNjZXNzZnVsIC0gTWFya3Mgb25lIHN5bmMgYXMgc3VjY2Vzc2Z1bCBsb2NhbGx5LlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBhbGwgYmF0Y2hlcyBhcmUgcmVwbGF5ZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVwbGF5UGVuZGluZyhhcmdzKSB7XG4gICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgIGNvbnN0IHBlbmRpbmdTeW5jcyA9IGF3YWl0IGFyZ3MucGVuZGluZ1N5bmNzKClcbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgY29uc3QgYmF0Y2hTaXplID0gdGhpcy5ub3JtYWxpemVkQmF0Y2hTaXplKGFyZ3MuYmF0Y2hTaXplKVxuXG4gICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgcGVuZGluZ1N5bmNzLmxlbmd0aDsgb2Zmc2V0ICs9IGJhdGNoU2l6ZSkge1xuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgYXdhaXQgdGhpcy5yZXBsYXlCYXRjaCh7Li4uYXJncywgcGVuZGluZ1N5bmNzOiBwZW5kaW5nU3luY3Muc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBiYXRjaFNpemUpfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5cyBvbmUgYmF0Y2ggb2Ygc3luY3MuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVwbGF5IGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuLlxuICAgKiBAcGFyYW0ge0FycmF5PHVua25vd24+fSBhcmdzLnBlbmRpbmdTeW5jcyAtIEJhdGNoIHN5bmNzLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnN5bmNJZCAtIFN5bmMgaWQgZ2V0dGVyLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3Muc3luY1BheWxvYWQgLSBQYXlsb2FkIGJ1aWxkZXIuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHthdXRoZW50aWNhdGlvblRva2VuOiBzdHJpbmcsIHN5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSwgb3B0aW9ucz86IHtzaWduYWw/OiBBYm9ydFNpZ25hbH0pID0+IFByb21pc2U8U3luY1JlcGxheVJlc3BvbnNlPn0gYXJncy5wb3N0UmVwbGF5IC0gUmVwbGF5IHBvc3Rlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93biwgcmVzcG9uc2U6IFN5bmNSZXBsYXlJdGVtKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLm1hcmtTdWNjZXNzZnVsIC0gU3VjY2VzcyBob29rLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciB0aGUgYmF0Y2ggaXMgYWNrbm93bGVkZ2VkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUJhdGNoKGFyZ3MpIHtcbiAgICBjb25zdCB7YXV0aGVudGljYXRpb25Ub2tlbiwgbWFya1N1Y2Nlc3NmdWwsIHBlbmRpbmdTeW5jcywgcG9zdFJlcGxheSwgc2lnbmFsLCBzeW5jSWQsIHN5bmNQYXlsb2FkfSA9IGFyZ3NcblxuICAgIGlmIChwZW5kaW5nU3luY3MubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuXG4gICAgY29uc3Qgc3luY3NCeUlkID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHN5bmMgb2YgcGVuZGluZ1N5bmNzKSB7XG4gICAgICBjb25zdCBpZCA9IHN5bmNJZChzeW5jKVxuXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbCkgc3luY3NCeUlkLnNldChTdHJpbmcoaWQpLCBzeW5jKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFJlcGxheSh7XG4gICAgICBhdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgc3luY3M6IHBlbmRpbmdTeW5jcy5tYXAoKHN5bmMpID0+IHN5bmNQYXlsb2FkKHN5bmMpKVxuICAgIH0sIHtzaWduYWx9KVxuXG4gICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICB0aGlzLmVuc3VyZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwb25zZSlcblxuICAgIGZvciAoY29uc3Qgc3luY1Jlc3BvbnNlIG9mIHJlc3BvbnNlLnN5bmNzIHx8IFtdKSB7XG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgICAgY29uc3Qgc3luYyA9IHN5bmNzQnlJZC5nZXQoU3RyaW5nKHN5bmNSZXNwb25zZS5pZCkpXG5cbiAgICAgIGlmICghc3luYykgY29udGludWVcbiAgICAgIGlmIChzeW5jUmVzcG9uc2Uuc3luY1N0YXRlICE9PSBcInN1Y2Nlc3NmdWxcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luYyBzdGF0ZSByZXR1cm5lZCBmb3Igc3luYyAke1N0cmluZyhzeW5jUmVzcG9uc2UuaWQpfTogJHtTdHJpbmcoc3luY1Jlc3BvbnNlLnN5bmNTdGF0ZSl9YClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbWFya1N1Y2Nlc3NmdWwoc3luYywgc3luY1Jlc3BvbnNlKVxuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIEFQSSByZXNwb25zZSBzdGF0dXMgYW5kIHNoYXBlLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlSZXNwb25zZX0gcmVzcG9uc2UgLSBSZXBsYXkgcmVzcG9uc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGVuc3VyZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IFwiZXJyb3JcIikgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yTWVzc2FnZSB8fCBcIlN5bmMgZmFpbGVkXCIpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnN5bmNzKSkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyByZXNwb25zZSBtaXNzaW5nIHN5bmNzXCIpXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIHBvc2l0aXZlIGJhdGNoIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBiYXRjaFNpemUgLSBCYXRjaCBzaXplLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBQb3NpdGl2ZSBiYXRjaCBzaXplLlxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZWRCYXRjaFNpemUoYmF0Y2hTaXplKSB7XG4gICAgaWYgKHR5cGVvZiBiYXRjaFNpemUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShiYXRjaFNpemUpIHx8IGJhdGNoU2l6ZSA8IDEpIHJldHVybiAxMDBcblxuICAgIHJldHVybiBNYXRoLmZsb29yKGJhdGNoU2l6ZSlcbiAgfVxufVxuXG4vKipcbiAqIFRocm93cyB0aGUgZXhhY3QgYWJvcnQgcmVhc29uIGF0IGxpZmVjeWNsZSBib3VuZGFyaWVzIHNvIGNhbGxlcnMgY2FuXG4gKiBkaXN0aW5ndWlzaCBhbiBleHBlY3RlZCBjb29wZXJhdGl2ZSBzdG9wIGZyb20gdHJhbnNwb3J0IG9yIGFwcGx5IGZhaWx1cmVzLlxuICogQHBhcmFtIHtBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZH0gc2lnbmFsIC0gTGlmZWN5Y2xlIHNpZ25hbC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKSB7XG4gIGlmICghc2lnbmFsPy5hYm9ydGVkKSByZXR1cm5cblxuICB0aHJvdyBzaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyBzaWduYWwucmVhc29uIDogbmV3IEVycm9yKFwiU3luYyBvcGVyYXRpb24gYWJvcnRlZFwiKVxufVxuIl19
878
+ /**
879
+ * Resolves one conflict-tracking identity field at queue time: a static string
880
+ * or a function (sync or async) resolving the current value. Grants and policy
881
+ * hashes rotate at runtime, so declarations may resolve them per mutation.
882
+ * @param {{conflictTracking: import("./sync-client-types.js").SyncClientConflictTrackingConfig, key: "actorDeviceId" | "actorUserId" | "offlineGrantId" | "policyHash", resourceType: string}} args - Resolution args.
883
+ * @returns {Promise<string>} - Resolved non-empty identity value.
884
+ */
885
+ async function resolveConflictTrackingIdentityValue({ conflictTracking, key, resourceType }) {
886
+ const value = conflictTracking[key];
887
+ if (typeof value === "function") {
888
+ const resolved = await value();
889
+ if (typeof resolved !== "string" || resolved.length === 0) {
890
+ throw new Error(`${resourceType} conflictTracking.${key} resolved to an empty value`);
891
+ }
892
+ return resolved;
893
+ }
894
+ if (typeof value === "string" && value.length > 0)
895
+ return value;
896
+ throw new Error(`${resourceType} conflictTracking.${key} must be a non-empty string or a function resolving one (or start an offline session)`);
897
+ }
898
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hcGktY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1hcGktY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUV4RCxPQUFPLGFBQWEsTUFBTSwrQkFBK0IsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUN4RSxPQUFPLEVBQUMsdUNBQXVDLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUU5RSxrR0FBa0c7QUFDbEcsNEZBQTRGO0FBQzVGLDRGQUE0RjtBQUM1Riw4RkFBOEY7QUFDOUYsMEZBQTBGO0FBQzFGLDRFQUE0RTtBQUM1RSxvRkFBb0Y7QUFDcEYsNEZBQTRGO0FBQzVGLDRGQUE0RjtBQUM1RixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEVBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDO1FBQ3RJLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsNkJBQTZCLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNqSCxNQUFNLE9BQU8sR0FBRyxNQUFNLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUM1RCxNQUFNLFdBQVcsR0FBRyxPQUFPO2FBQ3hCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxD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Q0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssRUFBRSxDQUFBO1FBRTlCLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFlBQVkscUJBQXFCLEdBQUcsNkJBQTZCLENBQUMsQ0FBQTtRQUN2RixDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRS9ELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxZQUFZLHFCQUFxQixHQUFHLHVGQUF1RixDQUFDLENBQUE7QUFDakosQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge29wdGlvbmFsQm9vbGVhbiwgb3B0aW9uYWxJbnRlZ2VyfSBmcm9tIFwidHlwYW5pY1wiXG5cbmltcG9ydCByZWNvcmRDaGFuZ2VzIGZyb20gXCIuLi9kYXRhYmFzZS9yZWNvcmQtY2hhbmdlcy5qc1wiXG5pbXBvcnQge3NjYWxhck1vZGVsUHJpbWFyeUtleVZhbHVlfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIlxuaW1wb3J0IHthcHBseVN5bmNSZXBsYXlSZXN1bHRUb0xvY2FsTXV0YXRpb25Mb2d9IGZyb20gXCIuL2NvbmZsaWN0LXN0cmF0ZWd5LmpzXCJcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlQXBwbHlSZXN1bHR9IFN5bmNDaGFuZ2VBcHBseVJlc3VsdCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlRW52ZWxvcGV9IFN5bmNDaGFuZ2VFbnZlbG9wZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1JlcXVlc3R9IFN5bmNDaGFuZ2VzUmVxdWVzdCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3BvbnNlfSBTeW5jQ2hhbmdlc1Jlc3BvbnNlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0fSBTeW5jQ2hhbmdlc1Jlc3VsdCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ3Vyc29yfSBTeW5jQ3Vyc29yICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXBsYXlJdGVtfSBTeW5jUmVwbGF5SXRlbSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVwbGF5UmVzcG9uc2V9IFN5bmNSZXBsYXlSZXNwb25zZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWd9IFN5bmNSZXNvdXJjZUNvbmZpZyAqL1xuY29uc3Qgc3luY1Rhc2tQcm9taXNlcyA9IG5ldyBNYXAoKVxuXG4vKipcbiAqIEdlbmVyaWMgY2xpZW50LXNpZGUgaGVscGVyIGZvciByZXBsYXlpbmcgcGVuZGluZyBzeW5jIGVudmVsb3BlcyB0aHJvdWdoIHRoZVxuICogZnJhbWV3b3JrLW93bmVkIGAvdmVsb2Npb3VzL3N5bmMvcmVwbGF5YCBlbmRwb2ludC4gQXBwcyBwcm92aWRlIG9ubHkgbG9jYWxcbiAqIHBlcnNpc3RlbmNlL2F1dGggaG9va3MuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNBcGlDbGllbnQge1xuICAvKipcbiAgICogQXBwZW5kcyBvbmUgY29uZmxpY3QtdHJhY2tlZCBpbnRlbnQgdG8gdGhlIGV4aXN0aW5nIGR1cmFibGUgbXV0YXRpb24gbG9nLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFF1ZXVlIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBhcmdzLmJhc2VWZXJzaW9uIC0gQXV0aG9yaXRhdGl2ZSB2ZXJzaW9uIG9ic2VydmVkIGJlZm9yZSB0aGUgbG9jYWwgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50Q29uZmxpY3RUcmFja2luZ0NvbmZpZ30gYXJncy5jb25mbGljdFRyYWNraW5nIC0gRHVyYWJsZSB0cmFja2luZyBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhcmdzLmRhdGEgLSBCYWNrZW5kLXNhZmUgbXV0YXRpb24gYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtb2ZmbGluZS1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLm9mZmxpbmVTZXNzaW9uXSAtIEFjdGl2ZSBsb25nLW9mZmxpbmUgc2Vzc2lvbjogdGhlIG11dGF0aW9uIGlkZW50aXR5IChhY3RvciBpZHMsIGdyYW50IGlkLCBwb2xpY3kgaGFzaCkgaXMgc3VwcGxpZWQgYnkgdGhlIHNlc3Npb24gYW5kIHRoZSBhcHBlbmRlZCByZWNvcmQgY2FycmllcyB0aGUgZGV2aWNlLXNpZ25lZCBlbnZlbG9wZS5cbiAgICogQHBhcmFtIHtcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwifSBhcmdzLm9wZXJhdGlvbiAtIExvY2FsIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5yZXNvdXJjZSAtIExvY2FsIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVR5cGUgLSBSZXNvdXJjZSB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zeW5jVHlwZSAtIFdpcmUgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkPn0gQXBwZW5kZWQgaW50ZW50LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHF1ZXVlQ29uZmxpY3RUcmFja2VkU3luYyh7YmFzZVZlcnNpb24sIGNvbmZsaWN0VHJhY2tpbmcsIGRhdGEsIG9mZmxpbmVTZXNzaW9uLCBvcGVyYXRpb24sIHJlc291cmNlLCByZXNvdXJjZVR5cGUsIHN5bmNUeXBlfSkge1xuICAgIGNvbnN0IHJlc291cmNlSWQgPSBTdHJpbmcoc2NhbGFyTW9kZWxQcmltYXJ5S2V5VmFsdWUocmVzb3VyY2UuaWQoKSwgYENvbmZsaWN0LXRyYWNrZWQgc3luYyBmb3IgJHtyZXNvdXJjZVR5cGV9YCkpXG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cucmVjb3JkcygpXG4gICAgY29uc3QgcHJlZGVjZXNzb3IgPSByZWNvcmRzXG4gICAgICAuZmlsdGVyKChyZWNvcmQpID0+IHJlY29yZC5tdXRhdGlvbi5tb2RlbCA9PT0gcmVzb3VyY2VUeXBlICYmIHJlY29yZC5tdXRhdGlvbi5wYXlsb2FkPy5yZXNvdXJjZUlkID09PSByZXNvdXJjZUlkKVxuICAgICAgLmF0KC0xKVxuICAgIGNvbnN0IGNsaWVudE11dGF0aW9uSWQgPSBjb25mbGljdFRyYWNraW5nLmNsaWVudE11dGF0aW9uSWQoKVxuICAgIGNvbnN0IG5vdyA9IGNvbmZsaWN0VHJhY2tpbmcubm93ID8gY29uZmxpY3RUcmFja2luZy5ub3coKSA6IG5ldyBEYXRlKClcbiAgICBjb25zdCBwcmVkZWNlc3NvclRpbWUgPSBwcmVkZWNlc3NvciA/IG5ldyBEYXRlKHByZWRlY2Vzc29yLm11dGF0aW9uLm9jY3VycmVkQXQpLmdldFRpbWUoKSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgIGNvbnN0IG9jY3VycmVkQXQgPSBuZXcgRGF0ZShNYXRoLm1heChub3cuZ2V0VGltZSgpLCBwcmVkZWNlc3NvclRpbWUgKyAxKSkudG9JU09TdHJpbmcoKVxuXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcHJlZGVjZXNzb3IgPyBbe2NsaWVudE11dGF0aW9uSWQ6IHByZWRlY2Vzc29yLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIG1vZGVsOiByZXNvdXJjZVR5cGV9XSA6IFtdXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChkYXRhKVxuXG4gICAgaWYgKG9mZmxpbmVTZXNzaW9uKSB7XG4gICAgICAvLyBMb25nLW9mZmxpbmUgcXVldWVpbmc6IHRoZSBzZXNzaW9uIHN1cHBsaWVzIHRoZSByb3RhdGluZyBpZGVudGl0eVxuICAgICAgLy8gKGFjdG9yIGlkcywgbGl2ZSBncmFudCBpZCwgY3VycmVudCBwb2xpY3kgaGFzaCkgYW5kIHNpZ25zIHRoZSBpbnRlbnRcbiAgICAgIC8vIHdpdGggdGhlIGRldmljZSBrZXkgc28gaXQgY2FuIHJlcGxheSB3aXRob3V0IGEgbGl2ZSBzZXNzaW9uLlxuICAgICAgY29uc3Qgc2lnbmVkTXV0YXRpb24gPSBhd2FpdCBvZmZsaW5lU2Vzc2lvbi5zaWduTXV0YXRpb24oe1xuICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICBiYXNlVmVyc2lvbixcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZCxcbiAgICAgICAgbW9kZWw6IHJlc291cmNlVHlwZSxcbiAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBwYXlsb2FkOiB7cmVzb3VyY2VJZCwgc3luY1R5cGV9XG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gYXdhaXQgY29uZmxpY3RUcmFja2luZy5tdXRhdGlvbkxvZy5hcHBlbmQoe2RlcGVuZGVuY2llcywgbXV0YXRpb246IHNpZ25lZE11dGF0aW9uLm11dGF0aW9uLCBzaWduZWRNdXRhdGlvbn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cuYXBwZW5kKHtcbiAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgIG11dGF0aW9uOiB7XG4gICAgICAgIGFjdG9yRGV2aWNlSWQ6IGF3YWl0IHJlc29sdmVDb25mbGljdFRyYWNraW5nSWRlbnRpdHlWYWx1ZSh7Y29uZmxpY3RUcmFja2luZywga2V5OiBcImFjdG9yRGV2aWNlSWRcIiwgcmVzb3VyY2VUeXBlfSksXG4gICAgICAgIGFjdG9yVXNlcklkOiBhd2FpdCByZXNvbHZlQ29uZmxpY3RUcmFja2luZ0lkZW50aXR5VmFsdWUoe2NvbmZsaWN0VHJhY2tpbmcsIGtleTogXCJhY3RvclVzZXJJZFwiLCByZXNvdXJjZVR5cGV9KSxcbiAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgYmFzZVZlcnNpb24sXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQsXG4gICAgICAgIG1vZGVsOiByZXNvdXJjZVR5cGUsXG4gICAgICAgIG9jY3VycmVkQXQsXG4gICAgICAgIG9mZmxpbmVHcmFudElkOiBhd2FpdCByZXNvbHZlQ29uZmxpY3RUcmFja2luZ0lkZW50aXR5VmFsdWUoe2NvbmZsaWN0VHJhY2tpbmcsIGtleTogXCJvZmZsaW5lR3JhbnRJZFwiLCByZXNvdXJjZVR5cGV9KSxcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBwYXlsb2FkOiB7cmVzb3VyY2VJZCwgc3luY1R5cGV9LFxuICAgICAgICBwb2xpY3lIYXNoOiBhd2FpdCByZXNvbHZlQ29uZmxpY3RUcmFja2luZ0lkZW50aXR5VmFsdWUoe2NvbmZsaWN0VHJhY2tpbmcsIGtleTogXCJwb2xpY3lIYXNoXCIsIHJlc291cmNlVHlwZX0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbnMgdGhlIGV4aXN0aW5nIG11dGF0aW9uIGxvZyBpbiBwcmVkZWNlc3NvciBvcmRlci4gSW5kZXBlbmRlbnQgcmVjb3Jkc1xuICAgKiBjb250aW51ZSBhZnRlciBkdXJhYmxlIGNvbmZsaWN0cy9yZWplY3Rpb25zOyBzdWNjZXNzb3JzIHN0YXkgYmxvY2tlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZXBsYXkgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aGVudGljYXRpb24gdG9rZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5iYXRjaFNpemVdIC0gQmF0Y2ggc2l6ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25mbGljdFRyYWNraW5nQ29uZmlnfSBhcmdzLmNvbmZsaWN0VHJhY2tpbmcgLSBUcmFja2luZyBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0sIG9wdGlvbnM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWx9KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFRyYW5zcG9ydCBib3VuZGFyeS5cbiAgICogQHBhcmFtIHsoYXJnczoge3JlY29yZDogaW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZCwgcmVzdWx0OiBTeW5jUmVwbGF5SXRlbX0pID0+IFByb21pc2U8dm9pZD59IFthcmdzLmFwcGx5Q29uZmxpY3RdIC0gQXBwbGllcyBhdXRob3JpdGF0aXZlIGNvbmZsaWN0IHN0YXRlIHRvIHRoZSBsb2NhbCByZXBsaWNhIGJlZm9yZSBwcmVzZXJ2aW5nIHRoZSByZWplY3RlZCBpbnRlbnQuXG4gICAqIEBwYXJhbSB7KGlkZW50aXR5OiBzdHJpbmcpID0+IG51bWJlcn0gYXJncy5yZW1vdGVHZW5lcmF0aW9uIC0gQ3VycmVudCByZW1vdGUgZ2VuZXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VUeXBlIC0gUmVzb3VyY2Ugd2hvc2UgbG9nIHJlY29yZHMgc2hvdWxkIGRyYWluLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIG5vIHJlYWR5IGludGVudCByZW1haW5zLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUNvbmZsaWN0VHJhY2tlZFN5bmNzKHthcHBseUNvbmZsaWN0LCBhdXRoZW50aWNhdGlvblRva2VuLCBiYXRjaFNpemUsIGNvbmZsaWN0VHJhY2tpbmcsIHBvc3RSZXBsYXksIHJlbW90ZUdlbmVyYXRpb24sIHJlc291cmNlVHlwZSwgc2lnbmFsfSkge1xuICAgIGNvbnN0IG1heEJhdGNoU2l6ZSA9IHRoaXMubm9ybWFsaXplZEJhdGNoU2l6ZShiYXRjaFNpemUpXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBjb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nLnJlY29yZHMoKVxuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICAgIGNvbnN0IHN0YXR1c2VzID0gbmV3IE1hcChyZWNvcmRzLm1hcCgocmVjb3JkKSA9PiBbcmVjb3JkLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIHJlY29yZC5zdGF0dXNdKSlcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSByZWNvcmRzLmZpbHRlcigocmVjb3JkKSA9PiByZWNvcmQuc3RhdHVzID09PSBcInBlbmRpbmdcIiAmJiByZWNvcmQubXV0YXRpb24ubW9kZWwgPT09IHJlc291cmNlVHlwZSlcbiAgICAgIGNvbnN0IHJlYWR5ID0gcGVuZGluZy5maWx0ZXIoKHJlY29yZCkgPT4gcmVjb3JkLmRlcGVuZGVuY2llcy5ldmVyeSgoZGVwZW5kZW5jeSkgPT4gc3RhdHVzZXMuZ2V0KGRlcGVuZGVuY3kuY2xpZW50TXV0YXRpb25JZCkgPT09IFwic3luY2VkXCIpKVxuXG4gICAgICBpZiAocmVhZHkubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5jb25mbGljdFJlcGxheUdyb3Vwcyh7cGVuZGluZywgcmVhZHl9KS5zbGljZSgwLCBtYXhCYXRjaFNpemUpXG4gICAgICBjb25zdCBnZW5lcmF0aW9ucyA9IG5ldyBNYXAoZ3JvdXBzLm1hcCgoZ3JvdXApID0+IFtncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkLCByZW1vdGVHZW5lcmF0aW9uKHRoaXMuY29uZmxpY3RSZWNvcmRJZGVudGl0eShncm91cFswXSkpXSkpXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RSZXBsYXkoe1xuICAgICAgICBhdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgICBzeW5jczogZ3JvdXBzLm1hcCgoZ3JvdXApID0+IHRoaXMuY29uZmxpY3RSZXBsYXlQYXlsb2FkKGdyb3VwKSlcbiAgICAgIH0sIHtzaWduYWx9KVxuXG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgICAgdGhpcy5lbnN1cmVTdWNjZXNzZnVsUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlc0J5SWQgPSBuZXcgTWFwKChyZXNwb25zZS5zeW5jcyB8fCBbXSkubWFwKChyZXN1bHQpID0+IFtTdHJpbmcocmVzdWx0LmlkKSwgcmVzdWx0XSkpXG5cbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlc0J5SWQuZ2V0KGdyb3VwWzBdLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQpXG5cbiAgICAgICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihgU3luYyByZXNwb25zZSBtaXNzaW5nIHJlc3VsdCBmb3IgbXV0YXRpb24gJHtncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkfWApXG4gICAgICAgIGlmICghW1wic3VjY2Vzc2Z1bFwiLCBcImR1cGxpY2F0ZVwiLCBcImNvbmZsaWN0XCIsIFwiZmFpbGVkXCIsIFwicmVqZWN0ZWRcIl0uaW5jbHVkZXMocmVzdWx0LnN5bmNTdGF0ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luYyBzdGF0ZSByZXR1cm5lZCBmb3IgbXV0YXRpb24gJHtncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkfTogJHtyZXN1bHQuc3luY1N0YXRlfWApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LnN5bmNTdGF0ZSA9PT0gXCJjb25mbGljdFwiICYmIGFwcGx5Q29uZmxpY3QpIHtcbiAgICAgICAgICBhd2FpdCBhcHBseUNvbmZsaWN0KHtyZWNvcmQ6IGdyb3VwWzBdLCByZXN1bHR9KVxuICAgICAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBncm91cCkge1xuICAgICAgICAgIGF3YWl0IGFwcGx5U3luY1JlcGxheVJlc3VsdFRvTG9jYWxNdXRhdGlvbkxvZyh7bXV0YXRpb25Mb2c6IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2csIHJlY29yZCwgcmVzdWx0OiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHJlc3VsdCl9KVxuICAgICAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoW1wic3VjY2Vzc2Z1bFwiLCBcImR1cGxpY2F0ZVwiXS5pbmNsdWRlcyhyZXN1bHQuc3luY1N0YXRlKSAmJiByZXN1bHQuc2VydmVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmNvbmZsaWN0UmVjb3JkSWRlbnRpdHkoZ3JvdXBbMF0pXG5cbiAgICAgICAgICBpZiAocmVtb3RlR2VuZXJhdGlvbihpZGVudGl0eSkgPT09IGdlbmVyYXRpb25zLmdldChncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWJhc2VDb25mbGljdFN1Y2Nlc3Nvcih7Y29uZmxpY3RUcmFja2luZywgcHJlZGVjZXNzb3I6IGdyb3VwW2dyb3VwLmxlbmd0aCAtIDFdLCBzZXJ2ZXJWZXJzaW9uOiByZXN1bHQuc2VydmVyVmVyc2lvbn0pXG4gICAgICAgICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgc2FmZSB0cmFuc3BvcnQgZ3JvdXBzIGZyb20gcm9vdC1yZWFkeSByZWNvcmRzIGFuZCB0aGVpciBzdWNjZXNzb3JzLlxuICAgKiBAcGFyYW0ge3twZW5kaW5nOiBBcnJheTxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkPiwgcmVhZHk6IEFycmF5PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fX0gYXJncyAtIFBlbmRpbmcgYW5kIHJvb3QtcmVhZHkgcmVjb3Jkcy5cbiAgICogQHJldHVybnMge0FycmF5PEFycmF5PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+Pn0gU2FmZSB0cmFuc3BvcnQgZ3JvdXBzLlxuICAgKi9cbiAgc3RhdGljIGNvbmZsaWN0UmVwbGF5R3JvdXBzKHtwZW5kaW5nLCByZWFkeX0pIHtcbiAgICBjb25zdCBncm91cHMgPSBbXVxuICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpdGllcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVhZHkpIHtcbiAgICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KHJlY29yZClcblxuICAgICAgaWYgKHNlbGVjdGVkSWRlbnRpdGllcy5oYXMoaWRlbnRpdHkpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBncm91cCA9IFtyZWNvcmRdXG4gICAgICBsZXQgdGFpbCA9IHJlY29yZFxuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBzdWNjZXNzb3IgPSBwZW5kaW5nLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmRlcGVuZGVuY2llcy5zb21lKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LmNsaWVudE11dGF0aW9uSWQgPT09IHRhaWwubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCkpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzb3IgfHwgIXRoaXMuY2FuQ29hbGVzY2VDb25mbGljdFJlY29yZHModGFpbCwgc3VjY2Vzc29yKSkgYnJlYWtcbiAgICAgICAgZ3JvdXAucHVzaChzdWNjZXNzb3IpXG4gICAgICAgIHRhaWwgPSBzdWNjZXNzb3JcbiAgICAgIH1cblxuICAgICAgZ3JvdXBzLnB1c2goZ3JvdXApXG4gICAgICBzZWxlY3RlZElkZW50aXRpZXMuYWRkKGlkZW50aXR5KVxuICAgIH1cblxuICAgIHJldHVybiBncm91cHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0d28gZHVyYWJsZSBpbnRlbnRzIGNhbiBzaGFyZSBvbmUgdHJhbnNwb3J0IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IGxlZnQgLSBFYXJsaWVyIGludGVudC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByaWdodCAtIExhdGVyIGludGVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgc2NhbGFyIHVwZGF0ZXMgY2FuIHNoYXJlIG9uZSB0cmFuc3BvcnQgbXV0YXRpb24uXG4gICAqL1xuICBzdGF0aWMgY2FuQ29hbGVzY2VDb25mbGljdFJlY29yZHMobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAobGVmdC5tdXRhdGlvbi5vcGVyYXRpb24gIT09IFwidXBkYXRlXCIgfHwgcmlnaHQubXV0YXRpb24ub3BlcmF0aW9uICE9PSBcInVwZGF0ZVwiKSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KGxlZnQpICE9PSB0aGlzLmNvbmZsaWN0UmVjb3JkSWRlbnRpdHkocmlnaHQpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAobGVmdC5tdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gcmlnaHQubXV0YXRpb24uYmFzZVZlcnNpb24pIHJldHVybiBmYWxzZVxuICAgIGlmICghdGhpcy5zY2FsYXJTeW5jQXR0cmlidXRlcyhsZWZ0Lm11dGF0aW9uLmF0dHJpYnV0ZXMpIHx8ICF0aGlzLnNjYWxhclN5bmNBdHRyaWJ1dGVzKHJpZ2h0Lm11dGF0aW9uLmF0dHJpYnV0ZXMpKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiAhT2JqZWN0LmtleXMobGVmdC5tdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHt9KS5zb21lKChrZXkpID0+IE9iamVjdC5oYXNPd24ocmlnaHQubXV0YXRpb24uYXR0cmlidXRlcyB8fCB7fSwga2V5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhdHRyaWJ1dGVzIGNvbnRhaW4gc2NhbGFyIEpTT04gdmFsdWVzIG9ubHkuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT4gfCB1bmRlZmluZWR9IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBldmVyeSB2YWx1ZSBpcyBzY2FsYXIuXG4gICAqL1xuICBzdGF0aWMgc2NhbGFyU3luY0F0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIHJldHVybiBCb29sZWFuKGF0dHJpYnV0ZXMpICYmIE9iamVjdC52YWx1ZXMoYXR0cmlidXRlcyB8fCB7fSkuZXZlcnkoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCB8fCBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIG9uZSByZXBsYXkgZW52ZWxvcGUgZm9yIGEgc2FmZSB0cmFuc3BvcnQgZ3JvdXAuXG4gICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59IGdyb3VwIC0gVHJhbnNwb3J0IGdyb3VwLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBSZXBsYXkgZW52ZWxvcGUuXG4gICAqL1xuICBzdGF0aWMgY29uZmxpY3RSZXBsYXlQYXlsb2FkKGdyb3VwKSB7XG4gICAgY29uc3QgZmlyc3QgPSBncm91cFswXVxuICAgIGNvbnN0IHBheWxvYWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHtcbiAgICAgIGJhc2VWZXJzaW9uOiBmaXJzdC5tdXRhdGlvbi5iYXNlVmVyc2lvbixcbiAgICAgIGNsaWVudFVwZGF0ZWRBdDogZmlyc3QubXV0YXRpb24ub2NjdXJyZWRBdCxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIC4uLmdyb3VwLm1hcCgocmVjb3JkKSA9PiByZWNvcmQubXV0YXRpb24uYXR0cmlidXRlcyB8fCB7fSkpLFxuICAgICAgaWQ6IGZpcnN0Lm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsXG4gICAgICByZXNvdXJjZUlkOiBmaXJzdC5tdXRhdGlvbi5wYXlsb2FkPy5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VUeXBlOiBmaXJzdC5tdXRhdGlvbi5tb2RlbCxcbiAgICAgIHN5bmNUeXBlOiBmaXJzdC5tdXRhdGlvbi5wYXlsb2FkPy5zeW5jVHlwZVxuICAgIH0pXG5cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN0YWJsZSByZXNvdXJjZSBpZGVudGl0eSBmb3Igb3JkZXJpbmcgYW5kIHJlbW90ZSBnZW5lcmF0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByZWNvcmQgLSBSZWNvcmQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJlc291cmNlIGlkZW50aXR5LlxuICAgKi9cbiAgc3RhdGljIGNvbmZsaWN0UmVjb3JkSWRlbnRpdHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIGAke3JlY29yZC5tdXRhdGlvbi5tb2RlbH06JHtTdHJpbmcocmVjb3JkLm11dGF0aW9uLnBheWxvYWQ/LnJlc291cmNlSWQpfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJhc2VzIHRoZSBkaXJlY3QgcGVuZGluZyBzdWNjZXNzb3IgZnJvbSBhbiBhdXRob3JpdGF0aXZlIGFja25vd2xlZGdlbWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZWJhc2UgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25mbGljdFRyYWNraW5nQ29uZmlnfSBhcmdzLmNvbmZsaWN0VHJhY2tpbmcgLSBUcmFja2luZyBjb25maWcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gYXJncy5wcmVkZWNlc3NvciAtIEFja25vd2xlZGdlZCBwcmVkZWNlc3Nvci5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBhcmdzLnNlcnZlclZlcnNpb24gLSBBdXRob3JpdGF0aXZlIHNlcnZlciB2ZXJzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZWJhc2VDb25mbGljdFN1Y2Nlc3Nvcih7Y29uZmxpY3RUcmFja2luZywgcHJlZGVjZXNzb3IsIHNlcnZlclZlcnNpb259KSB7XG4gICAgY29uc3Qgc3VjY2Vzc29yID0gKGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cucGVuZGluZ1JlY29yZHMoKSlcbiAgICAgIC5maW5kKChyZWNvcmQpID0+IHJlY29yZC5kZXBlbmRlbmNpZXMuc29tZSgoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5jbGllbnRNdXRhdGlvbklkID09PSBwcmVkZWNlc3Nvci5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkKSlcblxuICAgIGlmICghc3VjY2Vzc29yKSByZXR1cm5cblxuICAgIGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cudXBkYXRlTXV0YXRpb24oe1xuICAgICAgaWQ6IHN1Y2Nlc3Nvci5pZCxcbiAgICAgIG11dGF0aW9uOiB7Li4uc3VjY2Vzc29yLm11dGF0aW9uLCBiYXNlVmVyc2lvbjogc2VydmVyVmVyc2lvbn1cbiAgICB9KVxuICB9XG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHN5bmMgd29yayB3aXRoIHRoZSBzYW1lIGtleSBzbyBjYWxsZXJzIGRvIG5vdCBoYXZlIHRvIGtlZXAgYXBwLWxvY2FsIGxvY2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTG9jayBrZXkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBXb3JrIHRvIHJ1biBvbmNlIHByZXZpb3VzIHdvcmsgZmluaXNoZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNpbmdsZUZsaWdodChrZXksIGNhbGxiYWNrKSB7XG4gICAgd2hpbGUgKHN5bmNUYXNrUHJvbWlzZXMuaGFzKGtleSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN5bmNUYXNrUHJvbWlzZXMuZ2V0KGtleSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBUaGUgZmFpbGVkIGZsaWdodCdzIG93biBjYWxsZXIgb2JzZXJ2ZXMgdGhhdCByZWplY3Rpb247IGNhbGxlcnMgcXVldWVkXG4gICAgICAgIC8vIGJlaGluZCBpdCBzdGlsbCBydW4gdGhlaXIgb3duIHdvcmsgc28gcGVuZGluZyByb3dzIHJldHJ5IGFmdGVyIHRoZSBsb2NrIGNsZWFycy5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gY2FsbGJhY2soKVxuICAgIHN5bmNUYXNrUHJvbWlzZXMuc2V0KGtleSwgcHJvbWlzZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzeW5jVGFza1Byb21pc2VzLmdldChrZXkpID09PSBwcm9taXNlKSBzeW5jVGFza1Byb21pc2VzLmRlbGV0ZShrZXkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGJhY2tlbmQgc3luYyBjaGFuZ2VzIHdpdGggYSBmcmFtZXdvcmstbWFuYWdlZCBjdXJzb3Igcm93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFB1bGwgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4gdG8gc2VuZCB3aXRoIGNoYW5nZSByZXF1ZXN0cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmJhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MuY3Vyc29yTW9kZWwgLSBNb2RlbCB0aGF0IHJlc3BvbmRzIHRvIGZpbmRCeS9maW5kT3JJbml0aWFsaXplQnkgZm9yIGN1cnNvciBwZXJzaXN0ZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY3Vyc29yS2V5IC0gQ3Vyc29yIG9wdGlvbiBrZXkuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IFN5bmNDaGFuZ2VzUmVxdWVzdCkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gYXJncy5wb3N0Q2hhbmdlcyAtIFBvc3RzIG9uZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY1Jlc291cmNlQ29uZmlnPn0gYXJncy5yZXNvdXJjZXMgLSBSZXNvdXJjZSBwb2xpY2llcy5cbiAgICogQHBhcmFtIHsocHJvZ3Jlc3M6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNQdWxsUHJvZ3Jlc3MpID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gUHJvZ3Jlc3MgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFthcmdzLnNpZ25hbF0gLSBMaWZlY3ljbGUgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U3luY0NoYW5nZXNSZXN1bHQ+fSBQdWxsIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBwdWxsQ2hhbmdlc1dpdGhDdXJzb3IoYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnB1bGxDaGFuZ2VzKHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGJhdGNoU2l6ZTogYXJncy5iYXRjaFNpemUsXG4gICAgICBsb2FkQ3Vyc29yOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmxvYWRTeW5jQ3Vyc29yKHtjdXJzb3JLZXk6IGFyZ3MuY3Vyc29yS2V5LCBjdXJzb3JNb2RlbDogYXJncy5jdXJzb3JNb2RlbH0pLFxuICAgICAgc2F2ZUN1cnNvcjogYXN5bmMgKGN1cnNvcikgPT4gYXdhaXQgdGhpcy5zYXZlU3luY0N1cnNvcih7Y3Vyc29yLCBjdXJzb3JLZXk6IGFyZ3MuY3Vyc29yS2V5LCBjdXJzb3JNb2RlbDogYXJncy5jdXJzb3JNb2RlbH0pLFxuICAgICAgcG9zdENoYW5nZXM6IGFyZ3MucG9zdENoYW5nZXMsXG4gICAgICBhcHBseVN5bmM6IHRoaXMucmVzb3VyY2VBcHBsaWVyKGFyZ3MucmVzb3VyY2VzKSxcbiAgICAgIG9uUHJvZ3Jlc3M6IGFyZ3Mub25Qcm9ncmVzcyxcbiAgICAgIHNpZ25hbDogYXJncy5zaWduYWxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgcGVyc2lzdGVkIHN5bmMgY3Vyc29yIGZyb20gYSBtb2RlbCByb3cgd2l0aCBhIHZhbHVlIGNvbHVtbi5cbiAgICogQHBhcmFtIHt7Y3Vyc29yS2V5OiBzdHJpbmcsIGN1cnNvck1vZGVsOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn19IGFyZ3MgLSBDdXJzb3IgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IFBlcnNpc3RlZCBjdXJzb3IgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkU3luY0N1cnNvcih7Y3Vyc29yS2V5LCBjdXJzb3JNb2RlbH0pIHtcbiAgICBjb25zdCBvcHRpb24gPSBhd2FpdCBjdXJzb3JNb2RlbC5maW5kQnkoe2tleTogY3Vyc29yS2V5fSlcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24udmFsdWUoKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHBlcnNpc3RlZCBzeW5jIGN1cnNvciB0byBhIG1vZGVsIHJvdyB3aXRoIGEgdmFsdWUgY29sdW1uLlxuICAgKiBAcGFyYW0ge3tjdXJzb3I6IFN5bmNDdXJzb3IsIGN1cnNvcktleTogc3RyaW5nLCBjdXJzb3JNb2RlbDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59fSBhcmdzIC0gQ3Vyc29yIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNhdmVTeW5jQ3Vyc29yKHtjdXJzb3IsIGN1cnNvcktleSwgY3Vyc29yTW9kZWx9KSB7XG4gICAgaWYgKCFjdXJzb3IpIHJldHVyblxuXG4gICAgY29uc3Qgb3B0aW9uID0gYXdhaXQgY3Vyc29yTW9kZWwuZmluZE9ySW5pdGlhbGl6ZUJ5KHtrZXk6IGN1cnNvcktleX0pXG5cbiAgICBvcHRpb24uYXNzaWduKHt2YWx1ZTogSlNPTi5zdHJpbmdpZnkoY3Vyc29yKX0pXG4gICAgaWYgKG9wdGlvbi5pc0NoYW5nZWQoKSkgYXdhaXQgb3B0aW9uLnNhdmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGJhY2tlbmQgc3luYyBjaGFuZ2VzIGluIHN0YWJsZSBwYWdlcywgYXBwbGllcyB0aGVtIGxvY2FsbHksIGFuZCBzdG9yZXNcbiAgICogdGhlIGFja25vd2xlZGdlZCBjdXJzb3IuIEFwcHMgcHJvdmlkZSBvbmx5IGF1dGgsIHBlcnNpc3RlbmNlLCB0cmFuc3BvcnQsIGFuZFxuICAgKiByZXNvdXJjZSBwb2xpY3kgaG9va3MuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUHVsbCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggY2hhbmdlIHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8U3luY0N1cnNvciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSBhcmdzLmxvYWRDdXJzb3IgLSBMb2FkcyB0aGUgcGVyc2lzdGVkIGxvY2FsIGN1cnNvci5cbiAgICogQHBhcmFtIHsoY3Vyc29yOiBTeW5jQ3Vyc29yKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLnNhdmVDdXJzb3IgLSBQZXJzaXN0cyB0aGUgZmluYWwgYWNrbm93bGVkZ2VkIGN1cnNvci5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogU3luY0NoYW5nZXNSZXF1ZXN0LCBvcHRpb25zPzoge3NpZ25hbD86IEFib3J0U2lnbmFsfSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gYXJncy5wb3N0Q2hhbmdlcyAtIFBvc3RzIG9uZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7KHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBhcmdzLmFwcGx5U3luYyAtIEFwcGxpZXMgb25lIG5vcm1hbGl6ZWQgc3luYyByb3cgbG9jYWxseS5cbiAgICogQHBhcmFtIHsocHJvZ3Jlc3M6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNQdWxsUHJvZ3Jlc3MpID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gUHJvZ3Jlc3MgY2FsbGJhY2sgaW52b2tlZCBwZXIgYXBwbGllZCBwYWdlIChhbmQgb25jZSBmb3IgYW4gZW1wdHkgcHVsbCkgd2l0aCB0aGUgYXBwbGllZCBjb3VudHMgYW5kIHRoZSBzdGFibGUgc2VydmVyIHRvdGFsLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDaGFuZ2VzUmVzdWx0Pn0gUHVsbCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHVsbENoYW5nZXMoYXJncykge1xuICAgIHRocm93SWZTeW5jQWJvcnRlZChhcmdzLnNpZ25hbClcbiAgICBsZXQgYWZ0ZXJDdXJzb3IgPSB0aGlzLnN5bmNDdXJzb3JGcm9tUGF5bG9hZChhd2FpdCBhcmdzLmxvYWRDdXJzb3IoKSlcbiAgICBsZXQgdXBUb0N1cnNvciA9IG51bGxcbiAgICBsZXQgcGFnZXMgPSAwXG4gICAgbGV0IHN5bmNlZENvdW50ID0gMFxuICAgIGxldCB0b3RhbCA9IDBcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlXG4gICAgY29uc3QgcmVzb3VyY2VDb3VudHMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovICh7fSlcbiAgICBjb25zdCByZXNvdXJjZUNoYW5nZWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSAqLyAoe30pXG4gICAgY29uc3QgYmF0Y2hTaXplID0gdGhpcy5ub3JtYWxpemVkQmF0Y2hTaXplKGFyZ3MuYmF0Y2hTaXplKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRocm93SWZTeW5jQWJvcnRlZChhcmdzLnNpZ25hbClcbiAgICAgIGNvbnN0IGNoYW5nZXNSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2hhbmdlc1BhZ2Uoey4uLmFyZ3MsIGFmdGVyQ3Vyc29yLCBiYXRjaFNpemUsIHVwVG9DdXJzb3J9KVxuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgY29uc3Qgc3luY3MgPSBjaGFuZ2VzUmVzcG9uc2Uuc3luY3NcblxuICAgICAgaWYgKCF1cFRvQ3Vyc29yKSB1cFRvQ3Vyc29yID0gY2hhbmdlc1Jlc3BvbnNlLnVwVG9DdXJzb3JcblxuICAgICAgLy8gVGhlIHNlcnZlciBjb3VudHMgcGVuZGluZyByb3dzIGZyb20gdGhpcyByZXF1ZXN0J3MgY3Vyc29yLCBzbyBhbHJlYWR5LWFwcGxpZWRcbiAgICAgIC8vIHBhZ2VzIHBsdXMgdGhpcyByZXF1ZXN0J3MgY291bnQgc3RheXMgdGhlIHNhbWUgdG90YWwgYWNyb3NzIGV2ZXJ5IHBhZ2U6IGEgc3RhYmxlXG4gICAgICAvLyBcIm9mIFlcIiBkZW5vbWluYXRvciBldmVuIGFzIHRoZSBjdXJzb3IgYWR2YW5jZXMuIEEgc2VydmVyIHRoYXQgZG9lc24ndCByZXBvcnQgdGhlXG4gICAgICAvLyBjb3VudCBhdCBhbGwgbGVhdmVzIHRoZSB0b3RhbCBhdCAwIGZvciBldmVyeSBwYWdlIHJhdGhlciB0aGFuIGRyaWZ0aW5nIHVwd2FyZHNcbiAgICAgIC8vIHdpdGggdGhlIGFwcGxpZWQgcm93cy5cbiAgICAgIGlmIChjaGFuZ2VzUmVzcG9uc2UudG90YWwgIT09IG51bGwpIHRvdGFsID0gc3luY2VkQ291bnQgKyBjaGFuZ2VzUmVzcG9uc2UudG90YWxcblxuICAgICAgaWYgKHN5bmNzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBSZXBvcnQgdGhlIHRlcm1pbmFsIHByb2dyZXNzIG9uY2UgZm9yIGFuIGVudGlyZWx5IGVtcHR5IHB1bGwgc28gY29uc3VtZXJzIG9ic2VydmVcbiAgICAgICAgLy8gdG90YWwgMDsgYSBwdWxsIHRoYXQgYWxyZWFkeSBhcHBsaWVkIHBhZ2VzIHJlcG9ydGVkIGl0cyBmaW5hbCBjb3VudHMgb24gaXRzIGxhc3QgcGFnZS5cbiAgICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgICBpZiAocGFnZXMgPT09IDAgJiYgYXJncy5vblByb2dyZXNzKSBhcmdzLm9uUHJvZ3Jlc3Moe3BhZ2VzLCBzeW5jZWRDb3VudCwgdG90YWx9KVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIHBhZ2VzICs9IDFcblxuICAgICAgLy8gQ29hbGVzY2UgcmVjb3JkLWNoYW5nZSBldmVudHMgYWNyb3NzIHRoaXMgcGFnZSdzIGFwcGxpZXMgc28gTiBhcHBsaWVkIHJvd3MgdHJpZ2dlciBvbmVcbiAgICAgIC8vIGxpdmUtcXVlcnkgcmUtcnVuLiBPbmx5IHRoZSBhcHBseSBsb29wIGlzIGJhdGNoZWQ6IHRoZSBuZXR3b3JrIHBhZ2UgZmV0Y2ggYWJvdmUgYW5kIHRoZVxuICAgICAgLy8gY3Vyc29yIHNhdmUgYmVsb3cgc3RheSBvdXRzaWRlLCBzbyBsaXZlIHF1ZXJpZXMgZmx1c2ggcmlnaHQgYWZ0ZXIgdGhlIGFwcGxpZXMgaW5zdGVhZCBvZlxuICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHB1bGwuXG4gICAgICBhd2FpdCByZWNvcmRDaGFuZ2VzLmJhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBzeW5jIG9mIHN5bmNzKSB7XG4gICAgICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgICAgIGNvbnN0IGFwcGx5UmVzdWx0ID0gYXdhaXQgYXJncy5hcHBseVN5bmMoc3luYylcbiAgICAgICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gYXBwbHlSZXN1bHQucmVzb3VyY2VUeXBlID8/IHN5bmMucmVzb3VyY2VUeXBlKClcblxuICAgICAgICAgIGNoYW5nZWQgfHw9IGFwcGx5UmVzdWx0LmNoYW5nZWQgPT09IHRydWVcbiAgICAgICAgICBzeW5jZWRDb3VudCArPSAxXG5cbiAgICAgICAgICBpZiAocmVzb3VyY2VUeXBlKSB7XG4gICAgICAgICAgICByZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdID0gKHJlc291cmNlQ291bnRzW3Jlc291cmNlVHlwZV0gfHwgMCkgKyAxXG4gICAgICAgICAgICByZXNvdXJjZUNoYW5nZWRbcmVzb3VyY2VUeXBlXSB8fD0gYXBwbHlSZXN1bHQuY2hhbmdlZCA9PT0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYWZ0ZXJDdXJzb3IgPSBjaGFuZ2VzUmVzcG9uc2UubmV4dEN1cnNvclxuXG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgICBpZiAoYXJncy5vblByb2dyZXNzKSBhcmdzLm9uUHJvZ3Jlc3Moe3BhZ2VzLCBzeW5jZWRDb3VudCwgdG90YWx9KVxuICAgICAgaWYgKHN5bmNzLmxlbmd0aCA8IGJhdGNoU2l6ZSkgYnJlYWtcbiAgICB9XG5cbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgaWYgKGFmdGVyQ3Vyc29yKSBhd2FpdCBhcmdzLnNhdmVDdXJzb3IoYWZ0ZXJDdXJzb3IpXG4gICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuXG4gICAgcmV0dXJuIHtjaGFuZ2VkLCBwYWdlcywgcmVzb3VyY2VDaGFuZ2VkLCByZXNvdXJjZUNvdW50cywgc3luY2VkQ291bnQsIHRvdGFsfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHZhbGlkYXRlcyBvbmUgYmFja2VuZCBzeW5jIGNoYW5nZXMgcGFnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQYWdlIGFyZ3MuXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvcn0gYXJncy5hZnRlckN1cnNvciAtIExhc3QgYWNrbm93bGVkZ2VkIGN1cnNvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmJhdGNoU2l6ZSAtIFBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogU3luY0NoYW5nZXNSZXF1ZXN0LCBvcHRpb25zPzoge3NpZ25hbD86IEFib3J0U2lnbmFsfSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gYXJncy5wb3N0Q2hhbmdlcyAtIENoYW5nZXMgcG9zdGVyLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvcn0gYXJncy51cFRvQ3Vyc29yIC0gU25hcHNob3QgdXBwZXItYm91bmQgY3Vyc29yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bmV4dEN1cnNvcjogU3luY0N1cnNvciwgc3luY3M6IFN5bmNDaGFuZ2VFbnZlbG9wZVtdLCB0b3RhbDogbnVtYmVyIHwgbnVsbCwgdXBUb0N1cnNvcjogU3luY0N1cnNvcn0+fSBOb3JtYWxpemVkIGNoYW5nZXMgcGFnZS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjaGFuZ2VzUGFnZSh7YWZ0ZXJDdXJzb3IsIGF1dGhlbnRpY2F0aW9uVG9rZW4sIGJhdGNoU2l6ZSwgcG9zdENoYW5nZXMsIHNpZ25hbCwgdXBUb0N1cnNvcn0pIHtcbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdENoYW5nZXMoe1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGxpbWl0OiBiYXRjaFNpemUsXG4gICAgICAuLi50aGlzLmN1cnNvclBheWxvYWQoXCJhZnRlclwiLCBhZnRlckN1cnNvciksXG4gICAgICAuLi50aGlzLmN1cnNvclBheWxvYWQoXCJ1cFRvXCIsIHVwVG9DdXJzb3IpXG4gICAgfSwge3NpZ25hbH0pXG5cbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgIHRoaXMuZW5zdXJlU3VjY2Vzc2Z1bENoYW5nZXNSZXNwb25zZShyZXNwb25zZSlcblxuICAgIGNvbnN0IHN5bmNzID0gLyoqIEB0eXBlIHt1bmtub3duW119ICovIChyZXNwb25zZS5zeW5jcylcblxuICAgIHJldHVybiB7XG4gICAgICBuZXh0Q3Vyc29yOiB0aGlzLnN5bmNDdXJzb3JGcm9tUGF5bG9hZChyZXNwb25zZS5uZXh0Q3Vyc29yID8/IG51bGwpLFxuICAgICAgc3luY3M6IHN5bmNzLm1hcCgoc3luY1BheWxvYWQpID0+IHRoaXMuc3luY0VudmVsb3BlRnJvbVBheWxvYWQoc3luY1BheWxvYWQpKSxcbiAgICAgIHRvdGFsOiBvcHRpb25hbEludGVnZXIocmVzcG9uc2UudG90YWwpLFxuICAgICAgdXBUb0N1cnNvcjogdGhpcy5zeW5jQ3Vyc29yRnJvbVBheWxvYWQocmVzcG9uc2UudXBUb0N1cnNvciA/PyBudWxsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgQVBJIHJlc3BvbnNlIHN0YXR1cyBhbmQgc2hhcGUgZm9yIGNoYW5nZS1mZWVkIHB1bGxzLlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VzUmVzcG9uc2V9IHJlc3BvbnNlIC0gQ2hhbmdlcyByZXNwb25zZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgZW5zdXJlU3VjY2Vzc2Z1bENoYW5nZXNSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IFwiZXJyb3JcIikgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yTWVzc2FnZSB8fCBcIlN5bmMgY2hhbmdlcyBmYWlsZWRcIilcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2Uuc3luY3MpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNoYW5nZXMgcmVzcG9uc2UgbWlzc2luZyBzeW5jc1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY3Vyc29yIGludG8gcmVxdWVzdCBwYXJhbXMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LlxuICAgKiBAcGFyYW0ge1wiYWZ0ZXJcIiB8IFwidXBUb1wifSBwcmVmaXggLSBSZXF1ZXN0IGZpZWxkIHByZWZpeC5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yfSBjdXJzb3IgLSBDdXJzb3IgdG8gc2VyaWFsaXplLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbD59IFJlcXVlc3QgcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGN1cnNvclBheWxvYWQocHJlZml4LCBjdXJzb3IpIHtcbiAgICBpZiAoIWN1cnNvcikgcmV0dXJuIHt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgW2Ake3ByZWZpeH1JZGBdOiBjdXJzb3IuaWQsXG4gICAgICAuLi4oY3Vyc29yLnNlcnZlclNlcXVlbmNlID8ge1tgJHtwcmVmaXh9U2VydmVyU2VxdWVuY2VgXTogY3Vyc29yLnNlcnZlclNlcXVlbmNlfSA6IHt9KSxcbiAgICAgIFtgJHtwcmVmaXh9VXBkYXRlZEF0YF06IGN1cnNvci51cGRhdGVkQXRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgcGVyc2lzdGVkIG9yIHJlc3BvbnNlIGN1cnNvciBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge1N5bmNDdXJzb3IgfCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsIHwgdW5kZWZpbmVkfSBwYXlsb2FkIC0gQ3Vyc29yIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ3Vyc29yfSBQYXJzZWQgY3Vyc29yLlxuICAgKi9cbiAgc3RhdGljIHN5bmNDdXJzb3JGcm9tUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKCFwYXlsb2FkKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jQ3Vyc29yRnJvbVBheWxvYWQoSlNPTi5wYXJzZShwYXlsb2FkKSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICByZXR1cm4ge2lkOiBudWxsLCBzZXJ2ZXJTZXF1ZW5jZTogbnVsbCwgdXBkYXRlZEF0OiBwYXlsb2FkfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHBheWxvYWQpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdXBkYXRlZEF0ID0gdHlwZW9mIHBheWxvYWQudXBkYXRlZEF0ID09PSBcInN0cmluZ1wiID8gcGF5bG9hZC51cGRhdGVkQXQgOiBudWxsXG5cbiAgICBpZiAoIXVwZGF0ZWRBdCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogcGF5bG9hZC5pZCA9PT0gbnVsbCB8fCBwYXlsb2FkLmlkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKHBheWxvYWQuaWQpLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IG9wdGlvbmFsSW50ZWdlcihwYXlsb2FkLnNlcnZlclNlcXVlbmNlID09PSBcIlwiID8gbnVsbCA6IHBheWxvYWQuc2VydmVyU2VxdWVuY2UpLFxuICAgICAgdXBkYXRlZEF0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG5vcm1hbGl6ZWQgc3luYyByb3cgYWRhcHRlci5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcGF5bG9hZCAtIFJhdyBzeW5jIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2hhbmdlRW52ZWxvcGV9IFN5bmMgcm93IGFkYXB0ZXIuXG4gICAqL1xuICBzdGF0aWMgc3luY0VudmVsb3BlRnJvbVBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmICghcGF5bG9hZCB8fCB0eXBlb2YgcGF5bG9hZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHBheWxvYWQpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNoYW5nZXMgZW50cnkgbXVzdCBiZSBhbiBvYmplY3RcIilcblxuICAgIGNvbnN0IHN5bmNQYXlsb2FkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChwYXlsb2FkKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6ICgpID0+IHN5bmNQYXlsb2FkLmRhdGEsXG4gICAgICBpZDogKCkgPT4gc3luY1BheWxvYWQuaWQsXG4gICAgICByZXNvdXJjZUlkOiAoKSA9PiBzeW5jUGF5bG9hZC5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VUeXBlOiAoKSA9PiBzeW5jUGF5bG9hZC5yZXNvdXJjZVR5cGUgPT09IG51bGwgfHwgc3luY1BheWxvYWQucmVzb3VyY2VUeXBlID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKHN5bmNQYXlsb2FkLnJlc291cmNlVHlwZSksXG4gICAgICBzeW5jVHlwZTogKCkgPT4gc3luY1BheWxvYWQuc3luY1R5cGUgPT09IG51bGwgfHwgc3luY1BheWxvYWQuc3luY1R5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBTdHJpbmcoc3luY1BheWxvYWQuc3luY1R5cGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBhcHAtY29uZmlndXJlZCByZXNvdXJjZSBhcHBsaWVyIGZvciBwdWxsZWQgc3luYyByb3dzLiBUaGUgc3luY1xuICAgKiBtZWNoYW5pY3Mgc3RheSBoZXJlOyBhcHBzIG9ubHkgZGVjbGFyZSB3aGljaCBtb2RlbHMvYXR0cmlidXRlcy9ob29rcyBhcmVcbiAgICogYWxsb3dlZCBmb3IgZWFjaCByZXNvdXJjZSB0eXBlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFN5bmNSZXNvdXJjZUNvbmZpZz59IHJlc291cmNlcyAtIFJlc291cmNlIHBvbGljeSBtYXAuXG4gICAqIEBwYXJhbSB7KHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+ICgpID0+IHZvaWR9IFtvblJlY29yZF0gLSBDYWxsZWQgd2l0aCBlYWNoIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuOyByZXR1cm5zIGEgcmVsZWFzZSBjYWxsYmFjayBpbnZva2VkIGFmdGVyIHRoZSB3cml0ZSAodXNlZCBmb3IgZWNobyBzdXBwcmVzc2lvbikuXG4gICAqIEByZXR1cm5zIHsoc3luYzogU3luY0NoYW5nZUVudmVsb3BlKSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VBcHBseVJlc3VsdD59IFN5bmMgYXBwbHkgY2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgcmVzb3VyY2VBcHBsaWVyKHJlc291cmNlcywgb25SZWNvcmQpIHtcbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IGF3YWl0IHRoaXMuYXBwbHlSZXNvdXJjZVN5bmMoe29uUmVjb3JkLCByZXNvdXJjZXMsIHN5bmN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgb25lIHN5bmMgcm93IHVzaW5nIGRlY2xhcmF0aXZlIHJlc291cmNlIHBvbGljeS5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTeW5jUmVzb3VyY2VDb25maWc+LCBzeW5jOiBTeW5jQ2hhbmdlRW52ZWxvcGUsIG9uUmVjb3JkPzogKHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+ICgpID0+IHZvaWR9fSBhcmdzIC0gQXBwbHkgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gQXBwbHkgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFwcGx5UmVzb3VyY2VTeW5jKHtvblJlY29yZCwgcmVzb3VyY2VzLCBzeW5jfSkge1xuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcbiAgICBjb25zdCByZXNvdXJjZSA9IHJlc291cmNlVHlwZSA/IHJlc291cmNlc1tyZXNvdXJjZVR5cGVdIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIXJlc291cmNlIHx8ICFyZXNvdXJjZS5lbmFibGVkKSByZXR1cm4ge2NoYW5nZWQ6IGZhbHNlLCByZXNvdXJjZVR5cGV9XG5cbiAgICBpZiAoc3luYy5zeW5jVHlwZSgpID09PSBcImRlbGV0ZVwiKSB7XG4gICAgICByZXR1cm4ge2NoYW5nZWQ6IGF3YWl0IHRoaXMuZGVzdHJveVN5bmNlZFJlc291cmNlKHtvblJlY29yZCwgcmVzb3VyY2UsIHN5bmN9KSwgcmVzb3VyY2VUeXBlfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN5bmNEYXRhKHN5bmMpXG4gICAgY29uc3QgcmVjb3JkID0gcmVzb3VyY2UuZmluZFJlY29yZCA/IGF3YWl0IHJlc291cmNlLmZpbmRSZWNvcmQoe2RhdGEsIHJlc291cmNlSWQ6IHN5bmMucmVzb3VyY2VJZCgpLCBzeW5jfSkgOiBhd2FpdCByZXNvdXJjZS5tb2RlbENsYXNzLmZpbmRPckluaXRpYWxpemVCeSh7aWQ6IGRhdGEuaWQgPz8gc3luYy5yZXNvdXJjZUlkKCl9KVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBhd2FpdCByZXNvdXJjZS5hdHRyaWJ1dGVzKHtkYXRhLCByZWNvcmQsIHN5bmN9KVxuICAgIGNvbnN0IHJlbGVhc2VSZWNvcmQgPSBvblJlY29yZCA/IG9uUmVjb3JkKHJlY29yZCkgOiBudWxsXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZC5hc3NpZ24oYXR0cmlidXRlcylcblxuICAgICAgaWYgKHJlY29yZC5pc0NoYW5nZWQoKSkge1xuICAgICAgICBhd2FpdCByZWNvcmQuc2F2ZSgpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZS5hZnRlckFwcGx5KSB7XG4gICAgICAgIGNvbnN0IGhvb2tDaGFuZ2VkID0gYXdhaXQgcmVzb3VyY2UuYWZ0ZXJBcHBseSh7YXR0cmlidXRlcywgZGF0YSwgcmVjb3JkLCBzeW5jfSlcblxuICAgICAgICBjaGFuZ2VkIHx8PSBob29rQ2hhbmdlZCA9PT0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocmVsZWFzZVJlY29yZCkgcmVsZWFzZVJlY29yZCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtjaGFuZ2VkLCByZXNvdXJjZVR5cGV9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgYSBzeW5jZWQgcmVzb3VyY2UgdmlhIGl0cyBkZWNsYXJlZCBtb2RlbCBwb2xpY3kuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiBTeW5jUmVzb3VyY2VDb25maWcsIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSwgb25SZWNvcmQ/OiAocmVjb3JkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gKCkgPT4gdm9pZH19IGFyZ3MgLSBEZXN0cm95IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGEgbG9jYWwgcm93IHdhcyBkZXN0cm95ZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVzdHJveVN5bmNlZFJlc291cmNlKHtvblJlY29yZCwgcmVzb3VyY2UsIHN5bmN9KSB7XG4gICAgY29uc3QgaWQgPSBzeW5jLnJlc291cmNlSWQoKVxuICAgIGNvbnN0IHJlY29yZCA9IHJlc291cmNlLmZpbmRSZWNvcmRGb3JEZWxldGUgPyBhd2FpdCByZXNvdXJjZS5maW5kUmVjb3JkRm9yRGVsZXRlKHtyZXNvdXJjZUlkOiBpZCwgc3luY30pIDogYXdhaXQgcmVzb3VyY2UubW9kZWxDbGFzcy5maW5kQnkoe2lkfSlcblxuICAgIGlmICghcmVjb3JkKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHJlbGVhc2VSZWNvcmQgPSBvblJlY29yZCA/IG9uUmVjb3JkKHJlY29yZCkgOiBudWxsXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVjb3JkLmRlc3Ryb3koKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocmVsZWFzZVJlY29yZCkgcmVsZWFzZVJlY29yZCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIGVtYmVkZGVkIHN5bmMgZGF0YSBKU09OL29iamVjdC5cbiAgICogQHBhcmFtIHtTeW5jQ2hhbmdlRW52ZWxvcGV9IHN5bmMgLSBTeW5jIHJvdy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBTeW5jIGRhdGEgb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIHN5bmNEYXRhKHN5bmMpIHtcbiAgICBjb25zdCBkYXRhID0gc3luYy5kYXRhKClcblxuICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKGBTeW5jICR7c3luYy5pZCgpfSBpcyBtaXNzaW5nIGRhdGFgKVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChKU09OLnBhcnNlKGRhdGEpKVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChkYXRhKVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jICR7c3luYy5pZCgpfSBoYXMgaW52YWxpZCBkYXRhYClcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbnMgcGVuZGluZyBzeW5jIHJlY29yZHMgZnJvbSBhIGxvY2FsIFZlbG9jaW91cyBtb2RlbCBpbiBzdGFibGUgb3JkZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVwbGF5IGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuIHRvIHNlbmQgd2l0aCByZXBsYXkgcmVxdWVzdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5iYXRjaFNpemVdIC0gTWF4IHN5bmNzIHBlciByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnN5bmNNb2RlbCAtIExvY2FsIFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHthdXRoZW50aWNhdGlvblRva2VuOiBzdHJpbmcsIHN5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSwgb3B0aW9ucz86IHtzaWduYWw/OiBBYm9ydFNpZ25hbH0pID0+IFByb21pc2U8U3luY1JlcGxheVJlc3BvbnNlPn0gYXJncy5wb3N0UmVwbGF5IC0gUmVwbGF5IHBvc3Rlci5cbiAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gW2FyZ3Muc2lnbmFsXSAtIExpZmVjeWNsZSBjYW5jZWxsYXRpb24gc2lnbmFsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXBsYXlMb2NhbFN5bmNzKGFyZ3MpIHtcbiAgICBjb25zdCBwb3N0ZWRTbmFwc2hvdHNCeVN5bmNJZCA9IG5ldyBNYXAoKVxuXG4gICAgYXdhaXQgdGhpcy5yZXBsYXlQZW5kaW5nKHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGJhdGNoU2l6ZTogYXJncy5iYXRjaFNpemUsXG4gICAgICBtYXJrU3VjY2Vzc2Z1bDogYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgICAgY29uc3Qgc3luY0lkID0gKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpXG4gICAgICAgIC8vIFJlbG9hZCB3aXRoIHRoZSByZXNvdXJjZSBwcmVsb2FkZWQgc28gcm93cyByZWx5aW5nIG9uIHRoZSByZXNvdXJjZS1hdHRyaWJ1dGVzXG4gICAgICAgIC8vIGZhbGxiYWNrIGluIGxvY2FsU3luY0RhdGEgY29tcGFyZSBhZ2FpbnN0IHRoZSBzYW1lIHNuYXBzaG90IHRoZXkgcG9zdGVkLlxuICAgICAgICBjb25zdCBjdXJyZW50U3luYyA9IGF3YWl0IGFyZ3Muc3luY01vZGVsLnByZWxvYWQoe3Jlc291cmNlOiB0cnVlfSkud2hlcmUoe2lkOiBzeW5jSWR9KS5maXJzdCgpXG5cbiAgICAgICAgaWYgKCFjdXJyZW50U3luYykgcmV0dXJuXG4gICAgICAgIC8vIEEgcm93IGVkaXRlZCB3aGlsZSBpdHMgb2xkIHBheWxvYWQgd2FzIGluIGZsaWdodCBzdGF5cyBwZW5kaW5nLCBzbyB0aGVcbiAgICAgICAgLy8gbmV3ZXIgbG9jYWwgY2hhbmdlIHJlcGxheXMgb24gdGhlIG5leHQgZHJhaW4gaW5zdGVhZCBvZiBiZWluZyBsb3N0LlxuICAgICAgICBpZiAodGhpcy5sb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChjdXJyZW50U3luYykgIT09IHBvc3RlZFNuYXBzaG90c0J5U3luY0lkLmdldChTdHJpbmcoc3luY0lkKSkpIHJldHVyblxuXG4gICAgICAgIGF3YWl0IGN1cnJlbnRTeW5jLnVwZGF0ZSh7c3RhdGU6IFwic3VjY2Vzc1wifSlcbiAgICAgIH0sXG4gICAgICBwZW5kaW5nU3luY3M6IGFzeW5jICgpID0+IGF3YWl0IGFyZ3Muc3luY01vZGVsLnByZWxvYWQoe3Jlc291cmNlOiB0cnVlfSkud2hlcmUoe3N0YXRlOiBcInBlbmRpbmdcIn0pLm9yZGVyKFwiY3JlYXRlZF9hdFwiKS50b0FycmF5KCksXG4gICAgICBwb3N0UmVwbGF5OiBhcmdzLnBvc3RSZXBsYXksXG4gICAgICBzaWduYWw6IGFyZ3Muc2lnbmFsLFxuICAgICAgc3luY0lkOiAoc3luYykgPT4gKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpLFxuICAgICAgc3luY1BheWxvYWQ6IChzeW5jKSA9PiB7XG4gICAgICAgIHBvc3RlZFNuYXBzaG90c0J5U3luY0lkLnNldChTdHJpbmcoKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpKSwgdGhpcy5sb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChzeW5jKSlcblxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFN5bmNQYXlsb2FkKHN5bmMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoZSByZXBsYXktcmVsZXZhbnQgc3RhdGUgb2YgYSBsb2NhbCBzeW5jIHJvdyBmb3IgaW4tZmxpZ2h0IGNvbXBhcmlzb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBzeW5jIC0gTG9jYWwgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSBzbmFwc2hvdCBvZiB0aGUgcm93J3MgcmVwbGF5ZWQgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChzeW5jKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtkYXRhOiB0aGlzLmxvY2FsU3luY0RhdGEoc3luYyksIHN5bmNUeXBlOiBzeW5jLnN5bmNUeXBlKCl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBvbmUgcmVwbGF5IGVudmVsb3BlIGZyb20gYSBsb2NhbCBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc3luYyAtIExvY2FsIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7e2NsaWVudFVwZGF0ZWRBdD86IHN0cmluZywgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGlkOiBudW1iZXIsIHJlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmcsIHN5bmNUeXBlOiBzdHJpbmd9fSBTeW5jIHJlcGxheSBlbnZlbG9wZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNQYXlsb2FkKHN5bmMpIHtcbiAgICBjb25zdCBjbGllbnRVcGRhdGVkQXQgPSBzeW5jLnVwZGF0ZWRBdCgpIHx8IHN5bmMuY3JlYXRlZEF0KClcblxuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRVcGRhdGVkQXQ6IGNsaWVudFVwZGF0ZWRBdCA/IGNsaWVudFVwZGF0ZWRBdC50b0lTT1N0cmluZygpIDogdW5kZWZpbmVkLFxuICAgICAgZGF0YTogdGhpcy5sb2NhbFN5bmNEYXRhKHN5bmMpLFxuICAgICAgaWQ6IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoc3luYy5pZCgpKSksXG4gICAgICByZXNvdXJjZUlkOiBTdHJpbmcoc3luYy5yZXNvdXJjZUlkKCkpLFxuICAgICAgcmVzb3VyY2VUeXBlOiBzeW5jLnJlc291cmNlVHlwZSgpIHx8IFwiXCIsXG4gICAgICBzeW5jVHlwZTogc3luYy5zeW5jVHlwZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uZSBsb2NhbCBzeW5jIHJvdyBwYXlsb2FkLCBmYWxsaW5nIGJhY2sgdG8gcHJlbG9hZGVkIHJlc291cmNlIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHN5bmMgLSBMb2NhbCBzeW5jIHJvdy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBTeW5jIGRhdGEuXG4gICAqL1xuICBzdGF0aWMgbG9jYWxTeW5jRGF0YShzeW5jKSB7XG4gICAgbGV0IHN5bmNEYXRhID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHN5bmMuZGF0YSgpIHx8IHt9KVxuXG4gICAgaWYgKHR5cGVvZiBzeW5jRGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3luY0RhdGEgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoSlNPTi5wYXJzZShzeW5jRGF0YSkpXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgc3luY0RhdGEgPSB7fVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhzeW5jRGF0YSkubGVuZ3RoID4gMCkgcmV0dXJuIHN5bmNEYXRhXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChzeW5jLnJlc291cmNlKCkuYXR0cmlidXRlcygpKVxuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIGxvY2FsIHN5bmMgcm93IGZvciBhIFZlbG9jaW91cyBtb2RlbCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBRdWV1ZSBhcmdzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnJlc291cmNlIC0gUmVzb3VyY2UgYmVpbmcgc3luY2VkLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnN5bmNNb2RlbCAtIExvY2FsIFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLmRhdGFdIC0gRXhwbGljaXQgc3luYyBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3luY1R5cGVdIC0gU3luYyBvcGVyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MubG9jYWxPbmx5QXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIHRvIHN0cmlwIGZyb20gcXVldWVkIHBheWxvYWRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5ib29sZWFuQXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIHRvIGNvZXJjZSB0aHJvdWdoIHN5bmMgYm9vbGVhbiBwYXJzaW5nLlxuICAgKiBAcGFyYW0geyhkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLm5vcm1hbGl6ZURhdGFdIC0gQXBwLXNwZWNpZmljIGRhdGEgbm9ybWFsaXplci5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBMb2NhbCBzeW5jIHJvdy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBxdWV1ZUxvY2FsU3luYyhhcmdzKSB7XG4gICAgY29uc3QgcmVzb3VyY2VSZWNvcmRJZCA9IHNjYWxhck1vZGVsUHJpbWFyeUtleVZhbHVlKGFyZ3MucmVzb3VyY2UuaWQoKSwgXCJMb2NhbCBzeW5jIHF1ZXVlaW5nXCIpXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IGFyZ3MucmVzb3VyY2UuY29uc3RydWN0b3JcblxuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlc291cmNlIG1vZGVsIGNsYXNzIG11c3QgaW1wbGVtZW50IHN0YXRpYyBnZXRNb2RlbE5hbWUoKSB0byBxdWV1ZSBzeW5jIGRhdGEgLSBjbGFzcyBuYW1lcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3MgZXhwbGljaXQgbW9kZWwgbmFtZXMgYW5kIG1pbmlmaWVkIGJ1bmRsZXNcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG4gICAgY29uc3Qgc3luY0RhdGEgPSB0aGlzLnF1ZXVlZFN5bmNEYXRhKGFyZ3MpXG4gICAgY29uc3Qgc3luY1R5cGUgPSBhcmdzLnN5bmNUeXBlIHx8IFwidXBkYXRlXCJcblxuICAgIGlmICghcmVzb3VyY2VSZWNvcmRJZCkgdGhyb3cgbmV3IEVycm9yKFwicmVzb3VyY2UuaWQoKSBpcyByZXF1aXJlZCB0byBxdWV1ZSBzeW5jIGRhdGFcIilcblxuICAgIGNvbnN0IHJlc291cmNlSWQgPSBTdHJpbmcocmVzb3VyY2VSZWNvcmRJZClcbiAgICBjb25zdCBleGlzdGluZ1N5bmMgPSBhd2FpdCBhcmdzLnN5bmNNb2RlbC5maW5kQnkoe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZX0pXG5cbiAgICBpZiAoZXhpc3RpbmdTeW5jKSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1N5bmMudXBkYXRlKHtcbiAgICAgICAgZGF0YTogc3luY0RhdGEsXG4gICAgICAgIHN0YXRlOiBcInBlbmRpbmdcIixcbiAgICAgICAgc3luY1R5cGVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBleGlzdGluZ1N5bmNcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgYXJncy5zeW5jTW9kZWwuY3JlYXRlKHtcbiAgICAgIGRhdGE6IHN5bmNEYXRhLFxuICAgICAgcmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIHN0YXRlOiBcInBlbmRpbmdcIixcbiAgICAgIHN5bmNUeXBlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYmFja2VuZC1zYWZlIHF1ZXVlZCBzeW5jIGRhdGEgd2l0aG91dCBtdXRhdGluZyBjYWxsZXIgZGF0YS4gVGhlIGRlZmF1bHRcbiAgICogKG5vIGV4cGxpY2l0IGBkYXRhYCkgaXMgdGhlIHJlc291cmNlJ3MgYXR0cmlidXRlcyBtaW51cyBsb2NhbC1vbmx5IGF0dHJpYnV0ZXMsXG4gICAqIHdpdGggYm9vbGVhbnMgY29lcmNlZCBhbmQgRGF0ZSB2YWx1ZXMgc2VyaWFsaXplZCB0byBJU08gc3RyaW5ncywgc28gYXBwcyBkb24ndFxuICAgKiBuZWVkIHBlci1tb2RlbCB0cmFja2VkLXBheWxvYWQgYnVpbGRlcnMuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBsb2NhbE9ubHlBdHRyaWJ1dGVzPzogc3RyaW5nW10sIGJvb2xlYW5BdHRyaWJ1dGVzPzogc3RyaW5nW10sIG5vcm1hbGl6ZURhdGE/OiAoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fX0gYXJncyAtIERhdGEgYXJncy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBRdWV1ZWQgZGF0YS5cbiAgICovXG4gIHN0YXRpYyBxdWV1ZWRTeW5jRGF0YShhcmdzKSB7XG4gICAgY29uc3QgaW5wdXREYXRhID0gYXJncy5kYXRhID8/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChhcmdzLnJlc291cmNlLmF0dHJpYnV0ZXMoKSlcbiAgICBjb25zdCBub3JtYWxpemVkRGF0YSA9IGFyZ3Mubm9ybWFsaXplRGF0YSA/IGFyZ3Mubm9ybWFsaXplRGF0YShpbnB1dERhdGEpIDogaW5wdXREYXRhXG4gICAgY29uc3Qgc3luY0RhdGEgPSB7Li4ubm9ybWFsaXplZERhdGF9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzIHx8IFtdKSBkZWxldGUgc3luY0RhdGFbYXR0cmlidXRlTmFtZV1cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXJncy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSkge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24oc3luY0RhdGEsIGF0dHJpYnV0ZU5hbWUpKSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXSA9IHRoaXMub3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHN5bmNEYXRhW2F0dHJpYnV0ZU5hbWVdLCBhdHRyaWJ1dGVOYW1lKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3luY0RhdGEpKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXSA9IHZhbHVlLnRvSVNPU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY0RhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzbWFsbCBhcHAtZmFjaW5nIGxvY2FsIHN5bmMgcXVldWUgZmFjYWRlIGZyb20gZGVjbGFyYXRpdmUgbW9kZWwgY29uZmlnLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFF1ZXVlIGNvbmZpZy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5zeW5jTW9kZWwgLSBMb2NhbCBTeW5jIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zaW5nbGVGbGlnaHRLZXkgLSBLZXkgdXNlZCB0byBzZXJpYWxpemUgYmFja2VuZCByZXBsYXkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gYXJncy5zeW5jUGVuZGluZyAtIEJhY2tlbmQgcmVwbGF5IGNhbGxiYWNrLlxuICAgKiBAcGFyYW0geyhyZXNvdXJjZTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IHN0cmluZ1tdfSBbYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzXSAtIFJlc291cmNlLXNwZWNpZmljIGxvY2FsLW9ubHkgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHsocmVzb3VyY2U6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiBzdHJpbmdbXX0gW2FyZ3MuYm9vbGVhbkF0dHJpYnV0ZXNdIC0gUmVzb3VyY2Utc3BlY2lmaWMgU1FMaXRlIGJvb2xlYW4gYXR0cmlidXRlcy5cbiAgICogQHJldHVybnMge3txdWV1ZTogKHF1ZXVlQXJnczoge3Jlc291cmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzeW5jVHlwZT86IHN0cmluZ30pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzeW5jUGVuZGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPn19IENvbmZpZ3VyZWQgbG9jYWwgc3luYyBxdWV1ZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNRdWV1ZShhcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlOiBhc3luYyAocXVldWVBcmdzKSA9PiBhd2FpdCB0aGlzLnF1ZXVlTG9jYWxTeW5jKHtcbiAgICAgICAgLi4ucXVldWVBcmdzLFxuICAgICAgICBib29sZWFuQXR0cmlidXRlczogYXJncy5ib29sZWFuQXR0cmlidXRlcyA/IGFyZ3MuYm9vbGVhbkF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMgPyBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBzeW5jTW9kZWw6IGFyZ3Muc3luY01vZGVsXG4gICAgICB9KSxcbiAgICAgIHN5bmNQZW5kaW5nOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNpbmdsZUZsaWdodChhcmdzLnNpbmdsZUZsaWdodEtleSwgYXJncy5zeW5jUGVuZGluZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGJvb2xlYW5zIGNvbW1vbmx5IHVzZWQgYnkgU1FMaXRlL29mZmxpbmUgc3luYyBwYXlsb2Fkcy5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFN5bmMgZGVjaXNpb24gdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIC0gRXJyb3IgY29udGV4dC5cbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSBQYXJzZWQgYm9vbGVhbi1saWtlIGJhY2tlbmQvbG9jYWwgdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgb3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHZhbHVlLCBkZXNjcmlwdGlvbiA9IFwic3luYyBib29sZWFuXCIpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlXG4gICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBvcHRpb25hbEJvb2xlYW4odmFsdWUsIGRlc2NyaXB0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYm9vbGVhbiBzeW5jIHZhbHVlIHRvIFNRTGl0ZSBib29sZWFuIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGx9IHZhbHVlIC0gU3luYyBib29sZWFuIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7MCB8IDF9IFNRTGl0ZS1jb21wYXRpYmxlIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgc3FsaXRlQm9vbGVhblN5bmNWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IDEgOiAwXG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdHMgZ2VuZXJpYyBzeW5jIGNvdW50ZXJzIGludG8gYXBwLXNwZWNpZmljIHJlc3VsdCBrZXlzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlc3VsdCBhcmdzLlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VzUmVzdWx0fSBhcmdzLnJlc3VsdCAtIEdlbmVyaWMgVmVsb2Npb3VzIHN5bmMgcmVzdWx0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHtjaGFuZ2VkS2V5OiBzdHJpbmcsIGNvdW50S2V5OiBzdHJpbmd9Pn0gYXJncy5yZXNvdXJjZXMgLSBSZXNvdXJjZSByZXN1bHQga2V5IG1hcC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBQcm9qZWN0ZWQgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIHN5bmNSZXN1bHRGb3JSZXNvdXJjZXMoe3Jlc3VsdCwgcmVzb3VyY2VzfSkge1xuICAgIGNvbnN0IHN5bmNSZXN1bHQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoe1xuICAgICAgY2hhbmdlZDogcmVzdWx0LmNoYW5nZWQsXG4gICAgICBwYWdlczogcmVzdWx0LnBhZ2VzLFxuICAgICAgc3luY2VkQ291bnQ6IHJlc3VsdC5zeW5jZWRDb3VudFxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGtleXNdIG9mIE9iamVjdC5lbnRyaWVzKHJlc291cmNlcykpIHtcbiAgICAgIHN5bmNSZXN1bHRba2V5cy5jb3VudEtleV0gPSByZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwXG4gICAgICBzeW5jUmVzdWx0W2tleXMuY2hhbmdlZEtleV0gPSByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHwgZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY1Jlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIHN5bmMgcmVjb3JkcyBpbiBzdGFibGUgb3JkZXIgYW5kIG1hcmtzIGFja25vd2xlZGdlZCByb3dzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcGxheSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggcmVwbGF5IHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8QXJyYXk8dW5rbm93bj4+fSBhcmdzLnBlbmRpbmdTeW5jcyAtIExvYWRzIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIGluIHJlcGxheSBvcmRlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5zeW5jSWQgLSBSZXR1cm5zIHRoZSBsb2NhbCBzeW5jIGlkLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3Muc3luY1BheWxvYWQgLSBCdWlsZHMgdGhlIEFQSSBzeW5jIGVudmVsb3BlLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0sIG9wdGlvbnM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWx9KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFBvc3RzIG9uZSByZXBsYXkgcmVxdWVzdC5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93biwgcmVzcG9uc2U6IFN5bmNSZXBsYXlJdGVtKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLm1hcmtTdWNjZXNzZnVsIC0gTWFya3Mgb25lIHN5bmMgYXMgc3VjY2Vzc2Z1bCBsb2NhbGx5LlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBhbGwgYmF0Y2hlcyBhcmUgcmVwbGF5ZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVwbGF5UGVuZGluZyhhcmdzKSB7XG4gICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgIGNvbnN0IHBlbmRpbmdTeW5jcyA9IGF3YWl0IGFyZ3MucGVuZGluZ1N5bmNzKClcbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgY29uc3QgYmF0Y2hTaXplID0gdGhpcy5ub3JtYWxpemVkQmF0Y2hTaXplKGFyZ3MuYmF0Y2hTaXplKVxuXG4gICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgcGVuZGluZ1N5bmNzLmxlbmd0aDsgb2Zmc2V0ICs9IGJhdGNoU2l6ZSkge1xuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgYXdhaXQgdGhpcy5yZXBsYXlCYXRjaCh7Li4uYXJncywgcGVuZGluZ1N5bmNzOiBwZW5kaW5nU3luY3Muc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBiYXRjaFNpemUpfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5cyBvbmUgYmF0Y2ggb2Ygc3luY3MuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVwbGF5IGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuLlxuICAgKiBAcGFyYW0ge0FycmF5PHVua25vd24+fSBhcmdzLnBlbmRpbmdTeW5jcyAtIEJhdGNoIHN5bmNzLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnN5bmNJZCAtIFN5bmMgaWQgZ2V0dGVyLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3Muc3luY1BheWxvYWQgLSBQYXlsb2FkIGJ1aWxkZXIuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHthdXRoZW50aWNhdGlvblRva2VuOiBzdHJpbmcsIHN5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSwgb3B0aW9ucz86IHtzaWduYWw/OiBBYm9ydFNpZ25hbH0pID0+IFByb21pc2U8U3luY1JlcGxheVJlc3BvbnNlPn0gYXJncy5wb3N0UmVwbGF5IC0gUmVwbGF5IHBvc3Rlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93biwgcmVzcG9uc2U6IFN5bmNSZXBsYXlJdGVtKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLm1hcmtTdWNjZXNzZnVsIC0gU3VjY2VzcyBob29rLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciB0aGUgYmF0Y2ggaXMgYWNrbm93bGVkZ2VkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUJhdGNoKGFyZ3MpIHtcbiAgICBjb25zdCB7YXV0aGVudGljYXRpb25Ub2tlbiwgbWFya1N1Y2Nlc3NmdWwsIHBlbmRpbmdTeW5jcywgcG9zdFJlcGxheSwgc2lnbmFsLCBzeW5jSWQsIHN5bmNQYXlsb2FkfSA9IGFyZ3NcblxuICAgIGlmIChwZW5kaW5nU3luY3MubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuXG4gICAgY29uc3Qgc3luY3NCeUlkID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHN5bmMgb2YgcGVuZGluZ1N5bmNzKSB7XG4gICAgICBjb25zdCBpZCA9IHN5bmNJZChzeW5jKVxuXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbCkgc3luY3NCeUlkLnNldChTdHJpbmcoaWQpLCBzeW5jKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFJlcGxheSh7XG4gICAgICBhdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgc3luY3M6IHBlbmRpbmdTeW5jcy5tYXAoKHN5bmMpID0+IHN5bmNQYXlsb2FkKHN5bmMpKVxuICAgIH0sIHtzaWduYWx9KVxuXG4gICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICB0aGlzLmVuc3VyZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwb25zZSlcblxuICAgIGZvciAoY29uc3Qgc3luY1Jlc3BvbnNlIG9mIHJlc3BvbnNlLnN5bmNzIHx8IFtdKSB7XG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgICAgY29uc3Qgc3luYyA9IHN5bmNzQnlJZC5nZXQoU3RyaW5nKHN5bmNSZXNwb25zZS5pZCkpXG5cbiAgICAgIGlmICghc3luYykgY29udGludWVcbiAgICAgIGlmIChzeW5jUmVzcG9uc2Uuc3luY1N0YXRlICE9PSBcInN1Y2Nlc3NmdWxcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luYyBzdGF0ZSByZXR1cm5lZCBmb3Igc3luYyAke1N0cmluZyhzeW5jUmVzcG9uc2UuaWQpfTogJHtTdHJpbmcoc3luY1Jlc3BvbnNlLnN5bmNTdGF0ZSl9YClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbWFya1N1Y2Nlc3NmdWwoc3luYywgc3luY1Jlc3BvbnNlKVxuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIEFQSSByZXNwb25zZSBzdGF0dXMgYW5kIHNoYXBlLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlSZXNwb25zZX0gcmVzcG9uc2UgLSBSZXBsYXkgcmVzcG9uc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGVuc3VyZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IFwiZXJyb3JcIikgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yTWVzc2FnZSB8fCBcIlN5bmMgZmFpbGVkXCIpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnN5bmNzKSkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyByZXNwb25zZSBtaXNzaW5nIHN5bmNzXCIpXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIHBvc2l0aXZlIGJhdGNoIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBiYXRjaFNpemUgLSBCYXRjaCBzaXplLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBQb3NpdGl2ZSBiYXRjaCBzaXplLlxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZWRCYXRjaFNpemUoYmF0Y2hTaXplKSB7XG4gICAgaWYgKHR5cGVvZiBiYXRjaFNpemUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShiYXRjaFNpemUpIHx8IGJhdGNoU2l6ZSA8IDEpIHJldHVybiAxMDBcblxuICAgIHJldHVybiBNYXRoLmZsb29yKGJhdGNoU2l6ZSlcbiAgfVxufVxuXG4vKipcbiAqIFRocm93cyB0aGUgZXhhY3QgYWJvcnQgcmVhc29uIGF0IGxpZmVjeWNsZSBib3VuZGFyaWVzIHNvIGNhbGxlcnMgY2FuXG4gKiBkaXN0aW5ndWlzaCBhbiBleHBlY3RlZCBjb29wZXJhdGl2ZSBzdG9wIGZyb20gdHJhbnNwb3J0IG9yIGFwcGx5IGZhaWx1cmVzLlxuICogQHBhcmFtIHtBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZH0gc2lnbmFsIC0gTGlmZWN5Y2xlIHNpZ25hbC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKSB7XG4gIGlmICghc2lnbmFsPy5hYm9ydGVkKSByZXR1cm5cblxuICB0aHJvdyBzaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyBzaWduYWwucmVhc29uIDogbmV3IEVycm9yKFwiU3luYyBvcGVyYXRpb24gYWJvcnRlZFwiKVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSBjb25mbGljdC10cmFja2luZyBpZGVudGl0eSBmaWVsZCBhdCBxdWV1ZSB0aW1lOiBhIHN0YXRpYyBzdHJpbmdcbiAqIG9yIGEgZnVuY3Rpb24gKHN5bmMgb3IgYXN5bmMpIHJlc29sdmluZyB0aGUgY3VycmVudCB2YWx1ZS4gR3JhbnRzIGFuZCBwb2xpY3lcbiAqIGhhc2hlcyByb3RhdGUgYXQgcnVudGltZSwgc28gZGVjbGFyYXRpb25zIG1heSByZXNvbHZlIHRoZW0gcGVyIG11dGF0aW9uLlxuICogQHBhcmFtIHt7Y29uZmxpY3RUcmFja2luZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50Q29uZmxpY3RUcmFja2luZ0NvbmZpZywga2V5OiBcImFjdG9yRGV2aWNlSWRcIiB8IFwiYWN0b3JVc2VySWRcIiB8IFwib2ZmbGluZUdyYW50SWRcIiB8IFwicG9saWN5SGFzaFwiLCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBSZXNvbHV0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFJlc29sdmVkIG5vbi1lbXB0eSBpZGVudGl0eSB2YWx1ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmZsaWN0VHJhY2tpbmdJZGVudGl0eVZhbHVlKHtjb25mbGljdFRyYWNraW5nLCBrZXksIHJlc291cmNlVHlwZX0pIHtcbiAgY29uc3QgdmFsdWUgPSBjb25mbGljdFRyYWNraW5nW2tleV1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHZhbHVlKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgIT09IFwic3RyaW5nXCIgfHwgcmVzb2x2ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBjb25mbGljdFRyYWNraW5nLiR7a2V5fSByZXNvbHZlZCB0byBhbiBlbXB0eSB2YWx1ZWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLmxlbmd0aCA+IDApIHJldHVybiB2YWx1ZVxuXG4gIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IGNvbmZsaWN0VHJhY2tpbmcuJHtrZXl9IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgZnVuY3Rpb24gcmVzb2x2aW5nIG9uZSAob3Igc3RhcnQgYW4gb2ZmbGluZSBzZXNzaW9uKWApXG59XG4iXX0=
@@ -24,13 +24,13 @@ export type ModelSyncRealtimeDeclaration = {
24
24
  };
25
25
  export type SyncClientConflictTrackingConfig = {
26
26
  /**
27
- * - Stable device identity.
27
+ * - Stable device identity, or a function resolving it at queue time. When a `sync.client.offline` session is configured, the session supplies it and the declaration may omit it.
28
28
  */
29
- actorDeviceId: string;
29
+ actorDeviceId?: string | (() => string | Promise<string>);
30
30
  /**
31
- * - Stable user identity.
31
+ * - Stable user identity, or a function resolving it at queue time. When a `sync.client.offline` session is configured, the session supplies it and the declaration may omit it.
32
32
  */
33
- actorUserId: string;
33
+ actorUserId?: string | (() => string | Promise<string>);
34
34
  /**
35
35
  * - Durable idempotency-id generator.
36
36
  */
@@ -44,13 +44,13 @@ export type SyncClientConflictTrackingConfig = {
44
44
  */
45
45
  now?: () => Date;
46
46
  /**
47
- * - Grant identifier retained with intent.
47
+ * - Grant identifier retained with intent, or a function resolving it at queue time (grants rotate at runtime). When a `sync.client.offline` session is configured, the session supplies it and the declaration may omit it.
48
48
  */
49
- offlineGrantId: string;
49
+ offlineGrantId?: string | (() => string | Promise<string>);
50
50
  /**
51
- * - Policy hash retained with intent.
51
+ * - Policy hash retained with intent, or a function resolving it at queue time (policy hashes rotate with the server policy). When a `sync.client.offline` session is configured, the session supplies it and the declaration may omit it.
52
52
  */
53
- policyHash: string;
53
+ policyHash?: string | (() => string | Promise<string>);
54
54
  /**
55
55
  * - Authoritative version attribute; defaults to updatedAt when present.
56
56
  */
@@ -263,6 +263,16 @@ export type SyncClientConfig = {
263
263
  }, options?: {
264
264
  signal?: AbortSignal;
265
265
  }) => Promise<import("./sync-api-client-types.js").SyncChangesResponse>;
266
+ /**
267
+ * - Normalized long-offline session configuration from `sync.client.offline`.
268
+ */
269
+ offline?: import("../configuration-types.js").NormalizedVelociousSyncClientOfflineConfiguration;
270
+ /**
271
+ * - Path-selecting POSTer over the configured transport for the offline session's bootstrap/replay endpoints.
272
+ */
273
+ offlinePost: (path: string, payload: Record<string, ReturnType<typeof JSON.parse>>, options?: {
274
+ signal?: AbortSignal;
275
+ }) => Promise<ReturnType<typeof JSON.parse>>;
266
276
  /**
267
277
  * - Posts one replay request.
268
278
  */
@@ -324,13 +334,13 @@ export type SyncClientConfig = {
324
334
  * Durable optimistic-version tracking configuration. Identity/grant fields are
325
335
  * retained in the shared LocalMutationLog mutation shape used by offline sync.
326
336
  * @typedef {object} SyncClientConflictTrackingConfig
327
- * @property {string} actorDeviceId - Stable device identity.
328
- * @property {string} actorUserId - Stable user identity.
337
+ * @property {string | (() => string | Promise<string>)} [actorDeviceId] - Stable device identity, or a function resolving it at queue time. When a `sync.client.offline` session is configured, the session supplies it and the declaration may omit it.
338
+ * @property {string | (() => string | Promise<string>)} [actorUserId] - Stable user identity, or a function resolving it at queue time. When a `sync.client.offline` session is configured, the session supplies it and the declaration may omit it.
329
339
  * @property {() => string} clientMutationId - Durable idempotency-id generator.
330
340
  * @property {import("./local-mutation-log.js").default} mutationLog - Existing durable mutation log.
331
341
  * @property {() => Date} [now] - Mutation clock.
332
- * @property {string} offlineGrantId - Grant identifier retained with intent.
333
- * @property {string} policyHash - Policy hash retained with intent.
342
+ * @property {string | (() => string | Promise<string>)} [offlineGrantId] - Grant identifier retained with intent, or a function resolving it at queue time (grants rotate at runtime). When a `sync.client.offline` session is configured, the session supplies it and the declaration may omit it.
343
+ * @property {string | (() => string | Promise<string>)} [policyHash] - Policy hash retained with intent, or a function resolving it at queue time (policy hashes rotate with the server policy). When a `sync.client.offline` session is configured, the session supplies it and the declaration may omit it.
334
344
  * @property {string} [versionAttribute] - Authoritative version attribute; defaults to updatedAt when present.
335
345
  */
336
346
  /**
@@ -422,6 +432,8 @@ export type SyncClientConfig = {
422
432
  * @property {(args: {scope: SerializedSyncScope}) => string | null | Promise<string | null>} [legacyCursor] - Seeds a newly declared scope's cursor (e.g. from a pre-scope cursor store) so devices don't re-pull everything.
423
433
  * @property {(error: Error) => void} [onError] - Reports background replay/pull failures. Defaults to rethrowing.
424
434
  * @property {(payload: import("./sync-api-client-types.js").SyncChangesRequest & {scope: SerializedSyncScope}, options?: {signal?: AbortSignal}) => Promise<import("./sync-api-client-types.js").SyncChangesResponse>} postChanges - Posts one changes request.
435
+ * @property {import("../configuration-types.js").NormalizedVelociousSyncClientOfflineConfiguration} [offline] - Normalized long-offline session configuration from `sync.client.offline`.
436
+ * @property {(path: string, payload: Record<string, ReturnType<typeof JSON.parse>>, options?: {signal?: AbortSignal}) => Promise<ReturnType<typeof JSON.parse>>} offlinePost - Path-selecting POSTer over the configured transport for the offline session's bootstrap/replay endpoints.
425
437
  * @property {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}, options?: {signal?: AbortSignal}) => Promise<import("./sync-api-client-types.js").SyncReplayResponse>} postReplay - Posts one replay request.
426
438
  * @property {import("../configuration-types.js").VelociousSyncClientRealtimeConfiguration} [realtime] - Realtime push configuration consumed by `subscribeRealtime(...)`.
427
439
  * @property {import("../remote-request-context.js").RemoteRequestContext} requestContext - Immutable scalar context captured for this client.