@dbx-tools/postgres 0.9.70 → 0.9.71
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/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/persistence.d.ts +1 -1
- package/lib/src/persistence.js +10 -1
- package/package.json +3 -3
- package/src/persistence.ts +17 -1
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.71";
|
|
7
7
|
export * as advisoryLock from "./src/advisory-lock.ts";
|
|
8
8
|
export * as bindings from "./src/bindings.ts";
|
|
9
9
|
export * as identity from "./src/identity.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.71";
|
|
3
3
|
export * as advisoryLock from "./src/advisory-lock.ts";
|
|
4
4
|
export * as bindings from "./src/bindings.ts";
|
|
5
5
|
export * as identity from "./src/identity.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.71";
|
|
6
6
|
export * as advisoryLock from "./src/advisory-lock.js";
|
|
7
7
|
export * as bindings from "./src/bindings.js";
|
|
8
8
|
export * as identity from "./src/identity.js";
|
|
@@ -12,4 +12,4 @@ export * as topicBus from "./src/topic-bus.js";
|
|
|
12
12
|
export { POINTER_VERSION } from "./src/persistence.js";
|
|
13
13
|
export { PostgresTopicBus } from "./src/topic-bus.js";
|
|
14
14
|
export * from "./exports.js";
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS43MVwiO1xuZXhwb3J0ICogYXMgYWR2aXNvcnlMb2NrIGZyb20gXCIuL3NyYy9hZHZpc29yeS1sb2NrLnRzXCI7XG5leHBvcnQgKiBhcyBiaW5kaW5ncyBmcm9tIFwiLi9zcmMvYmluZGluZ3MudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgcGVyc2lzdGVuY2UgZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXNzaW9uIGZyb20gXCIuL3NyYy9zZXNzaW9uLnRzXCI7XG5leHBvcnQgKiBhcyB0b3BpY0J1cyBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkdmlzb3J5TG9ja0tleSwgUGdQb29sTGlrZSwgUGdRdWVyeWFibGUgfSBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0IHsgUE9JTlRFUl9WRVJTSU9OIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgdHlwZSB7IER1cmF0aW9uSW5wdXQsIFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcGVyc2lzdGVuY2UudHNcIjtcbmV4cG9ydCB7IFBvc3RncmVzVG9waWNCdXMgfSBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFRvcGljTWV0YWRhdGEsIFRvcGljTWVzc2FnZSwgVG9waWNQdWJsaXNoSW5wdXQsIFRvcGljTGlzdGVuZXIsIFRvcGljTWV0YWRhdGFQcm92aWRlciwgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdG9waWMtYnVzLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
|
package/lib/src/persistence.d.ts
CHANGED
|
@@ -54,7 +54,7 @@ export declare const POINTER_VERSION = 1;
|
|
|
54
54
|
/** Validate persistence scope and apply stable schema, table, TTL, and cleanup defaults. */
|
|
55
55
|
export declare function resolvePersistenceOptions(value: true | TopicBusPersistenceOptions): ResolvedTopicBusPersistenceOptions;
|
|
56
56
|
/** Create the persistence schema, open and restricted tables, and replay indexes. */
|
|
57
|
-
export declare function provisionMessageBusSchema(pool: PgPoolLike, options: ResolvedTopicBusPersistenceOptions): Promise<void>;
|
|
57
|
+
export declare function provisionMessageBusSchema(pool: PgPoolLike & PgQueryable, options: ResolvedTopicBusPersistenceOptions): Promise<void>;
|
|
58
58
|
/** Build SQL grants for roles that may read and write one persistence scope. */
|
|
59
59
|
export declare function messageBusGrantStatements(roles: string | readonly string[], scope: TopicPersistenceScope, options: ResolvedTopicBusPersistenceOptions): string[];
|
|
60
60
|
/** Convert a persistence TTL to milliseconds, preserving disabled retention. */
|
package/lib/src/persistence.js
CHANGED
|
@@ -17,6 +17,11 @@ const DEFAULT_TTL = "24 hours";
|
|
|
17
17
|
*/
|
|
18
18
|
export const POINTER_VERSION = 1;
|
|
19
19
|
const table = (options, scope) => `${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier(options.tables[scope])}`;
|
|
20
|
+
/** Whether the selected persistence table exists but is managed by another role. */
|
|
21
|
+
async function selectedTableIsExternallyManaged(queryable, options) {
|
|
22
|
+
const result = await queryable.query(`SELECT pg_has_role(current_user, pg_get_userbyid(table_class.relowner), 'USAGE') AS can_manage FROM pg_class AS table_class JOIN pg_namespace AS table_schema ON table_schema.oid = table_class.relnamespace WHERE table_schema.nspname = $1 AND table_class.relname = $2 AND table_class.relkind IN ('r', 'p')`, [options.schema, options.tables[options.scope]]);
|
|
23
|
+
return result.rows[0]?.can_manage === false;
|
|
24
|
+
}
|
|
20
25
|
/** Validate persistence scope and apply stable schema, table, TTL, and cleanup defaults. */
|
|
21
26
|
export function resolvePersistenceOptions(value) {
|
|
22
27
|
const configured = value === true ? {} : value;
|
|
@@ -39,7 +44,11 @@ export function resolvePersistenceOptions(value) {
|
|
|
39
44
|
}
|
|
40
45
|
/** Create the persistence schema, open and restricted tables, and replay indexes. */
|
|
41
46
|
export async function provisionMessageBusSchema(pool, options) {
|
|
47
|
+
if (await selectedTableIsExternallyManaged(pool, options))
|
|
48
|
+
return;
|
|
42
49
|
await withAdvisoryTransactionLock(pool, ["dbx_message_bus", "schema"], async (client) => {
|
|
50
|
+
if (await selectedTableIsExternallyManaged(client, options))
|
|
51
|
+
return;
|
|
43
52
|
await client.query(`CREATE SCHEMA IF NOT EXISTS ${quotePostgresIdentifier(options.schema)}`);
|
|
44
53
|
await client.query(`CREATE TABLE IF NOT EXISTS ${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier("schema_version")} (version INTEGER PRIMARY KEY)`);
|
|
45
54
|
for (const scope of ["open", "restricted"]) {
|
|
@@ -160,4 +169,4 @@ export async function readPointer(queryable, channel, pointer, options) {
|
|
|
160
169
|
const result = await queryable.query(`SELECT envelope FROM ${table(options, pointer.scope)} WHERE channel = $1 AND message_id = $2 AND (expires_at IS NULL OR expires_at > clock_timestamp())`, [channel, pointer.id]);
|
|
161
170
|
return result.rows[0]?.envelope;
|
|
162
171
|
}
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBNEN2RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFDL0I7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQTJDLEVBQUUsS0FBNEIsRUFBVSxFQUFFLENBQ2xHLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRWpHLDRGQUE0RjtBQUM1RixNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLEtBQXdDO0lBRXhDLE1BQU0sVUFBVSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDO0lBQ3pDLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLFNBQVMsQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxJQUFJLGlCQUFpQjtRQUM5QyxLQUFLO1FBQ0wsTUFBTSxFQUFFO1lB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UUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3hGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsU0FBc0IsRUFDdEIsT0FBZSxFQUNmLE9BQXFCLEVBQ3JCLE9BQTJDO0lBRTNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FDbEMsd0JBQXdCLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxvR0FBb0csRUFDekosQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUN0QixDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQTJDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRHVyYWJsZSByZXBsYXkgYW5kIHBvaW50ZXIgcGF5bG9hZHMgZm9yIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzfS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIHNjaGVtYSBwcm92aXNpb25pbmcsIGdyYW50cywgVFRMIGNsZWFudXAsIHJlcGxheSBjdXJzb3JzLFxuICogYW5kIG9wZW4vcmVzdHJpY3RlZCBwZXJzaXN0ZW5jZSBzY29wZXMuIFJldXNlIGl0IHdoZW4gYSB0b3BpYy1idXMgY29uc3VtZXJcbiAqIG5lZWRzIGhpc3Rvcnkgb3IgbGFyZ2VyIHBheWxvYWRzIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBwYXJhbGxlbCBtZXNzYWdlIHRhYmxlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdFJvdyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBQZ1Bvb2xMaWtlLCBQZ1F1ZXJ5YWJsZSB9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmltcG9ydCB7IHdpdGhBZHZpc29yeVRyYW5zYWN0aW9uTG9jayB9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmltcG9ydCB7IHF1b3RlUG9zdGdyZXNJZGVudGlmaWVyIH0gZnJvbSBcIi4vc2Vzc2lvbi50c1wiO1xuaW1wb3J0IHR5cGUgeyBUb3BpY01lc3NhZ2UgfSBmcm9tIFwiLi90b3BpYy1idXMudHNcIjtcblxuLyoqIFN0b3JhZ2UgYW5kIGdyYW50IHRpZXIgZm9yIHBlcnNpc3RlZCB0b3BpYyBtZXNzYWdlcy4gKi9cbmV4cG9ydCB0eXBlIFRvcGljUGVyc2lzdGVuY2VTY29wZSA9IFwib3BlblwiIHwgXCJyZXN0cmljdGVkXCI7XG4vKiogUG9zdGdyZVNRTCBpbnRlcnZhbCB0ZXh0IG9yIG1pbGxpc2Vjb25kIGR1cmF0aW9uIGFjY2VwdGVkIGZvciBtZXNzYWdlIGV4cGlyeS4gKi9cbmV4cG9ydCB0eXBlIER1cmF0aW9uSW5wdXQgPSBzdHJpbmcgfCBudW1iZXI7XG4vKiogT3B0aW9uYWwgc2NoZW1hLCB0YWJsZSwgZXhwaXJ5LCBwYXlsb2FkLCBhbmQgcHJvdmlzaW9uaW5nIHNldHRpbmdzIGZvciB0b3BpYyBwZXJzaXN0ZW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMge1xuICBzY2hlbWE/OiBzdHJpbmc7XG4gIHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICB0YWJsZXM/OiBQYXJ0aWFsPFJlY29yZDxUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIHN0cmluZz4+O1xuICB0dGw/OiBEdXJhdGlvbklucHV0IHwgZmFsc2U7XG4gIHBheWxvYWQ/OiBcImVudmVsb3BlXCIgfCBcInBvaW50ZXJcIjtcbiAgY2xlYW51cEJhdGNoU2l6ZT86IG51bWJlcjtcbiAgcHJvdmlzaW9uPzogYm9vbGVhbjtcbn1cbi8qKiBDb21wbGV0ZSBwZXJzaXN0ZW5jZSBzZXR0aW5ncyBhZnRlciBkZWZhdWx0cyBhcmUgYXBwbGllZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIHNjaGVtYTogc3RyaW5nO1xuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICB0YWJsZXM6IFJlY29yZDxUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIHN0cmluZz47XG4gIHR0bDogRHVyYXRpb25JbnB1dCB8IGZhbHNlO1xuICBwYXlsb2FkOiBcImVudmVsb3BlXCIgfCBcInBvaW50ZXJcIjtcbiAgY2xlYW51cEJhdGNoU2l6ZTogbnVtYmVyO1xuICBwcm92aXNpb246IGJvb2xlYW47XG59XG4vKiogUGVyc2lzdGVkIHRvcGljIG1lc3NhZ2UgcGx1cyByZXBsYXkgY3Vyc29yLCBzY29wZSwgYW5kIGV4cGlyeSBtZXRhZGF0YS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkVG9waWNNZXNzYWdlPFxuICBUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSxcbj4ge1xuICBjdXJzb3I6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBzdHJpbmcgfCBudWxsO1xuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICBtZXNzYWdlOiBUb3BpY01lc3NhZ2U8VEJvZHk+O1xufVxuLyoqIE9yZGVyZWQgcmVwbGF5IHBhZ2UgYW5kIG9wdGlvbmFsIGN1cnNvciBmb3IgdGhlIG5leHQgcGFnZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNIaXN0b3J5UGFnZTxcbiAgVEJvZHkgZXh0ZW5kcyBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWUgPSBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWUsXG4+IHtcbiAgbWVzc2FnZXM6IFN0b3JlZFRvcGljTWVzc2FnZTxUQm9keT5bXTtcbiAgbmV4dEN1cnNvcj86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9UVEwgPSBcIjI0IGhvdXJzXCI7XG4vKipcbiAqIFBvaW50ZXItcGF5bG9hZCB2ZXJzaW9uLiBBIGxpc3RlbmVyIHRoYXQgZG9lcyBub3QgcmVjb2duaXplIHRoZSB2ZXJzaW9uIHRyZWF0c1xuICogdGhlIG5vdGlmaWNhdGlvbiBhcyBmb3JlaWduIHRyYWZmaWMgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXQgaXRzIHNoYXBlLlxuICovXG5leHBvcnQgY29uc3QgUE9JTlRFUl9WRVJTSU9OID0gMTtcbmNvbnN0IHRhYmxlID0gKG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUpOiBzdHJpbmcgPT5cbiAgYCR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfS4ke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMudGFibGVzW3Njb3BlXSl9YDtcblxuLyoqIFZhbGlkYXRlIHBlcnNpc3RlbmNlIHNjb3BlIGFuZCBhcHBseSBzdGFibGUgc2NoZW1hLCB0YWJsZSwgVFRMLCBhbmQgY2xlYW51cCBkZWZhdWx0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zKFxuICB2YWx1ZTogdHJ1ZSB8IFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSB2YWx1ZSA9PT0gdHJ1ZSA/IHt9IDogdmFsdWU7XG4gIGNvbnN0IHNjb3BlID0gY29uZmlndXJlZC5zY29wZSA/PyBcIm9wZW5cIjtcbiAgaWYgKHNjb3BlICE9PSBcIm9wZW5cIiAmJiBzY29wZSAhPT0gXCJyZXN0cmljdGVkXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmtub3duIHBlcnNpc3RlbmNlIHNjb3BlOiAke1N0cmluZyhzY29wZSl9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWE6IGNvbmZpZ3VyZWQuc2NoZW1hID8/IFwiZGJ4X21lc3NhZ2VfYnVzXCIsXG4gICAgc2NvcGUsXG4gICAgdGFibGVzOiB7XG4gICAgICBvcGVuOiBjb25maWd1cmVkLnRhYmxlcz8ub3BlbiA/PyBcIm9wZW5fbWVzc2FnZXNcIixcbiAgICAgIHJlc3RyaWN0ZWQ6IGNvbmZpZ3VyZWQudGFibGVzPy5yZXN0cmljdGVkID8/IFwicmVzdHJpY3RlZF9tZXNzYWdlc1wiLFxuICAgIH0sXG4gICAgdHRsOiBjb25maWd1cmVkLnR0bCA/PyBERUZBVUxUX1RUTCxcbiAgICBwYXlsb2FkOiBjb25maWd1cmVkLnBheWxvYWQgPz8gXCJlbnZlbG9wZVwiLFxuICAgIGNsZWFudXBCYXRjaFNpemU6IGNvbmZpZ3VyZWQuY2xlYW51cEJhdGNoU2l6ZSA/PyAxMDAwLFxuICAgIHByb3Zpc2lvbjogY29uZmlndXJlZC5wcm92aXNpb24gPz8gdHJ1ZSxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZSB0aGUgcGVyc2lzdGVuY2Ugc2NoZW1hLCBvcGVuIGFuZCByZXN0cmljdGVkIHRhYmxlcywgYW5kIHJlcGxheSBpbmRleGVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEoXG4gIHBvb2w6IFBnUG9vbExpa2UsXG4gIG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd2l0aEFkdmlzb3J5VHJhbnNhY3Rpb25Mb2NrKHBvb2wsIFtcImRieF9tZXNzYWdlX2J1c1wiLCBcInNjaGVtYVwiXSwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShgQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfWApO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgIGBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX0uJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihcInNjaGVtYV92ZXJzaW9uXCIpfSAodmVyc2lvbiBJTlRFR0VSIFBSSU1BUlkgS0VZKWAsXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHNjb3BlIG9mIFtcIm9wZW5cIiwgXCJyZXN0cmljdGVkXCJdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBuYW1lID0gdGFibGUob3B0aW9ucywgc2NvcGUpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtuYW1lfSAoc2VxdWVuY2UgQklHSU5UIEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFkgUFJJTUFSWSBLRVksIGNoYW5uZWwgVEVYVCBOT1QgTlVMTCwgdG9waWMgVEVYVCBOT1QgTlVMTCwgbWVzc2FnZV9pZCBURVhUIE5PVCBOVUxMLCBwdWJsaXNoZWRfYXQgVElNRVNUQU1QVFogTk9UIE5VTEwsIGV4cGlyZXNfYXQgVElNRVNUQU1QVFosIHhhY3RfaWQgWElEOCBOT1QgTlVMTCBERUZBVUxUIHBnX2N1cnJlbnRfeGFjdF9pZCgpLCBlbnZlbG9wZSBKU09OQiBOT1QgTlVMTCwgVU5JUVVFIChjaGFubmVsLCBtZXNzYWdlX2lkKSwgQ0hFQ0sgKGpzb25iX3R5cGVvZihlbnZlbG9wZSkgPSAnb2JqZWN0JykpYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKGAke29wdGlvbnMudGFibGVzW3Njb3BlXX1fcmVwbGF5X2lkeGApfSBPTiAke25hbWV9IChjaGFubmVsLCB0b3BpYywgc2VxdWVuY2UpYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKGAke29wdGlvbnMudGFibGVzW3Njb3BlXX1fZXhwaXJ5X2lkeGApfSBPTiAke25hbWV9IChleHBpcmVzX2F0KSBXSEVSRSBleHBpcmVzX2F0IElTIE5PVCBOVUxMYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgIGBJTlNFUlQgSU5UTyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX0uJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihcInNjaGVtYV92ZXJzaW9uXCIpfSAodmVyc2lvbikgVkFMVUVTICgxKSBPTiBDT05GTElDVCAodmVyc2lvbikgRE8gTk9USElOR2AsXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKiBCdWlsZCBTUUwgZ3JhbnRzIGZvciByb2xlcyB0aGF0IG1heSByZWFkIGFuZCB3cml0ZSBvbmUgcGVyc2lzdGVuY2Ugc2NvcGUuICovXG5leHBvcnQgZnVuY3Rpb24gbWVzc2FnZUJ1c0dyYW50U3RhdGVtZW50cyhcbiAgcm9sZXM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBzZWxlY3RlZCA9IHRhYmxlKG9wdGlvbnMsIHNjb3BlKTtcbiAgcmV0dXJuICh0eXBlb2Ygcm9sZXMgPT09IFwic3RyaW5nXCIgPyBbcm9sZXNdIDogcm9sZXMpLmZsYXRNYXAoKHJvbGUpID0+IFtcbiAgICBgR1JBTlQgVVNBR0UgT04gU0NIRU1BICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfSBUTyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHJvbGUpfTtgLFxuICAgIGBHUkFOVCBTRUxFQ1QsIElOU0VSVCwgREVMRVRFIE9OIFRBQkxFICR7c2VsZWN0ZWR9IFRPICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIocm9sZSl9O2AsXG4gICAgYEdSQU5UIFNFTEVDVCBPTiBUQUJMRSAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX0uJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihcInNjaGVtYV92ZXJzaW9uXCIpfSBUTyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHJvbGUpfTtgLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gY3Vyc29yKHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIHNlcXVlbmNlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoW3Njb3BlLCBTdHJpbmcoc2VxdWVuY2UpXSkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xufVxuZnVuY3Rpb24gYWZ0ZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIjBcIjtcbiAgY29uc3QgZGVjb2RlZCA9IEpTT04ucGFyc2UoQnVmZmVyLmZyb20odmFsdWUsIFwiYmFzZTY0dXJsXCIpLnRvU3RyaW5nKCkpIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmIChkZWNvZGVkWzBdICE9PSBzY29wZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJIaXN0b3J5IGN1cnNvciBiZWxvbmdzIHRvIGFub3RoZXIgcGVyc2lzdGVuY2Ugc2NvcGVcIik7XG4gIH1cbiAgcmV0dXJuIGRlY29kZWRbMV07XG59XG5cbi8qKiBDb252ZXJ0IGEgcGVyc2lzdGVuY2UgVFRMIHRvIG1pbGxpc2Vjb25kcywgcHJlc2VydmluZyBkaXNhYmxlZCByZXRlbnRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gdHRsTWlsbGlzZWNvbmRzKHZhbHVlOiBEdXJhdGlvbklucHV0IHwgZmFsc2UpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IG9iamVjdC50b0R1cmF0aW9uKHZhbHVlKTtcbiAgaWYgKG1pbGxpc2Vjb25kcyA9PT0gdW5kZWZpbmVkIHx8IG1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBwZXJzaXN0ZW5jZSBUVEw6ICR7U3RyaW5nKHZhbHVlKX1gKTtcbiAgfVxuICByZXR1cm4gbWlsbGlzZWNvbmRzO1xufVxuXG4vKiogRGVsZXRlIG9uZSBib3VuZGVkIGJhdGNoIG9mIGV4cGlyZWQgcGVyc2lzdGVkIHRvcGljIG1lc3NhZ2VzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFudXBFeHBpcmVkKFxuICBxdWVyeWFibGU6IFBnUXVlcnlhYmxlLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICBsaW1pdCA9IG9wdGlvbnMuY2xlYW51cEJhdGNoU2l6ZSxcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5YWJsZS5xdWVyeShcbiAgICBgV0lUSCBleHBpcmVkIEFTIChTRUxFQ1QgY3RpZCBGUk9NICR7dGFibGUob3B0aW9ucywgc2NvcGUpfSBXSEVSRSBleHBpcmVzX2F0IElTIE5PVCBOVUxMIEFORCBleHBpcmVzX2F0IDw9IGNsb2NrX3RpbWVzdGFtcCgpIE9SREVSIEJZIGV4cGlyZXNfYXQgTElNSVQgJDEpIERFTEVURSBGUk9NICR7dGFibGUob3B0aW9ucywgc2NvcGUpfSBBUyBtZXNzYWdlcyBVU0lORyBleHBpcmVkIFdIRVJFIG1lc3NhZ2VzLmN0aWQgPSBleHBpcmVkLmN0aWRgLFxuICAgIFtsaW1pdF0sXG4gICk7XG4gIHJldHVybiByZXN1bHQucm93Q291bnQgPz8gMDtcbn1cblxudHlwZSBIaXN0b3J5Um93ID0gUXVlcnlSZXN1bHRSb3cgJiB7XG4gIHNlcXVlbmNlOiBzdHJpbmc7XG4gIGV4cGlyZXNfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICBlbnZlbG9wZTogVG9waWNNZXNzYWdlO1xufTtcblxuLyoqIFJlYWQgYSBjdXJzb3ItcGFnaW5hdGVkIHBhZ2Ugb2YgcGVyc2lzdGVkIHRvcGljIGhpc3RvcnkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGlzdG9yeTxUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZT4oXG4gIHF1ZXJ5YWJsZTogUGdRdWVyeWFibGUsXG4gIGNoYW5uZWw6IHN0cmluZyxcbiAgdG9waWM6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgaW5wdXQ6IHsgYWZ0ZXI/OiBzdHJpbmc7IGxpbWl0PzogbnVtYmVyOyBzY29wZT86IFRvcGljUGVyc2lzdGVuY2VTY29wZSB9ID0ge30sXG4pOiBQcm9taXNlPFRvcGljSGlzdG9yeVBhZ2U8VEJvZHk+PiB7XG4gIGNvbnN0IHNjb3BlID0gaW5wdXQuc2NvcGUgPz8gb3B0aW9ucy5zY29wZTtcbiAgY29uc3QgbGltaXQgPSBpbnB1dC5saW1pdCA/PyAxMDA7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5YWJsZS5xdWVyeTxIaXN0b3J5Um93PihcbiAgICBgU0VMRUNUIHNlcXVlbmNlLCBleHBpcmVzX2F0LCBlbnZlbG9wZSBGUk9NICR7dGFibGUob3B0aW9ucywgc2NvcGUpfSBXSEVSRSBjaGFubmVsID0gJDEgQU5EIHRvcGljID0gJDIgQU5EIHNlcXVlbmNlID4gJDM6OmJpZ2ludCBBTkQgKGV4cGlyZXNfYXQgSVMgTlVMTCBPUiBleHBpcmVzX2F0ID4gY2xvY2tfdGltZXN0YW1wKCkpIE9SREVSIEJZIHNlcXVlbmNlIExJTUlUICQ0YCxcbiAgICBbY2hhbm5lbCwgdG9waWMsIGFmdGVyKGlucHV0LmFmdGVyLCBzY29wZSksIGxpbWl0XSxcbiAgKTtcbiAgY29uc3QgbWVzc2FnZXMgPSByZXN1bHQucm93cy5tYXAoKHJvdykgPT4gKHtcbiAgICBjdXJzb3I6IGN1cnNvcihzY29wZSwgcm93LnNlcXVlbmNlKSxcbiAgICBleHBpcmVzQXQ6IHJvdy5leHBpcmVzX2F0ID09PSBudWxsID8gbnVsbCA6IG5ldyBEYXRlKHJvdy5leHBpcmVzX2F0KS50b0lTT1N0cmluZygpLFxuICAgIHNjb3BlLFxuICAgIG1lc3NhZ2U6IHJvdy5lbnZlbG9wZSBhcyBUb3BpY01lc3NhZ2U8VEJvZHk+LFxuICB9KSk7XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgLi4uKG1lc3NhZ2VzLmxlbmd0aCA9PT0gbGltaXQgPyB7IG5leHRDdXJzb3I6IG1lc3NhZ2VzLmF0KC0xKSEuY3Vyc29yIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBQZXJzaXN0IGEgdG9waWMgbWVzc2FnZSBhbmQgbm90aWZ5IGxpc3RlbmVycyBpbiBvbmUgdHJhbnNhY3Rpb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyc2lzdGVkTm90aWZ5KFxuICBjbGllbnQ6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHRvcGljOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZSxcbiAgZW5jb2RlZDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICB0dGw6IER1cmF0aW9uSW5wdXQgfCBmYWxzZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjbGVhbnVwRXhwaXJlZChjbGllbnQsIG9wdGlvbnMsIHNjb3BlKTtcbiAgY29uc3QgbWlsbGlzZWNvbmRzID0gdHRsTWlsbGlzZWNvbmRzKHR0bCk7XG4gIGNvbnN0IGluc2VydGVkID0gYXdhaXQgY2xpZW50LnF1ZXJ5PFF1ZXJ5UmVzdWx0Um93ICYgeyBzZXF1ZW5jZTogc3RyaW5nIH0+KFxuICAgIGBJTlNFUlQgSU5UTyAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gKGNoYW5uZWwsIHRvcGljLCBtZXNzYWdlX2lkLCBwdWJsaXNoZWRfYXQsIGV4cGlyZXNfYXQsIGVudmVsb3BlKSBWQUxVRVMgKCQxLCAkMiwgJDMsICQ0LCBDQVNFIFdIRU4gJDU6OmJpZ2ludCBJUyBOVUxMIFRIRU4gTlVMTCBFTFNFIGNsb2NrX3RpbWVzdGFtcCgpICsgKCQ1OjpiaWdpbnQgKiBpbnRlcnZhbCAnMSBtaWxsaXNlY29uZCcpIEVORCwgJDY6Ompzb25iKSBSRVRVUk5JTkcgc2VxdWVuY2VgLFxuICAgIFtjaGFubmVsLCB0b3BpYywgbWVzc2FnZS5pZCwgbWVzc2FnZS5wdWJsaXNoZWRBdCwgbWlsbGlzZWNvbmRzLCBlbmNvZGVkXSxcbiAgKTtcbiAgLy8gVGhlIHJvdyBhbmQgdGhlIG5vdGlmaWNhdGlvbiBjb21taXQgdG9nZXRoZXIsIHNvIGEgcG9pbnRlciBpcyBuZXZlciBkZWxpdmVyZWRcbiAgLy8gYmVmb3JlIHRoZSByb3cgaXQgbmFtZXMgaXMgcmVhZGFibGUgLSBgTk9USUZZYCBpcyBkZWxpdmVyZWQgYXQgQ09NTUlULCBub3QgYXRcbiAgLy8gc3RhdGVtZW50IHRpbWUuXG4gIGNvbnN0IHBheWxvYWQgPVxuICAgIG9wdGlvbnMucGF5bG9hZCA9PT0gXCJwb2ludGVyXCJcbiAgICAgID8gcG9pbnRlclBheWxvYWQoc2NvcGUsIHRvcGljLCBtZXNzYWdlLmlkLCBpbnNlcnRlZC5yb3dzWzBdPy5zZXF1ZW5jZSA/PyBcIjBcIilcbiAgICAgIDogZW5jb2RlZDtcbiAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VMRUNUIHBnX25vdGlmeSgkMSwgJDIpXCIsIFtjaGFubmVsLCBwYXlsb2FkXSk7XG59XG5cbi8qKlxuICogVGhlIGBwYXlsb2FkOiBcInBvaW50ZXJcImAgbm90aWZpY2F0aW9uIGJvZHk6IHJvdXRpbmcgYW5kIGlkZW50aXR5IG9ubHksIHNvIHRoZVxuICogc2l6ZSBsaW1pdCBkb2VzIG5vdCBhcHBseSBhbmQgYSBsaXN0ZW5lciB3aXRob3V0IHRoZSB0YWJsZSBncmFudCBsZWFybnMgdGhhdFxuICogc29tZXRoaW5nIGhhcHBlbmVkIHdpdGhvdXQgbGVhcm5pbmcgd2hhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJQYXlsb2FkKFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICB0b3BpYzogc3RyaW5nLFxuICBpZDogc3RyaW5nLFxuICBzZXF1ZW5jZTogc3RyaW5nIHwgbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdjogUE9JTlRFUl9WRVJTSU9OLCBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZTogU3RyaW5nKHNlcXVlbmNlKSB9KTtcbn1cblxuLyoqIEEgZGVjb2RlZCBwb2ludGVyIG5vdGlmaWNhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNQb2ludGVyIHtcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZTtcbiAgdG9waWM6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgc2VxdWVuY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWFkIGEgbm90aWZpY2F0aW9uIGFzIGEgcG9pbnRlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBub3Qgb25lLiBUaGUgY2hhbm5lbFxuICogaXMgc2hhcmVkLCBzbyBhbiB1bnJlY29nbml6ZWQgcGF5bG9hZCBpcyBvcmRpbmFyeSB0cmFmZmljIHJhdGhlciB0aGFuIGFuIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUG9pbnRlcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVG9waWNQb2ludGVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHJlY29yZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZWNvcmQgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIXJlY29yZCB8fCB0eXBlb2YgcmVjb3JkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmVjb3JkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY2FuZGlkYXRlID0gcmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAoY2FuZGlkYXRlLnYgIT09IFBPSU5URVJfVkVSU0lPTikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgeyBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZSB9ID0gY2FuZGlkYXRlO1xuICBpZiAoc2NvcGUgIT09IFwib3BlblwiICYmIHNjb3BlICE9PSBcInJlc3RyaWN0ZWRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB0b3BpYyAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHNlcXVlbmNlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZSB9O1xufVxuXG4vKipcbiAqIEZldGNoIHRoZSBvbmUgc3RvcmVkIGVudmVsb3BlIGEgcG9pbnRlciBuYW1lcy4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSByb3dcbiAqIGlzIGdvbmUgKFRUTCBjbGVhbnVwIHdvbiB0aGUgcmFjZSkgb3IgdGhlIHJlYWRlciBsYWNrcyB0aGUgdGFibGUncyBncmFudCwgYm90aFxuICogb2Ygd2hpY2ggYXJlIGV4cGVjdGVkIG9uIHRoZSBgcmVzdHJpY3RlZGAgdGllciByYXRoZXIgdGhhbiBlcnJvcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUG9pbnRlcjxUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZT4oXG4gIHF1ZXJ5YWJsZTogUGdRdWVyeWFibGUsXG4gIGNoYW5uZWw6IHN0cmluZyxcbiAgcG9pbnRlcjogVG9waWNQb2ludGVyLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogUHJvbWlzZTxUb3BpY01lc3NhZ2U8VEJvZHk+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5YWJsZS5xdWVyeTxRdWVyeVJlc3VsdFJvdyAmIHsgZW52ZWxvcGU6IFRvcGljTWVzc2FnZSB9PihcbiAgICBgU0VMRUNUIGVudmVsb3BlIEZST00gJHt0YWJsZShvcHRpb25zLCBwb2ludGVyLnNjb3BlKX0gV0hFUkUgY2hhbm5lbCA9ICQxIEFORCBtZXNzYWdlX2lkID0gJDIgQU5EIChleHBpcmVzX2F0IElTIE5VTEwgT1IgZXhwaXJlc19hdCA+IGNsb2NrX3RpbWVzdGFtcCgpKWAsXG4gICAgW2NoYW5uZWwsIHBvaW50ZXIuaWRdLFxuICApO1xuICByZXR1cm4gcmVzdWx0LnJvd3NbMF0/LmVudmVsb3BlIGFzIFRvcGljTWVzc2FnZTxUQm9keT4gfCB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBNEN2RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFDL0I7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQTJDLEVBQUUsS0FBNEIsRUFBVSxFQUFFLENBQ2xHLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBSWpHLG9GQUFvRjtBQUNwRixLQUFLLFVBQVUsZ0NBQWdDLENBQzdDLFNBQXNCLEVBQ3RCLE9BQTJDO0lBRTNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FDbEMsaVRBQWlULEVBQ2pULENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNoRCxDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsS0FBSyxLQUFLLENBQUM7QUFDOUMsQ0FBQztBQUVELDRGQUE0RjtBQUM1RixNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLEtBQXdDO0lBRXhDLE1BQU0sVUFBVSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMs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O0lBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRixNQUFNLFNBQVMsR0FBRyxNQUFpQyxDQUFDO0lBQ3BELElBQUksU0FBUyxDQUFDLENBQUMsS0FBSyxlQUFlO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdEQsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUNqRCxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLLFlBQVk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixTQUFzQixFQUN0QixPQUFlLEVBQ2YsT0FBcUIsRUFDckIsT0FBMkM7SUFFM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUNsQyx3QkFBd0IsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLG9HQUFvRyxFQUN6SixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQ3RCLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBMkMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEdXJhYmxlIHJlcGxheSBhbmQgcG9pbnRlciBwYXlsb2FkcyBmb3Ige0BsaW5rIFBvc3RncmVzVG9waWNCdXN9LlxuICpcbiAqIFRoaXMgbW9kdWxlIG93bnMgc2NoZW1hIHByb3Zpc2lvbmluZywgZ3JhbnRzLCBUVEwgY2xlYW51cCwgcmVwbGF5IGN1cnNvcnMsXG4gKiBhbmQgb3Blbi9yZXN0cmljdGVkIHBlcnNpc3RlbmNlIHNjb3Blcy4gUmV1c2UgaXQgd2hlbiBhIHRvcGljLWJ1cyBjb25zdW1lclxuICogbmVlZHMgaGlzdG9yeSBvciBsYXJnZXIgcGF5bG9hZHMgaW5zdGVhZCBvZiBjcmVhdGluZyBhIHBhcmFsbGVsIG1lc3NhZ2UgdGFibGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5UmVzdWx0Um93IH0gZnJvbSBcInBnXCI7XG5pbXBvcnQgdHlwZSB7IFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay50c1wiO1xuaW1wb3J0IHsgd2l0aEFkdmlzb3J5VHJhbnNhY3Rpb25Mb2NrIH0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay50c1wiO1xuaW1wb3J0IHsgcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIgfSBmcm9tIFwiLi9zZXNzaW9uLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFRvcGljTWVzc2FnZSB9IGZyb20gXCIuL3RvcGljLWJ1cy50c1wiO1xuXG4vKiogU3RvcmFnZSBhbmQgZ3JhbnQgdGllciBmb3IgcGVyc2lzdGVkIHRvcGljIG1lc3NhZ2VzLiAqL1xuZXhwb3J0IHR5cGUgVG9waWNQZXJzaXN0ZW5jZVNjb3BlID0gXCJvcGVuXCIgfCBcInJlc3RyaWN0ZWRcIjtcbi8qKiBQb3N0Z3JlU1FMIGludGVydmFsIHRleHQgb3IgbWlsbGlzZWNvbmQgZHVyYXRpb24gYWNjZXB0ZWQgZm9yIG1lc3NhZ2UgZXhwaXJ5LiAqL1xuZXhwb3J0IHR5cGUgRHVyYXRpb25JbnB1dCA9IHN0cmluZyB8IG51bWJlcjtcbi8qKiBPcHRpb25hbCBzY2hlbWEsIHRhYmxlLCBleHBpcnksIHBheWxvYWQsIGFuZCBwcm92aXNpb25pbmcgc2V0dGluZ3MgZm9yIHRvcGljIHBlcnNpc3RlbmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIHNjaGVtYT86IHN0cmluZztcbiAgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRhYmxlcz86IFBhcnRpYWw8UmVjb3JkPFRvcGljUGVyc2lzdGVuY2VTY29wZSwgc3RyaW5nPj47XG4gIHR0bD86IER1cmF0aW9uSW5wdXQgfCBmYWxzZTtcbiAgcGF5bG9hZD86IFwiZW52ZWxvcGVcIiB8IFwicG9pbnRlclwiO1xuICBjbGVhbnVwQmF0Y2hTaXplPzogbnVtYmVyO1xuICBwcm92aXNpb24/OiBib29sZWFuO1xufVxuLyoqIENvbXBsZXRlIHBlcnNpc3RlbmNlIHNldHRpbmdzIGFmdGVyIGRlZmF1bHRzIGFyZSBhcHBsaWVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIHtcbiAgc2NoZW1hOiBzdHJpbmc7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRhYmxlczogUmVjb3JkPFRvcGljUGVyc2lzdGVuY2VTY29wZSwgc3RyaW5nPjtcbiAgdHRsOiBEdXJhdGlvbklucHV0IHwgZmFsc2U7XG4gIHBheWxvYWQ6IFwiZW52ZWxvcGVcIiB8IFwicG9pbnRlclwiO1xuICBjbGVhbnVwQmF0Y2hTaXplOiBudW1iZXI7XG4gIHByb3Zpc2lvbjogYm9vbGVhbjtcbn1cbi8qKiBQZXJzaXN0ZWQgdG9waWMgbWVzc2FnZSBwbHVzIHJlcGxheSBjdXJzb3IsIHNjb3BlLCBhbmQgZXhwaXJ5IG1ldGFkYXRhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yZWRUb3BpY01lc3NhZ2U8XG4gIFRCb2R5IGV4dGVuZHMgb2JqZWN0LlNlcmlhbGl6YWJsZVZhbHVlID0gb2JqZWN0LlNlcmlhbGl6YWJsZVZhbHVlLFxuPiB7XG4gIGN1cnNvcjogc3RyaW5nO1xuICBleHBpcmVzQXQ6IHN0cmluZyB8IG51bGw7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT47XG59XG4vKiogT3JkZXJlZCByZXBsYXkgcGFnZSBhbmQgb3B0aW9uYWwgY3Vyc29yIGZvciB0aGUgbmV4dCBwYWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY0hpc3RvcnlQYWdlPFxuICBUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSxcbj4ge1xuICBtZXNzYWdlczogU3RvcmVkVG9waWNNZXNzYWdlPFRCb2R5PltdO1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX1RUTCA9IFwiMjQgaG91cnNcIjtcbi8qKlxuICogUG9pbnRlci1wYXlsb2FkIHZlcnNpb24uIEEgbGlzdGVuZXIgdGhhdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIHZlcnNpb24gdHJlYXRzXG4gKiB0aGUgbm90aWZpY2F0aW9uIGFzIGZvcmVpZ24gdHJhZmZpYyByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBpdHMgc2hhcGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQT0lOVEVSX1ZFUlNJT04gPSAxO1xuY29uc3QgdGFibGUgPSAob3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucywgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSk6IHN0cmluZyA9PlxuICBgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy50YWJsZXNbc2NvcGVdKX1gO1xuXG50eXBlIFRhYmxlT3duZXJzaGlwUm93ID0gUXVlcnlSZXN1bHRSb3cgJiB7IGNhbl9tYW5hZ2U6IGJvb2xlYW4gfTtcblxuLyoqIFdoZXRoZXIgdGhlIHNlbGVjdGVkIHBlcnNpc3RlbmNlIHRhYmxlIGV4aXN0cyBidXQgaXMgbWFuYWdlZCBieSBhbm90aGVyIHJvbGUuICovXG5hc3luYyBmdW5jdGlvbiBzZWxlY3RlZFRhYmxlSXNFeHRlcm5hbGx5TWFuYWdlZChcbiAgcXVlcnlhYmxlOiBQZ1F1ZXJ5YWJsZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnk8VGFibGVPd25lcnNoaXBSb3c+KFxuICAgIGBTRUxFQ1QgcGdfaGFzX3JvbGUoY3VycmVudF91c2VyLCBwZ19nZXRfdXNlcmJ5aWQodGFibGVfY2xhc3MucmVsb3duZXIpLCAnVVNBR0UnKSBBUyBjYW5fbWFuYWdlIEZST00gcGdfY2xhc3MgQVMgdGFibGVfY2xhc3MgSk9JTiBwZ19uYW1lc3BhY2UgQVMgdGFibGVfc2NoZW1hIE9OIHRhYmxlX3NjaGVtYS5vaWQgPSB0YWJsZV9jbGFzcy5yZWxuYW1lc3BhY2UgV0hFUkUgdGFibGVfc2NoZW1hLm5zcG5hbWUgPSAkMSBBTkQgdGFibGVfY2xhc3MucmVsbmFtZSA9ICQyIEFORCB0YWJsZV9jbGFzcy5yZWxraW5kIElOICgncicsICdwJylgLFxuICAgIFtvcHRpb25zLnNjaGVtYSwgb3B0aW9ucy50YWJsZXNbb3B0aW9ucy5zY29wZV1dLFxuICApO1xuICByZXR1cm4gcmVzdWx0LnJvd3NbMF0/LmNhbl9tYW5hZ2UgPT09IGZhbHNlO1xufVxuXG4vKiogVmFsaWRhdGUgcGVyc2lzdGVuY2Ugc2NvcGUgYW5kIGFwcGx5IHN0YWJsZSBzY2hlbWEsIHRhYmxlLCBUVEwsIGFuZCBjbGVhbnVwIGRlZmF1bHRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU9wdGlvbnMoXG4gIHZhbHVlOiB0cnVlIHwgVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4pOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IHZhbHVlID09PSB0cnVlID8ge30gOiB2YWx1ZTtcbiAgY29uc3Qgc2NvcGUgPSBjb25maWd1cmVkLnNjb3BlID8/IFwib3BlblwiO1xuICBpZiAoc2NvcGUgIT09IFwib3BlblwiICYmIHNjb3BlICE9PSBcInJlc3RyaWN0ZWRcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gcGVyc2lzdGVuY2Ugc2NvcGU6ICR7U3RyaW5nKHNjb3BlKX1gKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtYTogY29uZmlndXJlZC5zY2hlbWEgPz8gXCJkYnhfbWVzc2FnZV9idXNcIixcbiAgICBzY29wZSxcbiAgICB0YWJsZXM6IHtcbiAgICAgIG9wZW46IGNvbmZpZ3VyZWQudGFibGVzPy5vcGVuID8/IFwib3Blbl9tZXNzYWdlc1wiLFxuICAgICAgcmVzdHJpY3RlZDogY29uZmlndXJlZC50YWJsZXM/LnJlc3RyaWN0ZWQgPz8gXCJyZXN0cmljdGVkX21lc3NhZ2VzXCIsXG4gICAgfSxcbiAgICB0dGw6IGNvbmZpZ3VyZWQudHRsID8/IERFRkFVTFRfVFRMLFxuICAgIHBheWxvYWQ6IGNvbmZpZ3VyZWQucGF5bG9hZCA/PyBcImVudmVsb3BlXCIsXG4gICAgY2xlYW51cEJhdGNoU2l6ZTogY29uZmlndXJlZC5jbGVhbnVwQmF0Y2hTaXplID8/IDEwMDAsXG4gICAgcHJvdmlzaW9uOiBjb25maWd1cmVkLnByb3Zpc2lvbiA/PyB0cnVlLFxuICB9O1xufVxuXG4vKiogQ3JlYXRlIHRoZSBwZXJzaXN0ZW5jZSBzY2hlbWEsIG9wZW4gYW5kIHJlc3RyaWN0ZWQgdGFibGVzLCBhbmQgcmVwbGF5IGluZGV4ZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uTWVzc2FnZUJ1c1NjaGVtYShcbiAgcG9vbDogUGdQb29sTGlrZSAmIFBnUXVlcnlhYmxlLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChhd2FpdCBzZWxlY3RlZFRhYmxlSXNFeHRlcm5hbGx5TWFuYWdlZChwb29sLCBvcHRpb25zKSkgcmV0dXJuO1xuICBhd2FpdCB3aXRoQWR2aXNvcnlUcmFuc2FjdGlvbkxvY2socG9vbCwgW1wiZGJ4X21lc3NhZ2VfYnVzXCIsIFwic2NoZW1hXCJdLCBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgaWYgKGF3YWl0IHNlbGVjdGVkVGFibGVJc0V4dGVybmFsbHlNYW5hZ2VkKGNsaWVudCwgb3B0aW9ucykpIHJldHVybjtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX1gKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoXCJzY2hlbWFfdmVyc2lvblwiKX0gKHZlcnNpb24gSU5URUdFUiBQUklNQVJZIEtFWSlgLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBbXCJvcGVuXCIsIFwicmVzdHJpY3RlZFwiXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRhYmxlKG9wdGlvbnMsIHNjb3BlKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7bmFtZX0gKHNlcXVlbmNlIEJJR0lOVCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIFBSSU1BUlkgS0VZLCBjaGFubmVsIFRFWFQgTk9UIE5VTEwsIHRvcGljIFRFWFQgTk9UIE5VTEwsIG1lc3NhZ2VfaWQgVEVYVCBOT1QgTlVMTCwgcHVibGlzaGVkX2F0IFRJTUVTVEFNUFRaIE5PVCBOVUxMLCBleHBpcmVzX2F0IFRJTUVTVEFNUFRaLCB4YWN0X2lkIFhJRDggTk9UIE5VTEwgREVGQVVMVCBwZ19jdXJyZW50X3hhY3RfaWQoKSwgZW52ZWxvcGUgSlNPTkIgTk9UIE5VTEwsIFVOSVFVRSAoY2hhbm5lbCwgbWVzc2FnZV9pZCksIENIRUNLIChqc29uYl90eXBlb2YoZW52ZWxvcGUpID0gJ29iamVjdCcpKWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihgJHtvcHRpb25zLnRhYmxlc1tzY29wZV19X3JlcGxheV9pZHhgKX0gT04gJHtuYW1lfSAoY2hhbm5lbCwgdG9waWMsIHNlcXVlbmNlKWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihgJHtvcHRpb25zLnRhYmxlc1tzY29wZV19X2V4cGlyeV9pZHhgKX0gT04gJHtuYW1lfSAoZXhwaXJlc19hdCkgV0hFUkUgZXhwaXJlc19hdCBJUyBOT1QgTlVMTGAsXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICBgSU5TRVJUIElOVE8gJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoXCJzY2hlbWFfdmVyc2lvblwiKX0gKHZlcnNpb24pIFZBTFVFUyAoMSkgT04gQ09ORkxJQ1QgKHZlcnNpb24pIERPIE5PVEhJTkdgLFxuICAgICk7XG4gIH0pO1xufVxuXG4vKiogQnVpbGQgU1FMIGdyYW50cyBmb3Igcm9sZXMgdGhhdCBtYXkgcmVhZCBhbmQgd3JpdGUgb25lIHBlcnNpc3RlbmNlIHNjb3BlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lc3NhZ2VCdXNHcmFudFN0YXRlbWVudHMoXG4gIHJvbGVzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSB0YWJsZShvcHRpb25zLCBzY29wZSk7XG4gIHJldHVybiAodHlwZW9mIHJvbGVzID09PSBcInN0cmluZ1wiID8gW3JvbGVzXSA6IHJvbGVzKS5mbGF0TWFwKChyb2xlKSA9PiBbXG4gICAgYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX0gVE8gJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihyb2xlKX07YCxcbiAgICBgR1JBTlQgU0VMRUNULCBJTlNFUlQsIERFTEVURSBPTiBUQUJMRSAke3NlbGVjdGVkfSBUTyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHJvbGUpfTtgLFxuICAgIGBHUkFOVCBTRUxFQ1QgT04gVEFCTEUgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoXCJzY2hlbWFfdmVyc2lvblwiKX0gVE8gJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihyb2xlKX07YCxcbiAgXSk7XG59XG5cbmZ1bmN0aW9uIGN1cnNvcihzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLCBzZXF1ZW5jZTogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KFtzY29wZSwgU3RyaW5nKHNlcXVlbmNlKV0pKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbn1cbmZ1bmN0aW9uIGFmdGVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCIwXCI7XG4gIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKHZhbHVlLCBcImJhc2U2NHVybFwiKS50b1N0cmluZygpKSBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoZGVjb2RlZFswXSAhPT0gc2NvcGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSGlzdG9yeSBjdXJzb3IgYmVsb25ncyB0byBhbm90aGVyIHBlcnNpc3RlbmNlIHNjb3BlXCIpO1xuICB9XG4gIHJldHVybiBkZWNvZGVkWzFdO1xufVxuXG4vKiogQ29udmVydCBhIHBlcnNpc3RlbmNlIFRUTCB0byBtaWxsaXNlY29uZHMsIHByZXNlcnZpbmcgZGlzYWJsZWQgcmV0ZW50aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR0bE1pbGxpc2Vjb25kcyh2YWx1ZTogRHVyYXRpb25JbnB1dCB8IGZhbHNlKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICBjb25zdCBtaWxsaXNlY29uZHMgPSBvYmplY3QudG9EdXJhdGlvbih2YWx1ZSk7XG4gIGlmIChtaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZCB8fCBtaWxsaXNlY29uZHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgcGVyc2lzdGVuY2UgVFRMOiAke1N0cmluZyh2YWx1ZSl9YCk7XG4gIH1cbiAgcmV0dXJuIG1pbGxpc2Vjb25kcztcbn1cblxuLyoqIERlbGV0ZSBvbmUgYm91bmRlZCBiYXRjaCBvZiBleHBpcmVkIHBlcnNpc3RlZCB0b3BpYyBtZXNzYWdlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwRXhwaXJlZChcbiAgcXVlcnlhYmxlOiBQZ1F1ZXJ5YWJsZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgbGltaXQgPSBvcHRpb25zLmNsZWFudXBCYXRjaFNpemUsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnkoXG4gICAgYFdJVEggZXhwaXJlZCBBUyAoU0VMRUNUIGN0aWQgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gV0hFUkUgZXhwaXJlc19hdCBJUyBOT1QgTlVMTCBBTkQgZXhwaXJlc19hdCA8PSBjbG9ja190aW1lc3RhbXAoKSBPUkRFUiBCWSBleHBpcmVzX2F0IExJTUlUICQxKSBERUxFVEUgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gQVMgbWVzc2FnZXMgVVNJTkcgZXhwaXJlZCBXSEVSRSBtZXNzYWdlcy5jdGlkID0gZXhwaXJlZC5jdGlkYCxcbiAgICBbbGltaXRdLFxuICApO1xuICByZXR1cm4gcmVzdWx0LnJvd0NvdW50ID8/IDA7XG59XG5cbnR5cGUgSGlzdG9yeVJvdyA9IFF1ZXJ5UmVzdWx0Um93ICYge1xuICBzZXF1ZW5jZTogc3RyaW5nO1xuICBleHBpcmVzX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgZW52ZWxvcGU6IFRvcGljTWVzc2FnZTtcbn07XG5cbi8qKiBSZWFkIGEgY3Vyc29yLXBhZ2luYXRlZCBwYWdlIG9mIHBlcnNpc3RlZCB0b3BpYyBoaXN0b3J5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhpc3Rvcnk8VEJvZHkgZXh0ZW5kcyBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWU+KFxuICBxdWVyeWFibGU6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHRvcGljOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIGlucHV0OiB7IGFmdGVyPzogc3RyaW5nOyBsaW1pdD86IG51bWJlcjsgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUgfSA9IHt9LFxuKTogUHJvbWlzZTxUb3BpY0hpc3RvcnlQYWdlPFRCb2R5Pj4ge1xuICBjb25zdCBzY29wZSA9IGlucHV0LnNjb3BlID8/IG9wdGlvbnMuc2NvcGU7XG4gIGNvbnN0IGxpbWl0ID0gaW5wdXQubGltaXQgPz8gMTAwO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnk8SGlzdG9yeVJvdz4oXG4gICAgYFNFTEVDVCBzZXF1ZW5jZSwgZXhwaXJlc19hdCwgZW52ZWxvcGUgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gV0hFUkUgY2hhbm5lbCA9ICQxIEFORCB0b3BpYyA9ICQyIEFORCBzZXF1ZW5jZSA+ICQzOjpiaWdpbnQgQU5EIChleHBpcmVzX2F0IElTIE5VTEwgT1IgZXhwaXJlc19hdCA+IGNsb2NrX3RpbWVzdGFtcCgpKSBPUkRFUiBCWSBzZXF1ZW5jZSBMSU1JVCAkNGAsXG4gICAgW2NoYW5uZWwsIHRvcGljLCBhZnRlcihpbnB1dC5hZnRlciwgc2NvcGUpLCBsaW1pdF0sXG4gICk7XG4gIGNvbnN0IG1lc3NhZ2VzID0gcmVzdWx0LnJvd3MubWFwKChyb3cpID0+ICh7XG4gICAgY3Vyc29yOiBjdXJzb3Ioc2NvcGUsIHJvdy5zZXF1ZW5jZSksXG4gICAgZXhwaXJlc0F0OiByb3cuZXhwaXJlc19hdCA9PT0gbnVsbCA/IG51bGwgOiBuZXcgRGF0ZShyb3cuZXhwaXJlc19hdCkudG9JU09TdHJpbmcoKSxcbiAgICBzY29wZSxcbiAgICBtZXNzYWdlOiByb3cuZW52ZWxvcGUgYXMgVG9waWNNZXNzYWdlPFRCb2R5PixcbiAgfSkpO1xuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIC4uLihtZXNzYWdlcy5sZW5ndGggPT09IGxpbWl0ID8geyBuZXh0Q3Vyc29yOiBtZXNzYWdlcy5hdCgtMSkhLmN1cnNvciB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUGVyc2lzdCBhIHRvcGljIG1lc3NhZ2UgYW5kIG5vdGlmeSBsaXN0ZW5lcnMgaW4gb25lIHRyYW5zYWN0aW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RlZE5vdGlmeShcbiAgY2xpZW50OiBQZ1F1ZXJ5YWJsZSxcbiAgY2hhbm5lbDogc3RyaW5nLFxuICB0b3BpYzogc3RyaW5nLFxuICBtZXNzYWdlOiBUb3BpY01lc3NhZ2UsXG4gIGVuY29kZWQ6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgdHRsOiBEdXJhdGlvbklucHV0IHwgZmFsc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xlYW51cEV4cGlyZWQoY2xpZW50LCBvcHRpb25zLCBzY29wZSk7XG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IHR0bE1pbGxpc2Vjb25kcyh0dGwpO1xuICBjb25zdCBpbnNlcnRlZCA9IGF3YWl0IGNsaWVudC5xdWVyeTxRdWVyeVJlc3VsdFJvdyAmIHsgc2VxdWVuY2U6IHN0cmluZyB9PihcbiAgICBgSU5TRVJUIElOVE8gJHt0YWJsZShvcHRpb25zLCBzY29wZSl9IChjaGFubmVsLCB0b3BpYywgbWVzc2FnZV9pZCwgcHVibGlzaGVkX2F0LCBleHBpcmVzX2F0LCBlbnZlbG9wZSkgVkFMVUVTICgkMSwgJDIsICQzLCAkNCwgQ0FTRSBXSEVOICQ1OjpiaWdpbnQgSVMgTlVMTCBUSEVOIE5VTEwgRUxTRSBjbG9ja190aW1lc3RhbXAoKSArICgkNTo6YmlnaW50ICogaW50ZXJ2YWwgJzEgbWlsbGlzZWNvbmQnKSBFTkQsICQ2Ojpqc29uYikgUkVUVVJOSU5HIHNlcXVlbmNlYCxcbiAgICBbY2hhbm5lbCwgdG9waWMsIG1lc3NhZ2UuaWQsIG1lc3NhZ2UucHVibGlzaGVkQXQsIG1pbGxpc2Vjb25kcywgZW5jb2RlZF0sXG4gICk7XG4gIC8vIFRoZSByb3cgYW5kIHRoZSBub3RpZmljYXRpb24gY29tbWl0IHRvZ2V0aGVyLCBzbyBhIHBvaW50ZXIgaXMgbmV2ZXIgZGVsaXZlcmVkXG4gIC8vIGJlZm9yZSB0aGUgcm93IGl0IG5hbWVzIGlzIHJlYWRhYmxlIC0gYE5PVElGWWAgaXMgZGVsaXZlcmVkIGF0IENPTU1JVCwgbm90IGF0XG4gIC8vIHN0YXRlbWVudCB0aW1lLlxuICBjb25zdCBwYXlsb2FkID1cbiAgICBvcHRpb25zLnBheWxvYWQgPT09IFwicG9pbnRlclwiXG4gICAgICA/IHBvaW50ZXJQYXlsb2FkKHNjb3BlLCB0b3BpYywgbWVzc2FnZS5pZCwgaW5zZXJ0ZWQucm93c1swXT8uc2VxdWVuY2UgPz8gXCIwXCIpXG4gICAgICA6IGVuY29kZWQ7XG4gIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFTEVDVCBwZ19ub3RpZnkoJDEsICQyKVwiLCBbY2hhbm5lbCwgcGF5bG9hZF0pO1xufVxuXG4vKipcbiAqIFRoZSBgcGF5bG9hZDogXCJwb2ludGVyXCJgIG5vdGlmaWNhdGlvbiBib2R5OiByb3V0aW5nIGFuZCBpZGVudGl0eSBvbmx5LCBzbyB0aGVcbiAqIHNpemUgbGltaXQgZG9lcyBub3QgYXBwbHkgYW5kIGEgbGlzdGVuZXIgd2l0aG91dCB0aGUgdGFibGUgZ3JhbnQgbGVhcm5zIHRoYXRcbiAqIHNvbWV0aGluZyBoYXBwZW5lZCB3aXRob3V0IGxlYXJuaW5nIHdoYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2ludGVyUGF5bG9hZChcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgdG9waWM6IHN0cmluZyxcbiAgaWQ6IHN0cmluZyxcbiAgc2VxdWVuY2U6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHY6IFBPSU5URVJfVkVSU0lPTiwgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2U6IFN0cmluZyhzZXF1ZW5jZSkgfSk7XG59XG5cbi8qKiBBIGRlY29kZWQgcG9pbnRlciBub3RpZmljYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUG9pbnRlciB7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRvcGljOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIHNlcXVlbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVhZCBhIG5vdGlmaWNhdGlvbiBhcyBhIHBvaW50ZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgbm90IG9uZS4gVGhlIGNoYW5uZWxcbiAqIGlzIHNoYXJlZCwgc28gYW4gdW5yZWNvZ25pemVkIHBheWxvYWQgaXMgb3JkaW5hcnkgdHJhZmZpYyByYXRoZXIgdGhhbiBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBvaW50ZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRvcGljUG9pbnRlciB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCByZWNvcmQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVjb3JkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCFyZWNvcmQgfHwgdHlwZW9mIHJlY29yZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlY29yZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGNhbmRpZGF0ZS52ICE9PSBQT0lOVEVSX1ZFUlNJT04pIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2UgfSA9IGNhbmRpZGF0ZTtcbiAgaWYgKHNjb3BlICE9PSBcIm9wZW5cIiAmJiBzY29wZSAhPT0gXCJyZXN0cmljdGVkXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdG9waWMgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGlkICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBzZXF1ZW5jZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2UgfTtcbn1cblxuLyoqXG4gKiBGZXRjaCB0aGUgb25lIHN0b3JlZCBlbnZlbG9wZSBhIHBvaW50ZXIgbmFtZXMuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcm93XG4gKiBpcyBnb25lIChUVEwgY2xlYW51cCB3b24gdGhlIHJhY2UpIG9yIHRoZSByZWFkZXIgbGFja3MgdGhlIHRhYmxlJ3MgZ3JhbnQsIGJvdGhcbiAqIG9mIHdoaWNoIGFyZSBleHBlY3RlZCBvbiB0aGUgYHJlc3RyaWN0ZWRgIHRpZXIgcmF0aGVyIHRoYW4gZXJyb3JzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBvaW50ZXI8VEJvZHkgZXh0ZW5kcyBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWU+KFxuICBxdWVyeWFibGU6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHBvaW50ZXI6IFRvcGljUG9pbnRlcixcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IFByb21pc2U8VG9waWNNZXNzYWdlPFRCb2R5PiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnk8UXVlcnlSZXN1bHRSb3cgJiB7IGVudmVsb3BlOiBUb3BpY01lc3NhZ2UgfT4oXG4gICAgYFNFTEVDVCBlbnZlbG9wZSBGUk9NICR7dGFibGUob3B0aW9ucywgcG9pbnRlci5zY29wZSl9IFdIRVJFIGNoYW5uZWwgPSAkMSBBTkQgbWVzc2FnZV9pZCA9ICQyIEFORCAoZXhwaXJlc19hdCBJUyBOVUxMIE9SIGV4cGlyZXNfYXQgPiBjbG9ja190aW1lc3RhbXAoKSlgLFxuICAgIFtjaGFubmVsLCBwb2ludGVyLmlkXSxcbiAgKTtcbiAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdPy5lbnZlbG9wZSBhcyBUb3BpY01lc3NhZ2U8VEJvZHk+IHwgdW5kZWZpbmVkO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"@databricks/appkit": "0.81.0"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@dbx-tools/lakebase": "^0.9.
|
|
32
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
31
|
+
"@dbx-tools/lakebase": "^0.9.71",
|
|
32
|
+
"@dbx-tools/shared-core": "^0.9.71",
|
|
33
33
|
"pg": "^8.22.0"
|
|
34
34
|
},
|
|
35
35
|
"main": "./lib/index.js",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"./package.json": "./package.json"
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
|
-
"version": "0.9.
|
|
73
|
+
"version": "0.9.71",
|
|
74
74
|
"types": "./lib/index.d.ts",
|
|
75
75
|
"dbxToolsConfig": {
|
|
76
76
|
"tags": [
|
package/src/persistence.ts
CHANGED
|
@@ -65,6 +65,20 @@ export const POINTER_VERSION = 1;
|
|
|
65
65
|
const table = (options: ResolvedTopicBusPersistenceOptions, scope: TopicPersistenceScope): string =>
|
|
66
66
|
`${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier(options.tables[scope])}`;
|
|
67
67
|
|
|
68
|
+
type TableOwnershipRow = QueryResultRow & { can_manage: boolean };
|
|
69
|
+
|
|
70
|
+
/** Whether the selected persistence table exists but is managed by another role. */
|
|
71
|
+
async function selectedTableIsExternallyManaged(
|
|
72
|
+
queryable: PgQueryable,
|
|
73
|
+
options: ResolvedTopicBusPersistenceOptions,
|
|
74
|
+
): Promise<boolean> {
|
|
75
|
+
const result = await queryable.query<TableOwnershipRow>(
|
|
76
|
+
`SELECT pg_has_role(current_user, pg_get_userbyid(table_class.relowner), 'USAGE') AS can_manage FROM pg_class AS table_class JOIN pg_namespace AS table_schema ON table_schema.oid = table_class.relnamespace WHERE table_schema.nspname = $1 AND table_class.relname = $2 AND table_class.relkind IN ('r', 'p')`,
|
|
77
|
+
[options.schema, options.tables[options.scope]],
|
|
78
|
+
);
|
|
79
|
+
return result.rows[0]?.can_manage === false;
|
|
80
|
+
}
|
|
81
|
+
|
|
68
82
|
/** Validate persistence scope and apply stable schema, table, TTL, and cleanup defaults. */
|
|
69
83
|
export function resolvePersistenceOptions(
|
|
70
84
|
value: true | TopicBusPersistenceOptions,
|
|
@@ -90,10 +104,12 @@ export function resolvePersistenceOptions(
|
|
|
90
104
|
|
|
91
105
|
/** Create the persistence schema, open and restricted tables, and replay indexes. */
|
|
92
106
|
export async function provisionMessageBusSchema(
|
|
93
|
-
pool: PgPoolLike,
|
|
107
|
+
pool: PgPoolLike & PgQueryable,
|
|
94
108
|
options: ResolvedTopicBusPersistenceOptions,
|
|
95
109
|
): Promise<void> {
|
|
110
|
+
if (await selectedTableIsExternallyManaged(pool, options)) return;
|
|
96
111
|
await withAdvisoryTransactionLock(pool, ["dbx_message_bus", "schema"], async (client) => {
|
|
112
|
+
if (await selectedTableIsExternallyManaged(client, options)) return;
|
|
97
113
|
await client.query(`CREATE SCHEMA IF NOT EXISTS ${quotePostgresIdentifier(options.schema)}`);
|
|
98
114
|
await client.query(
|
|
99
115
|
`CREATE TABLE IF NOT EXISTS ${quotePostgresIdentifier(options.schema)}.${quotePostgresIdentifier("schema_version")} (version INTEGER PRIMARY KEY)`,
|