velocious 1.0.496 → 1.0.497
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/configuration-types.js +21 -0
- package/build/configuration.js +48 -0
- package/build/database/column-types.js +19 -0
- package/build/database/record/index.js +9 -0
- package/build/src/configuration-types.d.ts +68 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +20 -1
- package/build/src/configuration.d.ts +6 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +45 -1
- package/build/src/database/column-types.d.ts +8 -0
- package/build/src/database/column-types.d.ts.map +1 -0
- package/build/src/database/column-types.js +18 -0
- package/build/src/database/record/index.d.ts +8 -0
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +9 -1
- package/build/src/sync/sync-api-client.d.ts +4 -1
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +9 -2
- package/build/src/sync/sync-client-types.d.ts +88 -10
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +1 -1
- package/build/src/sync/sync-client.d.ts +38 -11
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +193 -29
- package/build/sync/sync-api-client.js +7 -1
- package/build/sync/sync-client-types.js +34 -5
- package/build/sync/sync-client.js +223 -27
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/configuration-types.js +21 -0
- package/src/configuration.js +48 -0
- package/src/database/column-types.js +19 -0
- package/src/database/record/index.js +9 -0
- package/src/sync/sync-api-client.js +7 -1
- package/src/sync/sync-client-types.js +34 -5
- package/src/sync/sync-client.js +223 -27
|
@@ -235,7 +235,10 @@ export default class SyncApiClient {
|
|
|
235
235
|
normalizeData?: ((data: Record<string, unknown>) => Record<string, unknown>) | undefined;
|
|
236
236
|
}): Promise<unknown>;
|
|
237
237
|
/**
|
|
238
|
-
* Builds backend-safe queued sync data without mutating caller data.
|
|
238
|
+
* Builds backend-safe queued sync data without mutating caller data. The default
|
|
239
|
+
* (no explicit `data`) is the resource's attributes minus local-only attributes,
|
|
240
|
+
* with booleans coerced and Date values serialized to ISO strings, so apps don't
|
|
241
|
+
* need per-model tracked-payload builders.
|
|
239
242
|
* @param {{resource: ?, data?: Record<string, unknown>, localOnlyAttributes?: string[], booleanAttributes?: string[], normalizeData?: (data: Record<string, unknown>) => Record<string, unknown>}} args - Data args.
|
|
240
243
|
* @returns {Record<string, unknown>} Queued data.
|
|
241
244
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-api-client.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-api-client.js"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sync-api-client.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-api-client.js"],"names":[],"mappings":"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"}
|
|
@@ -440,7 +440,10 @@ export default class SyncApiClient {
|
|
|
440
440
|
});
|
|
441
441
|
}
|
|
442
442
|
/**
|
|
443
|
-
* Builds backend-safe queued sync data without mutating caller data.
|
|
443
|
+
* Builds backend-safe queued sync data without mutating caller data. The default
|
|
444
|
+
* (no explicit `data`) is the resource's attributes minus local-only attributes,
|
|
445
|
+
* with booleans coerced and Date values serialized to ISO strings, so apps don't
|
|
446
|
+
* need per-model tracked-payload builders.
|
|
444
447
|
* @param {{resource: ?, data?: Record<string, unknown>, localOnlyAttributes?: string[], booleanAttributes?: string[], normalizeData?: (data: Record<string, unknown>) => Record<string, unknown>}} args - Data args.
|
|
445
448
|
* @returns {Record<string, unknown>} Queued data.
|
|
446
449
|
*/
|
|
@@ -454,6 +457,10 @@ export default class SyncApiClient {
|
|
|
454
457
|
if (Object.hasOwn(syncData, attributeName))
|
|
455
458
|
syncData[attributeName] = this.optionalBooleanSyncValue(syncData[attributeName], attributeName);
|
|
456
459
|
}
|
|
460
|
+
for (const [attributeName, value] of Object.entries(syncData)) {
|
|
461
|
+
if (value instanceof Date)
|
|
462
|
+
syncData[attributeName] = value.toISOString();
|
|
463
|
+
}
|
|
457
464
|
return syncData;
|
|
458
465
|
}
|
|
459
466
|
/**
|
|
@@ -596,4 +603,4 @@ export default class SyncApiClient {
|
|
|
596
603
|
return Math.floor(batchSize);
|
|
597
604
|
}
|
|
598
605
|
}
|
|
599
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hcGktY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1hcGktY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUV4RCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEMsa0dBQWtHO0FBQ2xHLDRGQUE0RjtBQUM1Riw0RkFBNEY7QUFDNUYsOEZBQThGO0FBQzlGLDBGQUEwRjtBQUMxRiw0RUFBNEU7QUFDNUUsb0ZBQW9GO0FBQ3BGLDRGQUE0RjtBQUM1Riw0RkFBNEY7QUFFNUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRO1FBQ3JDLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDO2dCQUNILE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2pDLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQix5RUFBeUU7Z0JBQ3pFLGtGQUFrRjtZQUNwRixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxDQUFBO1FBQzFCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFbEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUE7UUFDZixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxPQUFPO2dCQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FB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SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLHdCQUF3QixDQUFDLFFBQVE7UUFDdEMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLElBQUksYUFBYSxDQUFDLENBQUE7UUFDeEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtJQUNwRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTO1FBQ2xDLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQztZQUFFLE9BQU8sR0FBRyxDQUFBO1FBRTdGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtvcHRpb25hbEJvb2xlYW4sIG9wdGlvbmFsSW50ZWdlcn0gZnJvbSBcInR5cGFuaWNcIlxuXG5jb25zdCBzeW5jVGFza1Byb21pc2VzID0gbmV3IE1hcCgpXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUFwcGx5UmVzdWx0fSBTeW5jQ2hhbmdlQXBwbHlSZXN1bHQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUVudmVsb3BlfSBTeW5jQ2hhbmdlRW52ZWxvcGUgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXF1ZXN0fSBTeW5jQ2hhbmdlc1JlcXVlc3QgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXNwb25zZX0gU3luY0NoYW5nZXNSZXNwb25zZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdH0gU3luY0NoYW5nZXNSZXN1bHQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0N1cnNvcn0gU3luY0N1cnNvciAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVwbGF5SXRlbX0gU3luY1JlcGxheUl0ZW0gKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1JlcGxheVJlc3BvbnNlfSBTeW5jUmVwbGF5UmVzcG9uc2UgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnfSBTeW5jUmVzb3VyY2VDb25maWcgKi9cblxuLyoqXG4gKiBHZW5lcmljIGNsaWVudC1zaWRlIGhlbHBlciBmb3IgcmVwbGF5aW5nIHBlbmRpbmcgc3luYyBlbnZlbG9wZXMgdGhyb3VnaCB0aGVcbiAqIGZyYW1ld29yay1vd25lZCBgL3ZlbG9jaW91cy9zeW5jL3JlcGxheWAgZW5kcG9pbnQuIEFwcHMgcHJvdmlkZSBvbmx5IGxvY2FsXG4gKiBwZXJzaXN0ZW5jZS9hdXRoIGhvb2tzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jQXBpQ2xpZW50IHtcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgc3luYyB3b3JrIHdpdGggdGhlIHNhbWUga2V5IHNvIGNhbGxlcnMgZG8gbm90IGhhdmUgdG8ga2VlcCBhcHAtbG9jYWwgbG9ja3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBMb2NrIGtleS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFjayAtIFdvcmsgdG8gcnVuIG9uY2UgcHJldmlvdXMgd29yayBmaW5pc2hlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc2luZ2xlRmxpZ2h0KGtleSwgY2FsbGJhY2spIHtcbiAgICB3aGlsZSAoc3luY1Rhc2tQcm9taXNlcy5oYXMoa2V5KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3luY1Rhc2tQcm9taXNlcy5nZXQoa2V5KVxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIC8vIFRoZSBmYWlsZWQgZmxpZ2h0J3Mgb3duIGNhbGxlciBvYnNlcnZlcyB0aGF0IHJlamVjdGlvbjsgY2FsbGVycyBxdWV1ZWRcbiAgICAgICAgLy8gYmVoaW5kIGl0IHN0aWxsIHJ1biB0aGVpciBvd24gd29yayBzbyBwZW5kaW5nIHJvd3MgcmV0cnkgYWZ0ZXIgdGhlIGxvY2sgY2xlYXJzLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSBjYWxsYmFjaygpXG4gICAgc3luY1Rhc2tQcm9taXNlcy5zZXQoa2V5LCBwcm9taXNlKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHN5bmNUYXNrUHJvbWlzZXMuZ2V0KGtleSkgPT09IHByb21pc2UpIHN5bmNUYXNrUHJvbWlzZXMuZGVsZXRlKGtleSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVsbHMgYmFja2VuZCBzeW5jIGNoYW5nZXMgd2l0aCBhIGZyYW1ld29yay1tYW5hZ2VkIGN1cnNvciByb3cuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUHVsbCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggY2hhbmdlIHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC5cbiAgICogQHBhcmFtIHs/fSBhcmdzLmN1cnNvck1vZGVsIC0gTW9kZWwgdGhhdCByZXNwb25kcyB0byBmaW5kQnkvZmluZE9ySW5pdGlhbGl6ZUJ5IGZvciBjdXJzb3IgcGVyc2lzdGVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmN1cnNvcktleSAtIEN1cnNvciBvcHRpb24ga2V5LlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBTeW5jQ2hhbmdlc1JlcXVlc3QpID0+IFByb21pc2U8U3luY0NoYW5nZXNSZXNwb25zZT59IGFyZ3MucG9zdENoYW5nZXMgLSBQb3N0cyBvbmUgY2hhbmdlcyByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFN5bmNSZXNvdXJjZUNvbmZpZz59IGFyZ3MucmVzb3VyY2VzIC0gUmVzb3VyY2UgcG9saWNpZXMuXG4gICAqIEBwYXJhbSB7KHByb2dyZXNzOiB7cGFnZXM6IG51bWJlciwgc3luY2VkQ291bnQ6IG51bWJlcn0pID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gUHJvZ3Jlc3MgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDaGFuZ2VzUmVzdWx0Pn0gUHVsbCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHVsbENoYW5nZXNXaXRoQ3Vyc29yKGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsQ2hhbmdlcyh7XG4gICAgICBhdXRoZW50aWNhdGlvblRva2VuOiBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBiYXRjaFNpemU6IGFyZ3MuYmF0Y2hTaXplLFxuICAgICAgbG9hZEN1cnNvcjogYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5sb2FkU3luY0N1cnNvcih7Y3Vyc29yS2V5OiBhcmdzLmN1cnNvcktleSwgY3Vyc29yTW9kZWw6IGFyZ3MuY3Vyc29yTW9kZWx9KSxcbiAgICAgIHNhdmVDdXJzb3I6IGFzeW5jIChjdXJzb3IpID0+IGF3YWl0IHRoaXMuc2F2ZVN5bmNDdXJzb3Ioe2N1cnNvciwgY3Vyc29yS2V5OiBhcmdzLmN1cnNvcktleSwgY3Vyc29yTW9kZWw6IGFyZ3MuY3Vyc29yTW9kZWx9KSxcbiAgICAgIHBvc3RDaGFuZ2VzOiBhcmdzLnBvc3RDaGFuZ2VzLFxuICAgICAgYXBwbHlTeW5jOiB0aGlzLnJlc291cmNlQXBwbGllcihhcmdzLnJlc291cmNlcyksXG4gICAgICBvblByb2dyZXNzOiBhcmdzLm9uUHJvZ3Jlc3NcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgcGVyc2lzdGVkIHN5bmMgY3Vyc29yIGZyb20gYSBtb2RlbCByb3cgd2l0aCBhIHZhbHVlIGNvbHVtbi5cbiAgICogQHBhcmFtIHt7Y3Vyc29yS2V5OiBzdHJpbmcsIGN1cnNvck1vZGVsOiA/fX0gYXJncyAtIEN1cnNvciBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gUGVyc2lzdGVkIGN1cnNvciBwYXlsb2FkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGxvYWRTeW5jQ3Vyc29yKHtjdXJzb3JLZXksIGN1cnNvck1vZGVsfSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IGF3YWl0IGN1cnNvck1vZGVsLmZpbmRCeSh7a2V5OiBjdXJzb3JLZXl9KVxuXG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi52YWx1ZSgpIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgcGVyc2lzdGVkIHN5bmMgY3Vyc29yIHRvIGEgbW9kZWwgcm93IHdpdGggYSB2YWx1ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7e2N1cnNvcjogU3luY0N1cnNvciwgY3Vyc29yS2V5OiBzdHJpbmcsIGN1cnNvck1vZGVsOiA/fX0gYXJncyAtIEN1cnNvciBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzYXZlU3luY0N1cnNvcih7Y3Vyc29yLCBjdXJzb3JLZXksIGN1cnNvck1vZGVsfSkge1xuICAgIGlmICghY3Vyc29yKSByZXR1cm5cblxuICAgIGNvbnN0IG9wdGlvbiA9IGF3YWl0IGN1cnNvck1vZGVsLmZpbmRPckluaXRpYWxpemVCeSh7a2V5OiBjdXJzb3JLZXl9KVxuXG4gICAgb3B0aW9uLmFzc2lnbih7dmFsdWU6IEpTT04uc3RyaW5naWZ5KGN1cnNvcil9KVxuICAgIGlmIChvcHRpb24uaXNDaGFuZ2VkKCkpIGF3YWl0IG9wdGlvbi5zYXZlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxscyBiYWNrZW5kIHN5bmMgY2hhbmdlcyBpbiBzdGFibGUgcGFnZXMsIGFwcGxpZXMgdGhlbSBsb2NhbGx5LCBhbmQgc3RvcmVzXG4gICAqIHRoZSBhY2tub3dsZWRnZWQgY3Vyc29yLiBBcHBzIHByb3ZpZGUgb25seSBhdXRoLCBwZXJzaXN0ZW5jZSwgdHJhbnNwb3J0LCBhbmRcbiAgICogcmVzb3VyY2UgcG9saWN5IGhvb2tzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFB1bGwgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4gdG8gc2VuZCB3aXRoIGNoYW5nZSByZXF1ZXN0cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmJhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuIERlZmF1bHRzIHRvIDEwMC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFN5bmNDdXJzb3IgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gYXJncy5sb2FkQ3Vyc29yIC0gTG9hZHMgdGhlIHBlcnNpc3RlZCBsb2NhbCBjdXJzb3IuXG4gICAqIEBwYXJhbSB7KGN1cnNvcjogU3luY0N1cnNvcikgPT4gUHJvbWlzZTx2b2lkPn0gYXJncy5zYXZlQ3Vyc29yIC0gUGVyc2lzdHMgdGhlIGZpbmFsIGFja25vd2xlZGdlZCBjdXJzb3IuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IFN5bmNDaGFuZ2VzUmVxdWVzdCkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gYXJncy5wb3N0Q2hhbmdlcyAtIFBvc3RzIG9uZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7KHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBhcmdzLmFwcGx5U3luYyAtIEFwcGxpZXMgb25lIG5vcm1hbGl6ZWQgc3luYyByb3cgbG9jYWxseS5cbiAgICogQHBhcmFtIHsocHJvZ3Jlc3M6IHtwYWdlczogbnVtYmVyLCBzeW5jZWRDb3VudDogbnVtYmVyfSkgPT4gdm9pZH0gW2FyZ3Mub25Qcm9ncmVzc10gLSBQcm9ncmVzcyBjYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8U3luY0NoYW5nZXNSZXN1bHQ+fSBQdWxsIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBwdWxsQ2hhbmdlcyhhcmdzKSB7XG4gICAgbGV0IGFmdGVyQ3Vyc29yID0gdGhpcy5zeW5jQ3Vyc29yRnJvbVBheWxvYWQoYXdhaXQgYXJncy5sb2FkQ3Vyc29yKCkpXG4gICAgbGV0IHVwVG9DdXJzb3IgPSBudWxsXG4gICAgbGV0IHBhZ2VzID0gMFxuICAgIGxldCBzeW5jZWRDb3VudCA9IDBcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlXG4gICAgY29uc3QgcmVzb3VyY2VDb3VudHMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovICh7fSlcbiAgICBjb25zdCByZXNvdXJjZUNoYW5nZWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSAqLyAoe30pXG4gICAgY29uc3QgYmF0Y2hTaXplID0gdGhpcy5ub3JtYWxpemVkQmF0Y2hTaXplKGFyZ3MuYmF0Y2hTaXplKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNoYW5nZXNSZXNwb25zZSA9IGF3YWl0IHRoaXMuY2hhbmdlc1BhZ2Uoey4uLmFyZ3MsIGFmdGVyQ3Vyc29yLCBiYXRjaFNpemUsIHVwVG9DdXJzb3J9KVxuICAgICAgY29uc3Qgc3luY3MgPSBjaGFuZ2VzUmVzcG9uc2Uuc3luY3NcblxuICAgICAgaWYgKCF1cFRvQ3Vyc29yKSB1cFRvQ3Vyc29yID0gY2hhbmdlc1Jlc3BvbnNlLnVwVG9DdXJzb3JcbiAgICAgIGlmIChzeW5jcy5sZW5ndGggPT09IDApIGJyZWFrXG5cbiAgICAgIHBhZ2VzICs9IDFcblxuICAgICAgZm9yIChjb25zdCBzeW5jIG9mIHN5bmNzKSB7XG4gICAgICAgIGNvbnN0IGFwcGx5UmVzdWx0ID0gYXdhaXQgYXJncy5hcHBseVN5bmMoc3luYylcbiAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gYXBwbHlSZXN1bHQucmVzb3VyY2VUeXBlID8/IHN5bmMucmVzb3VyY2VUeXBlKClcblxuICAgICAgICBjaGFuZ2VkIHx8PSBhcHBseVJlc3VsdC5jaGFuZ2VkID09PSB0cnVlXG4gICAgICAgIHN5bmNlZENvdW50ICs9IDFcblxuICAgICAgICBpZiAocmVzb3VyY2VUeXBlKSB7XG4gICAgICAgICAgcmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSA9IChyZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdIHx8IDApICsgMVxuICAgICAgICAgIHJlc291cmNlQ2hhbmdlZFtyZXNvdXJjZVR5cGVdIHx8PSBhcHBseVJlc3VsdC5jaGFuZ2VkID09PSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYWZ0ZXJDdXJzb3IgPSBjaGFuZ2VzUmVzcG9uc2UubmV4dEN1cnNvclxuXG4gICAgICBpZiAoYXJncy5vblByb2dyZXNzKSBhcmdzLm9uUHJvZ3Jlc3Moe3BhZ2VzLCBzeW5jZWRDb3VudH0pXG4gICAgICBpZiAoc3luY3MubGVuZ3RoIDwgYmF0Y2hTaXplKSBicmVha1xuICAgIH1cblxuICAgIGlmIChhZnRlckN1cnNvcikgYXdhaXQgYXJncy5zYXZlQ3Vyc29yKGFmdGVyQ3Vyc29yKVxuXG4gICAgcmV0dXJuIHtjaGFuZ2VkLCBwYWdlcywgcmVzb3VyY2VDaGFuZ2VkLCByZXNvdXJjZUNvdW50cywgc3luY2VkQ291bnR9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbmQgdmFsaWRhdGVzIG9uZSBiYWNrZW5kIHN5bmMgY2hhbmdlcyBwYWdlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFBhZ2UgYXJncy5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yfSBhcmdzLmFmdGVyQ3Vyc29yIC0gTGFzdCBhY2tub3dsZWRnZWQgY3Vyc29yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYmF0Y2hTaXplIC0gUGFnZSBzaXplLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBTeW5jQ2hhbmdlc1JlcXVlc3QpID0+IFByb21pc2U8U3luY0NoYW5nZXNSZXNwb25zZT59IGFyZ3MucG9zdENoYW5nZXMgLSBDaGFuZ2VzIHBvc3Rlci5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yfSBhcmdzLnVwVG9DdXJzb3IgLSBTbmFwc2hvdCB1cHBlci1ib3VuZCBjdXJzb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtuZXh0Q3Vyc29yOiBTeW5jQ3Vyc29yLCBzeW5jczogU3luY0NoYW5nZUVudmVsb3BlW10sIHVwVG9DdXJzb3I6IFN5bmNDdXJzb3J9Pn0gTm9ybWFsaXplZCBjaGFuZ2VzIHBhZ2UuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY2hhbmdlc1BhZ2Uoe2FmdGVyQ3Vyc29yLCBhdXRoZW50aWNhdGlvblRva2VuLCBiYXRjaFNpemUsIHBvc3RDaGFuZ2VzLCB1cFRvQ3Vyc29yfSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdENoYW5nZXMoe1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGxpbWl0OiBiYXRjaFNpemUsXG4gICAgICAuLi50aGlzLmN1cnNvclBheWxvYWQoXCJhZnRlclwiLCBhZnRlckN1cnNvciksXG4gICAgICAuLi50aGlzLmN1cnNvclBheWxvYWQoXCJ1cFRvXCIsIHVwVG9DdXJzb3IpXG4gICAgfSlcblxuICAgIHRoaXMuZW5zdXJlU3VjY2Vzc2Z1bENoYW5nZXNSZXNwb25zZShyZXNwb25zZSlcblxuICAgIGNvbnN0IHN5bmNzID0gLyoqIEB0eXBlIHt1bmtub3duW119ICovIChyZXNwb25zZS5zeW5jcylcblxuICAgIHJldHVybiB7XG4gICAgICBuZXh0Q3Vyc29yOiB0aGlzLnN5bmNDdXJzb3JGcm9tUGF5bG9hZChyZXNwb25zZS5uZXh0Q3Vyc29yID8/IG51bGwpLFxuICAgICAgc3luY3M6IHN5bmNzLm1hcCgoc3luY1BheWxvYWQpID0+IHRoaXMuc3luY0VudmVsb3BlRnJvbVBheWxvYWQoc3luY1BheWxvYWQpKSxcbiAgICAgIHVwVG9DdXJzb3I6IHRoaXMuc3luY0N1cnNvckZyb21QYXlsb2FkKHJlc3BvbnNlLnVwVG9DdXJzb3IgPz8gbnVsbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIEFQSSByZXNwb25zZSBzdGF0dXMgYW5kIHNoYXBlIGZvciBjaGFuZ2UtZmVlZCBwdWxscy5cbiAgICogQHBhcmFtIHtTeW5jQ2hhbmdlc1Jlc3BvbnNlfSByZXNwb25zZSAtIENoYW5nZXMgcmVzcG9uc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGVuc3VyZVN1Y2Nlc3NmdWxDaGFuZ2VzUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSBcImVycm9yXCIpIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvck1lc3NhZ2UgfHwgXCJTeW5jIGNoYW5nZXMgZmFpbGVkXCIpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnN5bmNzKSkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBjaGFuZ2VzIHJlc3BvbnNlIG1pc3Npbmcgc3luY3NcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGN1cnNvciBpbnRvIHJlcXVlc3QgcGFyYW1zIHdpdGggdGhlIGdpdmVuIHByZWZpeC5cbiAgICogQHBhcmFtIHtcImFmdGVyXCIgfCBcInVwVG9cIn0gcHJlZml4IC0gUmVxdWVzdCBmaWVsZCBwcmVmaXguXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvcn0gY3Vyc29yIC0gQ3Vyc29yIHRvIHNlcmlhbGl6ZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGw+fSBSZXF1ZXN0IHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBjdXJzb3JQYXlsb2FkKHByZWZpeCwgY3Vyc29yKSB7XG4gICAgaWYgKCFjdXJzb3IpIHJldHVybiB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIFtgJHtwcmVmaXh9SWRgXTogY3Vyc29yLmlkLFxuICAgICAgLi4uKGN1cnNvci5zZXJ2ZXJTZXF1ZW5jZSA/IHtbYCR7cHJlZml4fVNlcnZlclNlcXVlbmNlYF06IGN1cnNvci5zZXJ2ZXJTZXF1ZW5jZX0gOiB7fSksXG4gICAgICBbYCR7cHJlZml4fVVwZGF0ZWRBdGBdOiBjdXJzb3IudXBkYXRlZEF0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHBlcnNpc3RlZCBvciByZXNwb25zZSBjdXJzb3IgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgPz4gfCBudWxsIHwgdW5kZWZpbmVkfSBwYXlsb2FkIC0gQ3Vyc29yIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ3Vyc29yfSBQYXJzZWQgY3Vyc29yLlxuICAgKi9cbiAgc3RhdGljIHN5bmNDdXJzb3JGcm9tUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKCFwYXlsb2FkKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jQ3Vyc29yRnJvbVBheWxvYWQoSlNPTi5wYXJzZShwYXlsb2FkKSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICByZXR1cm4ge2lkOiBudWxsLCBzZXJ2ZXJTZXF1ZW5jZTogbnVsbCwgdXBkYXRlZEF0OiBwYXlsb2FkfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHBheWxvYWQpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdXBkYXRlZEF0ID0gdHlwZW9mIHBheWxvYWQudXBkYXRlZEF0ID09PSBcInN0cmluZ1wiID8gcGF5bG9hZC51cGRhdGVkQXQgOiBudWxsXG5cbiAgICBpZiAoIXVwZGF0ZWRBdCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogcGF5bG9hZC5pZCA9PT0gbnVsbCB8fCBwYXlsb2FkLmlkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKHBheWxvYWQuaWQpLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IG9wdGlvbmFsSW50ZWdlcihwYXlsb2FkLnNlcnZlclNlcXVlbmNlID09PSBcIlwiID8gbnVsbCA6IHBheWxvYWQuc2VydmVyU2VxdWVuY2UpLFxuICAgICAgdXBkYXRlZEF0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG5vcm1hbGl6ZWQgc3luYyByb3cgYWRhcHRlci5cbiAgICogQHBhcmFtIHs/fSBwYXlsb2FkIC0gUmF3IHN5bmMgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1N5bmNDaGFuZ2VFbnZlbG9wZX0gU3luYyByb3cgYWRhcHRlci5cbiAgICovXG4gIHN0YXRpYyBzeW5jRW52ZWxvcGVGcm9tUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKCFwYXlsb2FkIHx8IHR5cGVvZiBwYXlsb2FkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY2hhbmdlcyBlbnRyeSBtdXN0IGJlIGFuIG9iamVjdFwiKVxuXG4gICAgY29uc3Qgc3luY1BheWxvYWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAocGF5bG9hZClcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiAoKSA9PiBzeW5jUGF5bG9hZC5kYXRhLFxuICAgICAgaWQ6ICgpID0+IHN5bmNQYXlsb2FkLmlkLFxuICAgICAgcmVzb3VyY2VJZDogKCkgPT4gc3luY1BheWxvYWQucmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlVHlwZTogKCkgPT4gc3luY1BheWxvYWQucmVzb3VyY2VUeXBlID09PSBudWxsIHx8IHN5bmNQYXlsb2FkLnJlc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhzeW5jUGF5bG9hZC5yZXNvdXJjZVR5cGUpLFxuICAgICAgc3luY1R5cGU6ICgpID0+IHN5bmNQYXlsb2FkLnN5bmNUeXBlID09PSBudWxsIHx8IHN5bmNQYXlsb2FkLnN5bmNUeXBlID09PSB1bmRlZmluZWQgPyBcIlwiIDogU3RyaW5nKHN5bmNQYXlsb2FkLnN5bmNUeXBlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gYXBwLWNvbmZpZ3VyZWQgcmVzb3VyY2UgYXBwbGllciBmb3IgcHVsbGVkIHN5bmMgcm93cy4gVGhlIHN5bmNcbiAgICogbWVjaGFuaWNzIHN0YXkgaGVyZTsgYXBwcyBvbmx5IGRlY2xhcmUgd2hpY2ggbW9kZWxzL2F0dHJpYnV0ZXMvaG9va3MgYXJlXG4gICAqIGFsbG93ZWQgZm9yIGVhY2ggcmVzb3VyY2UgdHlwZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBTeW5jUmVzb3VyY2VDb25maWc+fSByZXNvdXJjZXMgLSBSZXNvdXJjZSBwb2xpY3kgbWFwLlxuICAgKiBAcGFyYW0geyhyZWNvcmQ6ID8pID0+ICgpID0+IHZvaWR9IFtvblJlY29yZF0gLSBDYWxsZWQgd2l0aCBlYWNoIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuOyByZXR1cm5zIGEgcmVsZWFzZSBjYWxsYmFjayBpbnZva2VkIGFmdGVyIHRoZSB3cml0ZSAodXNlZCBmb3IgZWNobyBzdXBwcmVzc2lvbikuXG4gICAqIEByZXR1cm5zIHsoc3luYzogU3luY0NoYW5nZUVudmVsb3BlKSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VBcHBseVJlc3VsdD59IFN5bmMgYXBwbHkgY2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgcmVzb3VyY2VBcHBsaWVyKHJlc291cmNlcywgb25SZWNvcmQpIHtcbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IGF3YWl0IHRoaXMuYXBwbHlSZXNvdXJjZVN5bmMoe29uUmVjb3JkLCByZXNvdXJjZXMsIHN5bmN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgb25lIHN5bmMgcm93IHVzaW5nIGRlY2xhcmF0aXZlIHJlc291cmNlIHBvbGljeS5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTeW5jUmVzb3VyY2VDb25maWc+LCBzeW5jOiBTeW5jQ2hhbmdlRW52ZWxvcGUsIG9uUmVjb3JkPzogKHJlY29yZDogPykgPT4gKCkgPT4gdm9pZH19IGFyZ3MgLSBBcHBseSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBBcHBseSByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXBwbHlSZXNvdXJjZVN5bmMoe29uUmVjb3JkLCByZXNvdXJjZXMsIHN5bmN9KSB7XG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc3luYy5yZXNvdXJjZVR5cGUoKVxuICAgIGNvbnN0IHJlc291cmNlID0gcmVzb3VyY2VUeXBlID8gcmVzb3VyY2VzW3Jlc291cmNlVHlwZV0gOiB1bmRlZmluZWRcblxuICAgIGlmICghcmVzb3VyY2UgfHwgIXJlc291cmNlLmVuYWJsZWQpIHJldHVybiB7Y2hhbmdlZDogZmFsc2UsIHJlc291cmNlVHlwZX1cblxuICAgIGlmIChzeW5jLnN5bmNUeXBlKCkgPT09IFwiZGVsZXRlXCIpIHtcbiAgICAgIHJldHVybiB7Y2hhbmdlZDogYXdhaXQgdGhpcy5kZXN0cm95U3luY2VkUmVzb3VyY2Uoe29uUmVjb3JkLCByZXNvdXJjZSwgc3luY30pLCByZXNvdXJjZVR5cGV9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3luY0RhdGEoc3luYylcbiAgICBjb25zdCByZWNvcmQgPSByZXNvdXJjZS5maW5kUmVjb3JkID8gYXdhaXQgcmVzb3VyY2UuZmluZFJlY29yZCh7ZGF0YSwgcmVzb3VyY2VJZDogc3luYy5yZXNvdXJjZUlkKCksIHN5bmN9KSA6IGF3YWl0IHJlc291cmNlLm1vZGVsQ2xhc3MuZmluZE9ySW5pdGlhbGl6ZUJ5KHtpZDogZGF0YS5pZCA/PyBzeW5jLnJlc291cmNlSWQoKX0pXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGF3YWl0IHJlc291cmNlLmF0dHJpYnV0ZXMoe2RhdGEsIHJlY29yZCwgc3luY30pXG4gICAgY29uc3QgcmVsZWFzZVJlY29yZCA9IG9uUmVjb3JkID8gb25SZWNvcmQocmVjb3JkKSA6IG51bGxcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgcmVjb3JkLmFzc2lnbihhdHRyaWJ1dGVzKVxuXG4gICAgICBpZiAocmVjb3JkLmlzQ2hhbmdlZCgpKSB7XG4gICAgICAgIGF3YWl0IHJlY29yZC5zYXZlKClcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlLmFmdGVyQXBwbHkpIHtcbiAgICAgICAgY29uc3QgaG9va0NoYW5nZWQgPSBhd2FpdCByZXNvdXJjZS5hZnRlckFwcGx5KHthdHRyaWJ1dGVzLCBkYXRhLCByZWNvcmQsIHN5bmN9KVxuXG4gICAgICAgIGNoYW5nZWQgfHw9IGhvb2tDaGFuZ2VkID09PSB0cnVlXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChyZWxlYXNlUmVjb3JkKSByZWxlYXNlUmVjb3JkKClcbiAgICB9XG5cbiAgICByZXR1cm4ge2NoYW5nZWQsIHJlc291cmNlVHlwZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhIHN5bmNlZCByZXNvdXJjZSB2aWEgaXRzIGRlY2xhcmVkIG1vZGVsIHBvbGljeS5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2U6IFN5bmNSZXNvdXJjZUNvbmZpZywgc3luYzogU3luY0NoYW5nZUVudmVsb3BlLCBvblJlY29yZD86IChyZWNvcmQ6ID8pID0+ICgpID0+IHZvaWR9fSBhcmdzIC0gRGVzdHJveSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciBhIGxvY2FsIHJvdyB3YXMgZGVzdHJveWVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRlc3Ryb3lTeW5jZWRSZXNvdXJjZSh7b25SZWNvcmQsIHJlc291cmNlLCBzeW5jfSkge1xuICAgIGNvbnN0IGlkID0gc3luYy5yZXNvdXJjZUlkKClcbiAgICBjb25zdCByZWNvcmQgPSByZXNvdXJjZS5maW5kUmVjb3JkRm9yRGVsZXRlID8gYXdhaXQgcmVzb3VyY2UuZmluZFJlY29yZEZvckRlbGV0ZSh7cmVzb3VyY2VJZDogaWQsIHN5bmN9KSA6IGF3YWl0IHJlc291cmNlLm1vZGVsQ2xhc3MuZmluZEJ5KHtpZH0pXG5cbiAgICBpZiAoIXJlY29yZCkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCByZWxlYXNlUmVjb3JkID0gb25SZWNvcmQgPyBvblJlY29yZChyZWNvcmQpIDogbnVsbFxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlY29yZC5kZXN0cm95KClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHJlbGVhc2VSZWNvcmQpIHJlbGVhc2VSZWNvcmQoKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBlbWJlZGRlZCBzeW5jIGRhdGEgSlNPTi9vYmplY3QuXG4gICAqIEBwYXJhbSB7U3luY0NoYW5nZUVudmVsb3BlfSBzeW5jIC0gU3luYyByb3cuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gU3luYyBkYXRhIG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBzeW5jRGF0YShzeW5jKSB7XG4gICAgY29uc3QgZGF0YSA9IHN5bmMuZGF0YSgpXG5cbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihgU3luYyAke3N5bmMuaWQoKX0gaXMgbWlzc2luZyBkYXRhYClcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoSlNPTi5wYXJzZShkYXRhKSlcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZGF0YSlcblxuICAgIHRocm93IG5ldyBFcnJvcihgU3luYyAke3N5bmMuaWQoKX0gaGFzIGludmFsaWQgZGF0YWApXG4gIH1cblxuICAvKipcbiAgICogRHJhaW5zIHBlbmRpbmcgc3luYyByZWNvcmRzIGZyb20gYSBsb2NhbCBWZWxvY2lvdXMgbW9kZWwgaW4gc3RhYmxlIG9yZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcGxheSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggcmVwbGF5IHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC5cbiAgICogQHBhcmFtIHs/fSBhcmdzLnN5bmNNb2RlbCAtIExvY2FsIFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHthdXRoZW50aWNhdGlvblRva2VuOiBzdHJpbmcsIHN5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj59KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFJlcGxheSBwb3N0ZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUxvY2FsU3luY3MoYXJncykge1xuICAgIGNvbnN0IHBvc3RlZFNuYXBzaG90c0J5U3luY0lkID0gbmV3IE1hcCgpXG5cbiAgICBhd2FpdCB0aGlzLnJlcGxheVBlbmRpbmcoe1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogYXJncy5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBhcmdzLmJhdGNoU2l6ZSxcbiAgICAgIG1hcmtTdWNjZXNzZnVsOiBhc3luYyAoc3luYykgPT4ge1xuICAgICAgICBjb25zdCBzeW5jSWQgPSAoLyoqIEB0eXBlIHt7aWQ6ICgpID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9fSAqLyAoc3luYykpLmlkKClcbiAgICAgICAgLy8gUmVsb2FkIHdpdGggdGhlIHJlc291cmNlIHByZWxvYWRlZCBzbyByb3dzIHJlbHlpbmcgb24gdGhlIHJlc291cmNlLWF0dHJpYnV0ZXNcbiAgICAgICAgLy8gZmFsbGJhY2sgaW4gbG9jYWxTeW5jRGF0YSBjb21wYXJlIGFnYWluc3QgdGhlIHNhbWUgc25hcHNob3QgdGhleSBwb3N0ZWQuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTeW5jID0gYXdhaXQgYXJncy5zeW5jTW9kZWwucHJlbG9hZCh7cmVzb3VyY2U6IHRydWV9KS53aGVyZSh7aWQ6IHN5bmNJZH0pLmZpcnN0KClcblxuICAgICAgICBpZiAoIWN1cnJlbnRTeW5jKSByZXR1cm5cbiAgICAgICAgLy8gQSByb3cgZWRpdGVkIHdoaWxlIGl0cyBvbGQgcGF5bG9hZCB3YXMgaW4gZmxpZ2h0IHN0YXlzIHBlbmRpbmcsIHNvIHRoZVxuICAgICAgICAvLyBuZXdlciBsb2NhbCBjaGFuZ2UgcmVwbGF5cyBvbiB0aGUgbmV4dCBkcmFpbiBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAgICAgIGlmICh0aGlzLmxvY2FsU3luY1JlcGxheVNuYXBzaG90KGN1cnJlbnRTeW5jKSAhPT0gcG9zdGVkU25hcHNob3RzQnlTeW5jSWQuZ2V0KFN0cmluZyhzeW5jSWQpKSkgcmV0dXJuXG5cbiAgICAgICAgYXdhaXQgY3VycmVudFN5bmMudXBkYXRlKHtzdGF0ZTogXCJzdWNjZXNzXCJ9KVxuICAgICAgfSxcbiAgICAgIHBlbmRpbmdTeW5jczogYXN5bmMgKCkgPT4gYXdhaXQgYXJncy5zeW5jTW9kZWwucHJlbG9hZCh7cmVzb3VyY2U6IHRydWV9KS53aGVyZSh7c3RhdGU6IFwicGVuZGluZ1wifSkub3JkZXIoXCJjcmVhdGVkX2F0XCIpLnRvQXJyYXkoKSxcbiAgICAgIHBvc3RSZXBsYXk6IGFyZ3MucG9zdFJlcGxheSxcbiAgICAgIHN5bmNJZDogKHN5bmMpID0+ICgvKiogQHR5cGUge3tpZDogKCkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH19ICovIChzeW5jKSkuaWQoKSxcbiAgICAgIHN5bmNQYXlsb2FkOiAoc3luYykgPT4ge1xuICAgICAgICBwb3N0ZWRTbmFwc2hvdHNCeVN5bmNJZC5zZXQoU3RyaW5nKCgvKiogQHR5cGUge3tpZDogKCkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH19ICovIChzeW5jKSkuaWQoKSksIHRoaXMubG9jYWxTeW5jUmVwbGF5U25hcHNob3Qoc3luYykpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxTeW5jUGF5bG9hZChzeW5jKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgcmVwbGF5LXJlbGV2YW50IHN0YXRlIG9mIGEgbG9jYWwgc3luYyByb3cgZm9yIGluLWZsaWdodCBjb21wYXJpc29ucy5cbiAgICogQHBhcmFtIHs/fSBzeW5jIC0gTG9jYWwgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSBzbmFwc2hvdCBvZiB0aGUgcm93J3MgcmVwbGF5ZWQgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChzeW5jKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtkYXRhOiB0aGlzLmxvY2FsU3luY0RhdGEoc3luYyksIHN5bmNUeXBlOiBzeW5jLnN5bmNUeXBlKCl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBvbmUgcmVwbGF5IGVudmVsb3BlIGZyb20gYSBsb2NhbCBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHs/fSBzeW5jIC0gTG9jYWwgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHt7Y2xpZW50VXBkYXRlZEF0Pzogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaWQ6IG51bWJlciwgcmVzb3VyY2VJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZywgc3luY1R5cGU6IHN0cmluZ319IFN5bmMgcmVwbGF5IGVudmVsb3BlLlxuICAgKi9cbiAgc3RhdGljIGxvY2FsU3luY1BheWxvYWQoc3luYykge1xuICAgIGNvbnN0IGNsaWVudFVwZGF0ZWRBdCA9IHN5bmMudXBkYXRlZEF0KCkgfHwgc3luYy5jcmVhdGVkQXQoKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudFVwZGF0ZWRBdDogY2xpZW50VXBkYXRlZEF0ID8gY2xpZW50VXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiB1bmRlZmluZWQsXG4gICAgICBkYXRhOiB0aGlzLmxvY2FsU3luY0RhdGEoc3luYyksXG4gICAgICBpZDogLyoqIEB0eXBlIHtudW1iZXJ9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChzeW5jLmlkKCkpKSxcbiAgICAgIHJlc291cmNlSWQ6IFN0cmluZyhzeW5jLnJlc291cmNlSWQoKSksXG4gICAgICByZXNvdXJjZVR5cGU6IHN5bmMucmVzb3VyY2VUeXBlKCkgfHwgXCJcIixcbiAgICAgIHN5bmNUeXBlOiBzeW5jLnN5bmNUeXBlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIGxvY2FsIHN5bmMgcm93IHBheWxvYWQsIGZhbGxpbmcgYmFjayB0byBwcmVsb2FkZWQgcmVzb3VyY2UgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHs/fSBzeW5jIC0gTG9jYWwgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gU3luYyBkYXRhLlxuICAgKi9cbiAgc3RhdGljIGxvY2FsU3luY0RhdGEoc3luYykge1xuICAgIGxldCBzeW5jRGF0YSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChzeW5jLmRhdGEoKSB8fCB7fSlcblxuICAgIGlmICh0eXBlb2Ygc3luY0RhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN5bmNEYXRhID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKEpTT04ucGFyc2Uoc3luY0RhdGEpKVxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIHN5bmNEYXRhID0ge31cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoc3luY0RhdGEpLmxlbmd0aCA+IDApIHJldHVybiBzeW5jRGF0YVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoc3luYy5yZXNvdXJjZSgpLmF0dHJpYnV0ZXMoKSlcbiAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZXMgYSBsb2NhbCBzeW5jIHJvdyBmb3IgYSBWZWxvY2lvdXMgbW9kZWwgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUXVldWUgYXJncy5cbiAgICogQHBhcmFtIHs/fSBhcmdzLnJlc291cmNlIC0gUmVzb3VyY2UgYmVpbmcgc3luY2VkLlxuICAgKiBAcGFyYW0gez99IGFyZ3Muc3luY01vZGVsIC0gTG9jYWwgU3luYyBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2FyZ3MuZGF0YV0gLSBFeHBsaWNpdCBzeW5jIGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zeW5jVHlwZV0gLSBTeW5jIG9wZXJhdGlvbiB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgdG8gc3RyaXAgZnJvbSBxdWV1ZWQgcGF5bG9hZHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmJvb2xlYW5BdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgdG8gY29lcmNlIHRocm91Z2ggc3luYyBib29sZWFuIHBhcnNpbmcuXG4gICAqIEBwYXJhbSB7KGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2FyZ3Mubm9ybWFsaXplRGF0YV0gLSBBcHAtc3BlY2lmaWMgZGF0YSBub3JtYWxpemVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gTG9jYWwgc3luYyByb3cuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcXVldWVMb2NhbFN5bmMoYXJncykge1xuICAgIGNvbnN0IHJlc291cmNlUmVjb3JkSWQgPSBhcmdzLnJlc291cmNlLmlkKClcbiAgICBjb25zdCBtb2RlbENsYXNzID0gYXJncy5yZXNvdXJjZS5jb25zdHJ1Y3RvclxuXG4gICAgaWYgKHR5cGVvZiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcmVzb3VyY2UgbW9kZWwgY2xhc3MgbXVzdCBpbXBsZW1lbnQgc3RhdGljIGdldE1vZGVsTmFtZSgpIHRvIHF1ZXVlIHN5bmMgZGF0YSAtIGNsYXNzIG5hbWVzIGFyZSBub3Qgc3RhYmxlIGFjcm9zcyBleHBsaWNpdCBtb2RlbCBuYW1lcyBhbmQgbWluaWZpZWQgYnVuZGxlc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgICBjb25zdCBzeW5jRGF0YSA9IHRoaXMucXVldWVkU3luY0RhdGEoYXJncylcbiAgICBjb25zdCBzeW5jVHlwZSA9IGFyZ3Muc3luY1R5cGUgfHwgXCJ1cGRhdGVcIlxuXG4gICAgaWYgKCFyZXNvdXJjZVJlY29yZElkKSB0aHJvdyBuZXcgRXJyb3IoXCJyZXNvdXJjZS5pZCgpIGlzIHJlcXVpcmVkIHRvIHF1ZXVlIHN5bmMgZGF0YVwiKVxuXG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IFN0cmluZyhyZXNvdXJjZVJlY29yZElkKVxuICAgIGNvbnN0IGV4aXN0aW5nU3luYyA9IGF3YWl0IGFyZ3Muc3luY01vZGVsLmZpbmRCeSh7cmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSlcblxuICAgIGlmIChleGlzdGluZ1N5bmMpIHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nU3luYy51cGRhdGUoe1xuICAgICAgICBkYXRhOiBzeW5jRGF0YSxcbiAgICAgICAgc3RhdGU6IFwicGVuZGluZ1wiLFxuICAgICAgICBzeW5jVHlwZVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGV4aXN0aW5nU3luY1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBhcmdzLnN5bmNNb2RlbC5jcmVhdGUoe1xuICAgICAgZGF0YTogc3luY0RhdGEsXG4gICAgICByZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgc3RhdGU6IFwicGVuZGluZ1wiLFxuICAgICAgc3luY1R5cGVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBiYWNrZW5kLXNhZmUgcXVldWVkIHN5bmMgZGF0YSB3aXRob3V0IG11dGF0aW5nIGNhbGxlciBkYXRhLlxuICAgKiBAcGFyYW0ge3tyZXNvdXJjZTogPywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBsb2NhbE9ubHlBdHRyaWJ1dGVzPzogc3RyaW5nW10sIGJvb2xlYW5BdHRyaWJ1dGVzPzogc3RyaW5nW10sIG5vcm1hbGl6ZURhdGE/OiAoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fX0gYXJncyAtIERhdGEgYXJncy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBRdWV1ZWQgZGF0YS5cbiAgICovXG4gIHN0YXRpYyBxdWV1ZWRTeW5jRGF0YShhcmdzKSB7XG4gICAgY29uc3QgaW5wdXREYXRhID0gYXJncy5kYXRhID8/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChhcmdzLnJlc291cmNlLmF0dHJpYnV0ZXMoKSlcbiAgICBjb25zdCBub3JtYWxpemVkRGF0YSA9IGFyZ3Mubm9ybWFsaXplRGF0YSA/IGFyZ3Mubm9ybWFsaXplRGF0YShpbnB1dERhdGEpIDogaW5wdXREYXRhXG4gICAgY29uc3Qgc3luY0RhdGEgPSB7Li4ubm9ybWFsaXplZERhdGF9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzIHx8IFtdKSBkZWxldGUgc3luY0RhdGFbYXR0cmlidXRlTmFtZV1cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXJncy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSkge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24oc3luY0RhdGEsIGF0dHJpYnV0ZU5hbWUpKSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXSA9IHRoaXMub3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHN5bmNEYXRhW2F0dHJpYnV0ZU5hbWVdLCBhdHRyaWJ1dGVOYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBzeW5jRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNtYWxsIGFwcC1mYWNpbmcgbG9jYWwgc3luYyBxdWV1ZSBmYWNhZGUgZnJvbSBkZWNsYXJhdGl2ZSBtb2RlbCBjb25maWcuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUXVldWUgY29uZmlnLlxuICAgKiBAcGFyYW0gez99IGFyZ3Muc3luY01vZGVsIC0gTG9jYWwgU3luYyBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2luZ2xlRmxpZ2h0S2V5IC0gS2V5IHVzZWQgdG8gc2VyaWFsaXplIGJhY2tlbmQgcmVwbGF5LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGFyZ3Muc3luY1BlbmRpbmcgLSBCYWNrZW5kIHJlcGxheSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsocmVzb3VyY2U6ID8pID0+IHN0cmluZ1tdfSBbYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzXSAtIFJlc291cmNlLXNwZWNpZmljIGxvY2FsLW9ubHkgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHsocmVzb3VyY2U6ID8pID0+IHN0cmluZ1tdfSBbYXJncy5ib29sZWFuQXR0cmlidXRlc10gLSBSZXNvdXJjZS1zcGVjaWZpYyBTUUxpdGUgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJucyB7e3F1ZXVlOiAocXVldWVBcmdzOiB7cmVzb3VyY2U6ID8sIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc3luY1R5cGU/OiBzdHJpbmd9KSA9PiBQcm9taXNlPD8+LCBzeW5jUGVuZGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPn19IENvbmZpZ3VyZWQgbG9jYWwgc3luYyBxdWV1ZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNRdWV1ZShhcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlOiBhc3luYyAocXVldWVBcmdzKSA9PiBhd2FpdCB0aGlzLnF1ZXVlTG9jYWxTeW5jKHtcbiAgICAgICAgLi4ucXVldWVBcmdzLFxuICAgICAgICBib29sZWFuQXR0cmlidXRlczogYXJncy5ib29sZWFuQXR0cmlidXRlcyA/IGFyZ3MuYm9vbGVhbkF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMgPyBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBzeW5jTW9kZWw6IGFyZ3Muc3luY01vZGVsXG4gICAgICB9KSxcbiAgICAgIHN5bmNQZW5kaW5nOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNpbmdsZUZsaWdodChhcmdzLnNpbmdsZUZsaWdodEtleSwgYXJncy5zeW5jUGVuZGluZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGJvb2xlYW5zIGNvbW1vbmx5IHVzZWQgYnkgU1FMaXRlL29mZmxpbmUgc3luYyBwYXlsb2Fkcy5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFN5bmMgZGVjaXNpb24gdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIC0gRXJyb3IgY29udGV4dC5cbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSBQYXJzZWQgYm9vbGVhbi1saWtlIGJhY2tlbmQvbG9jYWwgdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgb3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHZhbHVlLCBkZXNjcmlwdGlvbiA9IFwic3luYyBib29sZWFuXCIpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlXG4gICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBvcHRpb25hbEJvb2xlYW4odmFsdWUsIGRlc2NyaXB0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYm9vbGVhbiBzeW5jIHZhbHVlIHRvIFNRTGl0ZSBib29sZWFuIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGx9IHZhbHVlIC0gU3luYyBib29sZWFuIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7MCB8IDF9IFNRTGl0ZS1jb21wYXRpYmxlIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgc3FsaXRlQm9vbGVhblN5bmNWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IDEgOiAwXG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdHMgZ2VuZXJpYyBzeW5jIGNvdW50ZXJzIGludG8gYXBwLXNwZWNpZmljIHJlc3VsdCBrZXlzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlc3VsdCBhcmdzLlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VzUmVzdWx0fSBhcmdzLnJlc3VsdCAtIEdlbmVyaWMgVmVsb2Npb3VzIHN5bmMgcmVzdWx0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHtjaGFuZ2VkS2V5OiBzdHJpbmcsIGNvdW50S2V5OiBzdHJpbmd9Pn0gYXJncy5yZXNvdXJjZXMgLSBSZXNvdXJjZSByZXN1bHQga2V5IG1hcC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBQcm9qZWN0ZWQgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIHN5bmNSZXN1bHRGb3JSZXNvdXJjZXMoe3Jlc3VsdCwgcmVzb3VyY2VzfSkge1xuICAgIGNvbnN0IHN5bmNSZXN1bHQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoe1xuICAgICAgY2hhbmdlZDogcmVzdWx0LmNoYW5nZWQsXG4gICAgICBwYWdlczogcmVzdWx0LnBhZ2VzLFxuICAgICAgc3luY2VkQ291bnQ6IHJlc3VsdC5zeW5jZWRDb3VudFxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGtleXNdIG9mIE9iamVjdC5lbnRyaWVzKHJlc291cmNlcykpIHtcbiAgICAgIHN5bmNSZXN1bHRba2V5cy5jb3VudEtleV0gPSByZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwXG4gICAgICBzeW5jUmVzdWx0W2tleXMuY2hhbmdlZEtleV0gPSByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHwgZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY1Jlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIHN5bmMgcmVjb3JkcyBpbiBzdGFibGUgb3JkZXIgYW5kIG1hcmtzIGFja25vd2xlZGdlZCByb3dzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcGxheSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggcmVwbGF5IHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8QXJyYXk8dW5rbm93bj4+fSBhcmdzLnBlbmRpbmdTeW5jcyAtIExvYWRzIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIGluIHJlcGxheSBvcmRlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5zeW5jSWQgLSBSZXR1cm5zIHRoZSBsb2NhbCBzeW5jIGlkLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5zeW5jUGF5bG9hZCAtIEJ1aWxkcyB0aGUgQVBJIHN5bmMgZW52ZWxvcGUuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHthdXRoZW50aWNhdGlvblRva2VuOiBzdHJpbmcsIHN5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj59KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFBvc3RzIG9uZSByZXBsYXkgcmVxdWVzdC5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93biwgcmVzcG9uc2U6IFN5bmNSZXBsYXlJdGVtKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLm1hcmtTdWNjZXNzZnVsIC0gTWFya3Mgb25lIHN5bmMgYXMgc3VjY2Vzc2Z1bCBsb2NhbGx5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgYWxsIGJhdGNoZXMgYXJlIHJlcGxheWVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheVBlbmRpbmcoYXJncykge1xuICAgIGNvbnN0IHBlbmRpbmdTeW5jcyA9IGF3YWl0IGFyZ3MucGVuZGluZ1N5bmNzKClcbiAgICBjb25zdCBiYXRjaFNpemUgPSB0aGlzLm5vcm1hbGl6ZWRCYXRjaFNpemUoYXJncy5iYXRjaFNpemUpXG5cbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwZW5kaW5nU3luY3MubGVuZ3RoOyBvZmZzZXQgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcGxheUJhdGNoKHsuLi5hcmdzLCBwZW5kaW5nU3luY3M6IHBlbmRpbmdTeW5jcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJhdGNoU2l6ZSl9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXlzIG9uZSBiYXRjaCBvZiBzeW5jcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZXBsYXkgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4uXG4gICAqIEBwYXJhbSB7QXJyYXk8dW5rbm93bj59IGFyZ3MucGVuZGluZ1N5bmNzIC0gQmF0Y2ggc3luY3MuXG4gICAqIEBwYXJhbSB7KHN5bmM6IHVua25vd24pID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3Muc3luY0lkIC0gU3luYyBpZCBnZXR0ZXIuXG4gICAqIEBwYXJhbSB7KHN5bmM6IHVua25vd24pID0+IFJlY29yZDxzdHJpbmcsID8+fSBhcmdzLnN5bmNQYXlsb2FkIC0gUGF5bG9hZCBidWlsZGVyLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgPz4+fSkgPT4gUHJvbWlzZTxTeW5jUmVwbGF5UmVzcG9uc2U+fSBhcmdzLnBvc3RSZXBsYXkgLSBSZXBsYXkgcG9zdGVyLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duLCByZXNwb25zZTogU3luY1JlcGxheUl0ZW0pID0+IFByb21pc2U8dm9pZD59IGFyZ3MubWFya1N1Y2Nlc3NmdWwgLSBTdWNjZXNzIGhvb2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciB0aGUgYmF0Y2ggaXMgYWNrbm93bGVkZ2VkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUJhdGNoKGFyZ3MpIHtcbiAgICBjb25zdCB7YXV0aGVudGljYXRpb25Ub2tlbiwgbWFya1N1Y2Nlc3NmdWwsIHBlbmRpbmdTeW5jcywgcG9zdFJlcGxheSwgc3luY0lkLCBzeW5jUGF5bG9hZH0gPSBhcmdzXG5cbiAgICBpZiAocGVuZGluZ1N5bmNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBzeW5jc0J5SWQgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3Qgc3luYyBvZiBwZW5kaW5nU3luY3MpIHtcbiAgICAgIGNvbnN0IGlkID0gc3luY0lkKHN5bmMpXG5cbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsKSBzeW5jc0J5SWQuc2V0KFN0cmluZyhpZCksIHN5bmMpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0UmVwbGF5KHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBzeW5jczogcGVuZGluZ1N5bmNzLm1hcCgoc3luYykgPT4gc3luY1BheWxvYWQoc3luYykpXG4gICAgfSlcblxuICAgIHRoaXMuZW5zdXJlU3VjY2Vzc2Z1bFJlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgZm9yIChjb25zdCBzeW5jUmVzcG9uc2Ugb2YgcmVzcG9uc2Uuc3luY3MgfHwgW10pIHtcbiAgICAgIGNvbnN0IHN5bmMgPSBzeW5jc0J5SWQuZ2V0KFN0cmluZyhzeW5jUmVzcG9uc2UuaWQpKVxuXG4gICAgICBpZiAoIXN5bmMpIGNvbnRpbnVlXG4gICAgICBpZiAoc3luY1Jlc3BvbnNlLnN5bmNTdGF0ZSAhPT0gXCJzdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN5bmMgc3RhdGUgcmV0dXJuZWQgZm9yIHN5bmMgJHtTdHJpbmcoc3luY1Jlc3BvbnNlLmlkKX06ICR7U3RyaW5nKHN5bmNSZXNwb25zZS5zeW5jU3RhdGUpfWApXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG1hcmtTdWNjZXNzZnVsKHN5bmMsIHN5bmNSZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIEFQSSByZXNwb25zZSBzdGF0dXMgYW5kIHNoYXBlLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlSZXNwb25zZX0gcmVzcG9uc2UgLSBSZXBsYXkgcmVzcG9uc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGVuc3VyZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IFwiZXJyb3JcIikgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yTWVzc2FnZSB8fCBcIlN5bmMgZmFpbGVkXCIpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnN5bmNzKSkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyByZXNwb25zZSBtaXNzaW5nIHN5bmNzXCIpXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIHBvc2l0aXZlIGJhdGNoIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBiYXRjaFNpemUgLSBCYXRjaCBzaXplLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBQb3NpdGl2ZSBiYXRjaCBzaXplLlxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZWRCYXRjaFNpemUoYmF0Y2hTaXplKSB7XG4gICAgaWYgKHR5cGVvZiBiYXRjaFNpemUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShiYXRjaFNpemUpIHx8IGJhdGNoU2l6ZSA8IDEpIHJldHVybiAxMDBcblxuICAgIHJldHVybiBNYXRoLmZsb29yKGJhdGNoU2l6ZSlcbiAgfVxufVxuIl19
|
|
606
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hcGktY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1hcGktY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUV4RCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEMsa0dBQWtHO0FBQ2xHLDRGQUE0RjtBQUM1Riw0RkFBNEY7QUFDNUYsOEZBQThGO0FBQzlGLDBGQUEwRjtBQUMxRiw0RUFBNEU7QUFDNUUsb0ZBQW9GO0FBQ3BGLDRGQUE0RjtBQUM1Riw0RkFBNEY7QUFFNUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRO1FBQ3JDLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDO2dCQUNILE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2pDLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQix5RUFBeUU7Z0JBQ3pFLGtGQUFrRjtZQUNwRixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxDQUFBO1FBQzFCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFbEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUE7UUFDZixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxPQUFPO2dCQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FB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TSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2SCxDQUFDO1lBRUQsTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRO1FBQ3RDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxDQUFBO1FBQ3hGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUE7SUFDcEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUztRQUNsQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQTtRQUU3RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7b3B0aW9uYWxCb29sZWFuLCBvcHRpb25hbEludGVnZXJ9IGZyb20gXCJ0eXBhbmljXCJcblxuY29uc3Qgc3luY1Rhc2tQcm9taXNlcyA9IG5ldyBNYXAoKVxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VBcHBseVJlc3VsdH0gU3luY0NoYW5nZUFwcGx5UmVzdWx0ICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VFbnZlbG9wZX0gU3luY0NoYW5nZUVudmVsb3BlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVxdWVzdH0gU3luY0NoYW5nZXNSZXF1ZXN0ICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzcG9uc2V9IFN5bmNDaGFuZ2VzUmVzcG9uc2UgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXN1bHR9IFN5bmNDaGFuZ2VzUmVzdWx0ICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDdXJzb3J9IFN5bmNDdXJzb3IgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1JlcGxheUl0ZW19IFN5bmNSZXBsYXlJdGVtICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXBsYXlSZXNwb25zZX0gU3luY1JlcGxheVJlc3BvbnNlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZ30gU3luY1Jlc291cmNlQ29uZmlnICovXG5cbi8qKlxuICogR2VuZXJpYyBjbGllbnQtc2lkZSBoZWxwZXIgZm9yIHJlcGxheWluZyBwZW5kaW5nIHN5bmMgZW52ZWxvcGVzIHRocm91Z2ggdGhlXG4gKiBmcmFtZXdvcmstb3duZWQgYC92ZWxvY2lvdXMvc3luYy9yZXBsYXlgIGVuZHBvaW50LiBBcHBzIHByb3ZpZGUgb25seSBsb2NhbFxuICogcGVyc2lzdGVuY2UvYXV0aCBob29rcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY0FwaUNsaWVudCB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHN5bmMgd29yayB3aXRoIHRoZSBzYW1lIGtleSBzbyBjYWxsZXJzIGRvIG5vdCBoYXZlIHRvIGtlZXAgYXBwLWxvY2FsIGxvY2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTG9jayBrZXkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBXb3JrIHRvIHJ1biBvbmNlIHByZXZpb3VzIHdvcmsgZmluaXNoZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNpbmdsZUZsaWdodChrZXksIGNhbGxiYWNrKSB7XG4gICAgd2hpbGUgKHN5bmNUYXNrUHJvbWlzZXMuaGFzKGtleSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN5bmNUYXNrUHJvbWlzZXMuZ2V0KGtleSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBUaGUgZmFpbGVkIGZsaWdodCdzIG93biBjYWxsZXIgb2JzZXJ2ZXMgdGhhdCByZWplY3Rpb247IGNhbGxlcnMgcXVldWVkXG4gICAgICAgIC8vIGJlaGluZCBpdCBzdGlsbCBydW4gdGhlaXIgb3duIHdvcmsgc28gcGVuZGluZyByb3dzIHJldHJ5IGFmdGVyIHRoZSBsb2NrIGNsZWFycy5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gY2FsbGJhY2soKVxuICAgIHN5bmNUYXNrUHJvbWlzZXMuc2V0KGtleSwgcHJvbWlzZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzeW5jVGFza1Byb21pc2VzLmdldChrZXkpID09PSBwcm9taXNlKSBzeW5jVGFza1Byb21pc2VzLmRlbGV0ZShrZXkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGJhY2tlbmQgc3luYyBjaGFuZ2VzIHdpdGggYSBmcmFtZXdvcmstbWFuYWdlZCBjdXJzb3Igcm93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFB1bGwgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4gdG8gc2VuZCB3aXRoIGNoYW5nZSByZXF1ZXN0cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmJhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7P30gYXJncy5jdXJzb3JNb2RlbCAtIE1vZGVsIHRoYXQgcmVzcG9uZHMgdG8gZmluZEJ5L2ZpbmRPckluaXRpYWxpemVCeSBmb3IgY3Vyc29yIHBlcnNpc3RlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXJzb3JLZXkgLSBDdXJzb3Igb3B0aW9uIGtleS5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogU3luY0NoYW5nZXNSZXF1ZXN0KSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VzUmVzcG9uc2U+fSBhcmdzLnBvc3RDaGFuZ2VzIC0gUG9zdHMgb25lIGNoYW5nZXMgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBTeW5jUmVzb3VyY2VDb25maWc+fSBhcmdzLnJlc291cmNlcyAtIFJlc291cmNlIHBvbGljaWVzLlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczoge3BhZ2VzOiBudW1iZXIsIHN5bmNlZENvdW50OiBudW1iZXJ9KSA9PiB2b2lkfSBbYXJncy5vblByb2dyZXNzXSAtIFByb2dyZXNzIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3VsdD59IFB1bGwgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHB1bGxDaGFuZ2VzV2l0aEN1cnNvcihhcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHVsbENoYW5nZXMoe1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogYXJncy5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBhcmdzLmJhdGNoU2l6ZSxcbiAgICAgIGxvYWRDdXJzb3I6IGFzeW5jICgpID0+IGF3YWl0IHRoaXMubG9hZFN5bmNDdXJzb3Ioe2N1cnNvcktleTogYXJncy5jdXJzb3JLZXksIGN1cnNvck1vZGVsOiBhcmdzLmN1cnNvck1vZGVsfSksXG4gICAgICBzYXZlQ3Vyc29yOiBhc3luYyAoY3Vyc29yKSA9PiBhd2FpdCB0aGlzLnNhdmVTeW5jQ3Vyc29yKHtjdXJzb3IsIGN1cnNvcktleTogYXJncy5jdXJzb3JLZXksIGN1cnNvck1vZGVsOiBhcmdzLmN1cnNvck1vZGVsfSksXG4gICAgICBwb3N0Q2hhbmdlczogYXJncy5wb3N0Q2hhbmdlcyxcbiAgICAgIGFwcGx5U3luYzogdGhpcy5yZXNvdXJjZUFwcGxpZXIoYXJncy5yZXNvdXJjZXMpLFxuICAgICAgb25Qcm9ncmVzczogYXJncy5vblByb2dyZXNzXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHBlcnNpc3RlZCBzeW5jIGN1cnNvciBmcm9tIGEgbW9kZWwgcm93IHdpdGggYSB2YWx1ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7e2N1cnNvcktleTogc3RyaW5nLCBjdXJzb3JNb2RlbDogP319IGFyZ3MgLSBDdXJzb3IgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IFBlcnNpc3RlZCBjdXJzb3IgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkU3luY0N1cnNvcih7Y3Vyc29yS2V5LCBjdXJzb3JNb2RlbH0pIHtcbiAgICBjb25zdCBvcHRpb24gPSBhd2FpdCBjdXJzb3JNb2RlbC5maW5kQnkoe2tleTogY3Vyc29yS2V5fSlcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24udmFsdWUoKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHBlcnNpc3RlZCBzeW5jIGN1cnNvciB0byBhIG1vZGVsIHJvdyB3aXRoIGEgdmFsdWUgY29sdW1uLlxuICAgKiBAcGFyYW0ge3tjdXJzb3I6IFN5bmNDdXJzb3IsIGN1cnNvcktleTogc3RyaW5nLCBjdXJzb3JNb2RlbDogP319IGFyZ3MgLSBDdXJzb3IgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc2F2ZVN5bmNDdXJzb3Ioe2N1cnNvciwgY3Vyc29yS2V5LCBjdXJzb3JNb2RlbH0pIHtcbiAgICBpZiAoIWN1cnNvcikgcmV0dXJuXG5cbiAgICBjb25zdCBvcHRpb24gPSBhd2FpdCBjdXJzb3JNb2RlbC5maW5kT3JJbml0aWFsaXplQnkoe2tleTogY3Vyc29yS2V5fSlcblxuICAgIG9wdGlvbi5hc3NpZ24oe3ZhbHVlOiBKU09OLnN0cmluZ2lmeShjdXJzb3IpfSlcbiAgICBpZiAob3B0aW9uLmlzQ2hhbmdlZCgpKSBhd2FpdCBvcHRpb24uc2F2ZSgpXG4gIH1cblxuICAvKipcbiAgICogUHVsbHMgYmFja2VuZCBzeW5jIGNoYW5nZXMgaW4gc3RhYmxlIHBhZ2VzLCBhcHBsaWVzIHRoZW0gbG9jYWxseSwgYW5kIHN0b3Jlc1xuICAgKiB0aGUgYWNrbm93bGVkZ2VkIGN1cnNvci4gQXBwcyBwcm92aWRlIG9ubHkgYXV0aCwgcGVyc2lzdGVuY2UsIHRyYW5zcG9ydCwgYW5kXG4gICAqIHJlc291cmNlIHBvbGljeSBob29rcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQdWxsIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuIHRvIHNlbmQgd2l0aCBjaGFuZ2UgcmVxdWVzdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5iYXRjaFNpemVdIC0gTWF4IHN5bmNzIHBlciByZXF1ZXN0LiBEZWZhdWx0cyB0byAxMDAuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxTeW5jQ3Vyc29yIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD59IGFyZ3MubG9hZEN1cnNvciAtIExvYWRzIHRoZSBwZXJzaXN0ZWQgbG9jYWwgY3Vyc29yLlxuICAgKiBAcGFyYW0geyhjdXJzb3I6IFN5bmNDdXJzb3IpID0+IFByb21pc2U8dm9pZD59IGFyZ3Muc2F2ZUN1cnNvciAtIFBlcnNpc3RzIHRoZSBmaW5hbCBhY2tub3dsZWRnZWQgY3Vyc29yLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBTeW5jQ2hhbmdlc1JlcXVlc3QpID0+IFByb21pc2U8U3luY0NoYW5nZXNSZXNwb25zZT59IGFyZ3MucG9zdENoYW5nZXMgLSBQb3N0cyBvbmUgY2hhbmdlcyByZXF1ZXN0LlxuICAgKiBAcGFyYW0geyhzeW5jOiBTeW5jQ2hhbmdlRW52ZWxvcGUpID0+IFByb21pc2U8U3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gYXJncy5hcHBseVN5bmMgLSBBcHBsaWVzIG9uZSBub3JtYWxpemVkIHN5bmMgcm93IGxvY2FsbHkuXG4gICAqIEBwYXJhbSB7KHByb2dyZXNzOiB7cGFnZXM6IG51bWJlciwgc3luY2VkQ291bnQ6IG51bWJlcn0pID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gUHJvZ3Jlc3MgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDaGFuZ2VzUmVzdWx0Pn0gUHVsbCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHVsbENoYW5nZXMoYXJncykge1xuICAgIGxldCBhZnRlckN1cnNvciA9IHRoaXMuc3luY0N1cnNvckZyb21QYXlsb2FkKGF3YWl0IGFyZ3MubG9hZEN1cnNvcigpKVxuICAgIGxldCB1cFRvQ3Vyc29yID0gbnVsbFxuICAgIGxldCBwYWdlcyA9IDBcbiAgICBsZXQgc3luY2VkQ291bnQgPSAwXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGNvbnN0IHJlc291cmNlQ291bnRzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqLyAoe30pXG4gICAgY29uc3QgcmVzb3VyY2VDaGFuZ2VkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn0gKi8gKHt9KVxuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHRoaXMubm9ybWFsaXplZEJhdGNoU2l6ZShhcmdzLmJhdGNoU2l6ZSlcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBjaGFuZ2VzUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNoYW5nZXNQYWdlKHsuLi5hcmdzLCBhZnRlckN1cnNvciwgYmF0Y2hTaXplLCB1cFRvQ3Vyc29yfSlcbiAgICAgIGNvbnN0IHN5bmNzID0gY2hhbmdlc1Jlc3BvbnNlLnN5bmNzXG5cbiAgICAgIGlmICghdXBUb0N1cnNvcikgdXBUb0N1cnNvciA9IGNoYW5nZXNSZXNwb25zZS51cFRvQ3Vyc29yXG4gICAgICBpZiAoc3luY3MubGVuZ3RoID09PSAwKSBicmVha1xuXG4gICAgICBwYWdlcyArPSAxXG5cbiAgICAgIGZvciAoY29uc3Qgc3luYyBvZiBzeW5jcykge1xuICAgICAgICBjb25zdCBhcHBseVJlc3VsdCA9IGF3YWl0IGFyZ3MuYXBwbHlTeW5jKHN5bmMpXG4gICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGFwcGx5UmVzdWx0LnJlc291cmNlVHlwZSA/PyBzeW5jLnJlc291cmNlVHlwZSgpXG5cbiAgICAgICAgY2hhbmdlZCB8fD0gYXBwbHlSZXN1bHQuY2hhbmdlZCA9PT0gdHJ1ZVxuICAgICAgICBzeW5jZWRDb3VudCArPSAxXG5cbiAgICAgICAgaWYgKHJlc291cmNlVHlwZSkge1xuICAgICAgICAgIHJlc291cmNlQ291bnRzW3Jlc291cmNlVHlwZV0gPSAocmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwKSArIDFcbiAgICAgICAgICByZXNvdXJjZUNoYW5nZWRbcmVzb3VyY2VUeXBlXSB8fD0gYXBwbHlSZXN1bHQuY2hhbmdlZCA9PT0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFmdGVyQ3Vyc29yID0gY2hhbmdlc1Jlc3BvbnNlLm5leHRDdXJzb3JcblxuICAgICAgaWYgKGFyZ3Mub25Qcm9ncmVzcykgYXJncy5vblByb2dyZXNzKHtwYWdlcywgc3luY2VkQ291bnR9KVxuICAgICAgaWYgKHN5bmNzLmxlbmd0aCA8IGJhdGNoU2l6ZSkgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoYWZ0ZXJDdXJzb3IpIGF3YWl0IGFyZ3Muc2F2ZUN1cnNvcihhZnRlckN1cnNvcilcblxuICAgIHJldHVybiB7Y2hhbmdlZCwgcGFnZXMsIHJlc291cmNlQ2hhbmdlZCwgcmVzb3VyY2VDb3VudHMsIHN5bmNlZENvdW50fVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHZhbGlkYXRlcyBvbmUgYmFja2VuZCBzeW5jIGNoYW5nZXMgcGFnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQYWdlIGFyZ3MuXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvcn0gYXJncy5hZnRlckN1cnNvciAtIExhc3QgYWNrbm93bGVkZ2VkIGN1cnNvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmJhdGNoU2l6ZSAtIFBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogU3luY0NoYW5nZXNSZXF1ZXN0KSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VzUmVzcG9uc2U+fSBhcmdzLnBvc3RDaGFuZ2VzIC0gQ2hhbmdlcyBwb3N0ZXIuXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvcn0gYXJncy51cFRvQ3Vyc29yIC0gU25hcHNob3QgdXBwZXItYm91bmQgY3Vyc29yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bmV4dEN1cnNvcjogU3luY0N1cnNvciwgc3luY3M6IFN5bmNDaGFuZ2VFbnZlbG9wZVtdLCB1cFRvQ3Vyc29yOiBTeW5jQ3Vyc29yfT59IE5vcm1hbGl6ZWQgY2hhbmdlcyBwYWdlLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNoYW5nZXNQYWdlKHthZnRlckN1cnNvciwgYXV0aGVudGljYXRpb25Ub2tlbiwgYmF0Y2hTaXplLCBwb3N0Q2hhbmdlcywgdXBUb0N1cnNvcn0pIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RDaGFuZ2VzKHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBsaW1pdDogYmF0Y2hTaXplLFxuICAgICAgLi4udGhpcy5jdXJzb3JQYXlsb2FkKFwiYWZ0ZXJcIiwgYWZ0ZXJDdXJzb3IpLFxuICAgICAgLi4udGhpcy5jdXJzb3JQYXlsb2FkKFwidXBUb1wiLCB1cFRvQ3Vyc29yKVxuICAgIH0pXG5cbiAgICB0aGlzLmVuc3VyZVN1Y2Nlc3NmdWxDaGFuZ2VzUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICBjb25zdCBzeW5jcyA9IC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLyAocmVzcG9uc2Uuc3luY3MpXG5cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dEN1cnNvcjogdGhpcy5zeW5jQ3Vyc29yRnJvbVBheWxvYWQocmVzcG9uc2UubmV4dEN1cnNvciA/PyBudWxsKSxcbiAgICAgIHN5bmNzOiBzeW5jcy5tYXAoKHN5bmNQYXlsb2FkKSA9PiB0aGlzLnN5bmNFbnZlbG9wZUZyb21QYXlsb2FkKHN5bmNQYXlsb2FkKSksXG4gICAgICB1cFRvQ3Vyc29yOiB0aGlzLnN5bmNDdXJzb3JGcm9tUGF5bG9hZChyZXNwb25zZS51cFRvQ3Vyc29yID8/IG51bGwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBBUEkgcmVzcG9uc2Ugc3RhdHVzIGFuZCBzaGFwZSBmb3IgY2hhbmdlLWZlZWQgcHVsbHMuXG4gICAqIEBwYXJhbSB7U3luY0NoYW5nZXNSZXNwb25zZX0gcmVzcG9uc2UgLSBDaGFuZ2VzIHJlc3BvbnNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBlbnN1cmVTdWNjZXNzZnVsQ2hhbmdlc1Jlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3JNZXNzYWdlIHx8IFwiU3luYyBjaGFuZ2VzIGZhaWxlZFwiKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZXNwb25zZS5zeW5jcykpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY2hhbmdlcyByZXNwb25zZSBtaXNzaW5nIHN5bmNzXCIpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBjdXJzb3IgaW50byByZXF1ZXN0IHBhcmFtcyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguXG4gICAqIEBwYXJhbSB7XCJhZnRlclwiIHwgXCJ1cFRvXCJ9IHByZWZpeCAtIFJlcXVlc3QgZmllbGQgcHJlZml4LlxuICAgKiBAcGFyYW0ge1N5bmNDdXJzb3J9IGN1cnNvciAtIEN1cnNvciB0byBzZXJpYWxpemUuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBudWxsPn0gUmVxdWVzdCBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgY3Vyc29yUGF5bG9hZChwcmVmaXgsIGN1cnNvcikge1xuICAgIGlmICghY3Vyc29yKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICBbYCR7cHJlZml4fUlkYF06IGN1cnNvci5pZCxcbiAgICAgIC4uLihjdXJzb3Iuc2VydmVyU2VxdWVuY2UgPyB7W2Ake3ByZWZpeH1TZXJ2ZXJTZXF1ZW5jZWBdOiBjdXJzb3Iuc2VydmVyU2VxdWVuY2V9IDoge30pLFxuICAgICAgW2Ake3ByZWZpeH1VcGRhdGVkQXRgXTogY3Vyc29yLnVwZGF0ZWRBdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSBwZXJzaXN0ZWQgb3IgcmVzcG9uc2UgY3Vyc29yIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvciB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsID8+IHwgbnVsbCB8IHVuZGVmaW5lZH0gcGF5bG9hZCAtIEN1cnNvciBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7U3luY0N1cnNvcn0gUGFyc2VkIGN1cnNvci5cbiAgICovXG4gIHN0YXRpYyBzeW5jQ3Vyc29yRnJvbVBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmICghcGF5bG9hZCkgcmV0dXJuIG51bGxcblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY0N1cnNvckZyb21QYXlsb2FkKEpTT04ucGFyc2UocGF5bG9hZCkpXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtpZDogbnVsbCwgc2VydmVyU2VxdWVuY2U6IG51bGwsIHVwZGF0ZWRBdDogcGF5bG9hZH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXlsb2FkKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHVwZGF0ZWRBdCA9IHR5cGVvZiBwYXlsb2FkLnVwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiA/IHBheWxvYWQudXBkYXRlZEF0IDogbnVsbFxuXG4gICAgaWYgKCF1cGRhdGVkQXQpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHBheWxvYWQuaWQgPT09IG51bGwgfHwgcGF5bG9hZC5pZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhwYXlsb2FkLmlkKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiBvcHRpb25hbEludGVnZXIocGF5bG9hZC5zZXJ2ZXJTZXF1ZW5jZSA9PT0gXCJcIiA/IG51bGwgOiBwYXlsb2FkLnNlcnZlclNlcXVlbmNlKSxcbiAgICAgIHVwZGF0ZWRBdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBub3JtYWxpemVkIHN5bmMgcm93IGFkYXB0ZXIuXG4gICAqIEBwYXJhbSB7P30gcGF5bG9hZCAtIFJhdyBzeW5jIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTeW5jQ2hhbmdlRW52ZWxvcGV9IFN5bmMgcm93IGFkYXB0ZXIuXG4gICAqL1xuICBzdGF0aWMgc3luY0VudmVsb3BlRnJvbVBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmICghcGF5bG9hZCB8fCB0eXBlb2YgcGF5bG9hZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHBheWxvYWQpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNoYW5nZXMgZW50cnkgbXVzdCBiZSBhbiBvYmplY3RcIilcblxuICAgIGNvbnN0IHN5bmNQYXlsb2FkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHBheWxvYWQpXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogKCkgPT4gc3luY1BheWxvYWQuZGF0YSxcbiAgICAgIGlkOiAoKSA9PiBzeW5jUGF5bG9hZC5pZCxcbiAgICAgIHJlc291cmNlSWQ6ICgpID0+IHN5bmNQYXlsb2FkLnJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZVR5cGU6ICgpID0+IHN5bmNQYXlsb2FkLnJlc291cmNlVHlwZSA9PT0gbnVsbCB8fCBzeW5jUGF5bG9hZC5yZXNvdXJjZVR5cGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoc3luY1BheWxvYWQucmVzb3VyY2VUeXBlKSxcbiAgICAgIHN5bmNUeXBlOiAoKSA9PiBzeW5jUGF5bG9hZC5zeW5jVHlwZSA9PT0gbnVsbCB8fCBzeW5jUGF5bG9hZC5zeW5jVHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFN0cmluZyhzeW5jUGF5bG9hZC5zeW5jVHlwZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGFwcC1jb25maWd1cmVkIHJlc291cmNlIGFwcGxpZXIgZm9yIHB1bGxlZCBzeW5jIHJvd3MuIFRoZSBzeW5jXG4gICAqIG1lY2hhbmljcyBzdGF5IGhlcmU7IGFwcHMgb25seSBkZWNsYXJlIHdoaWNoIG1vZGVscy9hdHRyaWJ1dGVzL2hvb2tzIGFyZVxuICAgKiBhbGxvd2VkIGZvciBlYWNoIHJlc291cmNlIHR5cGUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY1Jlc291cmNlQ29uZmlnPn0gcmVzb3VyY2VzIC0gUmVzb3VyY2UgcG9saWN5IG1hcC5cbiAgICogQHBhcmFtIHsocmVjb3JkOiA/KSA9PiAoKSA9PiB2b2lkfSBbb25SZWNvcmRdIC0gQ2FsbGVkIHdpdGggZWFjaCByZWNvcmQgYWJvdXQgdG8gYmUgd3JpdHRlbjsgcmV0dXJucyBhIHJlbGVhc2UgY2FsbGJhY2sgaW52b2tlZCBhZnRlciB0aGUgd3JpdGUgKHVzZWQgZm9yIGVjaG8gc3VwcHJlc3Npb24pLlxuICAgKiBAcmV0dXJucyB7KHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBTeW5jIGFwcGx5IGNhbGxiYWNrLlxuICAgKi9cbiAgc3RhdGljIHJlc291cmNlQXBwbGllcihyZXNvdXJjZXMsIG9uUmVjb3JkKSB7XG4gICAgcmV0dXJuIGFzeW5jIChzeW5jKSA9PiBhd2FpdCB0aGlzLmFwcGx5UmVzb3VyY2VTeW5jKHtvblJlY29yZCwgcmVzb3VyY2VzLCBzeW5jfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG9uZSBzeW5jIHJvdyB1c2luZyBkZWNsYXJhdGl2ZSByZXNvdXJjZSBwb2xpY3kuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlczogUmVjb3JkPHN0cmluZywgU3luY1Jlc291cmNlQ29uZmlnPiwgc3luYzogU3luY0NoYW5nZUVudmVsb3BlLCBvblJlY29yZD86IChyZWNvcmQ6ID8pID0+ICgpID0+IHZvaWR9fSBhcmdzIC0gQXBwbHkgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gQXBwbHkgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFwcGx5UmVzb3VyY2VTeW5jKHtvblJlY29yZCwgcmVzb3VyY2VzLCBzeW5jfSkge1xuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcbiAgICBjb25zdCByZXNvdXJjZSA9IHJlc291cmNlVHlwZSA/IHJlc291cmNlc1tyZXNvdXJjZVR5cGVdIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIXJlc291cmNlIHx8ICFyZXNvdXJjZS5lbmFibGVkKSByZXR1cm4ge2NoYW5nZWQ6IGZhbHNlLCByZXNvdXJjZVR5cGV9XG5cbiAgICBpZiAoc3luYy5zeW5jVHlwZSgpID09PSBcImRlbGV0ZVwiKSB7XG4gICAgICByZXR1cm4ge2NoYW5nZWQ6IGF3YWl0IHRoaXMuZGVzdHJveVN5bmNlZFJlc291cmNlKHtvblJlY29yZCwgcmVzb3VyY2UsIHN5bmN9KSwgcmVzb3VyY2VUeXBlfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN5bmNEYXRhKHN5bmMpXG4gICAgY29uc3QgcmVjb3JkID0gcmVzb3VyY2UuZmluZFJlY29yZCA/IGF3YWl0IHJlc291cmNlLmZpbmRSZWNvcmQoe2RhdGEsIHJlc291cmNlSWQ6IHN5bmMucmVzb3VyY2VJZCgpLCBzeW5jfSkgOiBhd2FpdCByZXNvdXJjZS5tb2RlbENsYXNzLmZpbmRPckluaXRpYWxpemVCeSh7aWQ6IGRhdGEuaWQgPz8gc3luYy5yZXNvdXJjZUlkKCl9KVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBhd2FpdCByZXNvdXJjZS5hdHRyaWJ1dGVzKHtkYXRhLCByZWNvcmQsIHN5bmN9KVxuICAgIGNvbnN0IHJlbGVhc2VSZWNvcmQgPSBvblJlY29yZCA/IG9uUmVjb3JkKHJlY29yZCkgOiBudWxsXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZC5hc3NpZ24oYXR0cmlidXRlcylcblxuICAgICAgaWYgKHJlY29yZC5pc0NoYW5nZWQoKSkge1xuICAgICAgICBhd2FpdCByZWNvcmQuc2F2ZSgpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZS5hZnRlckFwcGx5KSB7XG4gICAgICAgIGNvbnN0IGhvb2tDaGFuZ2VkID0gYXdhaXQgcmVzb3VyY2UuYWZ0ZXJBcHBseSh7YXR0cmlidXRlcywgZGF0YSwgcmVjb3JkLCBzeW5jfSlcblxuICAgICAgICBjaGFuZ2VkIHx8PSBob29rQ2hhbmdlZCA9PT0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocmVsZWFzZVJlY29yZCkgcmVsZWFzZVJlY29yZCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtjaGFuZ2VkLCByZXNvdXJjZVR5cGV9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgYSBzeW5jZWQgcmVzb3VyY2UgdmlhIGl0cyBkZWNsYXJlZCBtb2RlbCBwb2xpY3kuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiBTeW5jUmVzb3VyY2VDb25maWcsIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSwgb25SZWNvcmQ/OiAocmVjb3JkOiA/KSA9PiAoKSA9PiB2b2lkfX0gYXJncyAtIERlc3Ryb3kgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgYSBsb2NhbCByb3cgd2FzIGRlc3Ryb3llZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBkZXN0cm95U3luY2VkUmVzb3VyY2Uoe29uUmVjb3JkLCByZXNvdXJjZSwgc3luY30pIHtcbiAgICBjb25zdCBpZCA9IHN5bmMucmVzb3VyY2VJZCgpXG4gICAgY29uc3QgcmVjb3JkID0gcmVzb3VyY2UuZmluZFJlY29yZEZvckRlbGV0ZSA/IGF3YWl0IHJlc291cmNlLmZpbmRSZWNvcmRGb3JEZWxldGUoe3Jlc291cmNlSWQ6IGlkLCBzeW5jfSkgOiBhd2FpdCByZXNvdXJjZS5tb2RlbENsYXNzLmZpbmRCeSh7aWR9KVxuXG4gICAgaWYgKCFyZWNvcmQpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgcmVsZWFzZVJlY29yZCA9IG9uUmVjb3JkID8gb25SZWNvcmQocmVjb3JkKSA6IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWNvcmQuZGVzdHJveSgpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChyZWxlYXNlUmVjb3JkKSByZWxlYXNlUmVjb3JkKClcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgZW1iZWRkZWQgc3luYyBkYXRhIEpTT04vb2JqZWN0LlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VFbnZlbG9wZX0gc3luYyAtIFN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFN5bmMgZGF0YSBvYmplY3QuXG4gICAqL1xuICBzdGF0aWMgc3luY0RhdGEoc3luYykge1xuICAgIGNvbnN0IGRhdGEgPSBzeW5jLmRhdGEoKVxuXG4gICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgJHtzeW5jLmlkKCl9IGlzIG1pc3NpbmcgZGF0YWApXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKEpTT04ucGFyc2UoZGF0YSkpXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGRhdGEpXG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgJHtzeW5jLmlkKCl9IGhhcyBpbnZhbGlkIGRhdGFgKVxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIHN5bmMgcmVjb3JkcyBmcm9tIGEgbG9jYWwgVmVsb2Npb3VzIG1vZGVsIGluIHN0YWJsZSBvcmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZXBsYXkgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4gdG8gc2VuZCB3aXRoIHJlcGxheSByZXF1ZXN0cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmJhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7P30gYXJncy5zeW5jTW9kZWwgLSBMb2NhbCBTeW5jIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgPz4+fSkgPT4gUHJvbWlzZTxTeW5jUmVwbGF5UmVzcG9uc2U+fSBhcmdzLnBvc3RSZXBsYXkgLSBSZXBsYXkgcG9zdGVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXBsYXlMb2NhbFN5bmNzKGFyZ3MpIHtcbiAgICBjb25zdCBwb3N0ZWRTbmFwc2hvdHNCeVN5bmNJZCA9IG5ldyBNYXAoKVxuXG4gICAgYXdhaXQgdGhpcy5yZXBsYXlQZW5kaW5nKHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGJhdGNoU2l6ZTogYXJncy5iYXRjaFNpemUsXG4gICAgICBtYXJrU3VjY2Vzc2Z1bDogYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgICAgY29uc3Qgc3luY0lkID0gKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpXG4gICAgICAgIC8vIFJlbG9hZCB3aXRoIHRoZSByZXNvdXJjZSBwcmVsb2FkZWQgc28gcm93cyByZWx5aW5nIG9uIHRoZSByZXNvdXJjZS1hdHRyaWJ1dGVzXG4gICAgICAgIC8vIGZhbGxiYWNrIGluIGxvY2FsU3luY0RhdGEgY29tcGFyZSBhZ2FpbnN0IHRoZSBzYW1lIHNuYXBzaG90IHRoZXkgcG9zdGVkLlxuICAgICAgICBjb25zdCBjdXJyZW50U3luYyA9IGF3YWl0IGFyZ3Muc3luY01vZGVsLnByZWxvYWQoe3Jlc291cmNlOiB0cnVlfSkud2hlcmUoe2lkOiBzeW5jSWR9KS5maXJzdCgpXG5cbiAgICAgICAgaWYgKCFjdXJyZW50U3luYykgcmV0dXJuXG4gICAgICAgIC8vIEEgcm93IGVkaXRlZCB3aGlsZSBpdHMgb2xkIHBheWxvYWQgd2FzIGluIGZsaWdodCBzdGF5cyBwZW5kaW5nLCBzbyB0aGVcbiAgICAgICAgLy8gbmV3ZXIgbG9jYWwgY2hhbmdlIHJlcGxheXMgb24gdGhlIG5leHQgZHJhaW4gaW5zdGVhZCBvZiBiZWluZyBsb3N0LlxuICAgICAgICBpZiAodGhpcy5sb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChjdXJyZW50U3luYykgIT09IHBvc3RlZFNuYXBzaG90c0J5U3luY0lkLmdldChTdHJpbmcoc3luY0lkKSkpIHJldHVyblxuXG4gICAgICAgIGF3YWl0IGN1cnJlbnRTeW5jLnVwZGF0ZSh7c3RhdGU6IFwic3VjY2Vzc1wifSlcbiAgICAgIH0sXG4gICAgICBwZW5kaW5nU3luY3M6IGFzeW5jICgpID0+IGF3YWl0IGFyZ3Muc3luY01vZGVsLnByZWxvYWQoe3Jlc291cmNlOiB0cnVlfSkud2hlcmUoe3N0YXRlOiBcInBlbmRpbmdcIn0pLm9yZGVyKFwiY3JlYXRlZF9hdFwiKS50b0FycmF5KCksXG4gICAgICBwb3N0UmVwbGF5OiBhcmdzLnBvc3RSZXBsYXksXG4gICAgICBzeW5jSWQ6IChzeW5jKSA9PiAoLyoqIEB0eXBlIHt7aWQ6ICgpID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9fSAqLyAoc3luYykpLmlkKCksXG4gICAgICBzeW5jUGF5bG9hZDogKHN5bmMpID0+IHtcbiAgICAgICAgcG9zdGVkU25hcHNob3RzQnlTeW5jSWQuc2V0KFN0cmluZygoLyoqIEB0eXBlIHt7aWQ6ICgpID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9fSAqLyAoc3luYykpLmlkKCkpLCB0aGlzLmxvY2FsU3luY1JlcGxheVNuYXBzaG90KHN5bmMpKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsU3luY1BheWxvYWQoc3luYylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhlIHJlcGxheS1yZWxldmFudCBzdGF0ZSBvZiBhIGxvY2FsIHN5bmMgcm93IGZvciBpbi1mbGlnaHQgY29tcGFyaXNvbnMuXG4gICAqIEBwYXJhbSB7P30gc3luYyAtIExvY2FsIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgc25hcHNob3Qgb2YgdGhlIHJvdydzIHJlcGxheWVkIHBheWxvYWQuXG4gICAqL1xuICBzdGF0aWMgbG9jYWxTeW5jUmVwbGF5U25hcHNob3Qoc3luYykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7ZGF0YTogdGhpcy5sb2NhbFN5bmNEYXRhKHN5bmMpLCBzeW5jVHlwZTogc3luYy5zeW5jVHlwZSgpfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgb25lIHJlcGxheSBlbnZlbG9wZSBmcm9tIGEgbG9jYWwgc3luYyByb3cuXG4gICAqIEBwYXJhbSB7P30gc3luYyAtIExvY2FsIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7e2NsaWVudFVwZGF0ZWRBdD86IHN0cmluZywgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGlkOiBudW1iZXIsIHJlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmcsIHN5bmNUeXBlOiBzdHJpbmd9fSBTeW5jIHJlcGxheSBlbnZlbG9wZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNQYXlsb2FkKHN5bmMpIHtcbiAgICBjb25zdCBjbGllbnRVcGRhdGVkQXQgPSBzeW5jLnVwZGF0ZWRBdCgpIHx8IHN5bmMuY3JlYXRlZEF0KClcblxuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRVcGRhdGVkQXQ6IGNsaWVudFVwZGF0ZWRBdCA/IGNsaWVudFVwZGF0ZWRBdC50b0lTT1N0cmluZygpIDogdW5kZWZpbmVkLFxuICAgICAgZGF0YTogdGhpcy5sb2NhbFN5bmNEYXRhKHN5bmMpLFxuICAgICAgaWQ6IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoc3luYy5pZCgpKSksXG4gICAgICByZXNvdXJjZUlkOiBTdHJpbmcoc3luYy5yZXNvdXJjZUlkKCkpLFxuICAgICAgcmVzb3VyY2VUeXBlOiBzeW5jLnJlc291cmNlVHlwZSgpIHx8IFwiXCIsXG4gICAgICBzeW5jVHlwZTogc3luYy5zeW5jVHlwZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uZSBsb2NhbCBzeW5jIHJvdyBwYXlsb2FkLCBmYWxsaW5nIGJhY2sgdG8gcHJlbG9hZGVkIHJlc291cmNlIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7P30gc3luYyAtIExvY2FsIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFN5bmMgZGF0YS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNEYXRhKHN5bmMpIHtcbiAgICBsZXQgc3luY0RhdGEgPSAvKiogQHR5cGUge3N0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoc3luYy5kYXRhKCkgfHwge30pXG5cbiAgICBpZiAodHlwZW9mIHN5bmNEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzeW5jRGF0YSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChKU09OLnBhcnNlKHN5bmNEYXRhKSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICBzeW5jRGF0YSA9IHt9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHN5bmNEYXRhKS5sZW5ndGggPiAwKSByZXR1cm4gc3luY0RhdGFcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHN5bmMucmVzb3VyY2UoKS5hdHRyaWJ1dGVzKCkpXG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUXVldWVzIGEgbG9jYWwgc3luYyByb3cgZm9yIGEgVmVsb2Npb3VzIG1vZGVsIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFF1ZXVlIGFyZ3MuXG4gICAqIEBwYXJhbSB7P30gYXJncy5yZXNvdXJjZSAtIFJlc291cmNlIGJlaW5nIHN5bmNlZC5cbiAgICogQHBhcmFtIHs/fSBhcmdzLnN5bmNNb2RlbCAtIExvY2FsIFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLmRhdGFdIC0gRXhwbGljaXQgc3luYyBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3luY1R5cGVdIC0gU3luYyBvcGVyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MubG9jYWxPbmx5QXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIHRvIHN0cmlwIGZyb20gcXVldWVkIHBheWxvYWRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5ib29sZWFuQXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIHRvIGNvZXJjZSB0aHJvdWdoIHN5bmMgYm9vbGVhbiBwYXJzaW5nLlxuICAgKiBAcGFyYW0geyhkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLm5vcm1hbGl6ZURhdGFdIC0gQXBwLXNwZWNpZmljIGRhdGEgbm9ybWFsaXplci5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IExvY2FsIHN5bmMgcm93LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHF1ZXVlTG9jYWxTeW5jKGFyZ3MpIHtcbiAgICBjb25zdCByZXNvdXJjZVJlY29yZElkID0gYXJncy5yZXNvdXJjZS5pZCgpXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IGFyZ3MucmVzb3VyY2UuY29uc3RydWN0b3JcblxuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlc291cmNlIG1vZGVsIGNsYXNzIG11c3QgaW1wbGVtZW50IHN0YXRpYyBnZXRNb2RlbE5hbWUoKSB0byBxdWV1ZSBzeW5jIGRhdGEgLSBjbGFzcyBuYW1lcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3MgZXhwbGljaXQgbW9kZWwgbmFtZXMgYW5kIG1pbmlmaWVkIGJ1bmRsZXNcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG4gICAgY29uc3Qgc3luY0RhdGEgPSB0aGlzLnF1ZXVlZFN5bmNEYXRhKGFyZ3MpXG4gICAgY29uc3Qgc3luY1R5cGUgPSBhcmdzLnN5bmNUeXBlIHx8IFwidXBkYXRlXCJcblxuICAgIGlmICghcmVzb3VyY2VSZWNvcmRJZCkgdGhyb3cgbmV3IEVycm9yKFwicmVzb3VyY2UuaWQoKSBpcyByZXF1aXJlZCB0byBxdWV1ZSBzeW5jIGRhdGFcIilcblxuICAgIGNvbnN0IHJlc291cmNlSWQgPSBTdHJpbmcocmVzb3VyY2VSZWNvcmRJZClcbiAgICBjb25zdCBleGlzdGluZ1N5bmMgPSBhd2FpdCBhcmdzLnN5bmNNb2RlbC5maW5kQnkoe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZX0pXG5cbiAgICBpZiAoZXhpc3RpbmdTeW5jKSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1N5bmMudXBkYXRlKHtcbiAgICAgICAgZGF0YTogc3luY0RhdGEsXG4gICAgICAgIHN0YXRlOiBcInBlbmRpbmdcIixcbiAgICAgICAgc3luY1R5cGVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBleGlzdGluZ1N5bmNcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgYXJncy5zeW5jTW9kZWwuY3JlYXRlKHtcbiAgICAgIGRhdGE6IHN5bmNEYXRhLFxuICAgICAgcmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIHN0YXRlOiBcInBlbmRpbmdcIixcbiAgICAgIHN5bmNUeXBlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYmFja2VuZC1zYWZlIHF1ZXVlZCBzeW5jIGRhdGEgd2l0aG91dCBtdXRhdGluZyBjYWxsZXIgZGF0YS4gVGhlIGRlZmF1bHRcbiAgICogKG5vIGV4cGxpY2l0IGBkYXRhYCkgaXMgdGhlIHJlc291cmNlJ3MgYXR0cmlidXRlcyBtaW51cyBsb2NhbC1vbmx5IGF0dHJpYnV0ZXMsXG4gICAqIHdpdGggYm9vbGVhbnMgY29lcmNlZCBhbmQgRGF0ZSB2YWx1ZXMgc2VyaWFsaXplZCB0byBJU08gc3RyaW5ncywgc28gYXBwcyBkb24ndFxuICAgKiBuZWVkIHBlci1tb2RlbCB0cmFja2VkLXBheWxvYWQgYnVpbGRlcnMuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiA/LCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGxvY2FsT25seUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgYm9vbGVhbkF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgbm9ybWFsaXplRGF0YT86IChkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59fSBhcmdzIC0gRGF0YSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFF1ZXVlZCBkYXRhLlxuICAgKi9cbiAgc3RhdGljIHF1ZXVlZFN5bmNEYXRhKGFyZ3MpIHtcbiAgICBjb25zdCBpbnB1dERhdGEgPSBhcmdzLmRhdGEgPz8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGFyZ3MucmVzb3VyY2UuYXR0cmlidXRlcygpKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhID0gYXJncy5ub3JtYWxpemVEYXRhID8gYXJncy5ub3JtYWxpemVEYXRhKGlucHV0RGF0YSkgOiBpbnB1dERhdGFcbiAgICBjb25zdCBzeW5jRGF0YSA9IHsuLi5ub3JtYWxpemVkRGF0YX1cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10pIGRlbGV0ZSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhcmdzLmJvb2xlYW5BdHRyaWJ1dGVzIHx8IFtdKSB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093bihzeW5jRGF0YSwgYXR0cmlidXRlTmFtZSkpIHN5bmNEYXRhW2F0dHJpYnV0ZU5hbWVdID0gdGhpcy5vcHRpb25hbEJvb2xlYW5TeW5jVmFsdWUoc3luY0RhdGFbYXR0cmlidXRlTmFtZV0sIGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2F0dHJpYnV0ZU5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzeW5jRGF0YSkpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHN5bmNEYXRhW2F0dHJpYnV0ZU5hbWVdID0gdmFsdWUudG9JU09TdHJpbmcoKVxuICAgIH1cblxuICAgIHJldHVybiBzeW5jRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNtYWxsIGFwcC1mYWNpbmcgbG9jYWwgc3luYyBxdWV1ZSBmYWNhZGUgZnJvbSBkZWNsYXJhdGl2ZSBtb2RlbCBjb25maWcuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUXVldWUgY29uZmlnLlxuICAgKiBAcGFyYW0gez99IGFyZ3Muc3luY01vZGVsIC0gTG9jYWwgU3luYyBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2luZ2xlRmxpZ2h0S2V5IC0gS2V5IHVzZWQgdG8gc2VyaWFsaXplIGJhY2tlbmQgcmVwbGF5LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGFyZ3Muc3luY1BlbmRpbmcgLSBCYWNrZW5kIHJlcGxheSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsocmVzb3VyY2U6ID8pID0+IHN0cmluZ1tdfSBbYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzXSAtIFJlc291cmNlLXNwZWNpZmljIGxvY2FsLW9ubHkgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHsocmVzb3VyY2U6ID8pID0+IHN0cmluZ1tdfSBbYXJncy5ib29sZWFuQXR0cmlidXRlc10gLSBSZXNvdXJjZS1zcGVjaWZpYyBTUUxpdGUgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJucyB7e3F1ZXVlOiAocXVldWVBcmdzOiB7cmVzb3VyY2U6ID8sIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc3luY1R5cGU/OiBzdHJpbmd9KSA9PiBQcm9taXNlPD8+LCBzeW5jUGVuZGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPn19IENvbmZpZ3VyZWQgbG9jYWwgc3luYyBxdWV1ZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNRdWV1ZShhcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlOiBhc3luYyAocXVldWVBcmdzKSA9PiBhd2FpdCB0aGlzLnF1ZXVlTG9jYWxTeW5jKHtcbiAgICAgICAgLi4ucXVldWVBcmdzLFxuICAgICAgICBib29sZWFuQXR0cmlidXRlczogYXJncy5ib29sZWFuQXR0cmlidXRlcyA/IGFyZ3MuYm9vbGVhbkF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMgPyBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBzeW5jTW9kZWw6IGFyZ3Muc3luY01vZGVsXG4gICAgICB9KSxcbiAgICAgIHN5bmNQZW5kaW5nOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNpbmdsZUZsaWdodChhcmdzLnNpbmdsZUZsaWdodEtleSwgYXJncy5zeW5jUGVuZGluZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGJvb2xlYW5zIGNvbW1vbmx5IHVzZWQgYnkgU1FMaXRlL29mZmxpbmUgc3luYyBwYXlsb2Fkcy5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFN5bmMgZGVjaXNpb24gdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIC0gRXJyb3IgY29udGV4dC5cbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSBQYXJzZWQgYm9vbGVhbi1saWtlIGJhY2tlbmQvbG9jYWwgdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgb3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHZhbHVlLCBkZXNjcmlwdGlvbiA9IFwic3luYyBib29sZWFuXCIpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlXG4gICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBvcHRpb25hbEJvb2xlYW4odmFsdWUsIGRlc2NyaXB0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYm9vbGVhbiBzeW5jIHZhbHVlIHRvIFNRTGl0ZSBib29sZWFuIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGx9IHZhbHVlIC0gU3luYyBib29sZWFuIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7MCB8IDF9IFNRTGl0ZS1jb21wYXRpYmxlIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgc3FsaXRlQm9vbGVhblN5bmNWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IDEgOiAwXG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdHMgZ2VuZXJpYyBzeW5jIGNvdW50ZXJzIGludG8gYXBwLXNwZWNpZmljIHJlc3VsdCBrZXlzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlc3VsdCBhcmdzLlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VzUmVzdWx0fSBhcmdzLnJlc3VsdCAtIEdlbmVyaWMgVmVsb2Npb3VzIHN5bmMgcmVzdWx0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHtjaGFuZ2VkS2V5OiBzdHJpbmcsIGNvdW50S2V5OiBzdHJpbmd9Pn0gYXJncy5yZXNvdXJjZXMgLSBSZXNvdXJjZSByZXN1bHQga2V5IG1hcC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBQcm9qZWN0ZWQgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIHN5bmNSZXN1bHRGb3JSZXNvdXJjZXMoe3Jlc3VsdCwgcmVzb3VyY2VzfSkge1xuICAgIGNvbnN0IHN5bmNSZXN1bHQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoe1xuICAgICAgY2hhbmdlZDogcmVzdWx0LmNoYW5nZWQsXG4gICAgICBwYWdlczogcmVzdWx0LnBhZ2VzLFxuICAgICAgc3luY2VkQ291bnQ6IHJlc3VsdC5zeW5jZWRDb3VudFxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGtleXNdIG9mIE9iamVjdC5lbnRyaWVzKHJlc291cmNlcykpIHtcbiAgICAgIHN5bmNSZXN1bHRba2V5cy5jb3VudEtleV0gPSByZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwXG4gICAgICBzeW5jUmVzdWx0W2tleXMuY2hhbmdlZEtleV0gPSByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHwgZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY1Jlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIHN5bmMgcmVjb3JkcyBpbiBzdGFibGUgb3JkZXIgYW5kIG1hcmtzIGFja25vd2xlZGdlZCByb3dzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcGxheSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggcmVwbGF5IHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8QXJyYXk8dW5rbm93bj4+fSBhcmdzLnBlbmRpbmdTeW5jcyAtIExvYWRzIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIGluIHJlcGxheSBvcmRlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5zeW5jSWQgLSBSZXR1cm5zIHRoZSBsb2NhbCBzeW5jIGlkLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5zeW5jUGF5bG9hZCAtIEJ1aWxkcyB0aGUgQVBJIHN5bmMgZW52ZWxvcGUuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHthdXRoZW50aWNhdGlvblRva2VuOiBzdHJpbmcsIHN5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj59KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFBvc3RzIG9uZSByZXBsYXkgcmVxdWVzdC5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93biwgcmVzcG9uc2U6IFN5bmNSZXBsYXlJdGVtKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLm1hcmtTdWNjZXNzZnVsIC0gTWFya3Mgb25lIHN5bmMgYXMgc3VjY2Vzc2Z1bCBsb2NhbGx5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgYWxsIGJhdGNoZXMgYXJlIHJlcGxheWVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheVBlbmRpbmcoYXJncykge1xuICAgIGNvbnN0IHBlbmRpbmdTeW5jcyA9IGF3YWl0IGFyZ3MucGVuZGluZ1N5bmNzKClcbiAgICBjb25zdCBiYXRjaFNpemUgPSB0aGlzLm5vcm1hbGl6ZWRCYXRjaFNpemUoYXJncy5iYXRjaFNpemUpXG5cbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwZW5kaW5nU3luY3MubGVuZ3RoOyBvZmZzZXQgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcGxheUJhdGNoKHsuLi5hcmdzLCBwZW5kaW5nU3luY3M6IHBlbmRpbmdTeW5jcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJhdGNoU2l6ZSl9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXlzIG9uZSBiYXRjaCBvZiBzeW5jcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZXBsYXkgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4uXG4gICAqIEBwYXJhbSB7QXJyYXk8dW5rbm93bj59IGFyZ3MucGVuZGluZ1N5bmNzIC0gQmF0Y2ggc3luY3MuXG4gICAqIEBwYXJhbSB7KHN5bmM6IHVua25vd24pID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3Muc3luY0lkIC0gU3luYyBpZCBnZXR0ZXIuXG4gICAqIEBwYXJhbSB7KHN5bmM6IHVua25vd24pID0+IFJlY29yZDxzdHJpbmcsID8+fSBhcmdzLnN5bmNQYXlsb2FkIC0gUGF5bG9hZCBidWlsZGVyLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgPz4+fSkgPT4gUHJvbWlzZTxTeW5jUmVwbGF5UmVzcG9uc2U+fSBhcmdzLnBvc3RSZXBsYXkgLSBSZXBsYXkgcG9zdGVyLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duLCByZXNwb25zZTogU3luY1JlcGxheUl0ZW0pID0+IFByb21pc2U8dm9pZD59IGFyZ3MubWFya1N1Y2Nlc3NmdWwgLSBTdWNjZXNzIGhvb2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciB0aGUgYmF0Y2ggaXMgYWNrbm93bGVkZ2VkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUJhdGNoKGFyZ3MpIHtcbiAgICBjb25zdCB7YXV0aGVudGljYXRpb25Ub2tlbiwgbWFya1N1Y2Nlc3NmdWwsIHBlbmRpbmdTeW5jcywgcG9zdFJlcGxheSwgc3luY0lkLCBzeW5jUGF5bG9hZH0gPSBhcmdzXG5cbiAgICBpZiAocGVuZGluZ1N5bmNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBzeW5jc0J5SWQgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3Qgc3luYyBvZiBwZW5kaW5nU3luY3MpIHtcbiAgICAgIGNvbnN0IGlkID0gc3luY0lkKHN5bmMpXG5cbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsKSBzeW5jc0J5SWQuc2V0KFN0cmluZyhpZCksIHN5bmMpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0UmVwbGF5KHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBzeW5jczogcGVuZGluZ1N5bmNzLm1hcCgoc3luYykgPT4gc3luY1BheWxvYWQoc3luYykpXG4gICAgfSlcblxuICAgIHRoaXMuZW5zdXJlU3VjY2Vzc2Z1bFJlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgZm9yIChjb25zdCBzeW5jUmVzcG9uc2Ugb2YgcmVzcG9uc2Uuc3luY3MgfHwgW10pIHtcbiAgICAgIGNvbnN0IHN5bmMgPSBzeW5jc0J5SWQuZ2V0KFN0cmluZyhzeW5jUmVzcG9uc2UuaWQpKVxuXG4gICAgICBpZiAoIXN5bmMpIGNvbnRpbnVlXG4gICAgICBpZiAoc3luY1Jlc3BvbnNlLnN5bmNTdGF0ZSAhPT0gXCJzdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN5bmMgc3RhdGUgcmV0dXJuZWQgZm9yIHN5bmMgJHtTdHJpbmcoc3luY1Jlc3BvbnNlLmlkKX06ICR7U3RyaW5nKHN5bmNSZXNwb25zZS5zeW5jU3RhdGUpfWApXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG1hcmtTdWNjZXNzZnVsKHN5bmMsIHN5bmNSZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIEFQSSByZXNwb25zZSBzdGF0dXMgYW5kIHNoYXBlLlxuICAgKiBAcGFyYW0ge1N5bmNSZXBsYXlSZXNwb25zZX0gcmVzcG9uc2UgLSBSZXBsYXkgcmVzcG9uc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGVuc3VyZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IFwiZXJyb3JcIikgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLmVycm9yTWVzc2FnZSB8fCBcIlN5bmMgZmFpbGVkXCIpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnN5bmNzKSkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyByZXNwb25zZSBtaXNzaW5nIHN5bmNzXCIpXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIHBvc2l0aXZlIGJhdGNoIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBiYXRjaFNpemUgLSBCYXRjaCBzaXplLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBQb3NpdGl2ZSBiYXRjaCBzaXplLlxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZWRCYXRjaFNpemUoYmF0Y2hTaXplKSB7XG4gICAgaWYgKHR5cGVvZiBiYXRjaFNpemUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShiYXRjaFNpemUpIHx8IGJhdGNoU2l6ZSA8IDEpIHJldHVybiAxMDBcblxuICAgIHJldHVybiBNYXRoLmZsb29yKGJhdGNoU2l6ZSlcbiAgfVxufVxuIl19
|
|
@@ -48,9 +48,9 @@ export type SyncClientResourceConfig = {
|
|
|
48
48
|
*/
|
|
49
49
|
localOnlyAttributes?: string[] | undefined;
|
|
50
50
|
/**
|
|
51
|
-
* - Maps a mutation operation to a sync type. Defaults to the operation name with destroy mapped to "delete".
|
|
51
|
+
* - Maps a mutation operation to a sync type. The "upsert" flag queues creates and updates as "update" rows (the server upserts by resource id) and destroys as "delete". Defaults to the operation name with destroy mapped to "delete".
|
|
52
52
|
*/
|
|
53
|
-
syncType?: ((args: {
|
|
53
|
+
syncType?: "upsert" | ((args: {
|
|
54
54
|
operation: "create" | "update" | "destroy";
|
|
55
55
|
record: unknown;
|
|
56
56
|
}) => string) | undefined;
|
|
@@ -69,7 +69,89 @@ export type SyncClientResourceConfig = {
|
|
|
69
69
|
} | undefined;
|
|
70
70
|
};
|
|
71
71
|
/**
|
|
72
|
-
*
|
|
72
|
+
* Model-level client sync declaration read from `static sync` by
|
|
73
|
+
* `SyncClient.fromConfiguration(...)`. `true` opts the model in with all
|
|
74
|
+
* defaults; an object customizes the derived resource config.
|
|
75
|
+
*/
|
|
76
|
+
export type ModelSyncDeclarationConfig = {
|
|
77
|
+
/**
|
|
78
|
+
* - Post-apply hook.
|
|
79
|
+
*/
|
|
80
|
+
afterApply?: import("./sync-api-client-types.js").SyncResourceConfig["afterApply"];
|
|
81
|
+
/**
|
|
82
|
+
* - Pull-apply attribute mapper. Required for resources that receive pulled changes.
|
|
83
|
+
*/
|
|
84
|
+
attributes?: ((args: {
|
|
85
|
+
data: Record<string, unknown>;
|
|
86
|
+
record: unknown;
|
|
87
|
+
sync: import("./sync-api-client-types.js").SyncChangeEnvelope;
|
|
88
|
+
}) => Promise<Record<string, unknown>> | Record<string, unknown>) | undefined;
|
|
89
|
+
/**
|
|
90
|
+
* - Extra boolean attributes merged with the boolean columns derived from column types.
|
|
91
|
+
*/
|
|
92
|
+
booleanAttributes?: string[] | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* - Custom pull-apply record resolver.
|
|
95
|
+
*/
|
|
96
|
+
findRecord?: import("./sync-api-client-types.js").SyncResourceConfig["findRecord"];
|
|
97
|
+
/**
|
|
98
|
+
* - Custom pull-apply delete resolver.
|
|
99
|
+
*/
|
|
100
|
+
findRecordForDelete?: import("./sync-api-client-types.js").SyncResourceConfig["findRecordForDelete"];
|
|
101
|
+
/**
|
|
102
|
+
* - Extra local-only attributes merged with the derived primary key, createdAt/updatedAt, and sync bookkeeping attributes.
|
|
103
|
+
*/
|
|
104
|
+
localOnlyAttributes?: string[] | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* - Sync type flag or mapper (see SyncClientResourceConfig).
|
|
107
|
+
*/
|
|
108
|
+
syncType?: "upsert" | ((args: {
|
|
109
|
+
operation: "create" | "update" | "destroy";
|
|
110
|
+
record: unknown;
|
|
111
|
+
}) => string) | undefined;
|
|
112
|
+
/**
|
|
113
|
+
* - Enables automatic mutation tracking; an array is shorthand for {operations}.
|
|
114
|
+
*/
|
|
115
|
+
track?: boolean | ("update" | "destroy" | "create")[] | {
|
|
116
|
+
operations: Array<"create" | "update" | "destroy">;
|
|
117
|
+
} | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* - Custom queued-payload builder for tracked mutations.
|
|
120
|
+
*/
|
|
121
|
+
trackedData?: ((args: {
|
|
122
|
+
operation: "create" | "update" | "destroy";
|
|
123
|
+
record: unknown;
|
|
124
|
+
}) => Record<string, unknown>) | undefined;
|
|
125
|
+
};
|
|
126
|
+
export type ModelSyncDeclaration = boolean | ModelSyncDeclarationConfig;
|
|
127
|
+
/**
|
|
128
|
+
* Options for building a sync client. Everything else — resources, transport
|
|
129
|
+
* POSTers, auth, connectivity, batch size — is derived from the configuration's
|
|
130
|
+
* registered models (`static sync`) and its `sync.client` block.
|
|
131
|
+
*/
|
|
132
|
+
export type SyncClientOptions = {
|
|
133
|
+
/**
|
|
134
|
+
* - Configuration owning the registered models, the `sync.client` block, and the scope-store database. Defaults to the current configuration.
|
|
135
|
+
*/
|
|
136
|
+
configuration?: import("../configuration.js").default | undefined;
|
|
137
|
+
/**
|
|
138
|
+
* - Seeds a newly declared scope's cursor (e.g. from a pre-scope cursor store) so devices don't re-pull everything.
|
|
139
|
+
*/
|
|
140
|
+
legacyCursor?: ((args: {
|
|
141
|
+
scope: SerializedSyncScope;
|
|
142
|
+
}) => string | null | Promise<string | null>) | undefined;
|
|
143
|
+
/**
|
|
144
|
+
* - Scope store override (tests).
|
|
145
|
+
*/
|
|
146
|
+
scopeStore?: import("./sync-scope-store.js").default | undefined;
|
|
147
|
+
/**
|
|
148
|
+
* - Pending-sync model override. Defaults to the registered "Sync" model.
|
|
149
|
+
*/
|
|
150
|
+
syncModel?: unknown;
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Internal derived sync client configuration built by the SyncClient
|
|
154
|
+
* constructor — not an app-facing API.
|
|
73
155
|
*/
|
|
74
156
|
export type SyncClientConfig = {
|
|
75
157
|
/**
|
|
@@ -81,9 +163,9 @@ export type SyncClientConfig = {
|
|
|
81
163
|
*/
|
|
82
164
|
batchSize?: number | undefined;
|
|
83
165
|
/**
|
|
84
|
-
* - Configuration owning the scope-store database.
|
|
166
|
+
* - Configuration owning the scope-store database.
|
|
85
167
|
*/
|
|
86
|
-
configuration
|
|
168
|
+
configuration: import("../configuration.js").default;
|
|
87
169
|
/**
|
|
88
170
|
* - Connectivity gate for pulls and replays. Defaults to always online.
|
|
89
171
|
*/
|
|
@@ -112,13 +194,9 @@ export type SyncClientConfig = {
|
|
|
112
194
|
syncs: Array<Record<string, unknown>>;
|
|
113
195
|
}) => Promise<import("./sync-api-client-types.js").SyncReplayResponse>;
|
|
114
196
|
/**
|
|
115
|
-
* -
|
|
197
|
+
* - Derived resource policies keyed by resource/model name.
|
|
116
198
|
*/
|
|
117
199
|
resources: Record<string, SyncClientResourceConfig>;
|
|
118
|
-
/**
|
|
119
|
-
* - Scope store override.
|
|
120
|
-
*/
|
|
121
|
-
scopeStore?: import("./sync-scope-store.js").default | undefined;
|
|
122
200
|
/**
|
|
123
201
|
* - Local pending-sync model class.
|
|
124
202
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-client-types.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-client-types.js"],"names":[],"mappings":";;;;;;;gBAKc,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;kBACjB,MAAM;;;;;;;;;gBAMN,OAAC;;;;;;;;;;;;iBAED,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;0BACrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;;;;iBAC9E,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"sync-client-types.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-client-types.js"],"names":[],"mappings":";;;;;;;gBAKc,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;kBACjB,MAAM;;;;;;;;;gBAMN,OAAC;;;;;;;;;;;;iBAED,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;0BACrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;;;;iBAC9E,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;;;kCAGlD;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM;;;;0BAC9E;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;;oBAC7D,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;;;;;;;;;iBAQ7D,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;iBAGrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,YAAY,CAAC;;;;0BACrE,OAAO,4BAA4B,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;;;;;;;;kCAE3D;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM;;;;;oBACrB,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;;0BAC/F;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,MAAM,EAAE,OAAC,CAAA;KAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;mCAGpF,OAAO,GAAG,0BAA0B;;;;;;;;;;;;;;2BAQ7B;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;;;;;;;;gBAE9E,OAAC;;;;;;;;;;yBAOD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;;;;;;;mBAE9B,OAAO,qBAAqB,EAAE,OAAO;;;;sBAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;;;;2BACzB;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;;;;uBACtE,KAAK,KAAK,IAAI;;;;iBACtB,CAAC,OAAO,EAAE,OAAO,4BAA4B,EAAE,kBAAkB,GAAG;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,4BAA4B,EAAE,mBAAmB,CAAC;;;;gBACtK,CAAC,OAAO,EAAE;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,4BAA4B,EAAE,kBAAkB,CAAC;;;;eAC7I,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC;;;;eACxC,OAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
export {};
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQtdHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC10eXBlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQ2xpZW50LWRlY2xhcmVkIHN5bmMgc2NvcGUgc2VyaWFsaXplZCBmcm9tIGEgbW9kZWwgcXVlcnkuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXJpYWxpemVkU3luY1Njb3BlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+fSBjb25kaXRpb25zIC0gUGxhaW4gYXR0cmlidXRlIGNvbmRpdGlvbnMgZnJvbSB0aGUgcXVlcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gUmVzb3VyY2UvbW9kZWwgbmFtZSB0aGUgc2NvcGUgd2FzIGRlY2xhcmVkIGZvci5cbiAqL1xuXG4vKipcbiAqIERlY2xhcmF0aXZlIHBlci1yZXNvdXJjZSBzeW5jIHBvbGljeS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ1xuICogQHByb3BlcnR5IHs/
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQtdHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC10eXBlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQ2xpZW50LWRlY2xhcmVkIHN5bmMgc2NvcGUgc2VyaWFsaXplZCBmcm9tIGEgbW9kZWwgcXVlcnkuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXJpYWxpemVkU3luY1Njb3BlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+fSBjb25kaXRpb25zIC0gUGxhaW4gYXR0cmlidXRlIGNvbmRpdGlvbnMgZnJvbSB0aGUgcXVlcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gUmVzb3VyY2UvbW9kZWwgbmFtZSB0aGUgc2NvcGUgd2FzIGRlY2xhcmVkIGZvci5cbiAqL1xuXG4vKipcbiAqIERlY2xhcmF0aXZlIHBlci1yZXNvdXJjZSBzeW5jIHBvbGljeS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ1xuICogQHByb3BlcnR5IHs/fSBtb2RlbENsYXNzIC0gTG9jYWwgbW9kZWwgY2xhc3MgZm9yIHRoaXMgcmVzb3VyY2UuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZ1tcImF0dHJpYnV0ZXNcIl19IFthdHRyaWJ1dGVzXSAtIFB1bGwtYXBwbHkgYXR0cmlidXRlIG1hcHBlci4gUmVxdWlyZWQgZm9yIHJlc291cmNlcyB0aGF0IHJlY2VpdmUgcHVsbGVkIGNoYW5nZXMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZ1tcImZpbmRSZWNvcmRcIl19IFtmaW5kUmVjb3JkXSAtIEN1c3RvbSBwdWxsLWFwcGx5IHJlY29yZCByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnW1wiZmluZFJlY29yZEZvckRlbGV0ZVwiXX0gW2ZpbmRSZWNvcmRGb3JEZWxldGVdIC0gQ3VzdG9tIHB1bGwtYXBwbHkgZGVsZXRlIHJlc29sdmVyLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWdbXCJhZnRlckFwcGx5XCJdfSBbYWZ0ZXJBcHBseV0gLSBQb3N0LWFwcGx5IGhvb2suXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYm9vbGVhbkF0dHJpYnV0ZXNdIC0gQXR0cmlidXRlcyBjb2VyY2VkIHRocm91Z2ggc3luYyBib29sZWFuIHBhcnNpbmcgd2hlbiBxdWV1ZWluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtsb2NhbE9ubHlBdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgc3RyaXBwZWQgZnJvbSBxdWV1ZWQgcGF5bG9hZHMuXG4gKiBAcHJvcGVydHkge1widXBzZXJ0XCIgfCAoKGFyZ3M6IHtvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogP30pID0+IHN0cmluZyl9IFtzeW5jVHlwZV0gLSBNYXBzIGEgbXV0YXRpb24gb3BlcmF0aW9uIHRvIGEgc3luYyB0eXBlLiBUaGUgXCJ1cHNlcnRcIiBmbGFnIHF1ZXVlcyBjcmVhdGVzIGFuZCB1cGRhdGVzIGFzIFwidXBkYXRlXCIgcm93cyAodGhlIHNlcnZlciB1cHNlcnRzIGJ5IHJlc291cmNlIGlkKSBhbmQgZGVzdHJveXMgYXMgXCJkZWxldGVcIi4gRGVmYXVsdHMgdG8gdGhlIG9wZXJhdGlvbiBuYW1lIHdpdGggZGVzdHJveSBtYXBwZWQgdG8gXCJkZWxldGVcIi5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogP30pID0+IFJlY29yZDxzdHJpbmcsID8+fSBbdHJhY2tlZERhdGFdIC0gQ3VzdG9tIHF1ZXVlZC1wYXlsb2FkIGJ1aWxkZXIgZm9yIHRyYWNrZWQgbXV0YXRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwge29wZXJhdGlvbnM6IEFycmF5PFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCI+fX0gW3RyYWNrXSAtIEVuYWJsZXMgYXV0b21hdGljIG11dGF0aW9uIHRyYWNraW5nIHRocm91Z2ggbW9kZWwgbGlmZWN5Y2xlIGNhbGxiYWNrcy5cbiAqL1xuXG4vKipcbiAqIE1vZGVsLWxldmVsIGNsaWVudCBzeW5jIGRlY2xhcmF0aW9uIHJlYWQgZnJvbSBgc3RhdGljIHN5bmNgIGJ5XG4gKiBgU3luY0NsaWVudC5mcm9tQ29uZmlndXJhdGlvbiguLi4pYC4gYHRydWVgIG9wdHMgdGhlIG1vZGVsIGluIHdpdGggYWxsXG4gKiBkZWZhdWx0czsgYW4gb2JqZWN0IGN1c3RvbWl6ZXMgdGhlIGRlcml2ZWQgcmVzb3VyY2UgY29uZmlnLlxuICogQHR5cGVkZWYge29iamVjdH0gTW9kZWxTeW5jRGVjbGFyYXRpb25Db25maWdcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnW1wiYWZ0ZXJBcHBseVwiXX0gW2FmdGVyQXBwbHldIC0gUG9zdC1hcHBseSBob29rLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWdbXCJhdHRyaWJ1dGVzXCJdfSBbYXR0cmlidXRlc10gLSBQdWxsLWFwcGx5IGF0dHJpYnV0ZSBtYXBwZXIuIFJlcXVpcmVkIGZvciByZXNvdXJjZXMgdGhhdCByZWNlaXZlIHB1bGxlZCBjaGFuZ2VzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jvb2xlYW5BdHRyaWJ1dGVzXSAtIEV4dHJhIGJvb2xlYW4gYXR0cmlidXRlcyBtZXJnZWQgd2l0aCB0aGUgYm9vbGVhbiBjb2x1bW5zIGRlcml2ZWQgZnJvbSBjb2x1bW4gdHlwZXMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZ1tcImZpbmRSZWNvcmRcIl19IFtmaW5kUmVjb3JkXSAtIEN1c3RvbSBwdWxsLWFwcGx5IHJlY29yZCByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnW1wiZmluZFJlY29yZEZvckRlbGV0ZVwiXX0gW2ZpbmRSZWNvcmRGb3JEZWxldGVdIC0gQ3VzdG9tIHB1bGwtYXBwbHkgZGVsZXRlIHJlc29sdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2xvY2FsT25seUF0dHJpYnV0ZXNdIC0gRXh0cmEgbG9jYWwtb25seSBhdHRyaWJ1dGVzIG1lcmdlZCB3aXRoIHRoZSBkZXJpdmVkIHByaW1hcnkga2V5LCBjcmVhdGVkQXQvdXBkYXRlZEF0LCBhbmQgc3luYyBib29ra2VlcGluZyBhdHRyaWJ1dGVzLlxuICogQHByb3BlcnR5IHtcInVwc2VydFwiIHwgKChhcmdzOiB7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZWNvcmQ6ID99KSA9PiBzdHJpbmcpfSBbc3luY1R5cGVdIC0gU3luYyB0eXBlIGZsYWcgb3IgbWFwcGVyIChzZWUgU3luY0NsaWVudFJlc291cmNlQ29uZmlnKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IEFycmF5PFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCI+IHwge29wZXJhdGlvbnM6IEFycmF5PFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCI+fX0gW3RyYWNrXSAtIEVuYWJsZXMgYXV0b21hdGljIG11dGF0aW9uIHRyYWNraW5nOyBhbiBhcnJheSBpcyBzaG9ydGhhbmQgZm9yIHtvcGVyYXRpb25zfS5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogP30pID0+IFJlY29yZDxzdHJpbmcsID8+fSBbdHJhY2tlZERhdGFdIC0gQ3VzdG9tIHF1ZXVlZC1wYXlsb2FkIGJ1aWxkZXIgZm9yIHRyYWNrZWQgbXV0YXRpb25zLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7Ym9vbGVhbiB8IE1vZGVsU3luY0RlY2xhcmF0aW9uQ29uZmlnfSBNb2RlbFN5bmNEZWNsYXJhdGlvbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGJ1aWxkaW5nIGEgc3luYyBjbGllbnQuIEV2ZXJ5dGhpbmcgZWxzZSDigJQgcmVzb3VyY2VzLCB0cmFuc3BvcnRcbiAqIFBPU1RlcnMsIGF1dGgsIGNvbm5lY3Rpdml0eSwgYmF0Y2ggc2l6ZSDigJQgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uJ3NcbiAqIHJlZ2lzdGVyZWQgbW9kZWxzIChgc3RhdGljIHN5bmNgKSBhbmQgaXRzIGBzeW5jLmNsaWVudGAgYmxvY2suXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jQ2xpZW50T3B0aW9uc1xuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscywgdGhlIGBzeW5jLmNsaWVudGAgYmxvY2ssIGFuZCB0aGUgc2NvcGUtc3RvcmUgZGF0YWJhc2UuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2NvcGU6IFNlcmlhbGl6ZWRTeW5jU2NvcGV9KSA9PiBzdHJpbmcgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gW2xlZ2FjeUN1cnNvcl0gLSBTZWVkcyBhIG5ld2x5IGRlY2xhcmVkIHNjb3BlJ3MgY3Vyc29yIChlLmcuIGZyb20gYSBwcmUtc2NvcGUgY3Vyc29yIHN0b3JlKSBzbyBkZXZpY2VzIGRvbid0IHJlLXB1bGwgZXZlcnl0aGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCIpLmRlZmF1bHR9IFtzY29wZVN0b3JlXSAtIFNjb3BlIHN0b3JlIG92ZXJyaWRlICh0ZXN0cykuXG4gKiBAcHJvcGVydHkgez99IFtzeW5jTW9kZWxdIC0gUGVuZGluZy1zeW5jIG1vZGVsIG92ZXJyaWRlLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0ZXJlZCBcIlN5bmNcIiBtb2RlbC5cbiAqL1xuXG4vKipcbiAqIEludGVybmFsIGRlcml2ZWQgc3luYyBjbGllbnQgY29uZmlndXJhdGlvbiBidWlsdCBieSB0aGUgU3luY0NsaWVudFxuICogY29uc3RydWN0b3Ig4oCUIG5vdCBhbiBhcHAtZmFjaW5nIEFQSS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDbGllbnRDb25maWdcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+fSBhdXRoZW50aWNhdGlvblRva2VuIC0gUmVzb2x2ZXMgdGhlIGF1dGggdG9rZW4gc2VudCB3aXRoIHN5bmMgcmVxdWVzdHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSBzY29wZS1zdG9yZSBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj59IFtpc09ubGluZV0gLSBDb25uZWN0aXZpdHkgZ2F0ZSBmb3IgcHVsbHMgYW5kIHJlcGxheXMuIERlZmF1bHRzIHRvIGFsd2F5cyBvbmxpbmUuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2NvcGU6IFNlcmlhbGl6ZWRTeW5jU2NvcGV9KSA9PiBzdHJpbmcgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gW2xlZ2FjeUN1cnNvcl0gLSBTZWVkcyBhIG5ld2x5IGRlY2xhcmVkIHNjb3BlJ3MgY3Vyc29yIChlLmcuIGZyb20gYSBwcmUtc2NvcGUgY3Vyc29yIHN0b3JlKSBzbyBkZXZpY2VzIGRvbid0IHJlLXB1bGwgZXZlcnl0aGluZy5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH0gW29uRXJyb3JdIC0gUmVwb3J0cyBiYWNrZ3JvdW5kIHJlcGxheS9wdWxsIGZhaWx1cmVzLiBEZWZhdWx0cyB0byByZXRocm93aW5nLlxuICogQHByb3BlcnR5IHsocGF5bG9hZDogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXF1ZXN0ICYge3Njb3BlOiBTZXJpYWxpemVkU3luY1Njb3BlfSkgPT4gUHJvbWlzZTxpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gcG9zdENoYW5nZXMgLSBQb3N0cyBvbmUgY2hhbmdlcyByZXF1ZXN0LlxuICogQHByb3BlcnR5IHsocGF5bG9hZDoge2F1dGhlbnRpY2F0aW9uVG9rZW46IHN0cmluZywgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsID8+Pn0pID0+IFByb21pc2U8aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1JlcGxheVJlc3BvbnNlPn0gcG9zdFJlcGxheSAtIFBvc3RzIG9uZSByZXBsYXkgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgU3luY0NsaWVudFJlc291cmNlQ29uZmlnPn0gcmVzb3VyY2VzIC0gRGVyaXZlZCByZXNvdXJjZSBwb2xpY2llcyBrZXllZCBieSByZXNvdXJjZS9tb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHs/fSBzeW5jTW9kZWwgLSBMb2NhbCBwZW5kaW5nLXN5bmMgbW9kZWwgY2xhc3MuXG4gKi9cblxuZXhwb3J0IHt9XG4iXX0=
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazily builds (and memoizes per configuration) the sync client derived from the
|
|
3
|
+
* app's Velocious configuration and registers it as the current sync client.
|
|
4
|
+
* @param {Configuration} [configuration] - Configuration owning the registered models and the sync.client block. Defaults to the current configuration.
|
|
5
|
+
* @returns {SyncClient} Memoized sync client for the configuration.
|
|
6
|
+
*/
|
|
7
|
+
export function syncClient(configuration?: Configuration): SyncClient;
|
|
1
8
|
/**
|
|
2
9
|
* Declares a sync scope on the current sync client.
|
|
3
10
|
* @param {import("../database/query/model-class-query.js").default<?>} query - Query declaring the sync scope.
|
|
@@ -10,13 +17,14 @@ export function sync(query: import("../database/query/model-class-query.js").def
|
|
|
10
17
|
/**
|
|
11
18
|
* Declarative client-side sync driver.
|
|
12
19
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* and
|
|
20
|
+
* Everything is derived from the app's Velocious configuration: models declare
|
|
21
|
+
* `static sync`, transport/auth/connectivity come from the `sync.client`
|
|
22
|
+
* configuration block, and Velocious owns scope persistence, per-scope cursors,
|
|
23
|
+
* pull paging/apply, local queueing, and online-gated replay. Declare sync
|
|
24
|
+
* interest from queries:
|
|
16
25
|
*
|
|
17
|
-
*
|
|
18
|
-
* syncClient.
|
|
19
|
-
* await syncClient.sync(Event.where({partnerId}))
|
|
26
|
+
* await syncClient().start()
|
|
27
|
+
* await syncClient().sync(Event.where({partnerId}))
|
|
20
28
|
*/
|
|
21
29
|
export default class SyncClient {
|
|
22
30
|
/**
|
|
@@ -25,10 +33,26 @@ export default class SyncClient {
|
|
|
25
33
|
*/
|
|
26
34
|
static current(): SyncClient;
|
|
27
35
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
* Builds a sync client derived from the given configuration. Alias for
|
|
37
|
+
* `new SyncClient({configuration, ...options})`.
|
|
38
|
+
* @param {Configuration} [configuration] - Configuration owning the registered models and the sync.client block. Defaults to the current configuration.
|
|
39
|
+
* @param {Omit<import("./sync-client-types.js").SyncClientOptions, "configuration">} [options] - Optional overrides.
|
|
40
|
+
* @returns {SyncClient} Sync client derived from the configuration.
|
|
41
|
+
*/
|
|
42
|
+
static fromConfiguration(configuration?: Configuration, options?: Omit<import("./sync-client-types.js").SyncClientOptions, "configuration">): SyncClient;
|
|
43
|
+
/**
|
|
44
|
+
* Builds the sync client by deriving everything from the app's Velocious
|
|
45
|
+
* configuration: every registered model declaring `static sync` becomes a
|
|
46
|
+
* resource with booleanAttributes derived from column types and
|
|
47
|
+
* localOnlyAttributes derived from the primary key, createdAt/updatedAt, and
|
|
48
|
+
* sync bookkeeping columns; the pending-sync model is the registered "Sync"
|
|
49
|
+
* model; transport, auth, connectivity, and error reporting come from the
|
|
50
|
+
* `sync.client` configuration block, with the framework owning the
|
|
51
|
+
* `${mountPath}/changes` and `${mountPath}/replay` POSTers.
|
|
52
|
+
* @param {import("./sync-client-types.js").SyncClientOptions} [options] - Optional overrides.
|
|
53
|
+
*/
|
|
54
|
+
constructor(options?: import("./sync-client-types.js").SyncClientOptions);
|
|
55
|
+
/** @type {import("./sync-client-types.js").SyncClientConfig} */
|
|
32
56
|
config: import("./sync-client-types.js").SyncClientConfig;
|
|
33
57
|
_clientNumber: number;
|
|
34
58
|
/** @type {import("./sync-scope-store.js").default | null} */
|
|
@@ -158,7 +182,9 @@ export default class SyncClient {
|
|
|
158
182
|
*/
|
|
159
183
|
resourceConfigFor(resource: unknown): import("./sync-client-types.js").SyncClientResourceConfig;
|
|
160
184
|
/**
|
|
161
|
-
* Resolves the sync type for a mutation through the resource config.
|
|
185
|
+
* Resolves the sync type for a mutation through the resource config. The
|
|
186
|
+
* "upsert" flag queues creates and updates as "update" rows (the server
|
|
187
|
+
* upserts by resource id) and destroys as "delete" rows.
|
|
162
188
|
* @param {{operation: "create" | "update" | "destroy", record: ?, resourceConfig: import("./sync-client-types.js").SyncClientResourceConfig}} args - Mutation args.
|
|
163
189
|
* @returns {string} Sync type.
|
|
164
190
|
*/
|
|
@@ -173,4 +199,5 @@ export default class SyncClient {
|
|
|
173
199
|
*/
|
|
174
200
|
pullResourceConfigs(): Record<string, import("./sync-api-client-types.js").SyncResourceConfig>;
|
|
175
201
|
}
|
|
202
|
+
import Configuration from "../configuration.js";
|
|
176
203
|
//# sourceMappingURL=sync-client.d.ts.map
|