velocious 1.0.573 → 1.0.574

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  * Controllers and views for HTTP endpoints
13
13
  * Frontend-model transport for creating, updating, querying, and subscribing to query-filtered lifecycle events over HTTP/WebSocket, with structured per-attribute validation error responses and one-budget WebSocket startup controls (see [docs/frontend-models.md](docs/frontend-models.md) and [docs/websocket-channels.md](docs/websocket-channels.md))
14
14
  * Client-side offline sync mutation logs and frontend-model optimistic queueing primitives (see [docs/offline-sync.md](docs/offline-sync.md))
15
- * Declarative client sync scopes with per-scope cursors, automatic mutation tracking, realtime delivery, and `sync`/`pull` progress reporting for "X of Y" import screens (see [docs/sync-client.md](docs/sync-client.md))
15
+ * Declarative client sync scopes with per-scope cursors, automatic mutation tracking, realtime delivery whose per-recipient authorization hook receives the complete persisted sync envelope, and `sync`/`pull` progress reporting for "X of Y" import screens (see [docs/sync-client.md](docs/sync-client.md) and [docs/offline-sync.md](docs/offline-sync.md))
16
16
  * Reactive `useLiveQuery(Model.where(...))` queries that stay current from committed local model changes across local writes, pulls, and realtime (see [docs/live-queries.md](docs/live-queries.md))
17
17
  * Server-side sync envelope replay orchestration for app-owned sync receivers (see [docs/sync-envelope-replay-service.md](docs/sync-envelope-replay-service.md))
18
18
  * AwesomeTasks-shaped offline sync proof using routed resources, domain commands, signed offline grants, and peer-forwarded mutations (see [docs/awesome-tasks-offline-sync-proof.md](docs/awesome-tasks-offline-sync-proof.md))
@@ -120,6 +120,22 @@ export default class SyncPublisher {
120
120
  columns: Record<string, string | null>;
121
121
  params: Record<string, string | null>;
122
122
  }>;
123
+ /**
124
+ * Builds the framework sync channel entry for one published change: the
125
+ * snapshotted payload plus the persisted sync row's public exact-row metadata
126
+ * (id, server sequence, updated-at, and declared scope-partition attributes).
127
+ * Uses the sync model's generated typed accessors and follows the
128
+ * change-feed serializer's public field convention.
129
+ * @param {{data: Record<string, ?>, resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig, resourceId: string, syncRow: ?, syncType: string}} args - Publish args.
130
+ * @returns {Record<string, ?>} Broadcast sync entry.
131
+ */
132
+ publishedSyncEntry({ data, resourceConfig, resourceId, syncRow, syncType }: {
133
+ data: Record<string, unknown>;
134
+ resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig;
135
+ resourceId: string;
136
+ syncRow: unknown;
137
+ syncType: string;
138
+ }): Record<string, unknown>;
123
139
  /**
124
140
  * Upserts the published server-origin sync row for a resource identity:
125
141
  * server-origin rows carry a null actor column (no device to echo the
@@ -1 +1 @@
1
- {"version":3,"file":"sync-publisher.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher.js"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;IAgDE;;;;;;OAMG;IACH,yCAJW,aAAa,YACb,IAAI,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,EAAE,eAAe,CAAC,GAC7E,aAAa,CAIzB;IAED;;;;;;;OAOG;IACH,6CAHW,aAAa,GACX,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAezC;IA/ED;;;;;;;;OAQG;IACH,sBAFW,OAAO,2BAA2B,EAAE,oBAAoB,EAsClE;IAPC,0VAA0V;IAC1V,QADW;QAAC,qBAAqB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;QAAC,aAAa,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAC,CAAC;QAAC,SAAS,EAAE,OAAC,CAAA;KAAC,CACnO;IACnH,2IAA2I;IAC3I,qBADW,KAAK,CAAC;QAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,YAAY,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;QAAC,UAAU,EAAE,OAAC,CAAA;KAAC,CAAC,CAC1G;IAC7B,4BAA4B;IAC5B,SADW,MAAM,GAAG,IAAI,CACL;IACnB,kBAAqB;IAqCvB;;;;;OAKG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,QAFa,IAAI,CAShB;IAED;;;;;;;;;;;;;OAaG;IACH,yDAHW;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAA;KAAC,GAC3H,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAkDxC;IAED;;;;;;;;OAQG;IACH,iDAHW;QAAC,MAAM,EAAE,OAAC,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAA;KAAC,GAC1F,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;KAAC,CAAC,CA2BpG;IAED;;;;;;;;OAQG;IACH,mCAJW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,cACjB,OAAC,GACC,OAAO,CAAC,OAAC,CAAC,CAYtB;IAED;;;;;OAKG;IACH,eAFa,WAAW,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAShG;IAED;;;;;;;;;;;OAWG;IACH,8BAHW,KAAK,GACH,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,UAFa,MAAM,CAMlB;CACF;0BAxVyB,qBAAqB;mBAC5B,cAAc"}
1
+ {"version":3,"file":"sync-publisher.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher.js"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;IAgDE;;;;;;OAMG;IACH,yCAJW,aAAa,YACb,IAAI,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,EAAE,eAAe,CAAC,GAC7E,aAAa,CAIzB;IAED;;;;;;;OAOG;IACH,6CAHW,aAAa,GACX,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAezC;IA/ED;;;;;;;;OAQG;IACH,sBAFW,OAAO,2BAA2B,EAAE,oBAAoB,EAsClE;IAPC,0VAA0V;IAC1V,QADW;QAAC,qBAAqB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;QAAC,aAAa,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAC,CAAC;QAAC,SAAS,EAAE,OAAC,CAAA;KAAC,CACnO;IACnH,2IAA2I;IAC3I,qBADW,KAAK,CAAC;QAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,YAAY,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;QAAC,UAAU,EAAE,OAAC,CAAA;KAAC,CAAC,CAC1G;IAC7B,4BAA4B;IAC5B,SADW,MAAM,GAAG,IAAI,CACL;IACnB,kBAAqB;IAqCvB;;;;;OAKG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,QAFa,IAAI,CAShB;IAED;;;;;;;;;;;;;OAaG;IACH,yDAHW;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAA;KAAC,GAC3H,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAkDxC;IAED;;;;;;;;OAQG;IACH,iDAHW;QAAC,MAAM,EAAE,OAAC,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAA;KAAC,GAC1F,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;KAAC,CAAC,CA2BpG;IAED;;;;;;;;OAQG;IACH,4EAHW;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAC1J,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CA2B7B;IAED;;;;;;;;OAQG;IACH,mCAJW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,cACjB,OAAC,GACC,OAAO,CAAC,OAAC,CAAC,CAYtB;IAED;;;;;OAKG;IACH,eAFa,WAAW,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAShG;IAED;;;;;;;;;;;OAWG;IACH,8BAHW,KAAK,GACH,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,UAFa,MAAM,CAMlB;CACF;0BA5XyB,qBAAqB;mBAC5B,cAAc"}
@@ -187,7 +187,7 @@ export default class SyncPublisher {
187
187
  await this.broadcaster()({
188
188
  body: {
189
189
  echoOrigin: null,
190
- syncs: [{ data, resourceId, resourceType: resourceConfig.resourceType, syncType }]
190
+ syncs: [this.publishedSyncEntry({ data, resourceConfig, resourceId, syncRow, syncType })]
191
191
  },
192
192
  channel: VELOCIOUS_SYNC_CHANNEL,
193
193
  params: { ...scopeValues.params, resourceType: resourceConfig.resourceType }
@@ -238,6 +238,36 @@ export default class SyncPublisher {
238
238
  }
239
239
  return { columns, params };
240
240
  }
241
+ /**
242
+ * Builds the framework sync channel entry for one published change: the
243
+ * snapshotted payload plus the persisted sync row's public exact-row metadata
244
+ * (id, server sequence, updated-at, and declared scope-partition attributes).
245
+ * Uses the sync model's generated typed accessors and follows the
246
+ * change-feed serializer's public field convention.
247
+ * @param {{data: Record<string, ?>, resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig, resourceId: string, syncRow: ?, syncType: string}} args - Publish args.
248
+ * @returns {Record<string, ?>} Broadcast sync entry.
249
+ */
250
+ publishedSyncEntry({ data, resourceConfig, resourceId, syncRow, syncType }) {
251
+ /** @type {Record<string, ?>} */
252
+ const entry = {
253
+ data,
254
+ id: syncRow.id(),
255
+ resourceId,
256
+ resourceType: resourceConfig.resourceType,
257
+ serverSequence: syncRow.serverSequence(),
258
+ syncType,
259
+ updatedAt: isoDate(syncRow.updatedAt())
260
+ };
261
+ const scopeAttributes = declaredSyncScopeAttributes(this.config.syncModel);
262
+ for (const scopeAttribute of scopeAttributes || []) {
263
+ const scopeAccessor = syncRow[scopeAttribute];
264
+ if (typeof scopeAccessor !== "function") {
265
+ throw new Error(`Published sync row is missing the declared scope accessor ${scopeAttribute}().`);
266
+ }
267
+ entry[scopeAttribute] = scopeAccessor.call(syncRow);
268
+ }
269
+ return entry;
270
+ }
241
271
  /**
242
272
  * Upserts the published server-origin sync row for a resource identity:
243
273
  * server-origin rows carry a null actor column (no device to echo the
@@ -440,4 +470,17 @@ function defaultSerializedAttributes(record) {
440
470
  }
441
471
  return attributes;
442
472
  }
443
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wdWJsaXNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLXB1Ymxpc2hlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBRXZELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ3RFLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUNwRSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUU3RCxzRkFBc0Y7QUFDdEYsTUFBTSx3QkFBd0IsR0FBRyxFQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFDLENBQUE7QUFFeEc7Ozs7OztvREFNb0Q7QUFDcEQsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUV6RCxvREFBb0Q7QUFDcEQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRXREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7Ozs7Ozs7T0FRRztJQUNILFlBQVksT0FBTyxHQUFHLEVBQUU7UUFDdEIsTUFBTSxFQUFDLHFCQUFxQixHQUFHLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxXQUFXLEVBQUMsR0FBRyxPQUFP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RCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDJCQUEyQixDQUFDLE1BQU07SUFDekMsZ0NBQWdDO0lBQ2hDLE1BQU0sVUFBVSxHQUFHLEVBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsQ0FBQTtJQUUzQyxLQUFLLE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ2hFLElBQUksS0FBSyxZQUFZLElBQUk7WUFBRSxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzVFLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuaW1wb3J0IHtkZWNsYXJlZFN5bmNTY29wZUF0dHJpYnV0ZXN9IGZyb20gXCIuL3N5bmMtc2NvcGUtYXR0cmlidXRlcy5qc1wiXG5pbXBvcnQge2RlbGl2ZXJEZWNsYXJlZEJyb2FkY2FzdHMsIHVwc2VydFN5bmNSb3d9IGZyb20gXCIuL3N5bmMtY2hhbmdlLWZhbm91dC5qc1wiXG5pbXBvcnQge2lzUHVibGlzaGluZ1N1cHByZXNzZWR9IGZyb20gXCIuL3N5bmMtcHVibGlzaC1zdXBwcmVzc2lvbi5qc1wiXG5pbXBvcnQge1ZFTE9DSU9VU19TWU5DX0NIQU5ORUx9IGZyb20gXCIuL3N5bmMtY2hhbm5lbC1uYW1lLmpzXCJcblxuLyoqIEB0eXBlIHt7Y3JlYXRlOiBcImFmdGVyQ3JlYXRlXCIsIHVwZGF0ZTogXCJhZnRlclVwZGF0ZVwiLCBkZXN0cm95OiBcImFmdGVyRGVzdHJveVwifX0gKi9cbmNvbnN0IFBVQkxJU0hFRF9DQUxMQkFDS19OQU1FUyA9IHtjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgZGVzdHJveTogXCJhZnRlckRlc3Ryb3lcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCJ9XG5cbi8qKlxuICogT3BlcmF0aW9ucyBwdWJsaXNoZWQgYnkgZGVmYXVsdCBmb3IgbW9kZWxzIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIHB1Ymxpc2hcbiAqIHdpdGhvdXQgYW4gYG9wZXJhdGlvbnNgIGtleTogc2VydmVyLXNpZGUgY3JlYXRlcyBhbmQgdXBkYXRlcyBwdWJsaXNoXG4gKiBhdXRvbWF0aWNhbGx5LiBEZXN0cm95cyBhcmUgbm90IHB1Ymxpc2hlZCBieSBkZWZhdWx0IGJlY2F1c2UgYSBzZXJ2ZXJcbiAqIGRlc3Ryb3kgaXMgb2Z0ZW4gY2xlYW51cCByYXRoZXIgdGhhbiBhIHN5bmNlZCBkZWxldGU7IG9wdCBpbiB3aXRoIGFuXG4gKiBvcGVyYXRpb25zIGxpc3QuXG4gKiBAdHlwZSB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59ICovXG5jb25zdCBERUZBVUxUX1BVQkxJU0hFRF9PUEVSQVRJT05TID0gW1wiY3JlYXRlXCIsIFwidXBkYXRlXCJdXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxDb25maWd1cmF0aW9uLCBTeW5jUHVibGlzaGVyPn0gKi9cbmNvbnN0IHN0YXJ0ZWRQdWJsaXNoZXJzQnlDb25maWd1cmF0aW9uID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIERlY2xhcmF0aXZlIHNlcnZlci1zaWRlIHN5bmMgcHVibGlzaGVyIOKAlCB0aGUgc2VydmVyIG1pcnJvciBvZiB0aGUgY2xpZW50J3NcbiAqIHRyYWNrLWJ5LWRlZmF1bHQgbXV0YXRpb24gdHJhY2tpbmcuXG4gKlxuICogU2VydmVyIG1vZGVscyBkZWNsYXJlIHdoYXQgdG8gcHVibGlzaCB0aHJvdWdoIGBzdGF0aWMgc3luY2AncyBgcHVibGlzaGBcbiAqIGtleSwgYW5kIFZlbG9jaW91cyB3cml0ZXMgZXZlcnkgY29tbWl0dGVkIHNlcnZlci1zaWRlIGNoYW5nZSB0byB0aGUgc3luY1xuICogY2hhbmdlIGZlZWQgKG1vZGVsLWJhY2tlZCBTeW5jLXJvdyB1cHNlcnQgd2l0aCBzZXJ2ZXIgcmUtc2VxdWVuY2luZykgYW5kXG4gKiBicm9hZGNhc3RzIHRoZSBzdGFuZGFyZCBzeW5jIGVudmVsb3BlIChge2VjaG9PcmlnaW4sIHN5bmNzOiBbLi4uXX1gKSBvbiB0aGVcbiAqIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgKHtAbGluayBWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSkgc2NvcGVkIGJ5IHRoZVxuICogY2hhbmdlJ3MgZGVyaXZlZCBzY29wZS1wYXJ0aXRpb24gdmFsdWVzLCBzbyBkZXZpY2VzIHJlY2VpdmUgc2VydmVyLW9yaWdpblxuICogY2hhbmdlcyB3aXRob3V0IGFwcCBjb2RlIGRlY2xhcmluZyBjaGFubmVscyBvciBjYWxsaW5nIG1hbnVhbFxuICogdXBzZXJ0L2Jyb2FkY2FzdCBoZWxwZXJzOlxuICpcbiAqICAgICBzdGF0aWMgc3luYyA9IHtwdWJsaXNoOiB0cnVlfSAvLyBkZWZhdWx0IHBheWxvYWQgKGF0dHJpYnV0ZXMpICsgZGVmYXVsdCBzY29wZSBwYXJ0aXRpb25cbiAqICAgICBzdGF0aWMgc3luYyA9IHtwdWJsaXNoOiB7c2VyaWFsaXplOiAocmVjb3JkKSA9PiAoe2lkOiByZWNvcmQuaWQoKSwgcGluOiByZWNvcmQucGluKCl9KX19XG4gKlxuICogVGhlIHNjb3BlIHBhcnRpdGlvbiBjb21lcyBmcm9tIHRoZSBzeW5jIG1vZGVsJ3MgYHN0YXRpY1xuICogc3luY1Njb3BlQXR0cmlidXRlc2AgZGVjbGFyYXRpb24gKGZvciBleGFtcGxlIGBbXCJldmVudElkXCJdYCBvclxuICogYFtcImFjY291bnRJZFwiXWAg4oCUIFZlbG9jaW91cyBoYXMgbm8gYnVpbHQtaW4gcGFydGl0aW9uIG5hbWUpOiBlYWNoIGRlY2xhcmVkXG4gKiBzY29wZSBhdHRyaWJ1dGUgcmVhZHMgdGhlIHJlY29yZCdzIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lIHdoZW4gdGhlXG4gKiBtb2RlbCBoYXMgb25lLCBlbHNlIHRoZSByZWNvcmQncyBvd24gaWQgKHNjb3BlLXJvb3QgbW9kZWxzKSwgb3ZlcnJpZGFibGVcbiAqIHBlciBtb2RlbCB0aHJvdWdoIGBwdWJsaXNoOiB7c2NvcGVBdHRyaWJ1dGVzOiB7YWNjb3VudElkOiBcIm93bmVySWRcIn19YC5cbiAqIFRoZSBwcmUtZnJhbWV3b3JrLWNoYW5uZWwgYGJyb2FkY2FzdHNgIGxpc3QgYW5kIHRoZSBgZXZlbnRJZGBcbiAqIHN0cmluZy9yZXNvbHZlci1mdW5jdGlvbiBkZWNsYXJhdGlvbiBmb3JtcyBrZWVwIHdvcmtpbmcgYnV0IGFyZSBkZXByZWNhdGVkLlxuICpcbiAqIFJlcGxheWVkIGRldmljZSBtdXRhdGlvbnMgbmV2ZXIgZG91YmxlLXB1Ymxpc2g6IHRoZSBmcmFtZXdvcmsncyByb3V0ZWRcbiAqIHJlcGxheSBhcHBseSBtYXJrcyBpdHMgd3JpdHRlbiByZWNvcmRzIHRocm91Z2ggYG1hcmtTZXJ2ZXJBcHBseShyZWNvcmQpYFxuICogKHNlZSBzeW5jLXB1Ymxpc2gtc3VwcHJlc3Npb24uanMpLCBhbmQgYXBwIGNvZGUgYXBwbHlpbmcgYWxyZWFkeS1zeW5jZWRcbiAqIGRhdGEgY2FuIHVzZSBgbWFya1NlcnZlckFwcGx5YC9gd2l0aG91dFB1Ymxpc2hpbmdgIHRoZSBzYW1lIHdheS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY1B1Ymxpc2hlciB7XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHN5bmMgcHVibGlzaGVyIGJ5IGRlcml2aW5nIHB1Ymxpc2hlZCByZXNvdXJjZXMgZnJvbSB0aGVcbiAgICogY29uZmlndXJhdGlvbidzIHJlZ2lzdGVyZWQgbW9kZWxzOiBldmVyeSBtb2RlbCBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYFxuICAgKiB3aXRoIGEgYHB1Ymxpc2hgIGRlY2xhcmF0aW9uIGJlY29tZXMgYSBwdWJsaXNoZWQgcmVzb3VyY2VcbiAgICogKGBwdWJsaXNoOiBmYWxzZWAgb3B0cyBvdXQpLiBUaGUgc3luYy9jaGFuZ2UgbW9kZWwgaXMgdGhlIHJlZ2lzdGVyZWRcbiAgICogXCJTeW5jXCIgbW9kZWwgYW5kIGJyb2FkY2FzdHMgZGVmYXVsdCB0byB0aGUgY29uZmlndXJhdGlvbidzIGNoYW5uZWxcbiAgICogYnJvYWRjYXN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlck9wdGlvbnN9IFtvcHRpb25zXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHthY3RvckZvcmVpZ25LZXlDb2x1bW4gPSBcImF1dGhlbnRpY2F0aW9uX3Rva2VuX2lkXCIsIGJyb2FkY2FzdGVyLCBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIG9uRXJyb3IsIHN5bmNNb2RlbCwgLi4ucmVzdE9wdGlvbnN9ID0gb3B0aW9uc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0T3B0aW9ucylcblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClcbiAgICBjb25zdCBwdWJsaXNoaW5nTW9kZWxDbGFzc2VzID0gT2JqZWN0LnZhbHVlcyhtb2RlbENsYXNzZXMpLmZpbHRlcigobW9kZWxDbGFzcykgPT4gcHVibGlzaERlY2xhcmF0aW9uRm9yKG1vZGVsQ2xhc3MpKVxuXG4gICAgaWYgKHB1Ymxpc2hpbmdNb2RlbENsYXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jUHVibGlzaGVyIGZvdW5kIG5vIHJlZ2lzdGVyZWQgbW9kZWxzIGRlY2xhcmluZyBzdGF0aWMgc3luYyBwdWJsaXNoIC0gZGVjbGFyZSBgc3RhdGljIHN5bmMgPSB7cHVibGlzaDoge3NlcmlhbGl6ZX19YCBvbiB0aGUgbW9kZWxzIHdob3NlIHNlcnZlci1zaWRlIGNoYW5nZXMgc2hvdWxkIHB1Ymxpc2ggdG8gdGhlIHN5bmMgZmVlZFwiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3luY01vZGVsID0gc3luY01vZGVsIHx8IG1vZGVsQ2xhc3Nlcy5TeW5jXG5cbiAgICBpZiAoIXJlc29sdmVkU3luY01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jUHVibGlzaGVyIHJlcXVpcmVzIGEgcmVnaXN0ZXJlZCBcXFwiU3luY1xcXCIgbW9kZWwgZm9yIHB1Ymxpc2hlZCBzeW5jIGNoYW5nZSByb3dzIChvciBwYXNzIG9wdGlvbnMuc3luY01vZGVsKVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlQXR0cmlidXRlcyA9IGRlY2xhcmVkU3luY1Njb3BlQXR0cmlidXRlcyhyZXNvbHZlZFN5bmNNb2RlbClcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlclJlc291cmNlQ29uZmlnPn0gKi9cbiAgICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHB1Ymxpc2hpbmdNb2RlbENsYXNzZXMpIHtcbiAgICAgIGNvbnN0IHB1Ymxpc2ggPSBwdWJsaXNoRGVjbGFyYXRpb25Gb3IobW9kZWxDbGFzcylcbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gcmVzb3VyY2VDb25maWdGcm9tUHVibGlzaERlY2xhcmF0aW9uKHttb2RlbENsYXNzLCBwdWJsaXNoLCBzY29wZUF0dHJpYnV0ZXMsIHN5bmNNb2RlbDogcmVzb2x2ZWRTeW5jTW9kZWx9KVxuXG4gICAgICByZXNvdXJjZXNbcmVzb3VyY2VDb25maWcucmVzb3VyY2VUeXBlXSA9IHJlc291cmNlQ29uZmlnXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHt7YWN0b3JGb3JlaWduS2V5Q29sdW1uOiBzdHJpbmcsIGJyb2FkY2FzdGVyOiBpbXBvcnQoXCIuL3N5bmMtcHVibGlzaGVyLXR5cGVzLmpzXCIpLlN5bmNQdWJsaXNoZXJPcHRpb25zW1wiYnJvYWRjYXN0ZXJcIl0sIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24sIG9uRXJyb3I6IGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlck9wdGlvbnNbXCJvbkVycm9yXCJdLCByZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlclJlc291cmNlQ29uZmlnPiwgc3luY01vZGVsOiA/fX0gKi9cbiAgICB0aGlzLmNvbmZpZyA9IHthY3RvckZvcmVpZ25LZXlDb2x1bW4sIGJyb2FkY2FzdGVyLCBjb25maWd1cmF0aW9uLCBvbkVycm9yLCByZXNvdXJjZXMsIHN5bmNNb2RlbDogcmVzb2x2ZWRTeW5jTW9kZWx9XG4gICAgLyoqIEB0eXBlIHtBcnJheTx7Y2FsbGJhY2s6IChyZWNvcmQ6ID8pID0+IFByb21pc2U8dm9pZD4sIGNhbGxiYWNrTmFtZTogXCJhZnRlckNyZWF0ZVwiIHwgXCJhZnRlclVwZGF0ZVwiIHwgXCJhZnRlckRlc3Ryb3lcIiwgbW9kZWxDbGFzczogP30+fSAqL1xuICAgIHRoaXMuX3B1Ymxpc2hlZENhbGxiYWNrcyA9IFtdXG4gICAgLyoqIEB0eXBlIHtMb2dnZXIgfCBudWxsfSAqL1xuICAgIHRoaXMuX2xvZ2dlciA9IG51bGxcbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzeW5jIHB1Ymxpc2hlciBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIEFsaWFzIGZvclxuICAgKiBgbmV3IFN5bmNQdWJsaXNoZXIoe2NvbmZpZ3VyYXRpb24sIC4uLm9wdGlvbnN9KWAuXG4gICAqIEBwYXJhbSB7Q29uZmlndXJhdGlvbn0gW2NvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHJlZ2lzdGVyZWQgbW9kZWxzLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaGVyT3B0aW9ucywgXCJjb25maWd1cmF0aW9uXCI+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtTeW5jUHVibGlzaGVyfSBTeW5jIHB1Ymxpc2hlciBkZXJpdmVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNQdWJsaXNoZXIoey4uLm9wdGlvbnMsIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyAoYW5kIG1lbW9pemVzIHBlciBjb25maWd1cmF0aW9uKSB0aGUgc3luYyBwdWJsaXNoZXIgZm9yIGEgc2VydmVyXG4gICAqIGJvb3Q6IG5vLW9wIHdoZW4gbm8gcmVnaXN0ZXJlZCBtb2RlbCBkZWNsYXJlcyBhIHB1Ymxpc2ggY29uZmlnLCBndWFyZGVkIHNvXG4gICAqIHJlcGVhdGVkIGJvb3RzIHdpdGggdGhlIHNhbWUgY29uZmlndXJhdGlvbiByZWdpc3RlciB0aGUgcHVibGlzaCBjYWxsYmFja3NcbiAgICogb25seSBvbmNlLlxuICAgKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcmVnaXN0ZXJlZCBtb2RlbHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNQdWJsaXNoZXIgfCBudWxsPn0gU3RhcnRlZCBwdWJsaXNoZXIsIG9yIG51bGwgd2hlbiBubyBtb2RlbHMgZGVjbGFyZSBwdWJsaXNoLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0RnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHN0YXJ0ZWRQdWJsaXNoZXIgPSBzdGFydGVkUHVibGlzaGVyc0J5Q29uZmlndXJhdGlvbi5nZXQoY29uZmlndXJhdGlvbilcblxuICAgIGlmIChzdGFydGVkUHVibGlzaGVyKSByZXR1cm4gc3RhcnRlZFB1Ymxpc2hlclxuXG4gICAgaWYgKCFPYmplY3QudmFsdWVzKGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKCkpLnNvbWUoKG1vZGVsQ2xhc3MpID0+IHB1Ymxpc2hEZWNsYXJhdGlvbkZvcihtb2RlbENsYXNzKSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwdWJsaXNoZXIgPSBuZXcgU3luY1B1Ymxpc2hlcih7Y29uZmlndXJhdGlvbn0pXG5cbiAgICBzdGFydGVkUHVibGlzaGVyc0J5Q29uZmlndXJhdGlvbi5zZXQoY29uZmlndXJhdGlvbiwgcHVibGlzaGVyKVxuICAgIGF3YWl0IHB1Ymxpc2hlci5zdGFydCgpXG5cbiAgICByZXR1cm4gcHVibGlzaGVyXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBwdWJsaXNoIGNhbGxiYWNrcyBmb3IgZXZlcnkgcHVibGlzaGVkIHJlc291cmNlOiBzZXJ2ZXItc2lkZVxuICAgKiBjcmVhdGVzIGFuZCB1cGRhdGVzIChkZXN0cm95cyB3aGVuIG9wdGVkIGluKSB1cHNlcnQgYSBzeW5jIGNoYW5nZSByb3cgYW5kXG4gICAqIGZhbiBvdXQgdGhlIGRlY2xhcmVkIGJyb2FkY2FzdHMgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBjb21taXRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm5cblxuICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlXG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlQ29uZmlnIG9mIE9iamVjdC52YWx1ZXModGhpcy5jb25maWcucmVzb3VyY2VzKSkge1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgcmVzb3VyY2VDb25maWcub3BlcmF0aW9ucykge1xuICAgICAgICBjb25zdCBjYWxsYmFja05hbWUgPSBQVUJMSVNIRURfQ0FMTEJBQ0tfTkFNRVNbb3BlcmF0aW9uXVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMucHVibGlzaGVkTXV0YXRpb25DYWxsYmFjayh7b3BlcmF0aW9uLCByZXNvdXJjZUNvbmZpZ30pXG5cbiAgICAgICAgcmVzb3VyY2VDb25maWcubW9kZWxDbGFzc1tjYWxsYmFja05hbWVdKGNhbGxiYWNrKVxuICAgICAgICB0aGlzLl9wdWJsaXNoZWRDYWxsYmFja3MucHVzaCh7Y2FsbGJhY2ssIGNhbGxiYWNrTmFtZSwgbW9kZWxDbGFzczogcmVzb3VyY2VDb25maWcubW9kZWxDbGFzc30pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGFsbCBwdWJsaXNoIGNhbGxiYWNrcyAodGVzdHMsIHNodXRkb3duKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdG9wKCkge1xuICAgIGZvciAoY29uc3Qge2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3N9IG9mIHRoaXMuX3B1Ymxpc2hlZENhbGxiYWNrcykge1xuICAgICAgbW9kZWxDbGFzcy51bnJlZ2lzdGVyTGlmZWN5Y2xlQ2FsbGJhY2soY2FsbGJhY2tOYW1lLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICB0aGlzLl9wdWJsaXNoZWRDYWxsYmFja3MgPSBbXVxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbGlmZWN5Y2xlIGNhbGxiYWNrIHB1Ymxpc2hpbmcgb25lIHNlcnZlci1zaWRlIG11dGF0aW9uLiBUaGVcbiAgICogcHVibGlzaGVkIHBheWxvYWQgKGRlY2xhcmF0aW9uIGBzZXJpYWxpemVgKSwgZXZlbnQgc2NvcGUsIGFuZCBzeW5jIHR5cGVcbiAgICogYXJlIHNuYXBzaG90dGVkIGF0IG11dGF0aW9uLWNhbGxiYWNrIHRpbWUsIHNvIGFmdGVyU2F2ZSBob29rcyBhc3NpZ25pbmdcbiAgICogdW5zYXZlZCBhdHRyaWJ1dGVzIChvciBhbnkgbGF0ZXIgZHJpZnQgb24gdGhlIHJlY29yZCkgY2Fubm90IGNoYW5nZSB3aGF0XG4gICAqIGdldHMgcHVibGlzaGVkIHZzIHdoYXQgd2FzIGNvbW1pdHRlZC4gUGVyc2lzdGluZyBhbmQgYnJvYWRjYXN0aW5nIGFyZVxuICAgKiBkZWZlcnJlZCB0aHJvdWdoIHRoZSBtb2RlbCBjb25uZWN0aW9uJ3MgYWZ0ZXJDb21taXQgaG9vayBzbyB0aGV5IG9ubHkgcnVuXG4gICAqIG9uY2UgdGhlIG11dGF0aW9uJ3MgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCAoaW1tZWRpYXRlbHkgd2hlbiBub1xuICAgKiB0cmFuc2FjdGlvbiBpcyBvcGVuKSAtIHJvbGxlZC1iYWNrIG11dGF0aW9ucyBuZXZlciBwdWJsaXNoLiBQb3N0LWNvbW1pdFxuICAgKiBwdWJsaXNoIGZhaWx1cmVzIGFyZSByZXBvcnRlZCB3aXRob3V0IHJldGhyb3dpbmcgaW50byB0aGUgZHJpdmVyJ3NcbiAgICogYWZ0ZXJDb21taXQgY2hhaW4gKHNlZSByZXBvcnRBZnRlckNvbW1pdEVycm9yKS5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaGVyUmVzb3VyY2VDb25maWd9fSBhcmdzIC0gT3BlcmF0aW9uIGFuZCByZXNvdXJjZSBjb25maWcuXG4gICAqIEByZXR1cm5zIHsocmVjb3JkOiA/KSA9PiBQcm9taXNlPHZvaWQ+fSBMaWZlY3ljbGUgY2FsbGJhY2suXG4gICAqL1xuICBwdWJsaXNoZWRNdXRhdGlvbkNhbGxiYWNrKHtvcGVyYXRpb24sIHJlc291cmNlQ29uZmlnfSkge1xuICAgIHJldHVybiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICBpZiAoaXNQdWJsaXNoaW5nU3VwcHJlc3NlZChyZWNvcmQpKSByZXR1cm5cblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc291cmNlQ29uZmlnLnNlcmlhbGl6ZShyZWNvcmQpXG4gICAgICBjb25zdCByZXNvdXJjZUlkID0gU3RyaW5nKHJlY29yZC5pZCgpKVxuICAgICAgY29uc3Qgc3luY1R5cGUgPSBvcGVyYXRpb24gPT09IFwiZGVzdHJveVwiID8gXCJkZWxldGVcIiA6IFwidXBkYXRlXCJcbiAgICAgIGNvbnN0IHNjb3BlVmFsdWVzID0gYXdhaXQgdGhpcy5wdWJsaXNoZWRTY29wZVZhbHVlcyh7cmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmFjdG9yRm9yZWlnbktleUNvbHVtbl06IG51bGwsXG4gICAgICAgIGNsaWVudF91cGRhdGVkX2F0OiBuZXcgRGF0ZSgpLFxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVzb3VyY2VfaWQ6IHJlc291cmNlSWQsXG4gICAgICAgIHJlc291cmNlX3R5cGU6IHJlc291cmNlQ29uZmlnLnJlc291cmNlVHlwZSxcbiAgICAgICAgc3luY190eXBlOiBzeW5jVHlwZSxcbiAgICAgICAgLi4uc2NvcGVWYWx1ZXMuY29sdW1uc1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YWJhc2VPcGVyYXRpb24gPSByZWNvcmQuZGF0YWJhc2VPcGVyYXRpb24oKVxuICAgICAgY29uc3Qgb3BlcmF0aW9uU2NvcGUgPSBkYXRhYmFzZU9wZXJhdGlvblxuICAgICAgICA/IGRhdGFiYXNlT3BlcmF0aW9uLmZvck1vZGVsKHRoaXMuY29uZmlnLnN5bmNNb2RlbClcbiAgICAgICAgOiB0aGlzLmNvbmZpZy5zeW5jTW9kZWxcblxuICAgICAgYXdhaXQgcmVjb3JkLmNvbm5lY3Rpb24oKS5hZnRlckNvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3luY1JvdyA9IGF3YWl0IHRoaXMudXBzZXJ0UHVibGlzaGVkU3luY1JvdyhhdHRyaWJ1dGVzLCBvcGVyYXRpb25TY29wZSlcblxuICAgICAgICAgIGF3YWl0IHRoaXMuYnJvYWRjYXN0ZXIoKSh7XG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgIGVjaG9PcmlnaW46IG51bGwsXG4gICAgICAgICAgICAgIHN5bmNzOiBbe2RhdGEsIHJlc291cmNlSWQsIHJlc291cmNlVHlwZTogcmVzb3VyY2VDb25maWcucmVzb3VyY2VUeXBlLCBzeW5jVHlwZX1dXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhbm5lbDogVkVMT0NJT1VTX1NZTkNfQ0hBTk5FTCxcbiAgICAgICAgICAgIHBhcmFtczogey4uLnNjb3BlVmFsdWVzLnBhcmFtcywgcmVzb3VyY2VUeXBlOiByZXNvdXJjZUNvbmZpZy5yZXNvdXJjZVR5cGV9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChyZXNvdXJjZUNvbmZpZy5icm9hZGNhc3RzKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxpdmVyRGVjbGFyZWRCcm9hZGNhc3RzKHtcbiAgICAgICAgICAgICAgYXJnczoge2RhdGEsIG9wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUlkLCByZXNvdXJjZVR5cGU6IHJlc291cmNlQ29uZmlnLnJlc291cmNlVHlwZSwgc3luY1Jvdywgc3luY1R5cGV9LFxuICAgICAgICAgICAgICBicm9hZGNhc3RlcjogdGhpcy5icm9hZGNhc3RlcigpLFxuICAgICAgICAgICAgICBicm9hZGNhc3RzOiByZXNvdXJjZUNvbmZpZy5icm9hZGNhc3RzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydEFmdGVyQ29tbWl0RXJyb3IoLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHNjb3BlLXBhcnRpdGlvbiB2YWx1ZXMgZm9yIG9uZSBwdWJsaXNoZWQgbXV0YXRpb24gZnJvbSB0aGVcbiAgICogcmVzb3VyY2UncyBkZXJpdmVkIHNjb3BlIHBsYW46IGVhY2ggZW50cnkgcmVhZHMgaXRzIHJlY29yZCBhdHRyaWJ1dGUgKG9yXG4gICAqIHRoZSByZWNvcmQncyBvd24gaWQgZm9yIHNjb3BlLXJvb3QgbW9kZWxzLCBvciB0aGUgZGVwcmVjYXRlZCByZXNvbHZlclxuICAgKiBmdW5jdGlvbikuIFRoZSB2YWx1ZXMgYXJlIHBlcnNpc3RlZCBvbnRvIHRoZSBzeW5jIHJvdydzIHBhcnRpdGlvbiBjb2x1bW5zXG4gICAqIGFuZCBicm9hZGNhc3QgYXMgdGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwncyBzY29waW5nIHBhcmFtcy5cbiAgICogQHBhcmFtIHt7cmVjb3JkOiA/LCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaGVyUmVzb3VyY2VDb25maWd9fSBhcmdzIC0gTXV0YXRlZCByZWNvcmQgYW5kIHJlc291cmNlIGNvbmZpZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2NvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+fT59IFNjb3BlIHZhbHVlcyBrZXllZCBieSBzeW5jLXJvdyBjb2x1bW4gYW5kIGJ5IHNjb3BlIGF0dHJpYnV0ZS5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hlZFNjb3BlVmFsdWVzKHtyZWNvcmQsIHJlc291cmNlQ29uZmlnfSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD59ICovXG4gICAgY29uc3QgY29sdW1ucyA9IHt9XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBzY29wZVBsYW5FbnRyeSBvZiByZXNvdXJjZUNvbmZpZy5zY29wZVBsYW4pIHtcbiAgICAgIC8qKiBAdHlwZSB7P30gKi9cbiAgICAgIGxldCByYXdWYWx1ZVxuXG4gICAgICBpZiAoc2NvcGVQbGFuRW50cnkucmVzb2x2ZXIpIHtcbiAgICAgICAgcmF3VmFsdWUgPSBhd2FpdCBzY29wZVBsYW5FbnRyeS5yZXNvbHZlcihyZWNvcmQpXG4gICAgICB9IGVsc2UgaWYgKHNjb3BlUGxhbkVudHJ5LnJlY29yZEF0dHJpYnV0ZSkge1xuICAgICAgICByYXdWYWx1ZSA9IHJlY29yZC5yZWFkQXR0cmlidXRlKHNjb3BlUGxhbkVudHJ5LnJlY29yZEF0dHJpYnV0ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd1ZhbHVlID0gcmVjb3JkLmlkKClcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSByYXdWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHJhd1ZhbHVlID09PSBudWxsID8gbnVsbCA6IFN0cmluZyhyYXdWYWx1ZSlcblxuICAgICAgY29sdW1uc1tzY29wZVBsYW5FbnRyeS5jb2x1bW5OYW1lXSA9IHZhbHVlXG4gICAgICBwYXJhbXNbc2NvcGVQbGFuRW50cnkuc2NvcGVBdHRyaWJ1dGVdID0gdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4ge2NvbHVtbnMsIHBhcmFtc31cbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnRzIHRoZSBwdWJsaXNoZWQgc2VydmVyLW9yaWdpbiBzeW5jIHJvdyBmb3IgYSByZXNvdXJjZSBpZGVudGl0eTpcbiAgICogc2VydmVyLW9yaWdpbiByb3dzIGNhcnJ5IGEgbnVsbCBhY3RvciBjb2x1bW4gKG5vIGRldmljZSB0byBlY2hvIHRoZVxuICAgKiBjaGFuZ2UgYmFjayB0byksIHNvIHJlcGVhdGVkIHNlcnZlciBjaGFuZ2VzIHRvIG9uZSByZXNvdXJjZSByZXVzZSBhbmRcbiAgICogcmUtc2VxdWVuY2Ugb25lIGZlZWQgcm93LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhdHRyaWJ1dGVzIC0gU25hcHNob3R0ZWQgc3luYyByb3cgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHs/fSBzeW5jTW9kZWwgLSBPcGVyYXRpb24tYm91bmQgb3Igc3RhdGljIFN5bmMgbW9kZWwgaW50ZXJmYWNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gVXBzZXJ0ZWQgc3luYyByb3cuXG4gICAqL1xuICBhc3luYyB1cHNlcnRQdWJsaXNoZWRTeW5jUm93KGF0dHJpYnV0ZXMsIHN5bmNNb2RlbCA9IHRoaXMuY29uZmlnLnN5bmNNb2RlbCkge1xuICAgIGNvbnN0IGV4aXN0aW5nU3luYyA9IGF3YWl0IHN5bmNNb2RlbFxuICAgICAgLndoZXJlKHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmFjdG9yRm9yZWlnbktleUNvbHVtbl06IG51bGwsXG4gICAgICAgIHJlc291cmNlX2lkOiBhdHRyaWJ1dGVzLnJlc291cmNlX2lkLFxuICAgICAgICByZXNvdXJjZV90eXBlOiBhdHRyaWJ1dGVzLnJlc291cmNlX3R5cGVcbiAgICAgIH0pXG4gICAgICAuZmlyc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHVwc2VydFN5bmNSb3coe2F0dHJpYnV0ZXMsIGV4aXN0aW5nU3luYywgc3luY01vZGVsfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBicm9hZGNhc3RlciBkZWxpdmVyaW5nIGRlY2xhcmVkIGJyb2FkY2FzdHM6IHRoZSBpbmplY3RlZCBvbmUsXG4gICAqIG9yIHRoZSBjb25maWd1cmF0aW9uJ3MgY2hhbm5lbCBicm9hZGNhc3QgYXdhaXRlZCB0aHJvdWdoIHRoZSBwZW5kaW5nXG4gICAqIGJyb2FkY2FzdCBxdWV1ZS5cbiAgICogQHJldHVybnMge05vbk51bGxhYmxlPGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlck9wdGlvbnNbXCJicm9hZGNhc3RlclwiXT59IEJyb2FkY2FzdCBkZWxpdmVyZXIuXG4gICAqL1xuICBicm9hZGNhc3RlcigpIHtcbiAgICBpZiAodGhpcy5jb25maWcuYnJvYWRjYXN0ZXIpIHJldHVybiB0aGlzLmNvbmZpZy5icm9hZGNhc3RlclxuXG4gICAgcmV0dXJuIGFzeW5jICh7Ym9keSwgY2hhbm5lbCwgcGFyYW1zfSkgPT4ge1xuICAgICAgdGhpcy5jb25maWcuY29uZmlndXJhdGlvbi5icm9hZGNhc3RUb0NoYW5uZWwoY2hhbm5lbCwgcGFyYW1zLCBib2R5KVxuICAgICAgYXdhaXQgdGhpcy5jb25maWcuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyBhIHBvc3QtY29tbWl0IHB1Ymxpc2ggZmFpbHVyZS4gVGhlIHRyYW5zYWN0aW9uIGhhcyBhbHJlYWR5XG4gICAqIGNvbW1pdHRlZCB3aGVuIGFmdGVyQ29tbWl0IGNhbGxiYWNrcyBydW4sIHNvIHJldGhyb3dpbmcgaGVyZSB3b3VsZCBwb2lzb25cbiAgICogdGhlIGRyaXZlcidzIGF3YWl0ZWQgYWZ0ZXJDb21taXQgY2hhaW4gKGJyZWFraW5nIHVucmVsYXRlZCBjYWxsYmFja3MpIC1cbiAgICogaW5zdGVhZCB0aGUgZmFpbHVyZSBnb2VzIHRvIHRoZSBjb25maWd1cmVkIG9uRXJyb3IgaG9vaywgb3IgaXMgZW1pdHRlZCBvblxuICAgKiB0aGUgY29uZmlndXJhdGlvbidzIGZyYW1ld29yay1lcnJvci9hbGwtZXJyb3IgY2hhbm5lbHMgKHNvIHByb2R1Y3Rpb24gYnVnXG4gICAqIHJlcG9ydGluZyB2aWEgYGNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKWAgc2VlcyBhIGJyb2tlbiBwdWJsaXNoXG4gICAqIHBhdGgpIGFuZCBsb2dnZWQgbG91ZGx5IHRocm91Z2ggdGhlIHB1Ymxpc2hlcidzIGxvZ2dlciB3aGVuIG5vbmUgaXNcbiAgICogY29uZmlndXJlZC5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBQb3N0LWNvbW1pdCBwdWJsaXNoIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwb3J0QWZ0ZXJDb21taXRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlcnJvckV2ZW50cyA9IHRoaXMuY29uZmlnLmNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKVxuICAgIGNvbnN0IHBheWxvYWQgPSB7Y29udGV4dDoge3N0YWdlOiBcInN5bmMtcHVibGlzaC1hZnRlci1jb21taXRcIn0sIGVycm9yfVxuXG4gICAgZXJyb3JFdmVudHMuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBwYXlsb2FkKVxuICAgIGVycm9yRXZlbnRzLmVtaXQoXCJhbGwtZXJyb3JcIiwgey4uLnBheWxvYWQsIGVycm9yVHlwZTogXCJmcmFtZXdvcmstZXJyb3JcIn0pXG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlcigpLmVycm9yKFwiU3luY1B1Ymxpc2hlciBmYWlsZWQgdG8gcHVibGlzaCBhIHNlcnZlci1zaWRlIHN5bmMgY2hhbmdlIGFmdGVyIGNvbW1pdFwiLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXppbHkgYnVpbHQgcHVibGlzaGVyIGxvZ2dlci5cbiAgICogQHJldHVybnMge0xvZ2dlcn0gUHVibGlzaGVyIGxvZ2dlci5cbiAgICovXG4gIGxvZ2dlcigpIHtcbiAgICB0aGlzLl9sb2dnZXIgfHw9IG5ldyBMb2dnZXIoXCJTeW5jUHVibGlzaGVyXCIsIHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZy5jb25maWd1cmF0aW9ufSlcblxuICAgIHJldHVybiB0aGlzLl9sb2dnZXJcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgbW9kZWwgY2xhc3MncyBhY3RpdmUgcHVibGlzaCBkZWNsYXJhdGlvbiBmcm9tIGBzdGF0aWMgc3luY2AuXG4gKiBPcHRlZC1vdXQgKGBwdWJsaXNoOiBmYWxzZWApIGFuZCB1bmRlY2xhcmVkIG1vZGVscyByZXNvbHZlIHRvIG51bGw7IGV2ZXJ5XG4gKiBvdGhlciBkZWNsYXJlZCB2YWx1ZSBmbG93cyBpbnRvIGxvdWQgZGVjbGFyYXRpb24gdmFsaWRhdGlvbi5cbiAqIEBwYXJhbSB7P30gbW9kZWxDbGFzcyAtIFJlZ2lzdGVyZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaERlY2xhcmF0aW9uIHwgbnVsbH0gQWN0aXZlIHB1Ymxpc2ggZGVjbGFyYXRpb24sIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hEZWNsYXJhdGlvbkZvcihtb2RlbENsYXNzKSB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gbW9kZWxDbGFzcy5zeW5jXG5cbiAgaWYgKCFkZWNsYXJhdGlvbiB8fCB0eXBlb2YgZGVjbGFyYXRpb24gIT09IFwib2JqZWN0XCIgfHwgZGVjbGFyYXRpb24ucHVibGlzaCA9PT0gdW5kZWZpbmVkIHx8IGRlY2xhcmF0aW9uLnB1Ymxpc2ggPT09IGZhbHNlKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBkZWNsYXJhdGlvbi5wdWJsaXNoXG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBwdWJsaXNoZWQgcmVzb3VyY2UgY29uZmlnIGZyb20gYSBtb2RlbCdzIGBzdGF0aWMgc3luY2AgcHVibGlzaFxuICogZGVjbGFyYXRpb24uIGBwdWJsaXNoOiB0cnVlYCBvcHRzIGluIHdpdGggYWxsIGRlZmF1bHRzIChhdHRyaWJ1dGUgcGF5bG9hZCxcbiAqIGRlcml2ZWQgc2NvcGUgcGFydGl0aW9uLCBjcmVhdGVkL3VwZGF0ZWQgb3BlcmF0aW9ucykuXG4gKiBAcGFyYW0ge3ttb2RlbENsYXNzOiA/LCBwdWJsaXNoOiBpbXBvcnQoXCIuL3N5bmMtcHVibGlzaGVyLXR5cGVzLmpzXCIpLlN5bmNQdWJsaXNoRGVjbGFyYXRpb24gfCBudWxsLCBzY29wZUF0dHJpYnV0ZXM6IHN0cmluZ1tdIHwgbnVsbCwgc3luY01vZGVsOiA/fX0gYXJncyAtIERlY2xhcmF0aW9uIGFyZ3MgcGx1cyB0aGUgc3luYyBtb2RlbCdzIGRlY2xhcmVkIHNjb3BlIGF0dHJpYnV0ZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaGVyUmVzb3VyY2VDb25maWd9IERlcml2ZWQgcmVzb3VyY2UgY29uZmlnLlxuICovXG5mdW5jdGlvbiByZXNvdXJjZUNvbmZpZ0Zyb21QdWJsaXNoRGVjbGFyYXRpb24oe21vZGVsQ2xhc3MsIHB1Ymxpc2gsIHNjb3BlQXR0cmlidXRlczogc3luY1Njb3BlQXR0cmlidXRlcywgc3luY01vZGVsfSkge1xuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG4gIGNvbnN0IG5vcm1hbGl6ZWRQdWJsaXNoID0gcHVibGlzaCA9PT0gdHJ1ZSA/IHt9IDogcHVibGlzaFxuXG4gIGlmICghbm9ybWFsaXplZFB1Ymxpc2ggfHwgdHlwZW9mIG5vcm1hbGl6ZWRQdWJsaXNoICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZFB1Ymxpc2gpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gc3RhdGljIHN5bmMgcHVibGlzaCBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGEgcHVibGlzaCBkZWNsYXJhdGlvbiBvYmplY3QsIGdvdDogJHtTdHJpbmcocHVibGlzaCl9YClcbiAgfVxuXG4gIGNvbnN0IHticm9hZGNhc3RzLCBldmVudElkLCBvcGVyYXRpb25zLCByZXNvdXJjZVR5cGUsIHNjb3BlQXR0cmlidXRlcywgc2VyaWFsaXplLCAuLi5yZXN0RGVjbGFyYXRpb259ID0gbm9ybWFsaXplZFB1Ymxpc2hcbiAgY29uc3QgdW5rbm93bktleXMgPSBPYmplY3Qua2V5cyhyZXN0RGVjbGFyYXRpb24pXG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBzdGF0aWMgc3luYyBwdWJsaXNoIHJlY2VpdmVkIHVua25vd24ga2V5czogJHt1bmtub3duS2V5cy5qb2luKFwiLCBcIil9IChzdXBwb3J0ZWQ6IGJyb2FkY2FzdHMsIGV2ZW50SWQgKGRlcHJlY2F0ZWQpLCBvcGVyYXRpb25zLCByZXNvdXJjZVR5cGUsIHNjb3BlQXR0cmlidXRlcywgc2VyaWFsaXplKWApXG4gIH1cbiAgaWYgKHNlcmlhbGl6ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzZXJpYWxpemUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggc2VyaWFsaXplIG11c3QgYmUgYSBmdW5jdGlvbiBidWlsZGluZyB0aGUgcHVibGlzaGVkIHBheWxvYWQsIGdvdDogJHtTdHJpbmcoc2VyaWFsaXplKX1gKVxuICB9XG4gIGlmIChvcGVyYXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob3BlcmF0aW9ucykgfHwgb3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggb3BlcmF0aW9ucyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5IG9mIGNyZWF0ZS91cGRhdGUvZGVzdHJveWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKCEob3BlcmF0aW9uIGluIFBVQkxJU0hFRF9DQUxMQkFDS19OQU1FUykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gc3RhdGljIHN5bmMgcHVibGlzaCBvcGVyYXRpb25zIG11c3QgYmUgY3JlYXRlL3VwZGF0ZS9kZXN0cm95LCBnb3Q6ICR7U3RyaW5nKG9wZXJhdGlvbil9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJyb2FkY2FzdHMsXG4gICAgbW9kZWxDbGFzcyxcbiAgICBvcGVyYXRpb25zOiBvcGVyYXRpb25zID09PSB1bmRlZmluZWQgPyBERUZBVUxUX1BVQkxJU0hFRF9PUEVSQVRJT05TIDogb3BlcmF0aW9ucyxcbiAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkID8gbW9kZWxOYW1lIDogcmVzb3VyY2VUeXBlLFxuICAgIHNjb3BlUGxhbjogc2NvcGVQbGFuRm9yKHtldmVudElkLCBtb2RlbENsYXNzLCBtb2RlbE5hbWUsIHNjb3BlQXR0cmlidXRlcywgc3luY01vZGVsLCBzeW5jU2NvcGVBdHRyaWJ1dGVzfSksXG4gICAgc2VyaWFsaXplOiBzZXJpYWxpemUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRTZXJpYWxpemVkQXR0cmlidXRlcyA6IHNlcmlhbGl6ZVxuICB9XG59XG5cbi8qKlxuICogRGVyaXZlcyB0aGUgc2NvcGUgcGxhbiBwYXJ0aXRpb25pbmcgYSBwdWJsaXNoZWQgbW9kZWwncyBjaGFuZ2VzOiBvbmUgZW50cnlcbiAqIHBlciBzY29wZSBhdHRyaWJ1dGUgZGVjbGFyZWQgb24gdGhlIHN5bmMgbW9kZWwgKGBzdGF0aWNcbiAqIHN5bmNTY29wZUF0dHJpYnV0ZXNgKSwgZWFjaCByZWFkaW5nIHRoZSByZWNvcmQgYXR0cmlidXRlIG5hbWVkIGxpa2UgdGhlXG4gKiBzY29wZSBhdHRyaWJ1dGUgKG92ZXJyaWRhYmxlIHRocm91Z2ggdGhlIGRlY2xhcmF0aW9uJ3MgYHNjb3BlQXR0cmlidXRlc2BcbiAqIG5hbWUgbWFwKSwgb3IgdGhlIHJlY29yZCdzIG93biBpZCB3aGVuIHRoZSBtb2RlbCBoYXMgbm8gc3VjaCBhdHRyaWJ1dGVcbiAqIChzY29wZS1yb290IG1vZGVscykuIFRoZSBkZXByZWNhdGVkIGBldmVudElkYCBkZWNsYXJhdGlvbiBmb3JtcyBtYXAgdG8gYVxuICogZml4ZWQgYGV2ZW50SWRgL2BldmVudF9pZGAgcGxhbiBmb3IgMS4wLjUwMyBjb21wYXRpYmlsaXR5LlxuICogQHBhcmFtIHt7ZXZlbnRJZDogaW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaERlY2xhcmF0aW9uQ29uZmlnW1wiZXZlbnRJZFwiXSwgbW9kZWxDbGFzczogPywgbW9kZWxOYW1lOiBzdHJpbmcsIHNjb3BlQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCwgc3luY01vZGVsOiA/LCBzeW5jU2NvcGVBdHRyaWJ1dGVzOiBzdHJpbmdbXSB8IG51bGx9fSBhcmdzIC0gRGVjbGFyYXRpb24gYW5kIHN5bmMtbW9kZWwgc2NvcGUgYXJncy5cbiAqIEByZXR1cm5zIHtBcnJheTxpbXBvcnQoXCIuL3N5bmMtcHVibGlzaGVyLXR5cGVzLmpzXCIpLlN5bmNQdWJsaXNoZXJTY29wZVBsYW5FbnRyeT59IERlcml2ZWQgc2NvcGUgcGxhbi5cbiAqL1xuZnVuY3Rpb24gc2NvcGVQbGFuRm9yKHtldmVudElkLCBtb2RlbENsYXNzLCBtb2RlbE5hbWUsIHNjb3BlQXR0cmlidXRlcywgc3luY01vZGVsLCBzeW5jU2NvcGVBdHRyaWJ1dGVzfSkge1xuICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IE9iamVjdC52YWx1ZXMobW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKCkpXG5cbiAgaWYgKGV2ZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzY29wZUF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gc3RhdGljIHN5bmMgcHVibGlzaCBjYW4ndCBkZWNsYXJlIGJvdGggc2NvcGVBdHRyaWJ1dGVzIGFuZCB0aGUgZGVwcmVjYXRlZCBldmVudElkIGZvcm1gKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGV2ZW50SWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIFt7Y29sdW1uTmFtZTogXCJldmVudF9pZFwiLCByZWNvcmRBdHRyaWJ1dGU6IG51bGwsIHJlc29sdmVyOiBldmVudElkLCBzY29wZUF0dHJpYnV0ZTogXCJldmVudElkXCJ9XVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGV2ZW50SWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggZXZlbnRJZCBtdXN0IGJlIGFuIGF0dHJpYnV0ZS1uYW1lIHN0cmluZyAob3IgYSBkZXByZWNhdGVkIHJlc29sdmVyIGZ1bmN0aW9uKSwgZ290OiAke1N0cmluZyhldmVudElkKX1gKVxuICAgIH1cbiAgICBpZiAoIWF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKGV2ZW50SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBzdGF0aWMgc3luYyBwdWJsaXNoIGV2ZW50SWQgYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3Qgb24gdGhlIG1vZGVsOiAke2V2ZW50SWR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gW3tjb2x1bW5OYW1lOiBcImV2ZW50X2lkXCIsIHJlY29yZEF0dHJpYnV0ZTogZXZlbnRJZCwgcmVzb2x2ZXI6IHVuZGVmaW5lZCwgc2NvcGVBdHRyaWJ1dGU6IFwiZXZlbnRJZFwifV1cbiAgfVxuXG4gIGlmIChzY29wZUF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCAmJiAhc3luY1Njb3BlQXR0cmlidXRlcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggZGVjbGFyZXMgc2NvcGVBdHRyaWJ1dGVzIGJ1dCB0aGUgc3luYyBtb2RlbCBkZWNsYXJlcyBubyBzdGF0aWMgc3luY1Njb3BlQXR0cmlidXRlc2ApXG4gIH1cblxuICBpZiAoIXN5bmNTY29wZUF0dHJpYnV0ZXMpIHJldHVybiBbXVxuXG4gIGlmIChzY29wZUF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHNjb3BlQXR0cmlidXRlcyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHNjb3BlQXR0cmlidXRlcykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gc3RhdGljIHN5bmMgcHVibGlzaCBzY29wZUF0dHJpYnV0ZXMgbXVzdCBiZSBhbiBvYmplY3QgbWFwcGluZyBzY29wZSBhdHRyaWJ1dGVzIHRvIHJlY29yZCBhdHRyaWJ1dGUgbmFtZXMsIGdvdDogJHtTdHJpbmcoc2NvcGVBdHRyaWJ1dGVzKX1gKVxuICB9XG5cbiAgZm9yIChjb25zdCBzY29wZUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhzY29wZUF0dHJpYnV0ZXMgfHwge30pKSB7XG4gICAgaWYgKCFzeW5jU2NvcGVBdHRyaWJ1dGVzLmluY2x1ZGVzKHNjb3BlQXR0cmlidXRlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gc3RhdGljIHN5bmMgcHVibGlzaCBzY29wZUF0dHJpYnV0ZXMgcmVjZWl2ZWQgdW5rbm93biBzY29wZSBhdHRyaWJ1dGU6ICR7c2NvcGVBdHRyaWJ1dGV9ICh0aGUgc3luYyBtb2RlbCBkZWNsYXJlczogJHtzeW5jU2NvcGVBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKX0pYClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3luY1Njb3BlQXR0cmlidXRlcy5tYXAoKHNjb3BlQXR0cmlidXRlKSA9PiB7XG4gICAgY29uc3QgZGVjbGFyZWRSZWNvcmRBdHRyaWJ1dGUgPSBzY29wZUF0dHJpYnV0ZXM/LltzY29wZUF0dHJpYnV0ZV1cblxuICAgIGlmIChkZWNsYXJlZFJlY29yZEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGRlY2xhcmVkUmVjb3JkQXR0cmlidXRlICE9PSBcInN0cmluZ1wiIHx8ICFhdHRyaWJ1dGVOYW1lcy5pbmNsdWRlcyhkZWNsYXJlZFJlY29yZEF0dHJpYnV0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gc3RhdGljIHN5bmMgcHVibGlzaCBzY29wZUF0dHJpYnV0ZXMuJHtzY29wZUF0dHJpYnV0ZX0gbXVzdCBuYW1lIGFuIGV4aXN0aW5nIHJlY29yZCBhdHRyaWJ1dGUsIGdvdDogJHtTdHJpbmcoZGVjbGFyZWRSZWNvcmRBdHRyaWJ1dGUpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7Y29sdW1uTmFtZTogc3luY1Njb3BlQ29sdW1uTmFtZSh7c2NvcGVBdHRyaWJ1dGUsIHN5bmNNb2RlbH0pLCByZWNvcmRBdHRyaWJ1dGU6IGRlY2xhcmVkUmVjb3JkQXR0cmlidXRlLCByZXNvbHZlcjogdW5kZWZpbmVkLCBzY29wZUF0dHJpYnV0ZX1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uTmFtZTogc3luY1Njb3BlQ29sdW1uTmFtZSh7c2NvcGVBdHRyaWJ1dGUsIHN5bmNNb2RlbH0pLFxuICAgICAgcmVjb3JkQXR0cmlidXRlOiBhdHRyaWJ1dGVOYW1lcy5pbmNsdWRlcyhzY29wZUF0dHJpYnV0ZSkgPyBzY29wZUF0dHJpYnV0ZSA6IG51bGwsXG4gICAgICByZXNvbHZlcjogdW5kZWZpbmVkLFxuICAgICAgc2NvcGVBdHRyaWJ1dGVcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHN5bmMtcm93IGNvbHVtbiBwZXJzaXN0aW5nIGEgZGVjbGFyZWQgc2NvcGUgYXR0cmlidXRlLlxuICogQHBhcmFtIHt7c2NvcGVBdHRyaWJ1dGU6IHN0cmluZywgc3luY01vZGVsOiA/fX0gYXJncyAtIFNjb3BlIGF0dHJpYnV0ZSBhbmQgc3luYyBtb2RlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN5bmMtcm93IGNvbHVtbiBuYW1lLlxuICovXG5mdW5jdGlvbiBzeW5jU2NvcGVDb2x1bW5OYW1lKHtzY29wZUF0dHJpYnV0ZSwgc3luY01vZGVsfSkge1xuICBjb25zdCBjb2x1bW5OYW1lID0gc3luY01vZGVsLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVtzY29wZUF0dHJpYnV0ZV1cblxuICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3luY01vZGVsLm5hbWV9IGRlY2xhcmVzIHRoZSBzeW5jIHNjb3BlIGF0dHJpYnV0ZSAke3Njb3BlQXR0cmlidXRlfSBidXQgaGFzIG5vIG1hdGNoaW5nIGNvbHVtbiBmb3IgaXRgKVxuICB9XG5cbiAgcmV0dXJuIGNvbHVtbk5hbWVcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHB1Ymxpc2ggc2VyaWFsaXplcjogdGhlIHJlY29yZCdzIGF0dHJpYnV0ZXMgd2l0aCBEYXRlIHZhbHVlc1xuICogc2VyaWFsaXplZCB0byBJU08gc3RyaW5ncy5cbiAqIEBwYXJhbSB7P30gcmVjb3JkIC0gTXV0YXRlZCBzZXJ2ZXIgbW9kZWwgcmVjb3JkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSBTZXJpYWxpemVkIGF0dHJpYnV0ZXMgcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFNlcmlhbGl6ZWRBdHRyaWJ1dGVzKHJlY29yZCkge1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICBjb25zdCBhdHRyaWJ1dGVzID0gey4uLnJlY29yZC5hdHRyaWJ1dGVzKCl9XG5cbiAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IHZhbHVlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIHJldHVybiBhdHRyaWJ1dGVzXG59XG4iXX0=
473
+ /**
474
+ * Converts a date-like value to an ISO string, matching the change-feed
475
+ * serializer's convention for the sync entry's public updated-at metadata.
476
+ * @param {Date | null} value - Persisted updated-at value.
477
+ * @returns {string} ISO date.
478
+ * @throws {Error} When the persisted row has no valid updated-at timestamp.
479
+ */
480
+ function isoDate(value) {
481
+ if (!(value instanceof Date) || Number.isNaN(value.getTime())) {
482
+ throw new Error("Published sync row must have a valid updatedAt timestamp.");
483
+ }
484
+ return value.toISOString();
485
+ }
486
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wdWJsaXNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLXB1Ymxpc2hlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBRXZELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ3RFLE9BQU8sRUFBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUNwRSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUU3RCxzRkFBc0Y7QUFDdEYsTUFBTSx3QkFBd0IsR0FBRyxFQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFDLENBQUE7QUFFeEc7Ozs7OztvREFNb0Q7QUFDcEQsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUV6RCxvREFBb0Q7QUFDcEQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRXREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7Ozs7Ozs7T0FRRztJQUNILFlBQVksT0FBTyxHQUFHLEVBQUU7UUFDdEIsTUFBTSxFQUFDLHFCQUFxQixHQUFHLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxXQUFXLEVBQUMsR0FBRyxPQUFP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QUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDaEUsSUFBSSxLQUFLLFlBQVksSUFBSTtZQUFFLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDNUUsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLE9BQU8sQ0FBQyxLQUFLO0lBQ3BCLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFBO0lBQzlFLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuaW1wb3J0IHtkZWNsYXJlZFN5bmNTY29wZUF0dHJpYnV0ZXN9IGZyb20gXCIuL3N5bmMtc2NvcGUtYXR0cmlidXRlcy5qc1wiXG5pbXBvcnQge2RlbGl2ZXJEZWNsYXJlZEJyb2FkY2FzdHMsIHVwc2VydFN5bmNSb3d9IGZyb20gXCIuL3N5bmMtY2hhbmdlLWZhbm91dC5qc1wiXG5pbXBvcnQge2lzUHVibGlzaGluZ1N1cHByZXNzZWR9IGZyb20gXCIuL3N5bmMtcHVibGlzaC1zdXBwcmVzc2lvbi5qc1wiXG5pbXBvcnQge1ZFTE9DSU9VU19TWU5DX0NIQU5ORUx9IGZyb20gXCIuL3N5bmMtY2hhbm5lbC1uYW1lLmpzXCJcblxuLyoqIEB0eXBlIHt7Y3JlYXRlOiBcImFmdGVyQ3JlYXRlXCIsIHVwZGF0ZTogXCJhZnRlclVwZGF0ZVwiLCBkZXN0cm95OiBcImFmdGVyRGVzdHJveVwifX0gKi9cbmNvbnN0IFBVQkxJU0hFRF9DQUxMQkFDS19OQU1FUyA9IHtjcmVhdGU6IFwiYWZ0ZXJDcmVhdGVcIiwgZGVzdHJveTogXCJhZnRlckRlc3Ryb3lcIiwgdXBkYXRlOiBcImFmdGVyVXBkYXRlXCJ9XG5cbi8qKlxuICogT3BlcmF0aW9ucyBwdWJsaXNoZWQgYnkgZGVmYXVsdCBmb3IgbW9kZWxzIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIHB1Ymxpc2hcbiAqIHdpdGhvdXQgYW4gYG9wZXJhdGlvbnNgIGtleTogc2VydmVyLXNpZGUgY3JlYXRlcyBhbmQgdXBkYXRlcyBwdWJsaXNoXG4gKiBhdXRvbWF0aWNhbGx5LiBEZXN0cm95cyBhcmUgbm90IHB1Ymxpc2hlZCBieSBkZWZhdWx0IGJlY2F1c2UgYSBzZXJ2ZXJcbiAqIGRlc3Ryb3kgaXMgb2Z0ZW4gY2xlYW51cCByYXRoZXIgdGhhbiBhIHN5bmNlZCBkZWxldGU7IG9wdCBpbiB3aXRoIGFuXG4gKiBvcGVyYXRpb25zIGxpc3QuXG4gKiBAdHlwZSB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59ICovXG5jb25zdCBERUZBVUxUX1BVQkxJU0hFRF9PUEVSQVRJT05TID0gW1wiY3JlYXRlXCIsIFwidXBkYXRlXCJdXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxDb25maWd1cmF0aW9uLCBTeW5jUHVibGlzaGVyPn0gKi9cbmNvbnN0IHN0YXJ0ZWRQdWJsaXNoZXJzQnlDb25maWd1cmF0aW9uID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIERlY2xhcmF0aXZlIHNlcnZlci1zaWRlIHN5bmMgcHVibGlzaGVyIOKAlCB0aGUgc2VydmVyIG1pcnJvciBvZiB0aGUgY2xpZW50J3NcbiAqIHRyYWNrLWJ5LWRlZmF1bHQgbXV0YXRpb24gdHJhY2tpbmcuXG4gKlxuICogU2VydmVyIG1vZGVscyBkZWNsYXJlIHdoYXQgdG8gcHVibGlzaCB0aHJvdWdoIGBzdGF0aWMgc3luY2AncyBgcHVibGlzaGBcbiAqIGtleSwgYW5kIFZlbG9jaW91cyB3cml0ZXMgZXZlcnkgY29tbWl0dGVkIHNlcnZlci1zaWRlIGNoYW5nZSB0byB0aGUgc3luY1xuICogY2hhbmdlIGZlZWQgKG1vZGVsLWJhY2tlZCBTeW5jLXJvdyB1cHNlcnQgd2l0aCBzZXJ2ZXIgcmUtc2VxdWVuY2luZykgYW5kXG4gKiBicm9hZGNhc3RzIHRoZSBzdGFuZGFyZCBzeW5jIGVudmVsb3BlIChge2VjaG9PcmlnaW4sIHN5bmNzOiBbLi4uXX1gKSBvbiB0aGVcbiAqIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgKHtAbGluayBWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSkgc2NvcGVkIGJ5IHRoZVxuICogY2hhbmdlJ3MgZGVyaXZlZCBzY29wZS1wYXJ0aXRpb24gdmFsdWVzLCBzbyBkZXZpY2VzIHJlY2VpdmUgc2VydmVyLW9yaWdpblxuICogY2hhbmdlcyB3aXRob3V0IGFwcCBjb2RlIGRlY2xhcmluZyBjaGFubmVscyBvciBjYWxsaW5nIG1hbnVhbFxuICogdXBzZXJ0L2Jyb2FkY2FzdCBoZWxwZXJzOlxuICpcbiAqICAgICBzdGF0aWMgc3luYyA9IHtwdWJsaXNoOiB0cnVlfSAvLyBkZWZhdWx0IHBheWxvYWQgKGF0dHJpYnV0ZXMpICsgZGVmYXVsdCBzY29wZSBwYXJ0aXRpb25cbiAqICAgICBzdGF0aWMgc3luYyA9IHtwdWJsaXNoOiB7c2VyaWFsaXplOiAocmVjb3JkKSA9PiAoe2lkOiByZWNvcmQuaWQoKSwgcGluOiByZWNvcmQucGluKCl9KX19XG4gKlxuICogVGhlIHNjb3BlIHBhcnRpdGlvbiBjb21lcyBmcm9tIHRoZSBzeW5jIG1vZGVsJ3MgYHN0YXRpY1xuICogc3luY1Njb3BlQXR0cmlidXRlc2AgZGVjbGFyYXRpb24gKGZvciBleGFtcGxlIGBbXCJldmVudElkXCJdYCBvclxuICogYFtcImFjY291bnRJZFwiXWAg4oCUIFZlbG9jaW91cyBoYXMgbm8gYnVpbHQtaW4gcGFydGl0aW9uIG5hbWUpOiBlYWNoIGRlY2xhcmVkXG4gKiBzY29wZSBhdHRyaWJ1dGUgcmVhZHMgdGhlIHJlY29yZCdzIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lIHdoZW4gdGhlXG4gKiBtb2RlbCBoYXMgb25lLCBlbHNlIHRoZSByZWNvcmQncyBvd24gaWQgKHNjb3BlLXJvb3QgbW9kZWxzKSwgb3ZlcnJpZGFibGVcbiAqIHBlciBtb2RlbCB0aHJvdWdoIGBwdWJsaXNoOiB7c2NvcGVBdHRyaWJ1dGVzOiB7YWNjb3VudElkOiBcIm93bmVySWRcIn19YC5cbiAqIFRoZSBwcmUtZnJhbWV3b3JrLWNoYW5uZWwgYGJyb2FkY2FzdHNgIGxpc3QgYW5kIHRoZSBgZXZlbnRJZGBcbiAqIHN0cmluZy9yZXNvbHZlci1mdW5jdGlvbiBkZWNsYXJhdGlvbiBmb3JtcyBrZWVwIHdvcmtpbmcgYnV0IGFyZSBkZXByZWNhdGVkLlxuICpcbiAqIFJlcGxheWVkIGRldmljZSBtdXRhdGlvbnMgbmV2ZXIgZG91YmxlLXB1Ymxpc2g6IHRoZSBmcmFtZXdvcmsncyByb3V0ZWRcbiAqIHJlcGxheSBhcHBseSBtYXJrcyBpdHMgd3JpdHRlbiByZWNvcmRzIHRocm91Z2ggYG1hcmtTZXJ2ZXJBcHBseShyZWNvcmQpYFxuICogKHNlZSBzeW5jLXB1Ymxpc2gtc3VwcHJlc3Npb24uanMpLCBhbmQgYXBwIGNvZGUgYXBwbHlpbmcgYWxyZWFkeS1zeW5jZWRcbiAqIGRhdGEgY2FuIHVzZSBgbWFya1NlcnZlckFwcGx5YC9gd2l0aG91dFB1Ymxpc2hpbmdgIHRoZSBzYW1lIHdheS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY1B1Ymxpc2hlciB7XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHN5bmMgcHVibGlzaGVyIGJ5IGRlcml2aW5nIHB1Ymxpc2hlZCByZXNvdXJjZXMgZnJvbSB0aGVcbiAgICogY29uZmlndXJhdGlvbidzIHJlZ2lzdGVyZWQgbW9kZWxzOiBldmVyeSBtb2RlbCBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYFxuICAgKiB3aXRoIGEgYHB1Ymxpc2hgIGRlY2xhcmF0aW9uIGJlY29tZXMgYSBwdWJsaXNoZWQgcmVzb3VyY2VcbiAgICogKGBwdWJsaXNoOiBmYWxzZWAgb3B0cyBvdXQpLiBUaGUgc3luYy9jaGFuZ2UgbW9kZWwgaXMgdGhlIHJlZ2lzdGVyZWRcbiAgICogXCJTeW5jXCIgbW9kZWwgYW5kIGJyb2FkY2FzdHMgZGVmYXVsdCB0byB0aGUgY29uZmlndXJhdGlvbidzIGNoYW5uZWxcbiAgICogYnJvYWRjYXN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlck9wdGlvbnN9IFtvcHRpb25zXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHthY3RvckZvcmVpZ25LZXlDb2x1bW4gPSBcImF1dGhlbnRpY2F0aW9uX3Rva2VuX2lkXCIsIGJyb2FkY2FzdGVyLCBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIG9uRXJyb3IsIHN5bmNNb2RlbCwgLi4ucmVzdE9wdGlvbnN9ID0gb3B0aW9uc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0T3B0aW9ucylcblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClcbiAgICBjb25zdCBwdWJsaXNoaW5nTW9kZWxDbGFzc2VzID0gT2JqZWN0LnZhbHVlcyhtb2RlbENsYXNzZXMpLmZpbHRlcigobW9kZWxDbGFzcykgPT4gcHVibGlzaERlY2xhcmF0aW9uRm9yKG1vZGVsQ2xhc3MpKVxuXG4gICAgaWYgKHB1Ymxpc2hpbmdNb2RlbENsYXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jUHVibGlzaGVyIGZvdW5kIG5vIHJlZ2lzdGVyZWQgbW9kZWxzIGRlY2xhcmluZyBzdGF0aWMgc3luYyBwdWJsaXNoIC0gZGVjbGFyZSBgc3RhdGljIHN5bmMgPSB7cHVibGlzaDoge3NlcmlhbGl6ZX19YCBvbiB0aGUgbW9kZWxzIHdob3NlIHNlcnZlci1zaWRlIGNoYW5nZXMgc2hvdWxkIHB1Ymxpc2ggdG8gdGhlIHN5bmMgZmVlZFwiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3luY01vZGVsID0gc3luY01vZGVsIHx8IG1vZGVsQ2xhc3Nlcy5TeW5jXG5cbiAgICBpZiAoIXJlc29sdmVkU3luY01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jUHVibGlzaGVyIHJlcXVpcmVzIGEgcmVnaXN0ZXJlZCBcXFwiU3luY1xcXCIgbW9kZWwgZm9yIHB1Ymxpc2hlZCBzeW5jIGNoYW5nZSByb3dzIChvciBwYXNzIG9wdGlvbnMuc3luY01vZGVsKVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlQXR0cmlidXRlcyA9IGRlY2xhcmVkU3luY1Njb3BlQXR0cmlidXRlcyhyZXNvbHZlZFN5bmNNb2RlbClcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlclJlc291cmNlQ29uZmlnPn0gKi9cbiAgICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIHB1Ymxpc2hpbmdNb2RlbENsYXNzZXMpIHtcbiAgICAgIGNvbnN0IHB1Ymxpc2ggPSBwdWJsaXNoRGVjbGFyYXRpb25Gb3IobW9kZWxDbGFzcylcbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gcmVzb3VyY2VDb25maWdGcm9tUHVibGlzaERlY2xhcmF0aW9uKHttb2RlbENsYXNzLCBwdWJsaXNoLCBzY29wZUF0dHJpYnV0ZXMsIHN5bmNNb2RlbDogcmVzb2x2ZWRTeW5jTW9kZWx9KVxuXG4gICAgICByZXNvdXJjZXNbcmVzb3VyY2VDb25maWcucmVzb3VyY2VUeXBlXSA9IHJlc291cmNlQ29uZmlnXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHt7YWN0b3JGb3JlaWduS2V5Q29sdW1uOiBzdHJpbmcsIGJyb2FkY2FzdGVyOiBpbXBvcnQoXCIuL3N5bmMtcHVibGlzaGVyLXR5cGVzLmpzXCIpLlN5bmNQdWJsaXNoZXJPcHRpb25zW1wiYnJvYWRjYXN0ZXJcIl0sIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24sIG9uRXJyb3I6IGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlck9wdGlvbnNbXCJvbkVycm9yXCJdLCByZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlclJlc291cmNlQ29uZmlnPiwgc3luY01vZGVsOiA/fX0gKi9cbiAgICB0aGlzLmNvbmZpZyA9IHthY3RvckZvcmVpZ25LZXlDb2x1bW4sIGJyb2FkY2FzdGVyLCBjb25maWd1cmF0aW9uLCBvbkVycm9yLCByZXNvdXJjZXMsIHN5bmNNb2RlbDogcmVzb2x2ZWRTeW5jTW9kZWx9XG4gICAgLyoqIEB0eXBlIHtBcnJheTx7Y2FsbGJhY2s6IChyZWNvcmQ6ID8pID0+IFByb21pc2U8dm9pZD4sIGNhbGxiYWNrTmFtZTogXCJhZnRlckNyZWF0ZVwiIHwgXCJhZnRlclVwZGF0ZVwiIHwgXCJhZnRlckRlc3Ryb3lcIiwgbW9kZWxDbGFzczogP30+fSAqL1xuICAgIHRoaXMuX3B1Ymxpc2hlZENhbGxiYWNrcyA9IFtdXG4gICAgLyoqIEB0eXBlIHtMb2dnZXIgfCBudWxsfSAqL1xuICAgIHRoaXMuX2xvZ2dlciA9IG51bGxcbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzeW5jIHB1Ymxpc2hlciBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIEFsaWFzIGZvclxuICAgKiBgbmV3IFN5bmNQdWJsaXNoZXIoe2NvbmZpZ3VyYXRpb24sIC4uLm9wdGlvbnN9KWAuXG4gICAqIEBwYXJhbSB7Q29uZmlndXJhdGlvbn0gW2NvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHJlZ2lzdGVyZWQgbW9kZWxzLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaGVyT3B0aW9ucywgXCJjb25maWd1cmF0aW9uXCI+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtTeW5jUHVibGlzaGVyfSBTeW5jIHB1Ymxpc2hlciBkZXJpdmVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNQdWJsaXNoZXIoey4uLm9wdGlvbnMsIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyAoYW5kIG1lbW9pemVzIHBlciBjb25maWd1cmF0aW9uKSB0aGUgc3luYyBwdWJsaXNoZXIgZm9yIGEgc2VydmVyXG4gICAqIGJvb3Q6IG5vLW9wIHdoZW4gbm8gcmVnaXN0ZXJlZCBtb2RlbCBkZWNsYXJlcyBhIHB1Ymxpc2ggY29uZmlnLCBndWFyZGVkIHNvXG4gICAqIHJlcGVhdGVkIGJvb3RzIHdpdGggdGhlIHNhbWUgY29uZmlndXJhdGlvbiByZWdpc3RlciB0aGUgcHVibGlzaCBjYWxsYmFja3NcbiAgICogb25seSBvbmNlLlxuICAgKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcmVnaXN0ZXJlZCBtb2RlbHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNQdWJsaXNoZXIgfCBudWxsPn0gU3RhcnRlZCBwdWJsaXNoZXIsIG9yIG51bGwgd2hlbiBubyBtb2RlbHMgZGVjbGFyZSBwdWJsaXNoLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0RnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IHN0YXJ0ZWRQdWJsaXNoZXIgPSBzdGFydGVkUHVibGlzaGVyc0J5Q29uZmlndXJhdGlvbi5nZXQoY29uZmlndXJhdGlvbilcblxuICAgIGlmIChzdGFydGVkUHVibGlzaGVyKSByZXR1cm4gc3RhcnRlZFB1Ymxpc2hlclxuXG4gICAgaWYgKCFPYmplY3QudmFsdWVzKGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKCkpLnNvbWUoKG1vZGVsQ2xhc3MpID0+IHB1Ymxpc2hEZWNsYXJhdGlvbkZvcihtb2RlbENsYXNzKSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwdWJsaXNoZXIgPSBuZXcgU3luY1B1Ymxpc2hlcih7Y29uZmlndXJhdGlvbn0pXG5cbiAgICBzdGFydGVkUHVibGlzaGVyc0J5Q29uZmlndXJhdGlvbi5zZXQoY29uZmlndXJhdGlvbiwgcHVibGlzaGVyKVxuICAgIGF3YWl0IHB1Ymxpc2hlci5zdGFydCgpXG5cbiAgICByZXR1cm4gcHVibGlzaGVyXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBwdWJsaXNoIGNhbGxiYWNrcyBmb3IgZXZlcnkgcHVibGlzaGVkIHJlc291cmNlOiBzZXJ2ZXItc2lkZVxuICAgKiBjcmVhdGVzIGFuZCB1cGRhdGVzIChkZXN0cm95cyB3aGVuIG9wdGVkIGluKSB1cHNlcnQgYSBzeW5jIGNoYW5nZSByb3cgYW5kXG4gICAqIGZhbiBvdXQgdGhlIGRlY2xhcmVkIGJyb2FkY2FzdHMgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBjb21taXRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm5cblxuICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlXG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlQ29uZmlnIG9mIE9iamVjdC52YWx1ZXModGhpcy5jb25maWcucmVzb3VyY2VzKSkge1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgcmVzb3VyY2VDb25maWcub3BlcmF0aW9ucykge1xuICAgICAgICBjb25zdCBjYWxsYmFja05hbWUgPSBQVUJMSVNIRURfQ0FMTEJBQ0tfTkFNRVNbb3BlcmF0aW9uXVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMucHVibGlzaGVkTXV0YXRpb25DYWxsYmFjayh7b3BlcmF0aW9uLCByZXNvdXJjZUNvbmZpZ30pXG5cbiAgICAgICAgcmVzb3VyY2VDb25maWcubW9kZWxDbGFzc1tjYWxsYmFja05hbWVdKGNhbGxiYWNrKVxuICAgICAgICB0aGlzLl9wdWJsaXNoZWRDYWxsYmFja3MucHVzaCh7Y2FsbGJhY2ssIGNhbGxiYWNrTmFtZSwgbW9kZWxDbGFzczogcmVzb3VyY2VDb25maWcubW9kZWxDbGFzc30pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGFsbCBwdWJsaXNoIGNhbGxiYWNrcyAodGVzdHMsIHNodXRkb3duKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdG9wKCkge1xuICAgIGZvciAoY29uc3Qge2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3N9IG9mIHRoaXMuX3B1Ymxpc2hlZENhbGxiYWNrcykge1xuICAgICAgbW9kZWxDbGFzcy51bnJlZ2lzdGVyTGlmZWN5Y2xlQ2FsbGJhY2soY2FsbGJhY2tOYW1lLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICB0aGlzLl9wdWJsaXNoZWRDYWxsYmFja3MgPSBbXVxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbGlmZWN5Y2xlIGNhbGxiYWNrIHB1Ymxpc2hpbmcgb25lIHNlcnZlci1zaWRlIG11dGF0aW9uLiBUaGVcbiAgICogcHVibGlzaGVkIHBheWxvYWQgKGRlY2xhcmF0aW9uIGBzZXJpYWxpemVgKSwgZXZlbnQgc2NvcGUsIGFuZCBzeW5jIHR5cGVcbiAgICogYXJlIHNuYXBzaG90dGVkIGF0IG11dGF0aW9uLWNhbGxiYWNrIHRpbWUsIHNvIGFmdGVyU2F2ZSBob29rcyBhc3NpZ25pbmdcbiAgICogdW5zYXZlZCBhdHRyaWJ1dGVzIChvciBhbnkgbGF0ZXIgZHJpZnQgb24gdGhlIHJlY29yZCkgY2Fubm90IGNoYW5nZSB3aGF0XG4gICAqIGdldHMgcHVibGlzaGVkIHZzIHdoYXQgd2FzIGNvbW1pdHRlZC4gUGVyc2lzdGluZyBhbmQgYnJvYWRjYXN0aW5nIGFyZVxuICAgKiBkZWZlcnJlZCB0aHJvdWdoIHRoZSBtb2RlbCBjb25uZWN0aW9uJ3MgYWZ0ZXJDb21taXQgaG9vayBzbyB0aGV5IG9ubHkgcnVuXG4gICAqIG9uY2UgdGhlIG11dGF0aW9uJ3MgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCAoaW1tZWRpYXRlbHkgd2hlbiBub1xuICAgKiB0cmFuc2FjdGlvbiBpcyBvcGVuKSAtIHJvbGxlZC1iYWNrIG11dGF0aW9ucyBuZXZlciBwdWJsaXNoLiBQb3N0LWNvbW1pdFxuICAgKiBwdWJsaXNoIGZhaWx1cmVzIGFyZSByZXBvcnRlZCB3aXRob3V0IHJldGhyb3dpbmcgaW50byB0aGUgZHJpdmVyJ3NcbiAgICogYWZ0ZXJDb21taXQgY2hhaW4gKHNlZSByZXBvcnRBZnRlckNvbW1pdEVycm9yKS5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaGVyUmVzb3VyY2VDb25maWd9fSBhcmdzIC0gT3BlcmF0aW9uIGFuZCByZXNvdXJjZSBjb25maWcuXG4gICAqIEByZXR1cm5zIHsocmVjb3JkOiA/KSA9PiBQcm9taXNlPHZvaWQ+fSBMaWZlY3ljbGUgY2FsbGJhY2suXG4gICAqL1xuICBwdWJsaXNoZWRNdXRhdGlvbkNhbGxiYWNrKHtvcGVyYXRpb24sIHJlc291cmNlQ29uZmlnfSkge1xuICAgIHJldHVybiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICBpZiAoaXNQdWJsaXNoaW5nU3VwcHJlc3NlZChyZWNvcmQpKSByZXR1cm5cblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc291cmNlQ29uZmlnLnNlcmlhbGl6ZShyZWNvcmQpXG4gICAgICBjb25zdCByZXNvdXJjZUlkID0gU3RyaW5nKHJlY29yZC5pZCgpKVxuICAgICAgY29uc3Qgc3luY1R5cGUgPSBvcGVyYXRpb24gPT09IFwiZGVzdHJveVwiID8gXCJkZWxldGVcIiA6IFwidXBkYXRlXCJcbiAgICAgIGNvbnN0IHNjb3BlVmFsdWVzID0gYXdhaXQgdGhpcy5wdWJsaXNoZWRTY29wZVZhbHVlcyh7cmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHtcbiAgICAgICAgW3RoaXMuY29uZmlnLmFjdG9yRm9yZWlnbktleUNvbHVtbl06IG51bGwsXG4gICAgICAgIGNsaWVudF91cGRhdGVkX2F0OiBuZXcgRGF0ZSgpLFxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVzb3VyY2VfaWQ6IHJlc291cmNlSWQsXG4gICAgICAgIHJlc291cmNlX3R5cGU6IHJlc291cmNlQ29uZmlnLnJlc291cmNlVHlwZSxcbiAgICAgICAgc3luY190eXBlOiBzeW5jVHlwZSxcbiAgICAgICAgLi4uc2NvcGVWYWx1ZXMuY29sdW1uc1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YWJhc2VPcGVyYXRpb24gPSByZWNvcmQuZGF0YWJhc2VPcGVyYXRpb24oKVxuICAgICAgY29uc3Qgb3BlcmF0aW9uU2NvcGUgPSBkYXRhYmFzZU9wZXJhdGlvblxuICAgICAgICA/IGRhdGFiYXNlT3BlcmF0aW9uLmZvck1vZGVsKHRoaXMuY29uZmlnLnN5bmNNb2RlbClcbiAgICAgICAgOiB0aGlzLmNvbmZpZy5zeW5jTW9kZWxcblxuICAgICAgYXdhaXQgcmVjb3JkLmNvbm5lY3Rpb24oKS5hZnRlckNvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3luY1JvdyA9IGF3YWl0IHRoaXMudXBzZXJ0UHVibGlzaGVkU3luY1JvdyhhdHRyaWJ1dGVzLCBvcGVyYXRpb25TY29wZSlcblxuICAgICAgICAgIGF3YWl0IHRoaXMuYnJvYWRjYXN0ZXIoKSh7XG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgIGVjaG9PcmlnaW46IG51bGwsXG4gICAgICAgICAgICAgIHN5bmNzOiBbdGhpcy5wdWJsaXNoZWRTeW5jRW50cnkoe2RhdGEsIHJlc291cmNlQ29uZmlnLCByZXNvdXJjZUlkLCBzeW5jUm93LCBzeW5jVHlwZX0pXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoYW5uZWw6IFZFTE9DSU9VU19TWU5DX0NIQU5ORUwsXG4gICAgICAgICAgICBwYXJhbXM6IHsuLi5zY29wZVZhbHVlcy5wYXJhbXMsIHJlc291cmNlVHlwZTogcmVzb3VyY2VDb25maWcucmVzb3VyY2VUeXBlfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAocmVzb3VyY2VDb25maWcuYnJvYWRjYXN0cykge1xuICAgICAgICAgICAgYXdhaXQgZGVsaXZlckRlY2xhcmVkQnJvYWRjYXN0cyh7XG4gICAgICAgICAgICAgIGFyZ3M6IHtkYXRhLCBvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlOiByZXNvdXJjZUNvbmZpZy5yZXNvdXJjZVR5cGUsIHN5bmNSb3csIHN5bmNUeXBlfSxcbiAgICAgICAgICAgICAgYnJvYWRjYXN0ZXI6IHRoaXMuYnJvYWRjYXN0ZXIoKSxcbiAgICAgICAgICAgICAgYnJvYWRjYXN0czogcmVzb3VyY2VDb25maWcuYnJvYWRjYXN0c1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRBZnRlckNvbW1pdEVycm9yKC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzY29wZS1wYXJ0aXRpb24gdmFsdWVzIGZvciBvbmUgcHVibGlzaGVkIG11dGF0aW9uIGZyb20gdGhlXG4gICAqIHJlc291cmNlJ3MgZGVyaXZlZCBzY29wZSBwbGFuOiBlYWNoIGVudHJ5IHJlYWRzIGl0cyByZWNvcmQgYXR0cmlidXRlIChvclxuICAgKiB0aGUgcmVjb3JkJ3Mgb3duIGlkIGZvciBzY29wZS1yb290IG1vZGVscywgb3IgdGhlIGRlcHJlY2F0ZWQgcmVzb2x2ZXJcbiAgICogZnVuY3Rpb24pLiBUaGUgdmFsdWVzIGFyZSBwZXJzaXN0ZWQgb250byB0aGUgc3luYyByb3cncyBwYXJ0aXRpb24gY29sdW1uc1xuICAgKiBhbmQgYnJvYWRjYXN0IGFzIHRoZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsJ3Mgc2NvcGluZyBwYXJhbXMuXG4gICAqIEBwYXJhbSB7e3JlY29yZDogPywgcmVzb3VyY2VDb25maWc6IGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlclJlc291cmNlQ29uZmlnfX0gYXJncyAtIE11dGF0ZWQgcmVjb3JkIGFuZCByZXNvdXJjZSBjb25maWcuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPn0+fSBTY29wZSB2YWx1ZXMga2V5ZWQgYnkgc3luYy1yb3cgY29sdW1uIGFuZCBieSBzY29wZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoZWRTY29wZVZhbHVlcyh7cmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+fSAqL1xuICAgIGNvbnN0IGNvbHVtbnMgPSB7fVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD59ICovXG4gICAgY29uc3QgcGFyYW1zID0ge31cblxuICAgIGZvciAoY29uc3Qgc2NvcGVQbGFuRW50cnkgb2YgcmVzb3VyY2VDb25maWcuc2NvcGVQbGFuKSB7XG4gICAgICAvKiogQHR5cGUgez99ICovXG4gICAgICBsZXQgcmF3VmFsdWVcblxuICAgICAgaWYgKHNjb3BlUGxhbkVudHJ5LnJlc29sdmVyKSB7XG4gICAgICAgIHJhd1ZhbHVlID0gYXdhaXQgc2NvcGVQbGFuRW50cnkucmVzb2x2ZXIocmVjb3JkKVxuICAgICAgfSBlbHNlIGlmIChzY29wZVBsYW5FbnRyeS5yZWNvcmRBdHRyaWJ1dGUpIHtcbiAgICAgICAgcmF3VmFsdWUgPSByZWNvcmQucmVhZEF0dHJpYnV0ZShzY29wZVBsYW5FbnRyeS5yZWNvcmRBdHRyaWJ1dGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYXdWYWx1ZSA9IHJlY29yZC5pZCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gcmF3VmFsdWUgPT09IHVuZGVmaW5lZCB8fCByYXdWYWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBTdHJpbmcocmF3VmFsdWUpXG5cbiAgICAgIGNvbHVtbnNbc2NvcGVQbGFuRW50cnkuY29sdW1uTmFtZV0gPSB2YWx1ZVxuICAgICAgcGFyYW1zW3Njb3BlUGxhbkVudHJ5LnNjb3BlQXR0cmlidXRlXSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHtjb2x1bW5zLCBwYXJhbXN9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsIGVudHJ5IGZvciBvbmUgcHVibGlzaGVkIGNoYW5nZTogdGhlXG4gICAqIHNuYXBzaG90dGVkIHBheWxvYWQgcGx1cyB0aGUgcGVyc2lzdGVkIHN5bmMgcm93J3MgcHVibGljIGV4YWN0LXJvdyBtZXRhZGF0YVxuICAgKiAoaWQsIHNlcnZlciBzZXF1ZW5jZSwgdXBkYXRlZC1hdCwgYW5kIGRlY2xhcmVkIHNjb3BlLXBhcnRpdGlvbiBhdHRyaWJ1dGVzKS5cbiAgICogVXNlcyB0aGUgc3luYyBtb2RlbCdzIGdlbmVyYXRlZCB0eXBlZCBhY2Nlc3NvcnMgYW5kIGZvbGxvd3MgdGhlXG4gICAqIGNoYW5nZS1mZWVkIHNlcmlhbGl6ZXIncyBwdWJsaWMgZmllbGQgY29udmVudGlvbi5cbiAgICogQHBhcmFtIHt7ZGF0YTogUmVjb3JkPHN0cmluZywgPz4sIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtcHVibGlzaGVyLXR5cGVzLmpzXCIpLlN5bmNQdWJsaXNoZXJSZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VJZDogc3RyaW5nLCBzeW5jUm93OiA/LCBzeW5jVHlwZTogc3RyaW5nfX0gYXJncyAtIFB1Ymxpc2ggYXJncy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSBCcm9hZGNhc3Qgc3luYyBlbnRyeS5cbiAgICovXG4gIHB1Ymxpc2hlZFN5bmNFbnRyeSh7ZGF0YSwgcmVzb3VyY2VDb25maWcsIHJlc291cmNlSWQsIHN5bmNSb3csIHN5bmNUeXBlfSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaWQ6IHN5bmNSb3cuaWQoKSxcbiAgICAgIHJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlQ29uZmlnLnJlc291cmNlVHlwZSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiBzeW5jUm93LnNlcnZlclNlcXVlbmNlKCksXG4gICAgICBzeW5jVHlwZSxcbiAgICAgIHVwZGF0ZWRBdDogaXNvRGF0ZShzeW5jUm93LnVwZGF0ZWRBdCgpKVxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlQXR0cmlidXRlcyA9IGRlY2xhcmVkU3luY1Njb3BlQXR0cmlidXRlcyh0aGlzLmNvbmZpZy5zeW5jTW9kZWwpXG5cbiAgICBmb3IgKGNvbnN0IHNjb3BlQXR0cmlidXRlIG9mIHNjb3BlQXR0cmlidXRlcyB8fCBbXSkge1xuICAgICAgY29uc3Qgc2NvcGVBY2Nlc3NvciA9IHN5bmNSb3dbc2NvcGVBdHRyaWJ1dGVdXG5cbiAgICAgIGlmICh0eXBlb2Ygc2NvcGVBY2Nlc3NvciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHVibGlzaGVkIHN5bmMgcm93IGlzIG1pc3NpbmcgdGhlIGRlY2xhcmVkIHNjb3BlIGFjY2Vzc29yICR7c2NvcGVBdHRyaWJ1dGV9KCkuYClcbiAgICAgIH1cblxuICAgICAgZW50cnlbc2NvcGVBdHRyaWJ1dGVdID0gc2NvcGVBY2Nlc3Nvci5jYWxsKHN5bmNSb3cpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJ5XG4gIH1cblxuICAvKipcbiAgICogVXBzZXJ0cyB0aGUgcHVibGlzaGVkIHNlcnZlci1vcmlnaW4gc3luYyByb3cgZm9yIGEgcmVzb3VyY2UgaWRlbnRpdHk6XG4gICAqIHNlcnZlci1vcmlnaW4gcm93cyBjYXJyeSBhIG51bGwgYWN0b3IgY29sdW1uIChubyBkZXZpY2UgdG8gZWNobyB0aGVcbiAgICogY2hhbmdlIGJhY2sgdG8pLCBzbyByZXBlYXRlZCBzZXJ2ZXIgY2hhbmdlcyB0byBvbmUgcmVzb3VyY2UgcmV1c2UgYW5kXG4gICAqIHJlLXNlcXVlbmNlIG9uZSBmZWVkIHJvdy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXR0cmlidXRlcyAtIFNuYXBzaG90dGVkIHN5bmMgcm93IGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7P30gc3luY01vZGVsIC0gT3BlcmF0aW9uLWJvdW5kIG9yIHN0YXRpYyBTeW5jIG1vZGVsIGludGVyZmFjZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IFVwc2VydGVkIHN5bmMgcm93LlxuICAgKi9cbiAgYXN5bmMgdXBzZXJ0UHVibGlzaGVkU3luY1JvdyhhdHRyaWJ1dGVzLCBzeW5jTW9kZWwgPSB0aGlzLmNvbmZpZy5zeW5jTW9kZWwpIHtcbiAgICBjb25zdCBleGlzdGluZ1N5bmMgPSBhd2FpdCBzeW5jTW9kZWxcbiAgICAgIC53aGVyZSh7XG4gICAgICAgIFt0aGlzLmNvbmZpZy5hY3RvckZvcmVpZ25LZXlDb2x1bW5dOiBudWxsLFxuICAgICAgICByZXNvdXJjZV9pZDogYXR0cmlidXRlcy5yZXNvdXJjZV9pZCxcbiAgICAgICAgcmVzb3VyY2VfdHlwZTogYXR0cmlidXRlcy5yZXNvdXJjZV90eXBlXG4gICAgICB9KVxuICAgICAgLmZpcnN0KClcblxuICAgIHJldHVybiBhd2FpdCB1cHNlcnRTeW5jUm93KHthdHRyaWJ1dGVzLCBleGlzdGluZ1N5bmMsIHN5bmNNb2RlbH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYnJvYWRjYXN0ZXIgZGVsaXZlcmluZyBkZWNsYXJlZCBicm9hZGNhc3RzOiB0aGUgaW5qZWN0ZWQgb25lLFxuICAgKiBvciB0aGUgY29uZmlndXJhdGlvbidzIGNoYW5uZWwgYnJvYWRjYXN0IGF3YWl0ZWQgdGhyb3VnaCB0aGUgcGVuZGluZ1xuICAgKiBicm9hZGNhc3QgcXVldWUuXG4gICAqIEByZXR1cm5zIHtOb25OdWxsYWJsZTxpbXBvcnQoXCIuL3N5bmMtcHVibGlzaGVyLXR5cGVzLmpzXCIpLlN5bmNQdWJsaXNoZXJPcHRpb25zW1wiYnJvYWRjYXN0ZXJcIl0+fSBCcm9hZGNhc3QgZGVsaXZlcmVyLlxuICAgKi9cbiAgYnJvYWRjYXN0ZXIoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmJyb2FkY2FzdGVyKSByZXR1cm4gdGhpcy5jb25maWcuYnJvYWRjYXN0ZXJcblxuICAgIHJldHVybiBhc3luYyAoe2JvZHksIGNoYW5uZWwsIHBhcmFtc30pID0+IHtcbiAgICAgIHRoaXMuY29uZmlnLmNvbmZpZ3VyYXRpb24uYnJvYWRjYXN0VG9DaGFubmVsKGNoYW5uZWwsIHBhcmFtcywgYm9keSlcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnLmNvbmZpZ3VyYXRpb24uYXdhaXRQZW5kaW5nQnJvYWRjYXN0cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBwb3N0LWNvbW1pdCBwdWJsaXNoIGZhaWx1cmUuIFRoZSB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeVxuICAgKiBjb21taXR0ZWQgd2hlbiBhZnRlckNvbW1pdCBjYWxsYmFja3MgcnVuLCBzbyByZXRocm93aW5nIGhlcmUgd291bGQgcG9pc29uXG4gICAqIHRoZSBkcml2ZXIncyBhd2FpdGVkIGFmdGVyQ29tbWl0IGNoYWluIChicmVha2luZyB1bnJlbGF0ZWQgY2FsbGJhY2tzKSAtXG4gICAqIGluc3RlYWQgdGhlIGZhaWx1cmUgZ29lcyB0byB0aGUgY29uZmlndXJlZCBvbkVycm9yIGhvb2ssIG9yIGlzIGVtaXR0ZWQgb25cbiAgICogdGhlIGNvbmZpZ3VyYXRpb24ncyBmcmFtZXdvcmstZXJyb3IvYWxsLWVycm9yIGNoYW5uZWxzIChzbyBwcm9kdWN0aW9uIGJ1Z1xuICAgKiByZXBvcnRpbmcgdmlhIGBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKClgIHNlZXMgYSBicm9rZW4gcHVibGlzaFxuICAgKiBwYXRoKSBhbmQgbG9nZ2VkIGxvdWRseSB0aHJvdWdoIHRoZSBwdWJsaXNoZXIncyBsb2dnZXIgd2hlbiBub25lIGlzXG4gICAqIGNvbmZpZ3VyZWQuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gUG9zdC1jb21taXQgcHVibGlzaCBmYWlsdXJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcG9ydEFmdGVyQ29tbWl0RXJyb3IoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25FcnJvcikge1xuICAgICAgdGhpcy5jb25maWcub25FcnJvcihlcnJvcilcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JFdmVudHMgPSB0aGlzLmNvbmZpZy5jb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKClcbiAgICBjb25zdCBwYXlsb2FkID0ge2NvbnRleHQ6IHtzdGFnZTogXCJzeW5jLXB1Ymxpc2gtYWZ0ZXItY29tbWl0XCJ9LCBlcnJvcn1cblxuICAgIGVycm9yRXZlbnRzLmVtaXQoXCJmcmFtZXdvcmstZXJyb3JcIiwgcGF5bG9hZClcbiAgICBlcnJvckV2ZW50cy5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5wYXlsb2FkLCBlcnJvclR5cGU6IFwiZnJhbWV3b3JrLWVycm9yXCJ9KVxuXG4gICAgYXdhaXQgdGhpcy5sb2dnZXIoKS5lcnJvcihcIlN5bmNQdWJsaXNoZXIgZmFpbGVkIHRvIHB1Ymxpc2ggYSBzZXJ2ZXItc2lkZSBzeW5jIGNoYW5nZSBhZnRlciBjb21taXRcIiwgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF6aWx5IGJ1aWx0IHB1Ymxpc2hlciBsb2dnZXIuXG4gICAqIEByZXR1cm5zIHtMb2dnZXJ9IFB1Ymxpc2hlciBsb2dnZXIuXG4gICAqL1xuICBsb2dnZXIoKSB7XG4gICAgdGhpcy5fbG9nZ2VyIHx8PSBuZXcgTG9nZ2VyKFwiU3luY1B1Ymxpc2hlclwiLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWcuY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIG1vZGVsIGNsYXNzJ3MgYWN0aXZlIHB1Ymxpc2ggZGVjbGFyYXRpb24gZnJvbSBgc3RhdGljIHN5bmNgLlxuICogT3B0ZWQtb3V0IChgcHVibGlzaDogZmFsc2VgKSBhbmQgdW5kZWNsYXJlZCBtb2RlbHMgcmVzb2x2ZSB0byBudWxsOyBldmVyeVxuICogb3RoZXIgZGVjbGFyZWQgdmFsdWUgZmxvd3MgaW50byBsb3VkIGRlY2xhcmF0aW9uIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0gez99IG1vZGVsQ2xhc3MgLSBSZWdpc3RlcmVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hEZWNsYXJhdGlvbiB8IG51bGx9IEFjdGl2ZSBwdWJsaXNoIGRlY2xhcmF0aW9uLCBvciBudWxsLlxuICovXG5mdW5jdGlvbiBwdWJsaXNoRGVjbGFyYXRpb25Gb3IobW9kZWxDbGFzcykge1xuICBjb25zdCBkZWNsYXJhdGlvbiA9IG1vZGVsQ2xhc3Muc3luY1xuXG4gIGlmICghZGVjbGFyYXRpb24gfHwgdHlwZW9mIGRlY2xhcmF0aW9uICE9PSBcIm9iamVjdFwiIHx8IGRlY2xhcmF0aW9uLnB1Ymxpc2ggPT09IHVuZGVmaW5lZCB8fCBkZWNsYXJhdGlvbi5wdWJsaXNoID09PSBmYWxzZSkgcmV0dXJuIG51bGxcblxuICByZXR1cm4gZGVjbGFyYXRpb24ucHVibGlzaFxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgcHVibGlzaGVkIHJlc291cmNlIGNvbmZpZyBmcm9tIGEgbW9kZWwncyBgc3RhdGljIHN5bmNgIHB1Ymxpc2hcbiAqIGRlY2xhcmF0aW9uLiBgcHVibGlzaDogdHJ1ZWAgb3B0cyBpbiB3aXRoIGFsbCBkZWZhdWx0cyAoYXR0cmlidXRlIHBheWxvYWQsXG4gKiBkZXJpdmVkIHNjb3BlIHBhcnRpdGlvbiwgY3JlYXRlZC91cGRhdGVkIG9wZXJhdGlvbnMpLlxuICogQHBhcmFtIHt7bW9kZWxDbGFzczogPywgcHVibGlzaDogaW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaERlY2xhcmF0aW9uIHwgbnVsbCwgc2NvcGVBdHRyaWJ1dGVzOiBzdHJpbmdbXSB8IG51bGwsIHN5bmNNb2RlbDogP319IGFyZ3MgLSBEZWNsYXJhdGlvbiBhcmdzIHBsdXMgdGhlIHN5bmMgbW9kZWwncyBkZWNsYXJlZCBzY29wZSBhdHRyaWJ1dGVzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hlclJlc291cmNlQ29uZmlnfSBEZXJpdmVkIHJlc291cmNlIGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VDb25maWdGcm9tUHVibGlzaERlY2xhcmF0aW9uKHttb2RlbENsYXNzLCBwdWJsaXNoLCBzY29wZUF0dHJpYnV0ZXM6IHN5bmNTY29wZUF0dHJpYnV0ZXMsIHN5bmNNb2RlbH0pIHtcbiAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICBjb25zdCBub3JtYWxpemVkUHVibGlzaCA9IHB1Ymxpc2ggPT09IHRydWUgPyB7fSA6IHB1Ymxpc2hcblxuICBpZiAoIW5vcm1hbGl6ZWRQdWJsaXNoIHx8IHR5cGVvZiBub3JtYWxpemVkUHVibGlzaCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRQdWJsaXNoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggbXVzdCBiZSB0cnVlLCBmYWxzZSBvciBhIHB1Ymxpc2ggZGVjbGFyYXRpb24gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKHB1Ymxpc2gpfWApXG4gIH1cblxuICBjb25zdCB7YnJvYWRjYXN0cywgZXZlbnRJZCwgb3BlcmF0aW9ucywgcmVzb3VyY2VUeXBlLCBzY29wZUF0dHJpYnV0ZXMsIHNlcmlhbGl6ZSwgLi4ucmVzdERlY2xhcmF0aW9ufSA9IG5vcm1hbGl6ZWRQdWJsaXNoXG4gIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMocmVzdERlY2xhcmF0aW9uKVxuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gc3RhdGljIHN5bmMgcHVibGlzaCByZWNlaXZlZCB1bmtub3duIGtleXM6ICR7dW5rbm93bktleXMuam9pbihcIiwgXCIpfSAoc3VwcG9ydGVkOiBicm9hZGNhc3RzLCBldmVudElkIChkZXByZWNhdGVkKSwgb3BlcmF0aW9ucywgcmVzb3VyY2VUeXBlLCBzY29wZUF0dHJpYnV0ZXMsIHNlcmlhbGl6ZSlgKVxuICB9XG4gIGlmIChzZXJpYWxpemUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc2VyaWFsaXplICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBzdGF0aWMgc3luYyBwdWJsaXNoIHNlcmlhbGl6ZSBtdXN0IGJlIGEgZnVuY3Rpb24gYnVpbGRpbmcgdGhlIHB1Ymxpc2hlZCBwYXlsb2FkLCBnb3Q6ICR7U3RyaW5nKHNlcmlhbGl6ZSl9YClcbiAgfVxuICBpZiAob3BlcmF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wZXJhdGlvbnMpIHx8IG9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBzdGF0aWMgc3luYyBwdWJsaXNoIG9wZXJhdGlvbnMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheSBvZiBjcmVhdGUvdXBkYXRlL2Rlc3Ryb3lgKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgIGlmICghKG9wZXJhdGlvbiBpbiBQVUJMSVNIRURfQ0FMTEJBQ0tfTkFNRVMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggb3BlcmF0aW9ucyBtdXN0IGJlIGNyZWF0ZS91cGRhdGUvZGVzdHJveSwgZ290OiAke1N0cmluZyhvcGVyYXRpb24pfWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBicm9hZGNhc3RzLFxuICAgIG1vZGVsQ2xhc3MsXG4gICAgb3BlcmF0aW9uczogb3BlcmF0aW9ucyA9PT0gdW5kZWZpbmVkID8gREVGQVVMVF9QVUJMSVNIRURfT1BFUkFUSU9OUyA6IG9wZXJhdGlvbnMsXG4gICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGUgPT09IHVuZGVmaW5lZCA/IG1vZGVsTmFtZSA6IHJlc291cmNlVHlwZSxcbiAgICBzY29wZVBsYW46IHNjb3BlUGxhbkZvcih7ZXZlbnRJZCwgbW9kZWxDbGFzcywgbW9kZWxOYW1lLCBzY29wZUF0dHJpYnV0ZXMsIHN5bmNNb2RlbCwgc3luY1Njb3BlQXR0cmlidXRlc30pLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplID09PSB1bmRlZmluZWQgPyBkZWZhdWx0U2VyaWFsaXplZEF0dHJpYnV0ZXMgOiBzZXJpYWxpemVcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZXMgdGhlIHNjb3BlIHBsYW4gcGFydGl0aW9uaW5nIGEgcHVibGlzaGVkIG1vZGVsJ3MgY2hhbmdlczogb25lIGVudHJ5XG4gKiBwZXIgc2NvcGUgYXR0cmlidXRlIGRlY2xhcmVkIG9uIHRoZSBzeW5jIG1vZGVsIChgc3RhdGljXG4gKiBzeW5jU2NvcGVBdHRyaWJ1dGVzYCksIGVhY2ggcmVhZGluZyB0aGUgcmVjb3JkIGF0dHJpYnV0ZSBuYW1lZCBsaWtlIHRoZVxuICogc2NvcGUgYXR0cmlidXRlIChvdmVycmlkYWJsZSB0aHJvdWdoIHRoZSBkZWNsYXJhdGlvbidzIGBzY29wZUF0dHJpYnV0ZXNgXG4gKiBuYW1lIG1hcCksIG9yIHRoZSByZWNvcmQncyBvd24gaWQgd2hlbiB0aGUgbW9kZWwgaGFzIG5vIHN1Y2ggYXR0cmlidXRlXG4gKiAoc2NvcGUtcm9vdCBtb2RlbHMpLiBUaGUgZGVwcmVjYXRlZCBgZXZlbnRJZGAgZGVjbGFyYXRpb24gZm9ybXMgbWFwIHRvIGFcbiAqIGZpeGVkIGBldmVudElkYC9gZXZlbnRfaWRgIHBsYW4gZm9yIDEuMC41MDMgY29tcGF0aWJpbGl0eS5cbiAqIEBwYXJhbSB7e2V2ZW50SWQ6IGltcG9ydChcIi4vc3luYy1wdWJsaXNoZXItdHlwZXMuanNcIikuU3luY1B1Ymxpc2hEZWNsYXJhdGlvbkNvbmZpZ1tcImV2ZW50SWRcIl0sIG1vZGVsQ2xhc3M6ID8sIG1vZGVsTmFtZTogc3RyaW5nLCBzY29wZUF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQsIHN5bmNNb2RlbDogPywgc3luY1Njb3BlQXR0cmlidXRlczogc3RyaW5nW10gfCBudWxsfX0gYXJncyAtIERlY2xhcmF0aW9uIGFuZCBzeW5jLW1vZGVsIHNjb3BlIGFyZ3MuXG4gKiBAcmV0dXJucyB7QXJyYXk8aW1wb3J0KFwiLi9zeW5jLXB1Ymxpc2hlci10eXBlcy5qc1wiKS5TeW5jUHVibGlzaGVyU2NvcGVQbGFuRW50cnk+fSBEZXJpdmVkIHNjb3BlIHBsYW4uXG4gKi9cbmZ1bmN0aW9uIHNjb3BlUGxhbkZvcih7ZXZlbnRJZCwgbW9kZWxDbGFzcywgbW9kZWxOYW1lLCBzY29wZUF0dHJpYnV0ZXMsIHN5bmNNb2RlbCwgc3luY1Njb3BlQXR0cmlidXRlc30pIHtcbiAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBPYmplY3QudmFsdWVzKG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpKVxuXG4gIGlmIChldmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc2NvcGVBdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggY2FuJ3QgZGVjbGFyZSBib3RoIHNjb3BlQXR0cmlidXRlcyBhbmQgdGhlIGRlcHJlY2F0ZWQgZXZlbnRJZCBmb3JtYClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBldmVudElkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBbe2NvbHVtbk5hbWU6IFwiZXZlbnRfaWRcIiwgcmVjb3JkQXR0cmlidXRlOiBudWxsLCByZXNvbHZlcjogZXZlbnRJZCwgc2NvcGVBdHRyaWJ1dGU6IFwiZXZlbnRJZFwifV1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBldmVudElkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBzdGF0aWMgc3luYyBwdWJsaXNoIGV2ZW50SWQgbXVzdCBiZSBhbiBhdHRyaWJ1dGUtbmFtZSBzdHJpbmcgKG9yIGEgZGVwcmVjYXRlZCByZXNvbHZlciBmdW5jdGlvbiksIGdvdDogJHtTdHJpbmcoZXZlbnRJZCl9YClcbiAgICB9XG4gICAgaWYgKCFhdHRyaWJ1dGVOYW1lcy5pbmNsdWRlcyhldmVudElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gc3RhdGljIHN5bmMgcHVibGlzaCBldmVudElkIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0IG9uIHRoZSBtb2RlbDogJHtldmVudElkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIFt7Y29sdW1uTmFtZTogXCJldmVudF9pZFwiLCByZWNvcmRBdHRyaWJ1dGU6IGV2ZW50SWQsIHJlc29sdmVyOiB1bmRlZmluZWQsIHNjb3BlQXR0cmlidXRlOiBcImV2ZW50SWRcIn1dXG4gIH1cblxuICBpZiAoc2NvcGVBdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgJiYgIXN5bmNTY29wZUF0dHJpYnV0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBzdGF0aWMgc3luYyBwdWJsaXNoIGRlY2xhcmVzIHNjb3BlQXR0cmlidXRlcyBidXQgdGhlIHN5bmMgbW9kZWwgZGVjbGFyZXMgbm8gc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgKVxuICB9XG5cbiAgaWYgKCFzeW5jU2NvcGVBdHRyaWJ1dGVzKSByZXR1cm4gW11cblxuICBpZiAoc2NvcGVBdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBzY29wZUF0dHJpYnV0ZXMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzY29wZUF0dHJpYnV0ZXMpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggc2NvcGVBdHRyaWJ1dGVzIG11c3QgYmUgYW4gb2JqZWN0IG1hcHBpbmcgc2NvcGUgYXR0cmlidXRlcyB0byByZWNvcmQgYXR0cmlidXRlIG5hbWVzLCBnb3Q6ICR7U3RyaW5nKHNjb3BlQXR0cmlidXRlcyl9YClcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2NvcGVBdHRyaWJ1dGUgb2YgT2JqZWN0LmtleXMoc2NvcGVBdHRyaWJ1dGVzIHx8IHt9KSkge1xuICAgIGlmICghc3luY1Njb3BlQXR0cmlidXRlcy5pbmNsdWRlcyhzY29wZUF0dHJpYnV0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggc2NvcGVBdHRyaWJ1dGVzIHJlY2VpdmVkIHVua25vd24gc2NvcGUgYXR0cmlidXRlOiAke3Njb3BlQXR0cmlidXRlfSAodGhlIHN5bmMgbW9kZWwgZGVjbGFyZXM6ICR7c3luY1Njb3BlQXR0cmlidXRlcy5qb2luKFwiLCBcIil9KWApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bmNTY29wZUF0dHJpYnV0ZXMubWFwKChzY29wZUF0dHJpYnV0ZSkgPT4ge1xuICAgIGNvbnN0IGRlY2xhcmVkUmVjb3JkQXR0cmlidXRlID0gc2NvcGVBdHRyaWJ1dGVzPy5bc2NvcGVBdHRyaWJ1dGVdXG5cbiAgICBpZiAoZGVjbGFyZWRSZWNvcmRBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBkZWNsYXJlZFJlY29yZEF0dHJpYnV0ZSAhPT0gXCJzdHJpbmdcIiB8fCAhYXR0cmlidXRlTmFtZXMuaW5jbHVkZXMoZGVjbGFyZWRSZWNvcmRBdHRyaWJ1dGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IHN0YXRpYyBzeW5jIHB1Ymxpc2ggc2NvcGVBdHRyaWJ1dGVzLiR7c2NvcGVBdHRyaWJ1dGV9IG11c3QgbmFtZSBhbiBleGlzdGluZyByZWNvcmQgYXR0cmlidXRlLCBnb3Q6ICR7U3RyaW5nKGRlY2xhcmVkUmVjb3JkQXR0cmlidXRlKX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge2NvbHVtbk5hbWU6IHN5bmNTY29wZUNvbHVtbk5hbWUoe3Njb3BlQXR0cmlidXRlLCBzeW5jTW9kZWx9KSwgcmVjb3JkQXR0cmlidXRlOiBkZWNsYXJlZFJlY29yZEF0dHJpYnV0ZSwgcmVzb2x2ZXI6IHVuZGVmaW5lZCwgc2NvcGVBdHRyaWJ1dGV9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbk5hbWU6IHN5bmNTY29wZUNvbHVtbk5hbWUoe3Njb3BlQXR0cmlidXRlLCBzeW5jTW9kZWx9KSxcbiAgICAgIHJlY29yZEF0dHJpYnV0ZTogYXR0cmlidXRlTmFtZXMuaW5jbHVkZXMoc2NvcGVBdHRyaWJ1dGUpID8gc2NvcGVBdHRyaWJ1dGUgOiBudWxsLFxuICAgICAgcmVzb2x2ZXI6IHVuZGVmaW5lZCxcbiAgICAgIHNjb3BlQXR0cmlidXRlXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzeW5jLXJvdyBjb2x1bW4gcGVyc2lzdGluZyBhIGRlY2xhcmVkIHNjb3BlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7e3Njb3BlQXR0cmlidXRlOiBzdHJpbmcsIHN5bmNNb2RlbDogP319IGFyZ3MgLSBTY29wZSBhdHRyaWJ1dGUgYW5kIHN5bmMgbW9kZWwuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTeW5jLXJvdyBjb2x1bW4gbmFtZS5cbiAqL1xuZnVuY3Rpb24gc3luY1Njb3BlQ29sdW1uTmFtZSh7c2NvcGVBdHRyaWJ1dGUsIHN5bmNNb2RlbH0pIHtcbiAgY29uc3QgY29sdW1uTmFtZSA9IHN5bmNNb2RlbC5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClbc2NvcGVBdHRyaWJ1dGVdXG5cbiAgaWYgKCFjb2x1bW5OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3N5bmNNb2RlbC5uYW1lfSBkZWNsYXJlcyB0aGUgc3luYyBzY29wZSBhdHRyaWJ1dGUgJHtzY29wZUF0dHJpYnV0ZX0gYnV0IGhhcyBubyBtYXRjaGluZyBjb2x1bW4gZm9yIGl0YClcbiAgfVxuXG4gIHJldHVybiBjb2x1bW5OYW1lXG59XG5cbi8qKlxuICogRGVmYXVsdCBwdWJsaXNoIHNlcmlhbGl6ZXI6IHRoZSByZWNvcmQncyBhdHRyaWJ1dGVzIHdpdGggRGF0ZSB2YWx1ZXNcbiAqIHNlcmlhbGl6ZWQgdG8gSVNPIHN0cmluZ3MuXG4gKiBAcGFyYW0gez99IHJlY29yZCAtIE11dGF0ZWQgc2VydmVyIG1vZGVsIHJlY29yZC5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gU2VyaWFsaXplZCBhdHRyaWJ1dGVzIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZXJpYWxpemVkQXR0cmlidXRlcyhyZWNvcmQpIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgY29uc3QgYXR0cmlidXRlcyA9IHsuLi5yZWNvcmQuYXR0cmlidXRlcygpfVxuXG4gIGZvciAoY29uc3QgW2F0dHJpYnV0ZU5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSB2YWx1ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICByZXR1cm4gYXR0cmlidXRlc1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgZGF0ZS1saWtlIHZhbHVlIHRvIGFuIElTTyBzdHJpbmcsIG1hdGNoaW5nIHRoZSBjaGFuZ2UtZmVlZFxuICogc2VyaWFsaXplcidzIGNvbnZlbnRpb24gZm9yIHRoZSBzeW5jIGVudHJ5J3MgcHVibGljIHVwZGF0ZWQtYXQgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0RhdGUgfCBudWxsfSB2YWx1ZSAtIFBlcnNpc3RlZCB1cGRhdGVkLWF0IHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gSVNPIGRhdGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiB0aGUgcGVyc2lzdGVkIHJvdyBoYXMgbm8gdmFsaWQgdXBkYXRlZC1hdCB0aW1lc3RhbXAuXG4gKi9cbmZ1bmN0aW9uIGlzb0RhdGUodmFsdWUpIHtcbiAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB8fCBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlB1Ymxpc2hlZCBzeW5jIHJvdyBtdXN0IGhhdmUgYSB2YWxpZCB1cGRhdGVkQXQgdGltZXN0YW1wLlwiKVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKClcbn1cbiJdfQ==
@@ -111,16 +111,20 @@ export default class SyncResourceBase<TModelClass extends typeof import("../data
111
111
  * checks whether the published change's feed row is visible within that
112
112
  * scope. Apps get this for free from the scoping they already declared;
113
113
  * override only for custom per-delivery rules.
114
- * @param {{params: Record<string, ?>, scope: SerializedChangesScope | null, sync: {resourceId: string, resourceType: string}}} args - Request params, subscription scope, and the published change's identity.
114
+ *
115
+ * The `sync` argument is the complete broadcast sync entry — immutable
116
+ * sync-row id, actor-specific metadata, and any other publisher fields —
117
+ * with `resourceId`/`resourceType` normalized to strings, so an override
118
+ * can authorize concurrent targeted and shared broadcasts for the same
119
+ * resource identity independently by their exact-row identity. The channel
120
+ * never mutates the published entry; normalization happens on a copy.
121
+ * @param {{params: Record<string, ?>, scope: SerializedChangesScope | null, sync: ChangeDeliverableSyncEntry}} args - Request params, subscription scope, and the published sync entry.
115
122
  * @returns {Promise<boolean>} Whether the change may be delivered to this subscription.
116
123
  */
117
124
  changeDeliverable({ params, scope, sync }: {
118
125
  params: Record<string, unknown>;
119
126
  scope: SerializedChangesScope | null;
120
- sync: {
121
- resourceId: string;
122
- resourceType: string;
123
- };
127
+ sync: ChangeDeliverableSyncEntry;
124
128
  }): Promise<boolean>;
125
129
  /**
126
130
  * Resolves the replay service class handling replay mutations: the
@@ -150,5 +154,18 @@ export type SerializedChangesScope = {
150
154
  */
151
155
  resourceTypes: string[] | null;
152
156
  };
157
+ /**
158
+ * One published sync entry as delivered to the per-delivery access re-check
159
+ * ({@link SyncResourceBase#changeDeliverable}): the complete broadcast sync
160
+ * entry — including the immutable sync-row id, actor-specific metadata, and
161
+ * any other app fields the publisher put on it — with `resourceId` and
162
+ * `resourceType` normalized to strings. Apps authorizing by exact-row
163
+ * identity read the extra fields; overrides that only read
164
+ * `resourceId`/`resourceType` keep working unchanged.
165
+ */
166
+ export type ChangeDeliverableSyncEntry = Record<string, unknown> & {
167
+ resourceId: string;
168
+ resourceType: string;
169
+ };
153
170
  import FrontendModelBaseResource from "../frontend-model-resource/base-resource.js";
154
171
  //# sourceMappingURL=sync-resource-base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-resource-base.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-resource-base.js"],"names":[],"mappings":"AAkBA;;;;;;;;GAQG;AACH,sCAHqE,WAAW,SAAnE,cAAe,6BAA6B,EAAE,OAAQ;IAIjE;;;;OAIG;IACH,2BAFU,cAAc,mCAAmC,EAAE,OAAO,GAAG,SAAS,CAE3C;IAErC;;;;iCAI6B;IAC7B,2BADU,MAAM,EAAE,GAAG,IAAI,CACO;IAgBhC;;;;;;;OAOG;IACH,oCAJG;QAAkG,KAAK,EAA/F,OAAO,6CAA6C,EAAE,6BAA6B;QACK,MAAM,EAA9F,OAAO,6CAA6C,EAAE,2BAA2B;KACzF,GAAU,OAAO,CA6BnB;IAMD;;;OAGG;IACH,WAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAStC;IAED;;;OAGG;IACH,UAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAQtC;IAED;;;;OAIG;IACH,qBAHW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,sBAAsB,GAAG,IAAI,CAuBzC;IAED;;;;OAIG;IACH,iCAHW,OAAC,GACC,MAAM,EAAE,GAAG,IAAI,CAQ3B;IAED;;;;OAIG;IACH,qCAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAC/D;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAA;KAAC,CAQvD;IAED;;;;;;OAMG;IACH,sBAFa,OAAO,mCAAmC,EAAE,OAAO,CAY/D;IAED;;;OAGG;IACH,qBAFa,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAI7B;IAED;;;OAGG;IACH,kBAFa,cAAc,6BAA6B,EAAE,OAAO,CAQhE;IAED;;;;OAIG;IACH,wBAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAC/D,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,yBAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,OAAO,wCAAwC,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAChI,IAAI,CAIhB;IAED;;;;;;;;;;;OAWG;IACH,2CAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAC,CAAA;KAAC,GACjH,OAAO,CAAC,OAAO,CAAC,CAS5B;IAED;;;;;;;;OAQG;IACH,sBAFa,cAAc,mCAAmC,EAAE,OAAO,CAOtE;CACF;;;;;;;;gBAjQa,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;kBACjB,MAAM,GAAG,IAAI;;;;mBACb,MAAM,EAAE,GAAG,IAAI;;sCAVS,6CAA6C"}
1
+ {"version":3,"file":"sync-resource-base.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-resource-base.js"],"names":[],"mappings":"AA6BA;;;;;;;;GAQG;AACH,sCAHqE,WAAW,SAAnE,cAAe,6BAA6B,EAAE,OAAQ;IAIjE;;;;OAIG;IACH,2BAFU,cAAc,mCAAmC,EAAE,OAAO,GAAG,SAAS,CAE3C;IAErC;;;;iCAI6B;IAC7B,2BADU,MAAM,EAAE,GAAG,IAAI,CACO;IAgBhC;;;;;;;OAOG;IACH,oCAJG;QAAkG,KAAK,EAA/F,OAAO,6CAA6C,EAAE,6BAA6B;QACK,MAAM,EAA9F,OAAO,6CAA6C,EAAE,2BAA2B;KACzF,GAAU,OAAO,CA6BnB;IAMD;;;OAGG;IACH,WAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAStC;IAED;;;OAGG;IACH,UAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAQtC;IAED;;;;OAIG;IACH,qBAHW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,sBAAsB,GAAG,IAAI,CAuBzC;IAED;;;;OAIG;IACH,iCAHW,OAAC,GACC,MAAM,EAAE,GAAG,IAAI,CAQ3B;IAED;;;;OAIG;IACH,qCAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAC/D;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAA;KAAC,CAQvD;IAED;;;;;;OAMG;IACH,sBAFa,OAAO,mCAAmC,EAAE,OAAO,CAY/D;IAED;;;OAGG;IACH,qBAFa,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAI7B;IAED;;;OAGG;IACH,kBAFa,cAAc,6BAA6B,EAAE,OAAO,CAQhE;IAED;;;;OAIG;IACH,wBAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAC/D,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,yBAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,OAAO,wCAAwC,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAA;KAAC,GAChI,IAAI,CAIhB;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,2CAHW;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,0BAA0B,CAAA;KAAC,GACjG,OAAO,CAAC,OAAO,CAAC,CAS5B;IAED;;;;;;;;OAQG;IACH,sBAFa,cAAc,mCAAmC,EAAE,OAAO,CAOtE;CACF;;;;;;;;gBAnRa,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;kBACjB,MAAM,GAAG,IAAI;;;;mBACb,MAAM,EAAE,GAAG,IAAI;;;;;;;;;;;yCAWhB,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAC;sCArBrC,6CAA6C"}
@@ -11,6 +11,16 @@ import VelociousError from "../velocious-error.js";
11
11
  * @property {string | null} resourceType - Client resource/model name the scope was declared for, or null for the all-types (user) scope: one scope covering every resource type this resource authorizes for the caller, so a sync authorizes once however many types it serves.
12
12
  * @property {string[] | null} resourceTypes - For the all-types scope, the resource types the client can apply. A cheap delivery/type filter only - it narrows, never widens, what the app's authorization already allows. Null for a type-declared scope.
13
13
  */
14
+ /**
15
+ * One published sync entry as delivered to the per-delivery access re-check
16
+ * ({@link SyncResourceBase#changeDeliverable}): the complete broadcast sync
17
+ * entry — including the immutable sync-row id, actor-specific metadata, and
18
+ * any other app fields the publisher put on it — with `resourceId` and
19
+ * `resourceType` normalized to strings. Apps authorizing by exact-row
20
+ * identity read the extra fields; overrides that only read
21
+ * `resourceId`/`resourceType` keep working unchanged.
22
+ * @typedef {Record<string, ?> & {resourceId: string, resourceType: string}} ChangeDeliverableSyncEntry
23
+ */
14
24
  const QUICK_SEARCH_COLUMN = "quickSearch";
15
25
  /**
16
26
  * Base resource for Velocious sync endpoints.
@@ -205,7 +215,14 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
205
215
  * checks whether the published change's feed row is visible within that
206
216
  * scope. Apps get this for free from the scoping they already declared;
207
217
  * override only for custom per-delivery rules.
208
- * @param {{params: Record<string, ?>, scope: SerializedChangesScope | null, sync: {resourceId: string, resourceType: string}}} args - Request params, subscription scope, and the published change's identity.
218
+ *
219
+ * The `sync` argument is the complete broadcast sync entry — immutable
220
+ * sync-row id, actor-specific metadata, and any other publisher fields —
221
+ * with `resourceId`/`resourceType` normalized to strings, so an override
222
+ * can authorize concurrent targeted and shared broadcasts for the same
223
+ * resource identity independently by their exact-row identity. The channel
224
+ * never mutates the published entry; normalization happens on a copy.
225
+ * @param {{params: Record<string, ?>, scope: SerializedChangesScope | null, sync: ChangeDeliverableSyncEntry}} args - Request params, subscription scope, and the published sync entry.
209
226
  * @returns {Promise<boolean>} Whether the change may be delivered to this subscription.
210
227
  */
211
228
  async changeDeliverable({ params, scope, sync }) {
@@ -229,4 +246,4 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
229
246
  return ResourceClass.ReplayServiceClass ?? SharedResource?.ReplayServiceClass ?? SyncEnvelopeReplayService;
230
247
  }
231
248
  }
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXNvdXJjZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1yZXNvdXJjZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFFNUMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLHlCQUF5QixNQUFNLG1DQUFtQyxDQUFBO0FBQ3pFLE9BQU8sMEJBQTBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUUsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUE7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLHlCQUF5QjtJQUNyRTs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQTtJQUVyQzs7OztpQ0FJNkI7SUFDN0IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtJQUVoQzs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUFFLE9BQU07UUFFbEQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDO1FBQzlCLE1BQU0sa0JBQWtCLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsa0JBQWtCLENB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QixJQUFJLGNBQWMsRUFBRSxrQkFBa0IsSUFBSSx5QkFBeUIsQ0FBQTtJQUM1RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Zm9yY2VkTm9uQmxhbmtTdHJpbmd9IGZyb20gXCJ0eXBhbmljXCJcblxuaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIlxuaW1wb3J0IFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2UgZnJvbSBcIi4vc3luYy1lbnZlbG9wZS1yZXBsYXktc2VydmljZS5qc1wiXG5pbXBvcnQgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2UgZnJvbSBcIi4vc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBPcHRpb25hbCBjbGllbnQtZGVjbGFyZWQgc3luYyBzY29wZSBjYXJyaWVkIG9uIGEgY2hhbmdlcyByZXF1ZXN0LlxuICogQHR5cGVkZWYge29iamVjdH0gU2VyaWFsaXplZENoYW5nZXNTY29wZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gY29uZGl0aW9ucyAtIFBsYWluIGF0dHJpYnV0ZSBjb25kaXRpb25zIGZyb20gdGhlIGNsaWVudCBxdWVyeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVzb3VyY2VUeXBlIC0gQ2xpZW50IHJlc291cmNlL21vZGVsIG5hbWUgdGhlIHNjb3BlIHdhcyBkZWNsYXJlZCBmb3IsIG9yIG51bGwgZm9yIHRoZSBhbGwtdHlwZXMgKHVzZXIpIHNjb3BlOiBvbmUgc2NvcGUgY292ZXJpbmcgZXZlcnkgcmVzb3VyY2UgdHlwZSB0aGlzIHJlc291cmNlIGF1dGhvcml6ZXMgZm9yIHRoZSBjYWxsZXIsIHNvIGEgc3luYyBhdXRob3JpemVzIG9uY2UgaG93ZXZlciBtYW55IHR5cGVzIGl0IHNlcnZlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW10gfCBudWxsfSByZXNvdXJjZVR5cGVzIC0gRm9yIHRoZSBhbGwtdHlwZXMgc2NvcGUsIHRoZSByZXNvdXJjZSB0eXBlcyB0aGUgY2xpZW50IGNhbiBhcHBseS4gQSBjaGVhcCBkZWxpdmVyeS90eXBlIGZpbHRlciBvbmx5IC0gaXQgbmFycm93cywgbmV2ZXIgd2lkZW5zLCB3aGF0IHRoZSBhcHAncyBhdXRob3JpemF0aW9uIGFscmVhZHkgYWxsb3dzLiBOdWxsIGZvciBhIHR5cGUtZGVjbGFyZWQgc2NvcGUuXG4gKi9cbmNvbnN0IFFVSUNLX1NFQVJDSF9DT0xVTU4gPSBcInF1aWNrU2VhcmNoXCJcblxuLyoqXG4gKiBCYXNlIHJlc291cmNlIGZvciBWZWxvY2lvdXMgc3luYyBlbmRwb2ludHMuXG4gKlxuICogVmVsb2Npb3VzIG93bnMgdGhlIGNoYW5nZXMvcmVwbGF5IG9yY2hlc3RyYXRpb24gKHNjb3BlIHBhcnNpbmcsIGZlZWQgcGFnaW5nLFxuICogcmVwbGF5IGRlbGVnYXRpb24sIHJlc3BvbnNlIHNoYXBlKSB3aGlsZSBhcHBzIHN1YmNsYXNzIGFuZCBvbmx5IGRlY2xhcmVcbiAqIGF1dGhvcml6YXRpb24sIGZlZWQgc2NvcGluZywgYW5kIHRoZWlyIHJlcGxheSBzZXJ2aWNlLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IFtUTW9kZWxDbGFzcz10eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRdXG4gKiBAYXVnbWVudHMge0Zyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2U8VE1vZGVsQ2xhc3M+fVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jUmVzb3VyY2VCYXNlIGV4dGVuZHMgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXBsYXkgc2VydmljZSBjbGFzcyBoYW5kbGluZyByZXBsYXkgbXV0YXRpb25zIGZvciB0aGlzIHJlc291cmNlLFxuICAgKiBkZWNsYXJlZCBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjcmVwbGF5U2VydmljZUNsYXNzfS5cbiAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyBSZXBsYXlTZXJ2aWNlQ2xhc3MgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGVjbGFyYXRpdmUgcXVpY2stc2VhcmNoIHRleHQgY29sdW1ucy4gV2hlbiBkZWNsYXJlZCwgYW4gaW5kZXggc2VhcmNoIG9uXG4gICAqIHRoZSBwc2V1ZG8tY29sdW1uIGBxdWlja1NlYXJjaGAgZXhwYW5kcyB0byBhbiBPUiBvZiBMSUtFIGNvbmRpdGlvbnMgb3ZlclxuICAgKiB0aGVzZSByb290LXRhYmxlIGNvbHVtbnMgaW5zdGVhZCBvZiBoaXR0aW5nIHRoZSBjb250cm9sbGVyIGRlZmF1bHQuXG4gICAqIEB0eXBlIHtzdHJpbmdbXSB8IG51bGx9ICovXG4gIHN0YXRpYyBxdWlja1NlYXJjaENvbHVtbnMgPSBudWxsXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZnJvbnRlbmQtbW9kZWwgaW5kZXggc2VhcmNoZXMsIGV4cGFuZGluZyBkZWNsYXJlZCBxdWljayBzZWFyY2hlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZWFyY2ggYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbnRyb2xsZXJ9IGFyZ3MuY29udHJvbGxlciAtIENvbnRyb2xsZXIgaGFuZGxpbmcgdGhlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQW55UXVlcnl9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZVNlYXJjaH0gYXJncy5zZWFyY2ggLSBTZWFyY2ggcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbEluZGV4U2VhcmNoKHtjb250cm9sbGVyLCBxdWVyeSwgc2VhcmNofSkge1xuICAgIGlmICh0aGlzLmFwcGx5UXVpY2tTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KSkgcmV0dXJuXG5cbiAgICBzdXBlci5hcHBseUZyb250ZW5kTW9kZWxJbmRleFNlYXJjaCh7Y29udHJvbGxlciwgcXVlcnksIHNlYXJjaH0pXG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kcyBhIGBxdWlja1NlYXJjaGAgcHNldWRvLWNvbHVtbiBzZWFyY2ggaW50byBhbiBPUiBvZiBMSUtFIGNvbmRpdGlvbnNcbiAgICogb3ZlciB0aGUgZGVjbGFyZWQge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UucXVpY2tTZWFyY2hDb2x1bW5zfS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZWFyY2ggYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUFueVF1ZXJ5fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgdG8gZmlsdGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlU2VhcmNofSBhcmdzLnNlYXJjaCAtIFNlYXJjaCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc2VhcmNoIHdhcyBoYW5kbGVkIGFzIGEgcXVpY2sgc2VhcmNoLlxuICAgKi9cbiAgYXBwbHlRdWlja1NlYXJjaCh7cXVlcnksIHNlYXJjaH0pIHtcbiAgICBjb25zdCBxdWlja1NlYXJjaENvbHVtbnMgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikucXVpY2tTZWFyY2hDb2x1bW5zXG5cbiAgICBpZiAoIXF1aWNrU2VhcmNoQ29sdW1ucyB8fCBxdWlja1NlYXJjaENvbHVtbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoc2VhcmNoLnBhdGgubGVuZ3RoID4gMCB8fCBzZWFyY2guY29sdW1uICE9PSBRVUlDS19TRUFSQ0hfQ09MVU1OKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChzZWFyY2gub3BlcmF0b3IgIT09IFwibGlrZVwiKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBxdWljayBzZWFyY2ggbXVzdCB1c2UgdGhlIGxpa2Ugb3BlcmF0b3IuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1xdWljay1zZWFyY2hcIn0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZWFyY2gudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIHF1aWNrIHNlYXJjaCBtdXN0IGJlIGEgc3RyaW5nLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtcXVpY2stc2VhcmNoXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IHNlYXJjaC52YWx1ZS50cmltKClcblxuICAgIGlmICghdHJpbW1lZFZhbHVlKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgdGFibGVTcWwgPSBxdWVyeS5kcml2ZXIucXVvdGVUYWJsZShxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oKSlcbiAgICBjb25zdCBsaWtlVmFsdWUgPSBgJSR7dHJpbW1lZFZhbHVlfSVgXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHF1aWNrU2VhcmNoQ29sdW1ucy5tYXAoKGNvbHVtbk5hbWUpID0+IChcbiAgICAgIGAke3RhYmxlU3FsfS4ke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX0gTElLRSAke3F1ZXJ5LmRyaXZlci5xdW90ZShsaWtlVmFsdWUpfWBcbiAgICApKVxuXG4gICAgcXVlcnkud2hlcmUoYCgke2NvbmRpdGlvbnMuam9pbihcIiBPUiBcIil9KWApXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gVGhlIGRlY2xhcmF0aXZlIGBzdGF0aWMgd3JpdGFibGVBdHRyaWJ1dGVzYCBwZXJtaXQgbGlzdCBsaXZlcyBvblxuICAvLyBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHNvIGV2ZXJ5IGZyb250ZW5kLW1vZGVsIHJlc291cmNlIGNhbiBkZWNsYXJlXG4gIC8vIG9uZTsgc3luYyByZXNvdXJjZXMgaW5oZXJpdCBpdCB1bmNoYW5nZWQuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdGFibGUgY2hhbmdlLWZlZWQgcGFnZSBhZnRlciBhcHAgYXV0aG9yaXphdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBDaGFuZ2UtZmVlZCBwYWdlIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNoYW5nZXMoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5wYXJhbXMoKVxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5jaGFuZ2VzU2NvcGUocGFyYW1zKVxuXG4gICAgYXdhaXQgdGhpcy5hdXRob3JpemVDaGFuZ2VzKHtwYXJhbXMsIHNjb3BlfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5nZUZlZWRTZXJ2aWNlKHtwYXJhbXMsIHNjb3BlfSkuY2hhbmdlcygpXG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5cyBjbGllbnQgc3luYyBlbnZlbG9wZXMgdGhyb3VnaCB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IFJlcGxheSByZXN1bHQgd2l0aCBwZXItc3luYyBzdGF0ZXMuXG4gICAqL1xuICBhc3luYyByZXBsYXkoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5idWlsZFJlcGxheVNlcnZpY2UoKS5yZXBsYXkodGhpcy5wYXJhbXMoKSlcblxuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImVycm9yXCIpIHJldHVybiByZXN1bHRcblxuICAgIHJldHVybiB7c3RhdHVzOiBcInN1Y2Nlc3NcIiwgc3luY3M6IHJlc3VsdC5zeW5jc31cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG9wdGlvbmFsIGNsaWVudC1kZWNsYXJlZCBzY29wZSBmcm9tIHJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHJldHVybnMge1NlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfSBQYXJzZWQgc2NvcGUsIG9yIG51bGwgd2hlbiB0aGUgY2xpZW50IHNlbnQgbm9uZS5cbiAgICovXG4gIGNoYW5nZXNTY29wZShwYXJhbXMpIHtcbiAgICBjb25zdCBzY29wZSA9IHBhcmFtcy5zY29wZVxuXG4gICAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQgfHwgc2NvcGUgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBpZiAodHlwZW9mIHNjb3BlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2NvcGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY2hhbmdlcyBzY29wZSBtdXN0IGJlIGFuIG9iamVjdCwgZ290OiAke1N0cmluZyhzY29wZSl9YClcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZVBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChzY29wZSlcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGUgPT09IG51bGwgfHwgc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlID09PSB1bmRlZmluZWRcbiAgICAgID8gbnVsbFxuICAgICAgOiBmb3JjZWROb25CbGFua1N0cmluZyhzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGUsIFwicmVzb3VyY2VUeXBlXCIpXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlcyA9IHRoaXMuY2hhbmdlc1Njb3BlUmVzb3VyY2VUeXBlcyhzY29wZVBhcmFtcy5yZXNvdXJjZVR5cGVzKVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBzY29wZVBhcmFtcy5jb25kaXRpb25zXG5cbiAgICBpZiAoIWNvbmRpdGlvbnMgfHwgdHlwZW9mIGNvbmRpdGlvbnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb25kaXRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgc2NvcGUuY29uZGl0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCwgZ290OiAke1N0cmluZyhjb25kaXRpb25zKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7Y29uZGl0aW9uczogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKGNvbmRpdGlvbnMpLCByZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZXN9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBvcHRpb25hbCByZXNvdXJjZS10eXBlIGxpc3QgYW4gYWxsLXR5cGVzIHNjb3BlIGRlY2xhcmVzLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gUmF3IGBzY29wZS5yZXNvdXJjZVR5cGVzYCBwYXJhbS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gRGVjbGFyZWQgcmVzb3VyY2UgdHlwZXMsIG9yIG51bGwgd2hlbiB0aGUgY2xpZW50IHNlbnQgbm9uZS5cbiAgICovXG4gIGNoYW5nZXNTY29wZVJlc291cmNlVHlwZXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlLnJlc291cmNlVHlwZXMgbXVzdCBiZSBhbiBhcnJheSwgZ290OiAke1N0cmluZyh2YWx1ZSl9YClcblxuICAgIHJldHVybiB2YWx1ZS5tYXAoKHJlc291cmNlVHlwZSkgPT4gZm9yY2VkTm9uQmxhbmtTdHJpbmcocmVzb3VyY2VUeXBlLCBcInJlc291cmNlVHlwZXNcIikpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBjaGFuZ2UtZmVlZCBzZXJ2aWNlIHNlcnZpbmcgdGhpcyBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IGFyZ3MgLSBSZXF1ZXN0IHBhcmFtcyBhbmQgcGFyc2VkIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7e2NoYW5nZXM6ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fX0gQ2hhbmdlLWZlZWQgc2VydmljZS5cbiAgICovXG4gIGNoYW5nZUZlZWRTZXJ2aWNlKHtwYXJhbXMsIHNjb3BlfSkge1xuICAgIHJldHVybiBuZXcgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2Uoe1xuICAgICAgbW9kZWxDbGFzczogdGhpcy5zeW5jTW9kZWxDbGFzcygpLFxuICAgICAgcGFyYW1zLFxuICAgICAgc2NvcGVRdWVyeTogKHtxdWVyeX0pID0+IHRoaXMuc2NvcGVDaGFuZ2VzUXVlcnkoe3BhcmFtcywgcXVlcnksIHNjb3BlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYXBwIHJlcGxheSBzZXJ2aWNlIGhhbmRsaW5nIHRoaXMgcmVwbGF5IHJlcXVlc3QuIFRoZSByZXNvdXJjZVxuICAgKiBhYmlsaXR5LCBjb250ZXh0LCBjb25maWd1cmF0aW9uLCBhbmQgbG9jYWxzIGFyZSBwbHVtYmVkIGluIHVuZGVyIHRoZVxuICAgKiBhcHAtZGVjbGFyZWQge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UjcmVwbGF5U2VydmljZUFyZ3N9IChhcHAgYXJncyB3aW4pIHNvXG4gICAqIHRoZSBkZWZhdWx0IHJlc291cmNlLXJvdXRlZCByZXBsYXkgd29ya3Mgd2l0aG91dCB3aXJpbmcuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdH0gUmVwbGF5IHNlcnZpY2UgaW5zdGFuY2UuXG4gICAqL1xuICBidWlsZFJlcGxheVNlcnZpY2UoKSB7XG4gICAgY29uc3QgUmVwbGF5U2VydmljZUNsYXNzID0gdGhpcy5yZXBsYXlTZXJ2aWNlQ2xhc3MoKVxuXG4gICAgcmV0dXJuIG5ldyBSZXBsYXlTZXJ2aWNlQ2xhc3Moe1xuICAgICAgYWJpbGl0eTogdGhpcy5hYmlsaXR5LFxuICAgICAgYWJpbGl0eUNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dCgpLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb250cm9sbGVyID8gdGhpcy5jb250cm9sbGVySW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgICBsb2NhbHM6IHRoaXMuZ2V0TG9jYWxzKCksXG4gICAgICAuLi50aGlzLnJlcGxheVNlcnZpY2VBcmdzKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY29uc3RydWN0b3IgYXJncyBmb3IgdGhlIGFwcCByZXBsYXkgc2VydmljZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSBSZXBsYXkgc2VydmljZSBjb25zdHJ1Y3RvciBhcmdzLlxuICAgKi9cbiAgcmVwbGF5U2VydmljZUFyZ3MoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3luYyBtb2RlbCBjbGFzcyBiYWNraW5nIHRoZSBjaGFuZ2UgZmVlZC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gU3luYyBtb2RlbCBjbGFzcy5cbiAgICovXG4gIHN5bmNNb2RlbENsYXNzKCkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikuTW9kZWxDbGFzc1xuXG4gICAgaWYgKCFtb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBtdXN0IGRlZmluZSBzdGF0aWMgTW9kZWxDbGFzc2ApXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhvcml6ZXMgdGhlIGN1cnJlbnQgY29udGV4dCBmb3IgcmVhZGluZyB0aGUgcmVxdWVzdGVkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH19IF9hcmdzIC0gUmVxdWVzdCBwYXJhbXMgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gYWNjZXNzIGlzIGFsbG93ZWQ7IHRocm93cyBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyBhdXRob3JpemVDaGFuZ2VzKF9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY1Jlc291cmNlQmFzZSNhdXRob3JpemVDaGFuZ2VzIG11c3QgYmUgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFwcCB2aXNpYmlsaXR5IHNjb3Bpbmcgb250byB0aGUgY2hhbmdlLWZlZWQgcXVlcnkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHF1ZXJ5OiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9fSBfYXJncyAtIFJlcXVlc3QgcGFyYW1zLCBmZWVkIHF1ZXJ5LCBhbmQgcGFyc2VkIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNjb3BlQ2hhbmdlc1F1ZXJ5KF9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY1Jlc291cmNlQmFzZSNzY29wZUNoYW5nZXNRdWVyeSBtdXN0IGJlIGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIG9uZSBwdWJsaXNoZWQgY2hhbmdlIGlzIGRlbGl2ZXJhYmxlIHRvIGEgdXNlci1zY29wZVxuICAgKiBzdWJzY3JpcHRpb24gKHRoZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsJ3MgcGVyLWRlbGl2ZXJ5IGFjY2VzcyByZS1jaGVjaykuXG4gICAqIFRoZSBkZWZhdWx0IHJldXNlcyB0aGUgYXBwJ3MgYWJpbGl0eSBzY29waW5nOiBpdCBhcHBsaWVzXG4gICAqIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlI3Njb3BlQ2hhbmdlc1F1ZXJ5fSB0byB0aGUgY2hhbmdlLWZlZWQgbW9kZWwg4oCUIHdoaWNoXG4gICAqIGZvciBhbiBlbXB0eS1jb25kaXRpb25zIHVzZXIgc2NvcGUgZmFsbHMgYmFjayB0byBhYmlsaXR5IHNjb3Bpbmcg4oCUIGFuZFxuICAgKiBjaGVja3Mgd2hldGhlciB0aGUgcHVibGlzaGVkIGNoYW5nZSdzIGZlZWQgcm93IGlzIHZpc2libGUgd2l0aGluIHRoYXRcbiAgICogc2NvcGUuIEFwcHMgZ2V0IHRoaXMgZm9yIGZyZWUgZnJvbSB0aGUgc2NvcGluZyB0aGV5IGFscmVhZHkgZGVjbGFyZWQ7XG4gICAqIG92ZXJyaWRlIG9ubHkgZm9yIGN1c3RvbSBwZXItZGVsaXZlcnkgcnVsZXMuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbCwgc3luYzoge3Jlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fX0gYXJncyAtIFJlcXVlc3QgcGFyYW1zLCBzdWJzY3JpcHRpb24gc2NvcGUsIGFuZCB0aGUgcHVibGlzaGVkIGNoYW5nZSdzIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgY2hhbmdlIG1heSBiZSBkZWxpdmVyZWQgdG8gdGhpcyBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBhc3luYyBjaGFuZ2VEZWxpdmVyYWJsZSh7cGFyYW1zLCBzY29wZSwgc3luY30pIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc3luY01vZGVsQ2xhc3MoKS53aGVyZSh7fSlcblxuICAgIHRoaXMuc2NvcGVDaGFuZ2VzUXVlcnkoe3BhcmFtcywgcXVlcnksIHNjb3BlfSlcbiAgICBxdWVyeS53aGVyZSh7cmVzb3VyY2VfaWQ6IFN0cmluZyhzeW5jLnJlc291cmNlSWQpLCByZXNvdXJjZV90eXBlOiBTdHJpbmcoc3luYy5yZXNvdXJjZVR5cGUpfSlcblxuICAgIHJldHVybiBCb29sZWFuKGF3YWl0IHF1ZXJ5LmZpcnN0KCkpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJlcGxheSBzZXJ2aWNlIGNsYXNzIGhhbmRsaW5nIHJlcGxheSBtdXRhdGlvbnM6IHRoZVxuICAgKiBkZWNsYXJhdGl2ZSB7QGxpbmsgU3luY1Jlc291cmNlQmFzZS5SZXBsYXlTZXJ2aWNlQ2xhc3N9IHN0YXRpYyAoc2hhcmVkXG4gICAqIHJlc291cmNlcyBpbmNsdWRlZCkgd2hlbiBkZWNsYXJlZCwgb3RoZXJ3aXNlXG4gICAqIHtAbGluayBTeW5jRW52ZWxvcGVSZXBsYXlTZXJ2aWNlfSwgd2hpY2ggcmVzb3VyY2Utcm91dGVzIG11dGF0aW9ucyB0aHJvdWdoXG4gICAqIHRoZSBwbHVtYmVkIGNvbmZpZ3VyYXRpb24gcmVnaXN0cnkuIEFwcHMgZGVjbGFyZSB0aGUgc3RhdGljIGluc3RlYWQgb2ZcbiAgICogb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL3N5bmMtZW52ZWxvcGUtcmVwbGF5LXNlcnZpY2UuanNcIikuZGVmYXVsdH0gUmVwbGF5IHNlcnZpY2UgY2xhc3MuXG4gICAqL1xuICByZXBsYXlTZXJ2aWNlQ2xhc3MoKSB7XG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIFN5bmNSZXNvdXJjZUJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IFNoYXJlZFJlc291cmNlID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZSB8IG51bGx9ICovIChSZXNvdXJjZUNsYXNzLnNoYXJlZFJlc291cmNlQ2xhc3MoKSA/PyBudWxsKVxuXG4gICAgcmV0dXJuIFJlc291cmNlQ2xhc3MuUmVwbGF5U2VydmljZUNsYXNzID8/IFNoYXJlZFJlc291cmNlPy5SZXBsYXlTZXJ2aWNlQ2xhc3MgPz8gU3luY0VudmVsb3BlUmVwbGF5U2VydmljZVxuICB9XG59XG4iXX0=
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1yZXNvdXJjZS1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1yZXNvdXJjZS1iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFFNUMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLHlCQUF5QixNQUFNLG1DQUFtQyxDQUFBO0FBQ3pFLE9BQU8sMEJBQTBCLE1BQU0scUNBQXFDLENBQUE7QUFDNUUsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFFbEQ7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUE7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLHlCQUF5QjtJQUNyRTs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQTtJQUVyQzs7OztpQ0FJNkI7SUFDN0IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtJQUVoQzs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztZQUFFLE9BQU07UUFFbEQsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDO1FBQzlCLE1BQU0sa0JBQWtCLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxD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UUFFbEgsT0FBTyxhQUFhLENBQUMsa0JBQWtCLElBQUksY0FBYyxFQUFFLGtCQUFrQixJQUFJLHlCQUF5QixDQUFBO0lBQzVHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtmb3JjZWROb25CbGFua1N0cmluZ30gZnJvbSBcInR5cGFuaWNcIlxuXG5pbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiXG5pbXBvcnQgU3luY0VudmVsb3BlUmVwbGF5U2VydmljZSBmcm9tIFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCJcbmltcG9ydCBTeW5jTW9kZWxDaGFuZ2VGZWVkU2VydmljZSBmcm9tIFwiLi9zeW5jLW1vZGVsLWNoYW5nZS1mZWVkLXNlcnZpY2UuanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuLi92ZWxvY2lvdXMtZXJyb3IuanNcIlxuXG4vKipcbiAqIE9wdGlvbmFsIGNsaWVudC1kZWNsYXJlZCBzeW5jIHNjb3BlIGNhcnJpZWQgb24gYSBjaGFuZ2VzIHJlcXVlc3QuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+fSBjb25kaXRpb25zIC0gUGxhaW4gYXR0cmlidXRlIGNvbmRpdGlvbnMgZnJvbSB0aGUgY2xpZW50IHF1ZXJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZXNvdXJjZVR5cGUgLSBDbGllbnQgcmVzb3VyY2UvbW9kZWwgbmFtZSB0aGUgc2NvcGUgd2FzIGRlY2xhcmVkIGZvciwgb3IgbnVsbCBmb3IgdGhlIGFsbC10eXBlcyAodXNlcikgc2NvcGU6IG9uZSBzY29wZSBjb3ZlcmluZyBldmVyeSByZXNvdXJjZSB0eXBlIHRoaXMgcmVzb3VyY2UgYXV0aG9yaXplcyBmb3IgdGhlIGNhbGxlciwgc28gYSBzeW5jIGF1dGhvcml6ZXMgb25jZSBob3dldmVyIG1hbnkgdHlwZXMgaXQgc2VydmVzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXSB8IG51bGx9IHJlc291cmNlVHlwZXMgLSBGb3IgdGhlIGFsbC10eXBlcyBzY29wZSwgdGhlIHJlc291cmNlIHR5cGVzIHRoZSBjbGllbnQgY2FuIGFwcGx5LiBBIGNoZWFwIGRlbGl2ZXJ5L3R5cGUgZmlsdGVyIG9ubHkgLSBpdCBuYXJyb3dzLCBuZXZlciB3aWRlbnMsIHdoYXQgdGhlIGFwcCdzIGF1dGhvcml6YXRpb24gYWxyZWFkeSBhbGxvd3MuIE51bGwgZm9yIGEgdHlwZS1kZWNsYXJlZCBzY29wZS5cbiAqL1xuXG4vKipcbiAqIE9uZSBwdWJsaXNoZWQgc3luYyBlbnRyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHBlci1kZWxpdmVyeSBhY2Nlc3MgcmUtY2hlY2tcbiAqICh7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNjaGFuZ2VEZWxpdmVyYWJsZX0pOiB0aGUgY29tcGxldGUgYnJvYWRjYXN0IHN5bmNcbiAqIGVudHJ5IOKAlCBpbmNsdWRpbmcgdGhlIGltbXV0YWJsZSBzeW5jLXJvdyBpZCwgYWN0b3Itc3BlY2lmaWMgbWV0YWRhdGEsIGFuZFxuICogYW55IG90aGVyIGFwcCBmaWVsZHMgdGhlIHB1Ymxpc2hlciBwdXQgb24gaXQg4oCUIHdpdGggYHJlc291cmNlSWRgIGFuZFxuICogYHJlc291cmNlVHlwZWAgbm9ybWFsaXplZCB0byBzdHJpbmdzLiBBcHBzIGF1dGhvcml6aW5nIGJ5IGV4YWN0LXJvd1xuICogaWRlbnRpdHkgcmVhZCB0aGUgZXh0cmEgZmllbGRzOyBvdmVycmlkZXMgdGhhdCBvbmx5IHJlYWRcbiAqIGByZXNvdXJjZUlkYC9gcmVzb3VyY2VUeXBlYCBrZWVwIHdvcmtpbmcgdW5jaGFuZ2VkLlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsID8+ICYge3Jlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBDaGFuZ2VEZWxpdmVyYWJsZVN5bmNFbnRyeVxuICovXG5jb25zdCBRVUlDS19TRUFSQ0hfQ09MVU1OID0gXCJxdWlja1NlYXJjaFwiXG5cbi8qKlxuICogQmFzZSByZXNvdXJjZSBmb3IgVmVsb2Npb3VzIHN5bmMgZW5kcG9pbnRzLlxuICpcbiAqIFZlbG9jaW91cyBvd25zIHRoZSBjaGFuZ2VzL3JlcGxheSBvcmNoZXN0cmF0aW9uIChzY29wZSBwYXJzaW5nLCBmZWVkIHBhZ2luZyxcbiAqIHJlcGxheSBkZWxlZ2F0aW9uLCByZXNwb25zZSBzaGFwZSkgd2hpbGUgYXBwcyBzdWJjbGFzcyBhbmQgb25seSBkZWNsYXJlXG4gKiBhdXRob3JpemF0aW9uLCBmZWVkIHNjb3BpbmcsIGFuZCB0aGVpciByZXBsYXkgc2VydmljZS5cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBbVE1vZGVsQ2xhc3M9dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0XVxuICogQGF1Z21lbnRzIHtGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlPFRNb2RlbENsYXNzPn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY1Jlc291cmNlQmFzZSBleHRlbmRzIEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2Uge1xuICAvKipcbiAgICogUmVwbGF5IHNlcnZpY2UgY2xhc3MgaGFuZGxpbmcgcmVwbGF5IG11dGF0aW9ucyBmb3IgdGhpcyByZXNvdXJjZSxcbiAgICogZGVjbGFyZWQgaW5zdGVhZCBvZiBvdmVycmlkaW5nIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlI3JlcGxheVNlcnZpY2VDbGFzc30uXG4gICAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgUmVwbGF5U2VydmljZUNsYXNzID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIERlY2xhcmF0aXZlIHF1aWNrLXNlYXJjaCB0ZXh0IGNvbHVtbnMuIFdoZW4gZGVjbGFyZWQsIGFuIGluZGV4IHNlYXJjaCBvblxuICAgKiB0aGUgcHNldWRvLWNvbHVtbiBgcXVpY2tTZWFyY2hgIGV4cGFuZHMgdG8gYW4gT1Igb2YgTElLRSBjb25kaXRpb25zIG92ZXJcbiAgICogdGhlc2Ugcm9vdC10YWJsZSBjb2x1bW5zIGluc3RlYWQgb2YgaGl0dGluZyB0aGUgY29udHJvbGxlciBkZWZhdWx0LlxuICAgKiBAdHlwZSB7c3RyaW5nW10gfCBudWxsfSAqL1xuICBzdGF0aWMgcXVpY2tTZWFyY2hDb2x1bW5zID0gbnVsbFxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGZyb250ZW5kLW1vZGVsIGluZGV4IHNlYXJjaGVzLCBleHBhbmRpbmcgZGVjbGFyZWQgcXVpY2sgc2VhcmNoZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gU2VhcmNoIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb250cm9sbGVyfSBhcmdzLmNvbnRyb2xsZXIgLSBDb250cm9sbGVyIGhhbmRsaW5nIHRoZSBxdWVyeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUFueVF1ZXJ5fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VTZWFyY2h9IGFyZ3Muc2VhcmNoIC0gU2VhcmNoIHBhcmFtcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxJbmRleFNlYXJjaCh7Y29udHJvbGxlciwgcXVlcnksIHNlYXJjaH0pIHtcbiAgICBpZiAodGhpcy5hcHBseVF1aWNrU2VhcmNoKHtxdWVyeSwgc2VhcmNofSkpIHJldHVyblxuXG4gICAgc3VwZXIuYXBwbHlGcm9udGVuZE1vZGVsSW5kZXhTZWFyY2goe2NvbnRyb2xsZXIsIHF1ZXJ5LCBzZWFyY2h9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZHMgYSBgcXVpY2tTZWFyY2hgIHBzZXVkby1jb2x1bW4gc2VhcmNoIGludG8gYW4gT1Igb2YgTElLRSBjb25kaXRpb25zXG4gICAqIG92ZXIgdGhlIGRlY2xhcmVkIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlLnF1aWNrU2VhcmNoQ29sdW1uc30uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gU2VhcmNoIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VBbnlRdWVyeX0gYXJncy5xdWVyeSAtIFF1ZXJ5IHRvIGZpbHRlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZVNlYXJjaH0gYXJncy5zZWFyY2ggLSBTZWFyY2ggcGF5bG9hZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNlYXJjaCB3YXMgaGFuZGxlZCBhcyBhIHF1aWNrIHNlYXJjaC5cbiAgICovXG4gIGFwcGx5UXVpY2tTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KSB7XG4gICAgY29uc3QgcXVpY2tTZWFyY2hDb2x1bW5zID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpLnF1aWNrU2VhcmNoQ29sdW1uc1xuXG4gICAgaWYgKCFxdWlja1NlYXJjaENvbHVtbnMgfHwgcXVpY2tTZWFyY2hDb2x1bW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHNlYXJjaC5wYXRoLmxlbmd0aCA+IDAgfHwgc2VhcmNoLmNvbHVtbiAhPT0gUVVJQ0tfU0VBUkNIX0NPTFVNTikgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAoc2VhcmNoLm9wZXJhdG9yICE9PSBcImxpa2VcIikge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgcXVpY2sgc2VhcmNoIG11c3QgdXNlIHRoZSBsaWtlIG9wZXJhdG9yLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtcXVpY2stc2VhcmNoXCJ9KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2VhcmNoLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBxdWljayBzZWFyY2ggbXVzdCBiZSBhIHN0cmluZy5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLXF1aWNrLXNlYXJjaFwifSlcbiAgICB9XG5cbiAgICBjb25zdCB0cmltbWVkVmFsdWUgPSBzZWFyY2gudmFsdWUudHJpbSgpXG5cbiAgICBpZiAoIXRyaW1tZWRWYWx1ZSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHRhYmxlU3FsID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUocXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKCkpXG4gICAgY29uc3QgbGlrZVZhbHVlID0gYCUke3RyaW1tZWRWYWx1ZX0lYFxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBxdWlja1NlYXJjaENvbHVtbnMubWFwKChjb2x1bW5OYW1lKSA9PiAoXG4gICAgICBgJHt0YWJsZVNxbH0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9IExJS0UgJHtxdWVyeS5kcml2ZXIucXVvdGUobGlrZVZhbHVlKX1gXG4gICAgKSlcblxuICAgIHF1ZXJ5LndoZXJlKGAoJHtjb25kaXRpb25zLmpvaW4oXCIgT1IgXCIpfSlgKVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIFRoZSBkZWNsYXJhdGl2ZSBgc3RhdGljIHdyaXRhYmxlQXR0cmlidXRlc2AgcGVybWl0IGxpc3QgbGl2ZXMgb25cbiAgLy8gRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBzbyBldmVyeSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSBjYW4gZGVjbGFyZVxuICAvLyBvbmU7IHN5bmMgcmVzb3VyY2VzIGluaGVyaXQgaXQgdW5jaGFuZ2VkLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RhYmxlIGNoYW5nZS1mZWVkIHBhZ2UgYWZ0ZXIgYXBwIGF1dGhvcml6YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gQ2hhbmdlLWZlZWQgcGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyYW1zKClcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuY2hhbmdlc1Njb3BlKHBhcmFtcylcblxuICAgIGF3YWl0IHRoaXMuYXV0aG9yaXplQ2hhbmdlcyh7cGFyYW1zLCBzY29wZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFuZ2VGZWVkU2VydmljZSh7cGFyYW1zLCBzY29wZX0pLmNoYW5nZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgY2xpZW50IHN5bmMgZW52ZWxvcGVzIHRocm91Z2ggdGhlIGFwcCByZXBsYXkgc2VydmljZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBSZXBsYXkgcmVzdWx0IHdpdGggcGVyLXN5bmMgc3RhdGVzLlxuICAgKi9cbiAgYXN5bmMgcmVwbGF5KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYnVpbGRSZXBsYXlTZXJ2aWNlKCkucmVwbGF5KHRoaXMucGFyYW1zKCkpXG5cbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJlcnJvclwiKSByZXR1cm4gcmVzdWx0XG5cbiAgICByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCIsIHN5bmNzOiByZXN1bHQuc3luY3N9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBvcHRpb25hbCBjbGllbnQtZGVjbGFyZWQgc2NvcGUgZnJvbSByZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH0gUGFyc2VkIHNjb3BlLCBvciBudWxsIHdoZW4gdGhlIGNsaWVudCBzZW50IG5vbmUuXG4gICAqL1xuICBjaGFuZ2VzU2NvcGUocGFyYW1zKSB7XG4gICAgY29uc3Qgc2NvcGUgPSBwYXJhbXMuc2NvcGVcblxuICAgIGlmIChzY29wZSA9PT0gdW5kZWZpbmVkIHx8IHNjb3BlID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiBzY29wZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHNjb3BlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgc2NvcGUgbXVzdCBiZSBhbiBvYmplY3QsIGdvdDogJHtTdHJpbmcoc2NvcGUpfWApXG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGVQYXJhbXMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoc2NvcGUpXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlID09PSBudWxsIHx8IHNjb3BlUGFyYW1zLnJlc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IG51bGxcbiAgICAgIDogZm9yY2VkTm9uQmxhbmtTdHJpbmcoc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlLCBcInJlc291cmNlVHlwZVwiKVxuICAgIGNvbnN0IHJlc291cmNlVHlwZXMgPSB0aGlzLmNoYW5nZXNTY29wZVJlc291cmNlVHlwZXMoc2NvcGVQYXJhbXMucmVzb3VyY2VUeXBlcylcbiAgICBjb25zdCBjb25kaXRpb25zID0gc2NvcGVQYXJhbXMuY29uZGl0aW9uc1xuXG4gICAgaWYgKCFjb25kaXRpb25zIHx8IHR5cGVvZiBjb25kaXRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHNjb3BlLmNvbmRpdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdDogJHtTdHJpbmcoY29uZGl0aW9ucyl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge2NvbmRpdGlvbnM6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChjb25kaXRpb25zKSwgcmVzb3VyY2VUeXBlLCByZXNvdXJjZVR5cGVzfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgb3B0aW9uYWwgcmVzb3VyY2UtdHlwZSBsaXN0IGFuIGFsbC10eXBlcyBzY29wZSBkZWNsYXJlcy5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZSAtIFJhdyBgc2NvcGUucmVzb3VyY2VUeXBlc2AgcGFyYW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXSB8IG51bGx9IERlY2xhcmVkIHJlc291cmNlIHR5cGVzLCBvciBudWxsIHdoZW4gdGhlIGNsaWVudCBzZW50IG5vbmUuXG4gICAqL1xuICBjaGFuZ2VzU2NvcGVSZXNvdXJjZVR5cGVzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY2hhbmdlcyBzY29wZS5yZXNvdXJjZVR5cGVzIG11c3QgYmUgYW4gYXJyYXksIGdvdDogJHtTdHJpbmcodmFsdWUpfWApXG5cbiAgICByZXR1cm4gdmFsdWUubWFwKChyZXNvdXJjZVR5cGUpID0+IGZvcmNlZE5vbkJsYW5rU3RyaW5nKHJlc291cmNlVHlwZSwgXCJyZXNvdXJjZVR5cGVzXCIpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY2hhbmdlLWZlZWQgc2VydmljZSBzZXJ2aW5nIHRoaXMgY2hhbmdlcyByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3twYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9fSBhcmdzIC0gUmVxdWVzdCBwYXJhbXMgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge3tjaGFuZ2VzOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn19IENoYW5nZS1mZWVkIHNlcnZpY2UuXG4gICAqL1xuICBjaGFuZ2VGZWVkU2VydmljZSh7cGFyYW1zLCBzY29wZX0pIHtcbiAgICByZXR1cm4gbmV3IFN5bmNNb2RlbENoYW5nZUZlZWRTZXJ2aWNlKHtcbiAgICAgIG1vZGVsQ2xhc3M6IHRoaXMuc3luY01vZGVsQ2xhc3MoKSxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHNjb3BlUXVlcnk6ICh7cXVlcnl9KSA9PiB0aGlzLnNjb3BlQ2hhbmdlc1F1ZXJ5KHtwYXJhbXMsIHF1ZXJ5LCBzY29wZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGFwcCByZXBsYXkgc2VydmljZSBoYW5kbGluZyB0aGlzIHJlcGxheSByZXF1ZXN0LiBUaGUgcmVzb3VyY2VcbiAgICogYWJpbGl0eSwgY29udGV4dCwgY29uZmlndXJhdGlvbiwgYW5kIGxvY2FscyBhcmUgcGx1bWJlZCBpbiB1bmRlciB0aGVcbiAgICogYXBwLWRlY2xhcmVkIHtAbGluayBTeW5jUmVzb3VyY2VCYXNlI3JlcGxheVNlcnZpY2VBcmdzfSAoYXBwIGFyZ3Mgd2luKSBzb1xuICAgKiB0aGUgZGVmYXVsdCByZXNvdXJjZS1yb3V0ZWQgcmVwbGF5IHdvcmtzIHdpdGhvdXQgd2lyaW5nLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLmRlZmF1bHR9IFJlcGxheSBzZXJ2aWNlIGluc3RhbmNlLlxuICAgKi9cbiAgYnVpbGRSZXBsYXlTZXJ2aWNlKCkge1xuICAgIGNvbnN0IFJlcGxheVNlcnZpY2VDbGFzcyA9IHRoaXMucmVwbGF5U2VydmljZUNsYXNzKClcblxuICAgIHJldHVybiBuZXcgUmVwbGF5U2VydmljZUNsYXNzKHtcbiAgICAgIGFiaWxpdHk6IHRoaXMuYWJpbGl0eSxcbiAgICAgIGFiaWxpdHlDb250ZXh0OiB0aGlzLmdldENvbnRleHQoKSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29udHJvbGxlciA/IHRoaXMuY29udHJvbGxlckluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbigpIDogdW5kZWZpbmVkLFxuICAgICAgbG9jYWxzOiB0aGlzLmdldExvY2FscygpLFxuICAgICAgLi4udGhpcy5yZXBsYXlTZXJ2aWNlQXJncygpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGNvbnN0cnVjdG9yIGFyZ3MgZm9yIHRoZSBhcHAgcmVwbGF5IHNlcnZpY2UuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gUmVwbGF5IHNlcnZpY2UgY29uc3RydWN0b3IgYXJncy5cbiAgICovXG4gIHJlcGxheVNlcnZpY2VBcmdzKCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN5bmMgbW9kZWwgY2xhc3MgYmFja2luZyB0aGUgY2hhbmdlIGZlZWQuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBzeW5jTW9kZWxDbGFzcygpIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgU3luY1Jlc291cmNlQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpLk1vZGVsQ2xhc3NcblxuICAgIGlmICghbW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gbXVzdCBkZWZpbmUgc3RhdGljIE1vZGVsQ2xhc3NgKVxuXG4gICAgcmV0dXJuIG1vZGVsQ2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRob3JpemVzIHRoZSBjdXJyZW50IGNvbnRleHQgZm9yIHJlYWRpbmcgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge3twYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBzY29wZTogU2VyaWFsaXplZENoYW5nZXNTY29wZSB8IG51bGx9fSBfYXJncyAtIFJlcXVlc3QgcGFyYW1zIGFuZCBwYXJzZWQgc2NvcGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIGFjY2VzcyBpcyBhbGxvd2VkOyB0aHJvd3Mgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgYXV0aG9yaXplQ2hhbmdlcyhfYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNSZXNvdXJjZUJhc2UjYXV0aG9yaXplQ2hhbmdlcyBtdXN0IGJlIGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhcHAgdmlzaWJpbGl0eSBzY29waW5nIG9udG8gdGhlIGNoYW5nZS1mZWVkIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3twYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCwgc2NvcGU6IFNlcmlhbGl6ZWRDaGFuZ2VzU2NvcGUgfCBudWxsfX0gX2FyZ3MgLSBSZXF1ZXN0IHBhcmFtcywgZmVlZCBxdWVyeSwgYW5kIHBhcnNlZCBzY29wZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY29wZUNoYW5nZXNRdWVyeShfYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNSZXNvdXJjZUJhc2Ujc2NvcGVDaGFuZ2VzUXVlcnkgbXVzdCBiZSBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgcHVibGlzaGVkIGNoYW5nZSBpcyBkZWxpdmVyYWJsZSB0byBhIHVzZXItc2NvcGVcbiAgICogc3Vic2NyaXB0aW9uICh0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCdzIHBlci1kZWxpdmVyeSBhY2Nlc3MgcmUtY2hlY2spLlxuICAgKiBUaGUgZGVmYXVsdCByZXVzZXMgdGhlIGFwcCdzIGFiaWxpdHkgc2NvcGluZzogaXQgYXBwbGllc1xuICAgKiB7QGxpbmsgU3luY1Jlc291cmNlQmFzZSNzY29wZUNoYW5nZXNRdWVyeX0gdG8gdGhlIGNoYW5nZS1mZWVkIG1vZGVsIOKAlCB3aGljaFxuICAgKiBmb3IgYW4gZW1wdHktY29uZGl0aW9ucyB1c2VyIHNjb3BlIGZhbGxzIGJhY2sgdG8gYWJpbGl0eSBzY29waW5nIOKAlCBhbmRcbiAgICogY2hlY2tzIHdoZXRoZXIgdGhlIHB1Ymxpc2hlZCBjaGFuZ2UncyBmZWVkIHJvdyBpcyB2aXNpYmxlIHdpdGhpbiB0aGF0XG4gICAqIHNjb3BlLiBBcHBzIGdldCB0aGlzIGZvciBmcmVlIGZyb20gdGhlIHNjb3BpbmcgdGhleSBhbHJlYWR5IGRlY2xhcmVkO1xuICAgKiBvdmVycmlkZSBvbmx5IGZvciBjdXN0b20gcGVyLWRlbGl2ZXJ5IHJ1bGVzLlxuICAgKlxuICAgKiBUaGUgYHN5bmNgIGFyZ3VtZW50IGlzIHRoZSBjb21wbGV0ZSBicm9hZGNhc3Qgc3luYyBlbnRyeSDigJQgaW1tdXRhYmxlXG4gICAqIHN5bmMtcm93IGlkLCBhY3Rvci1zcGVjaWZpYyBtZXRhZGF0YSwgYW5kIGFueSBvdGhlciBwdWJsaXNoZXIgZmllbGRzIOKAlFxuICAgKiB3aXRoIGByZXNvdXJjZUlkYC9gcmVzb3VyY2VUeXBlYCBub3JtYWxpemVkIHRvIHN0cmluZ3MsIHNvIGFuIG92ZXJyaWRlXG4gICAqIGNhbiBhdXRob3JpemUgY29uY3VycmVudCB0YXJnZXRlZCBhbmQgc2hhcmVkIGJyb2FkY2FzdHMgZm9yIHRoZSBzYW1lXG4gICAqIHJlc291cmNlIGlkZW50aXR5IGluZGVwZW5kZW50bHkgYnkgdGhlaXIgZXhhY3Qtcm93IGlkZW50aXR5LiBUaGUgY2hhbm5lbFxuICAgKiBuZXZlciBtdXRhdGVzIHRoZSBwdWJsaXNoZWQgZW50cnk7IG5vcm1hbGl6YXRpb24gaGFwcGVucyBvbiBhIGNvcHkuXG4gICAqIEBwYXJhbSB7e3BhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHNjb3BlOiBTZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbCwgc3luYzogQ2hhbmdlRGVsaXZlcmFibGVTeW5jRW50cnl9fSBhcmdzIC0gUmVxdWVzdCBwYXJhbXMsIHN1YnNjcmlwdGlvbiBzY29wZSwgYW5kIHRoZSBwdWJsaXNoZWQgc3luYyBlbnRyeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIGNoYW5nZSBtYXkgYmUgZGVsaXZlcmVkIHRvIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgKi9cbiAgYXN5bmMgY2hhbmdlRGVsaXZlcmFibGUoe3BhcmFtcywgc2NvcGUsIHN5bmN9KSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnN5bmNNb2RlbENsYXNzKCkud2hlcmUoe30pXG5cbiAgICB0aGlzLnNjb3BlQ2hhbmdlc1F1ZXJ5KHtwYXJhbXMsIHF1ZXJ5LCBzY29wZX0pXG4gICAgcXVlcnkud2hlcmUoe3Jlc291cmNlX2lkOiBTdHJpbmcoc3luYy5yZXNvdXJjZUlkKSwgcmVzb3VyY2VfdHlwZTogU3RyaW5nKHN5bmMucmVzb3VyY2VUeXBlKX0pXG5cbiAgICByZXR1cm4gQm9vbGVhbihhd2FpdCBxdWVyeS5maXJzdCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByZXBsYXkgc2VydmljZSBjbGFzcyBoYW5kbGluZyByZXBsYXkgbXV0YXRpb25zOiB0aGVcbiAgICogZGVjbGFyYXRpdmUge0BsaW5rIFN5bmNSZXNvdXJjZUJhc2UuUmVwbGF5U2VydmljZUNsYXNzfSBzdGF0aWMgKHNoYXJlZFxuICAgKiByZXNvdXJjZXMgaW5jbHVkZWQpIHdoZW4gZGVjbGFyZWQsIG90aGVyd2lzZVxuICAgKiB7QGxpbmsgU3luY0VudmVsb3BlUmVwbGF5U2VydmljZX0sIHdoaWNoIHJlc291cmNlLXJvdXRlcyBtdXRhdGlvbnMgdGhyb3VnaFxuICAgKiB0aGUgcGx1bWJlZCBjb25maWd1cmF0aW9uIHJlZ2lzdHJ5LiBBcHBzIGRlY2xhcmUgdGhlIHN0YXRpYyBpbnN0ZWFkIG9mXG4gICAqIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi9zeW5jLWVudmVsb3BlLXJlcGxheS1zZXJ2aWNlLmpzXCIpLmRlZmF1bHR9IFJlcGxheSBzZXJ2aWNlIGNsYXNzLlxuICAgKi9cbiAgcmVwbGF5U2VydmljZUNsYXNzKCkge1xuICAgIGNvbnN0IFJlc291cmNlQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBTeW5jUmVzb3VyY2VCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcbiAgICBjb25zdCBTaGFyZWRSZXNvdXJjZSA9IC8qKiBAdHlwZSB7dHlwZW9mIFN5bmNSZXNvdXJjZUJhc2UgfCBudWxsfSAqLyAoUmVzb3VyY2VDbGFzcy5zaGFyZWRSZXNvdXJjZUNsYXNzKCkgPz8gbnVsbClcblxuICAgIHJldHVybiBSZXNvdXJjZUNsYXNzLlJlcGxheVNlcnZpY2VDbGFzcyA/PyBTaGFyZWRSZXNvdXJjZT8uUmVwbGF5U2VydmljZUNsYXNzID8/IFN5bmNFbnZlbG9wZVJlcGxheVNlcnZpY2VcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"sync-websocket-channel.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-websocket-channel.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;GAWG;AACH;IAOE;;;;;;;OAOG;IACH,gDAHW,OAAO,qBAAqB,EAAE,OAAO,GACnC,IAAI,CAOhB;IAnBD;;;OAGG;IACH,QAFU,OAAO,yBAAyB,EAAE,sBAAsB,GAAG,IAAI,CAE5D;IAiBb;;;;;;OAMG;IACH,gBAFa,OAAO,CAAC,OAAO,CAAC,CAW5B;IAED;;;;;;OAMG;IACH,qBAFa,OAAO,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAkC9D;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,yBAHW,OAAO,qCAAqC,EAAE,kBAAkB,GAC9D,OAAO,CAgCnB;IAED;;;;;;;;;;;;OAYG;IACH,uBAJW,OAAO,qCAAqC,EAAE,kBAAkB,SAChE;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAC,GAChB,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,gBAFa,OAAO,CAInB;IAED;;;;;;;;OAQG;IACH,gCAHW,OAAO,qCAAqC,EAAE,kBAAkB,GAC9D,OAAO,CAAC,OAAO,qCAAqC,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAoC5F;CASF;sCA9OqC,qCAAqC"}
1
+ {"version":3,"file":"sync-websocket-channel.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-websocket-channel.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;GAWG;AACH;IAOE;;;;;;;OAOG;IACH,gDAHW,OAAO,qBAAqB,EAAE,OAAO,GACnC,IAAI,CAOhB;IAnBD;;;OAGG;IACH,QAFU,OAAO,yBAAyB,EAAE,sBAAsB,GAAG,IAAI,CAE5D;IAiBb;;;;;;OAMG;IACH,gBAFa,OAAO,CAAC,OAAO,CAAC,CAW5B;IAED;;;;;;OAMG;IACH,qBAFa,OAAO,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAkC9D;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,yBAHW,OAAO,qCAAqC,EAAE,kBAAkB,GAC9D,OAAO,CAgCnB;IAED;;;;;;;;;;;;OAYG;IACH,uBAJW,OAAO,qCAAqC,EAAE,kBAAkB,SAChE;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAC,GAChB,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,gBAFa,OAAO,CAInB;IAED;;;;;;;;OAQG;IACH,gCAHW,OAAO,qCAAqC,EAAE,kBAAkB,GAC9D,OAAO,CAAC,OAAO,qCAAqC,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAiD5F;CASF;sCA3PqC,qCAAqC"}
@@ -181,6 +181,7 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
181
181
  return null;
182
182
  const envelope = /** @type {Record<string, ?>} */ (body);
183
183
  const scope = /** @type {import("./sync-resource-base.js").SerializedChangesScope} */ (this._scope);
184
+ /** @type {Array<Record<string, ?>>} */
184
185
  const syncs = Array.isArray(envelope.syncs) ? envelope.syncs : [envelope];
185
186
  const configuration = this.session.configuration;
186
187
  /** @type {Array<Record<string, ?>>} */
@@ -197,7 +198,18 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
197
198
  const resourceType = sync?.resourceType ?? scope.resourceType;
198
199
  if (resourceId === undefined || resourceId === null)
199
200
  continue;
200
- if (await resource.changeDeliverable({ params: this.params, scope, sync: { resourceId: String(resourceId), resourceType: String(resourceType) } })) {
201
+ // Pass the complete broadcast entry through so the app's
202
+ // changeDeliverable can authorize by exact-row identity (immutable
203
+ // sync-row id, actor-specific metadata) — concurrent targeted and
204
+ // shared broadcasts for the same resource identity authorize
205
+ // independently. Only resourceId/resourceType are normalized to
206
+ // strings, on a copy so the published entry is never mutated.
207
+ const syncEntry = {
208
+ ...sync,
209
+ resourceId: String(resourceId),
210
+ resourceType: String(resourceType)
211
+ };
212
+ if (await resource.changeDeliverable({ params: this.params, scope, sync: syncEntry })) {
201
213
  deliverableSyncs.push(sync);
202
214
  }
203
215
  }
@@ -216,4 +228,4 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
216
228
  return { scope: this._scope, userScope: this._isUserScope() };
217
229
  }
218
230
  }
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy13ZWJzb2NrZXQtY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtd2Vic29ja2V0LWNoYW5uZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8seUJBQXlCLE1BQU0scUNBQXFDLENBQUE7QUFDM0UsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFN0QsK0VBQStFO0FBQy9FLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUU5Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQXFCLFNBQVEseUJBQXlCO0lBQ3pFOzs7T0FHRztJQUNILE1BQU0sR0FBRyxJQUFJLENBQUE7SUFFYjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLHlCQUF5QixDQUFDLGFBQWE7UUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQUUsT0FBTTtRQUVwRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDM0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3RFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQy9DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxD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Q0FBQTtZQUUvQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixNQUFNLFVBQVUsR0FBRyxJQUFJLEVBQUUsVUFBVSxDQUFBO2dCQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLEVBQUUsWUFBWSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUE7Z0JBRTdELElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSTtvQkFBRSxTQUFRO2dCQUU3RCxJQUFJLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBRSxDQUFDO29CQUMvSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFDOUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUMsR0FBRyxRQUFRLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFDLENBQUE7UUFFaEYsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFDLENBQUE7SUFDN0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge1ZFTE9DSU9VU19TWU5DX0NIQU5ORUx9IGZyb20gXCIuL3N5bmMtY2hhbm5lbC1uYW1lLmpzXCJcblxuLyoqIENvbmZpZ3VyYXRpb25zIHdob3NlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLiAqL1xuY29uc3QgcmVnaXN0ZXJlZENvbmZpZ3VyYXRpb25zID0gbmV3IFdlYWtTZXQoKVxuXG4vKipcbiAqIEZyYW1ld29yay1vd25lZCB3ZWJzb2NrZXQgY2hhbm5lbCBmb3Igc3luY2VkIHJlc291cmNlc1xuICogKHtAbGluayBWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSkuXG4gKlxuICogU3Vic2NyaWJlIHBhcmFtcyBtaXJyb3IgYSBkZWNsYXJlZCBwdWxsIHNjb3BlIOKAlCBge3Jlc291cmNlVHlwZSwgY29uZGl0aW9uc31gXG4gKiBwbHVzIHRoZSBjbGllbnQtaW5qZWN0ZWQgYGF1dGhlbnRpY2F0aW9uVG9rZW5gIOKAlCBhbmQgc3Vic2NyaWJlLXRpbWVcbiAqIGF1dGhvcml6YXRpb24gZGVsZWdhdGVzIHRvIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzIGV4aXN0aW5nXG4gKiBgYXV0aG9yaXplQ2hhbmdlcyh7cGFyYW1zLCBzY29wZX0pYCAodGhlIGBzeW5jLmFwaS5yZXNvdXJjZUNsYXNzYCksIHNvIGFwcHNcbiAqIGhvb2sgaW4gdGhyb3VnaCB0aGUgYXV0aG9yaXphdGlvbiB0aGV5IGFscmVhZHkgZGVjbGFyZWQgaW5zdGVhZCBvZiB3cml0aW5nXG4gKiB0aGVpciBvd24gY2hhbm5lbCBjbGFzc2VzLiBCcm9hZGNhc3Qgcm91dGluZyBtYXRjaGVzIHRoZSBwdWJsaXNoZXInc1xuICogc2NvcGluZyBwYXJhbXMgYWdhaW5zdCB0aGUgc3Vic2NyaXB0aW9uJ3Mgc2NvcGUgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY1dlYnNvY2tldENoYW5uZWwgZXh0ZW5kcyBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIHtcbiAgLyoqXG4gICAqIFNjb3BlIHRoZSBzdWJzY3JpcHRpb24gd2FzIGF1dGhvcml6ZWQgZm9yLCBzZXQgYnkge0BsaW5rIFN5bmNXZWJzb2NrZXRDaGFubmVsI2NhblN1YnNjcmliZX0uXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5TZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH1cbiAgICovXG4gIF9zY29wZSA9IG51bGxcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsIG9uIGEgY29uZmlndXJhdGlvbiBkZWNsYXJpbmcgYVxuICAgKiBgc3luYy5hcGlgIGJsb2NrIChndWFyZGVkIHNvIHJlcGVhdGVkIHNlcnZlciBib290cyB3aXRoIHRoZSBzYW1lXG4gICAqIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaXQgb25seSBvbmNlKS4gTm8tb3Agd2l0aG91dCBgc3luYy5hcGlgIOKAlCB0aGVcbiAgICogY2hhbm5lbCBhdXRob3JpemVzIHRocm91Z2ggdGhlIGFwcCdzIHN5bmMgcmVzb3VyY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJGcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKCkuYXBpIHx8IHJlZ2lzdGVyZWRDb25maWd1cmF0aW9ucy5oYXMoY29uZmlndXJhdGlvbikpIHJldHVyblxuXG4gICAgcmVnaXN0ZXJlZENvbmZpZ3VyYXRpb25zLmFkZChjb25maWd1cmF0aW9uKVxuICAgIGNvbmZpZ3VyYXRpb24ucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsKFZFTE9DSU9VU19TWU5DX0NIQU5ORUwsIHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yaXplcyB0aGUgc3Vic2NyaXB0aW9uIHRocm91Z2ggdGhlIGFwcCBzeW5jIHJlc291cmNlOiB0aGUgc3Vic2NyaWJlXG4gICAqIHBhcmFtcyBhcmUgcGFyc2VkIGludG8gdGhlIHNhbWUgc2VyaWFsaXplZCBzY29wZSB0aGUgY2hhbmdlcyBlbmRwb2ludFxuICAgKiBjb25zdW1lcyBhbmQgcGFzc2VkIHRvIHRoZSByZXNvdXJjZSdzIGBhdXRob3JpemVDaGFuZ2VzKHtwYXJhbXMsIHNjb3BlfSlgLlxuICAgKiBEZW5pYWxzIGFuZCBtYWxmb3JtZWQgc2NvcGVzIHRocm93LCByZWplY3RpbmcgdGhlIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbiBpcyBhbGxvd2VkLlxuICAgKi9cbiAgYXN5bmMgY2FuU3Vic2NyaWJlKCkge1xuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFN5bmNSZXNvdXJjZSgpXG4gICAgY29uc3Qgc2NvcGUgPSByZXNvdXJjZS5jaGFuZ2VzU2NvcGUoe3Njb3BlOiB7Y29uZGl0aW9uczogdGhpcy5wYXJhbXMuY29uZGl0aW9ucywgcmVzb3VyY2VUeXBlOiB0aGlzLnBhcmFtcy5yZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZXM6IHRoaXMucGFyYW1zLnJlc291cmNlVHlwZXN9fSlcblxuICAgIGF3YWl0IHJlc291cmNlLmF1dGhvcml6ZUNoYW5nZXMoe3BhcmFtczogdGhpcy5wYXJhbXMsIHNjb3BlfSlcblxuICAgIHRoaXMuX3Njb3BlID0gc2NvcGVcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhcHAgc3luYyByZXNvdXJjZSBhdXRob3JpemluZyB0aGlzIHN1YnNjcmlwdGlvbiwgbWlycm9yaW5nIHRoZVxuICAgKiBzeW5jIHRyYW5zcG9ydCBjb250cm9sbGVyJ3MgcmVzb3VyY2UgY29uc3RydWN0aW9uIHdpdGggdGhlIGFiaWxpdHlcbiAgICogcmVzb2x2ZWQgZnJvbSB0aGUgc3Vic2NyaWJlIHBhcmFtcyAod2hpY2ggY2FycnkgdGhlIGNsaWVudC1pbmplY3RlZFxuICAgKiBhdXRoZW50aWNhdGlvblRva2VuKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zeW5jLXJlc291cmNlLWJhc2UuanNcIikuZGVmYXVsdD59IEFwcCBzeW5jIHJlc291cmNlIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgYnVpbGRTeW5jUmVzb3VyY2UoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG4gICAgY29uc3QgYXBpID0gY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpLmFwaVxuXG4gICAgaWYgKCFhcGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7VkVMT0NJT1VTX1NZTkNfQ0hBTk5FTH0gY2hhbm5lbCByZXF1aXJlcyBhIHN5bmMuYXBpIGNvbmZpZ3VyYXRpb24gYmxvY2sgd2l0aCB0aGUgYXBwJ3Mgc3luYyByZXNvdXJjZSBjbGFzc2ApXG4gICAgfVxuXG4gICAgLy8gTmFycm93cyB0aGUgY29uZmlndXJlZCByZXNvdXJjZSBjbGFzcyB0byB0aGUgc3luYyByZXNvdXJjZSBjb250cmFjdFxuICAgIC8vIChjaGFuZ2VzU2NvcGUvYXV0aG9yaXplQ2hhbmdlcykgdGhlIHN5bmMuYXBpIHZhbGlkYXRpb24gcmVxdWlyZXMuXG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1yZXNvdXJjZS1iYXNlLmpzXCIpLmRlZmF1bHR9ICovIChhcGkucmVzb3VyY2VDbGFzcylcbiAgICAvLyBOYXJyb3dzIHRoZSB3ZWJzb2NrZXQgc3Vic2NyaWJlIHBhcmFtcyB0byB0aGUgcmVzb3VyY2UgcGFyYW1zIGNvbnRyYWN0LlxuICAgIGNvbnN0IHBhcmFtcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNQYXJhbXN9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh0aGlzLnBhcmFtcykpXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuc2Vzc2lvbi51cGdyYWRlUmVxdWVzdFxuICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCBjb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtwYXJhbXMsIHJlcXVlc3R9KVxuXG4gICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNsYXNzKHtcbiAgICAgIGFiaWxpdHksXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIC4uLihhYmlsaXR5Py5nZXRDb250ZXh0KCkgfHwge30pLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0sXG4gICAgICBsb2NhbHM6IGFiaWxpdHk/LmdldExvY2FscygpIHx8IHt9LFxuICAgICAgbW9kZWxDbGFzczogUmVzb3VyY2VDbGFzcy5Nb2RlbENsYXNzLFxuICAgICAgbW9kZWxOYW1lOiBSZXNvdXJjZUNsYXNzLk1vZGVsQ2xhc3M/Lm5hbWUsXG4gICAgICBwYXJhbXMsXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSAqLyAoe1xuICAgICAgICBhdHRyaWJ1dGVzOiBSZXNvdXJjZUNsYXNzLmF0dHJpYnV0ZXMgfHwge30sXG4gICAgICAgIHN5bmM6IHtlbmFibGVkOiB0cnVlfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlcyBhIHB1Ymxpc2hlciBicm9hZGNhc3QgdG8gdGhpcyBzdWJzY3JpcHRpb24gd2hlbiB0aGUgcHVibGlzaGVkXG4gICAqIHJlc291cmNlIHR5cGUgZXF1YWxzIHRoZSB0eXBlIHRoZSBzdWJzY3JpcHRpb24gd2FzIGF1dGhvcml6ZWQgZm9yIGFuZCB0aGVcbiAgICogc2NvcGluZyBwYXJhbXMgc2F0aXNmeSBldmVyeSBzY29wZSBjb25kaXRpb246IGVhY2ggY29uZGl0aW9uIGtleSBtdXN0IGJlXG4gICAqIHByZXNlbnQgaW4gdGhlIGJyb2FkY2FzdCBwYXJhbXMgYW5kIG1hdGNoIGJ5IHN0cmluZyBjb21wYXJpc29uIChhcnJheVxuICAgKiBjb25kaXRpb25zIG1hdGNoIGJ5IG1lbWJlcnNoaXApLiBCcm9hZGNhc3RzIHdpdGhvdXQgYSByZXNvdXJjZSB0eXBlIGFuZFxuICAgKiBjb25kaXRpb25zIHRoZSBwdWJsaXNoZXIncyBzY29waW5nIHBhcmFtcyBkbyBub3QgY2FycnkgbmV2ZXIgbWF0Y2gsIHNvIGFcbiAgICogc3Vic2NyaXB0aW9uIGNhbm5vdCByZWNlaXZlIGNoYW5nZXMgb3V0c2lkZSBpdHMgYXV0aG9yaXplZCBzY29wZS5cbiAgICpcbiAgICogVGhlIGFsbC10eXBlcyAodXNlcikgc2NvcGUgZGVjbGFyZXMgbm8gc2luZ2xlIHJlc291cmNlIHR5cGUgLSBpdCBzdWJzY3JpYmVzXG4gICAqIG9uY2UgZm9yIGV2ZXJ5IHR5cGUgaXQgY2FuIGFwcGx5LCBsaXN0ZWQgaW4gYHNjb3BlLnJlc291cmNlVHlwZXNgIC0gc28gaXRcbiAgICogbWF0Y2hlcyBhIGJyb2FkY2FzdCBvZiBhbnkgb2YgdGhvc2UgdHlwZXMuIFR5cGVzIG91dHNpZGUgdGhhdCBsaXN0IGFyZVxuICAgKiBkcm9wcGVkIGhlcmUsIGJ5IHRoaXMgY2hlYXAgY2hlY2ssIGFuZCBuZXZlciByZWFjaCB0aGUgcGVyLWRlbGl2ZXJ5IGFjY2Vzc1xuICAgKiByZS1jaGVjayBpbiB7QGxpbmsgU3luY1dlYnNvY2tldENoYW5uZWwjX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keX06IHRoYXRcbiAgICogcmUtY2hlY2sgY2hlY2tzIG91dCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHJ1bnMgYSBxdWVyeSBwZXIgbWF0Y2hlZFxuICAgKiBicm9hZGNhc3QsIHNvIG1hdGNoaW5nIGV2ZXJ5IHR5cGUgd291bGQgcHV0IERCIHdvcmsgb24gZXZlcnkgYnJvYWRjYXN0IGZvclxuICAgKiBldmVyeSBzdWJzY3JpYmVkIGRldmljZS4gQSBicm9hZGNhc3QgY2Fycnlpbmcgbm8gcmVzb3VyY2UgdHlwZSBhdCBhbGwgc3RpbGxcbiAgICogbmV2ZXIgbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5XZWJzb2NrZXRKc29uVmFsdWV9IGJyb2FkY2FzdFBhcmFtcyAtIFB1Ymxpc2hlciBzY29waW5nIHBhcmFtcyAodGhlIHB1Ymxpc2hlZCByZXNvdXJjZVR5cGUgcGx1cyB0aGUgY2hhbmdlJ3Mgc2NvcGUtcGFydGl0aW9uIHZhbHVlcykuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBicm9hZGNhc3QgYmVsb25ncyB0byB0aGlzIHN1YnNjcmlwdGlvbidzIHNjb3BlLlxuICAgKi9cbiAgbWF0Y2hlcyhicm9hZGNhc3RQYXJhbXMpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuX3Njb3BlXG5cbiAgICBpZiAoIXNjb3BlKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHNjb3BpbmdQYXJhbXMgPSBicm9hZGNhc3RQYXJhbXMgJiYgdHlwZW9mIGJyb2FkY2FzdFBhcmFtcyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShicm9hZGNhc3RQYXJhbXMpXG4gICAgICA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChicm9hZGNhc3RQYXJhbXMpXG4gICAgICA6IHt9XG5cbiAgICBpZiAoIU9iamVjdC5oYXNPd24oc2NvcGluZ1BhcmFtcywgXCJyZXNvdXJjZVR5cGVcIikpIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHNjb3BlLnJlc291cmNlVHlwZSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHNjb3BlLnJlc291cmNlVHlwZXMgJiYgIXNjb3BlLnJlc291cmNlVHlwZXMuc29tZSgocmVzb3VyY2VUeXBlKSA9PiByZXNvdXJjZVR5cGUgPT09IFN0cmluZyhzY29waW5nUGFyYW1zLnJlc291cmNlVHlwZSkpKSByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKFN0cmluZyhzY29waW5nUGFyYW1zLnJlc291cmNlVHlwZSkgIT09IFN0cmluZyhzY29wZS5yZXNvdXJjZVR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb25kaXRpb25OYW1lLCBjb25kaXRpb25WYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGUuY29uZGl0aW9ucykpIHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihzY29waW5nUGFyYW1zLCBjb25kaXRpb25OYW1lKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IHNjb3BpbmdWYWx1ZSA9IHNjb3BpbmdQYXJhbXNbY29uZGl0aW9uTmFtZV1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uVmFsdWUpKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uVmFsdWUuc29tZSgodmFsdWUpID0+IFN0cmluZyh2YWx1ZSkgPT09IFN0cmluZyhzY29waW5nVmFsdWUpKSkgcmV0dXJuIGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKFN0cmluZyhjb25kaXRpb25WYWx1ZSkgIT09IFN0cmluZyhzY29waW5nVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogRGVsaXZlcnMgYSBtYXRjaGVkIGJyb2FkY2FzdC4gU2NvcGVkIHN1YnNjcmlwdGlvbnMgKHdpdGggZXhwbGljaXRcbiAgICogY29uZGl0aW9ucykgYWxyZWFkeSByb3V0ZWQgdGhyb3VnaCB7QGxpbmsgU3luY1dlYnNvY2tldENoYW5uZWwjbWF0Y2hlc30sIHNvXG4gICAqIHRoZSBjaGFuZ2UgaXMgaW4gc2NvcGUgYW5kIGRlbGl2ZXJzIHVuY2hhbmdlZC4gVXNlci1zY29wZSBzdWJzY3JpcHRpb25zXG4gICAqIChlbXB0eSBjb25kaXRpb25zLCBcImV2ZXJ5dGhpbmcgbXkgYWJpbGl0eSBjYW4gc2VlXCIpIG1hdGNoIGV2ZXJ5IGJyb2FkY2FzdFxuICAgKiBvZiB0aGUgcmVzb3VyY2UgdHlwZSwgc28gZWFjaCBwdWJsaXNoZWQgY2hhbmdlIGlzIHJlLWNoZWNrZWQgYWdhaW5zdCB0aGVcbiAgICogc3Vic2NyaWJlcidzIGFiaWxpdHkgYXQgZmFuLW91dCB0aHJvdWdoIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzXG4gICAqIGBjaGFuZ2VEZWxpdmVyYWJsZWA7IG9ubHkgYWNjZXNzaWJsZSBjaGFuZ2VzIGFyZSBkZWxpdmVyZWQsIGFuZCBhIGJyb2FkY2FzdFxuICAgKiB3aXRoIG5vIGFjY2Vzc2libGUgY2hhbmdlIGlzIGRyb3BwZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSBib2R5IC0gQnJvYWRjYXN0IGJvZHkgKHN5bmMgZW52ZWxvcGUpLlxuICAgKiBAcGFyYW0ge3tldmVudElkPzogc3RyaW5nfX0gW21ldGFdIC0gT3B0aW9uYWwgZXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGVsaXZlckJyb2FkY2FzdChib2R5LCBtZXRhKSB7XG4gICAgaWYgKCF0aGlzLl9pc1VzZXJTY29wZSgpKSB7XG4gICAgICB0aGlzLnNlbmRNZXNzYWdlKGJvZHksIG1ldGEpXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRlbGl2ZXJhYmxlQm9keSA9IGF3YWl0IHRoaXMuX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keShib2R5KVxuXG4gICAgaWYgKGRlbGl2ZXJhYmxlQm9keSAhPT0gbnVsbCkgdGhpcy5zZW5kTWVzc2FnZShkZWxpdmVyYWJsZUJvZHksIG1ldGEpXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN1YnNjcmlwdGlvbiBpcyBhIHVzZXIgc2NvcGU6IGF1dGhvcml6ZWQgd2l0aCBlbXB0eSBjb25kaXRpb25zXG4gICAqIChcImV2ZXJ5dGhpbmcgbXkgYWJpbGl0eSBjYW4gc2VlXCIpLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIGlzIGEgdXNlciBzY29wZS5cbiAgICovXG4gIF9pc1VzZXJTY29wZSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9zY29wZSkgJiYgT2JqZWN0LmtleXMoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5TZXJpYWxpemVkQ2hhbmdlc1Njb3BlfSAqLyAodGhpcy5fc2NvcGUpLmNvbmRpdGlvbnMpLmxlbmd0aCA9PT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYSB1c2VyLXNjb3BlIGJyb2FkY2FzdCB0byB0aGUgc3luYyBlbnRyaWVzIHRoZSBzdWJzY3JpYmVyJ3MgYWJpbGl0eVxuICAgKiBjYW4gYWNjZXNzLCByZS1jaGVja2luZyBlYWNoIHRocm91Z2ggdGhlIGFwcCBzeW5jIHJlc291cmNlJ3NcbiAgICogYGNoYW5nZURlbGl2ZXJhYmxlYC4gUmV0dXJucyB0aGUgYnJvYWRjYXN0IG5hcnJvd2VkIHRvIGFjY2Vzc2libGUgZW50cmllcyxcbiAgICogb3IgbnVsbCB3aGVuIG5vbmUgYXJlIGFjY2Vzc2libGUuIE5vbi1lbnZlbG9wZSBib2RpZXMgYW5kIGVudHJpZXMgd2l0aG91dCBhXG4gICAqIHJlc291cmNlIGlkIGFyZSBkcm9wcGVkIChmYWlsIGNsb3NlZCkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSBib2R5IC0gQnJvYWRjYXN0IGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEpzb25WYWx1ZSB8IG51bGw+fSBEZWxpdmVyYWJsZSBib2R5LCBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keShib2R5KSB7XG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYm9keSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBlbnZlbG9wZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChib2R5KVxuICAgIGNvbnN0IHNjb3BlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5TZXJpYWxpemVkQ2hhbmdlc1Njb3BlfSAqLyAodGhpcy5fc2NvcGUpXG4gICAgY29uc3Qgc3luY3MgPSBBcnJheS5pc0FycmF5KGVudmVsb3BlLnN5bmNzKSA/IGVudmVsb3BlLnN5bmNzIDogW2VudmVsb3BlXVxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuICAgIC8qKiBAdHlwZSB7QXJyYXk8UmVjb3JkPHN0cmluZywgPz4+fSAqL1xuICAgIGNvbnN0IGRlbGl2ZXJhYmxlU3luY3MgPSBbXVxuXG4gICAgLy8gQnJvYWRjYXN0IGZhbi1vdXQgcnVucyB0aHJvdWdoIGB3aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0c2AgKHNlZVxuICAgIC8vIENvbmZpZ3VyYXRpb24jX2Jyb2FkY2FzdFRvQ2hhbm5lbExvY2FsKSwgc28gdGhlcmUgaXMgbm8gYW1iaWVudCBkYXRhYmFzZVxuICAgIC8vIGNvbm5lY3Rpb24gaGVyZS4gUmVzb2x2ZSB0aGUgcmVzb3VyY2UncyBhYmlsaXR5IGFuZCBydW4gdGhlIHBlci1kZWxpdmVyeVxuICAgIC8vIGFjY2VzcyBxdWVyeSBpbnNpZGUgYSBjaGVja2VkLW91dCBjb25uZWN0aW9uIGNvbnRleHQsIG1pcnJvcmluZyBob3cgb3RoZXJcbiAgICAvLyBicm9hZGNhc3QtdGltZSBEQiB3b3JrICh0aGUgZnJvbnRlbmQtbW9kZWwgY2hhbm5lbCkgb2J0YWlucyBjb25uZWN0aW9ucy5cbiAgICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgJHtWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSB1c2VyLXNjb3BlIGRlbGl2ZXJ5IGFjY2VzcyBjaGVja2B9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRTeW5jUmVzb3VyY2UoKVxuXG4gICAgICBmb3IgKGNvbnN0IHN5bmMgb2Ygc3luY3MpIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IHN5bmM/LnJlc291cmNlSWRcbiAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc3luYz8ucmVzb3VyY2VUeXBlID8/IHNjb3BlLnJlc291cmNlVHlwZVxuXG4gICAgICAgIGlmIChyZXNvdXJjZUlkID09PSB1bmRlZmluZWQgfHwgcmVzb3VyY2VJZCA9PT0gbnVsbCkgY29udGludWVcblxuICAgICAgICBpZiAoYXdhaXQgcmVzb3VyY2UuY2hhbmdlRGVsaXZlcmFibGUoe3BhcmFtczogdGhpcy5wYXJhbXMsIHNjb3BlLCBzeW5jOiB7cmVzb3VyY2VJZDogU3RyaW5nKHJlc291cmNlSWQpLCByZXNvdXJjZVR5cGU6IFN0cmluZyhyZXNvdXJjZVR5cGUpfX0pKSB7XG4gICAgICAgICAgZGVsaXZlcmFibGVTeW5jcy5wdXNoKHN5bmMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGRlbGl2ZXJhYmxlU3luY3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICAgIGlmIChBcnJheS5pc0FycmF5KGVudmVsb3BlLnN5bmNzKSkgcmV0dXJuIHsuLi5lbnZlbG9wZSwgc3luY3M6IGRlbGl2ZXJhYmxlU3luY3N9XG5cbiAgICByZXR1cm4gZGVsaXZlcmFibGVTeW5jc1swXVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dGhvcml6ZWQgc2NvcGUgZm9yIGRlYnVnIHNuYXBzaG90cy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSBEZWJ1Zy1zYWZlIHN1YnNjcmlwdGlvbiBkZXRhaWxzLlxuICAgKi9cbiAgZGVidWdTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4ge3Njb3BlOiB0aGlzLl9zY29wZSwgdXNlclNjb3BlOiB0aGlzLl9pc1VzZXJTY29wZSgpfVxuICB9XG59XG4iXX0=
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy13ZWJzb2NrZXQtY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3N5bmMtd2Vic29ja2V0LWNoYW5uZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8seUJBQXlCLE1BQU0scUNBQXFDLENBQUE7QUFDM0UsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFN0QsK0VBQStFO0FBQy9FLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUU5Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQXFCLFNBQVEseUJBQXlCO0lBQ3pFOzs7T0FHRztJQUNILE1BQU0sR0FBRyxJQUFJLENBQUE7SUFFYjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLHlCQUF5QixDQUFDLGFBQWE7UUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQUUsT0FBTTtRQUVwRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDM0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3RFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQy9DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxD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QUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFDLENBQUE7SUFDN0QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge1ZFTE9DSU9VU19TWU5DX0NIQU5ORUx9IGZyb20gXCIuL3N5bmMtY2hhbm5lbC1uYW1lLmpzXCJcblxuLyoqIENvbmZpZ3VyYXRpb25zIHdob3NlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLiAqL1xuY29uc3QgcmVnaXN0ZXJlZENvbmZpZ3VyYXRpb25zID0gbmV3IFdlYWtTZXQoKVxuXG4vKipcbiAqIEZyYW1ld29yay1vd25lZCB3ZWJzb2NrZXQgY2hhbm5lbCBmb3Igc3luY2VkIHJlc291cmNlc1xuICogKHtAbGluayBWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSkuXG4gKlxuICogU3Vic2NyaWJlIHBhcmFtcyBtaXJyb3IgYSBkZWNsYXJlZCBwdWxsIHNjb3BlIOKAlCBge3Jlc291cmNlVHlwZSwgY29uZGl0aW9uc31gXG4gKiBwbHVzIHRoZSBjbGllbnQtaW5qZWN0ZWQgYGF1dGhlbnRpY2F0aW9uVG9rZW5gIOKAlCBhbmQgc3Vic2NyaWJlLXRpbWVcbiAqIGF1dGhvcml6YXRpb24gZGVsZWdhdGVzIHRvIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzIGV4aXN0aW5nXG4gKiBgYXV0aG9yaXplQ2hhbmdlcyh7cGFyYW1zLCBzY29wZX0pYCAodGhlIGBzeW5jLmFwaS5yZXNvdXJjZUNsYXNzYCksIHNvIGFwcHNcbiAqIGhvb2sgaW4gdGhyb3VnaCB0aGUgYXV0aG9yaXphdGlvbiB0aGV5IGFscmVhZHkgZGVjbGFyZWQgaW5zdGVhZCBvZiB3cml0aW5nXG4gKiB0aGVpciBvd24gY2hhbm5lbCBjbGFzc2VzLiBCcm9hZGNhc3Qgcm91dGluZyBtYXRjaGVzIHRoZSBwdWJsaXNoZXInc1xuICogc2NvcGluZyBwYXJhbXMgYWdhaW5zdCB0aGUgc3Vic2NyaXB0aW9uJ3Mgc2NvcGUgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY1dlYnNvY2tldENoYW5uZWwgZXh0ZW5kcyBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIHtcbiAgLyoqXG4gICAqIFNjb3BlIHRoZSBzdWJzY3JpcHRpb24gd2FzIGF1dGhvcml6ZWQgZm9yLCBzZXQgYnkge0BsaW5rIFN5bmNXZWJzb2NrZXRDaGFubmVsI2NhblN1YnNjcmliZX0uXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5TZXJpYWxpemVkQ2hhbmdlc1Njb3BlIHwgbnVsbH1cbiAgICovXG4gIF9zY29wZSA9IG51bGxcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsIG9uIGEgY29uZmlndXJhdGlvbiBkZWNsYXJpbmcgYVxuICAgKiBgc3luYy5hcGlgIGJsb2NrIChndWFyZGVkIHNvIHJlcGVhdGVkIHNlcnZlciBib290cyB3aXRoIHRoZSBzYW1lXG4gICAqIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaXQgb25seSBvbmNlKS4gTm8tb3Agd2l0aG91dCBgc3luYy5hcGlgIOKAlCB0aGVcbiAgICogY2hhbm5lbCBhdXRob3JpemVzIHRocm91Z2ggdGhlIGFwcCdzIHN5bmMgcmVzb3VyY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJGcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKCkuYXBpIHx8IHJlZ2lzdGVyZWRDb25maWd1cmF0aW9ucy5oYXMoY29uZmlndXJhdGlvbikpIHJldHVyblxuXG4gICAgcmVnaXN0ZXJlZENvbmZpZ3VyYXRpb25zLmFkZChjb25maWd1cmF0aW9uKVxuICAgIGNvbmZpZ3VyYXRpb24ucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsKFZFTE9DSU9VU19TWU5DX0NIQU5ORUwsIHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogQXV0aG9yaXplcyB0aGUgc3Vic2NyaXB0aW9uIHRocm91Z2ggdGhlIGFwcCBzeW5jIHJlc291cmNlOiB0aGUgc3Vic2NyaWJlXG4gICAqIHBhcmFtcyBhcmUgcGFyc2VkIGludG8gdGhlIHNhbWUgc2VyaWFsaXplZCBzY29wZSB0aGUgY2hhbmdlcyBlbmRwb2ludFxuICAgKiBjb25zdW1lcyBhbmQgcGFzc2VkIHRvIHRoZSByZXNvdXJjZSdzIGBhdXRob3JpemVDaGFuZ2VzKHtwYXJhbXMsIHNjb3BlfSlgLlxuICAgKiBEZW5pYWxzIGFuZCBtYWxmb3JtZWQgc2NvcGVzIHRocm93LCByZWplY3RpbmcgdGhlIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbiBpcyBhbGxvd2VkLlxuICAgKi9cbiAgYXN5bmMgY2FuU3Vic2NyaWJlKCkge1xuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFN5bmNSZXNvdXJjZSgpXG4gICAgY29uc3Qgc2NvcGUgPSByZXNvdXJjZS5jaGFuZ2VzU2NvcGUoe3Njb3BlOiB7Y29uZGl0aW9uczogdGhpcy5wYXJhbXMuY29uZGl0aW9ucywgcmVzb3VyY2VUeXBlOiB0aGlzLnBhcmFtcy5yZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZXM6IHRoaXMucGFyYW1zLnJlc291cmNlVHlwZXN9fSlcblxuICAgIGF3YWl0IHJlc291cmNlLmF1dGhvcml6ZUNoYW5nZXMoe3BhcmFtczogdGhpcy5wYXJhbXMsIHNjb3BlfSlcblxuICAgIHRoaXMuX3Njb3BlID0gc2NvcGVcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhcHAgc3luYyByZXNvdXJjZSBhdXRob3JpemluZyB0aGlzIHN1YnNjcmlwdGlvbiwgbWlycm9yaW5nIHRoZVxuICAgKiBzeW5jIHRyYW5zcG9ydCBjb250cm9sbGVyJ3MgcmVzb3VyY2UgY29uc3RydWN0aW9uIHdpdGggdGhlIGFiaWxpdHlcbiAgICogcmVzb2x2ZWQgZnJvbSB0aGUgc3Vic2NyaWJlIHBhcmFtcyAod2hpY2ggY2FycnkgdGhlIGNsaWVudC1pbmplY3RlZFxuICAgKiBhdXRoZW50aWNhdGlvblRva2VuKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zeW5jLXJlc291cmNlLWJhc2UuanNcIikuZGVmYXVsdD59IEFwcCBzeW5jIHJlc291cmNlIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgYnVpbGRTeW5jUmVzb3VyY2UoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG4gICAgY29uc3QgYXBpID0gY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpLmFwaVxuXG4gICAgaWYgKCFhcGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7VkVMT0NJT1VTX1NZTkNfQ0hBTk5FTH0gY2hhbm5lbCByZXF1aXJlcyBhIHN5bmMuYXBpIGNvbmZpZ3VyYXRpb24gYmxvY2sgd2l0aCB0aGUgYXBwJ3Mgc3luYyByZXNvdXJjZSBjbGFzc2ApXG4gICAgfVxuXG4gICAgLy8gTmFycm93cyB0aGUgY29uZmlndXJlZCByZXNvdXJjZSBjbGFzcyB0byB0aGUgc3luYyByZXNvdXJjZSBjb250cmFjdFxuICAgIC8vIChjaGFuZ2VzU2NvcGUvYXV0aG9yaXplQ2hhbmdlcykgdGhlIHN5bmMuYXBpIHZhbGlkYXRpb24gcmVxdWlyZXMuXG4gICAgY29uc3QgUmVzb3VyY2VDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vc3luYy1yZXNvdXJjZS1iYXNlLmpzXCIpLmRlZmF1bHR9ICovIChhcGkucmVzb3VyY2VDbGFzcylcbiAgICAvLyBOYXJyb3dzIHRoZSB3ZWJzb2NrZXQgc3Vic2NyaWJlIHBhcmFtcyB0byB0aGUgcmVzb3VyY2UgcGFyYW1zIGNvbnRyYWN0LlxuICAgIGNvbnN0IHBhcmFtcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNQYXJhbXN9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh0aGlzLnBhcmFtcykpXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuc2Vzc2lvbi51cGdyYWRlUmVxdWVzdFxuICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCBjb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtwYXJhbXMsIHJlcXVlc3R9KVxuXG4gICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNsYXNzKHtcbiAgICAgIGFiaWxpdHksXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIC4uLihhYmlsaXR5Py5nZXRDb250ZXh0KCkgfHwge30pLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0sXG4gICAgICBsb2NhbHM6IGFiaWxpdHk/LmdldExvY2FscygpIHx8IHt9LFxuICAgICAgbW9kZWxDbGFzczogUmVzb3VyY2VDbGFzcy5Nb2RlbENsYXNzLFxuICAgICAgbW9kZWxOYW1lOiBSZXNvdXJjZUNsYXNzLk1vZGVsQ2xhc3M/Lm5hbWUsXG4gICAgICBwYXJhbXMsXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSAqLyAoe1xuICAgICAgICBhdHRyaWJ1dGVzOiBSZXNvdXJjZUNsYXNzLmF0dHJpYnV0ZXMgfHwge30sXG4gICAgICAgIHN5bmM6IHtlbmFibGVkOiB0cnVlfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlcyBhIHB1Ymxpc2hlciBicm9hZGNhc3QgdG8gdGhpcyBzdWJzY3JpcHRpb24gd2hlbiB0aGUgcHVibGlzaGVkXG4gICAqIHJlc291cmNlIHR5cGUgZXF1YWxzIHRoZSB0eXBlIHRoZSBzdWJzY3JpcHRpb24gd2FzIGF1dGhvcml6ZWQgZm9yIGFuZCB0aGVcbiAgICogc2NvcGluZyBwYXJhbXMgc2F0aXNmeSBldmVyeSBzY29wZSBjb25kaXRpb246IGVhY2ggY29uZGl0aW9uIGtleSBtdXN0IGJlXG4gICAqIHByZXNlbnQgaW4gdGhlIGJyb2FkY2FzdCBwYXJhbXMgYW5kIG1hdGNoIGJ5IHN0cmluZyBjb21wYXJpc29uIChhcnJheVxuICAgKiBjb25kaXRpb25zIG1hdGNoIGJ5IG1lbWJlcnNoaXApLiBCcm9hZGNhc3RzIHdpdGhvdXQgYSByZXNvdXJjZSB0eXBlIGFuZFxuICAgKiBjb25kaXRpb25zIHRoZSBwdWJsaXNoZXIncyBzY29waW5nIHBhcmFtcyBkbyBub3QgY2FycnkgbmV2ZXIgbWF0Y2gsIHNvIGFcbiAgICogc3Vic2NyaXB0aW9uIGNhbm5vdCByZWNlaXZlIGNoYW5nZXMgb3V0c2lkZSBpdHMgYXV0aG9yaXplZCBzY29wZS5cbiAgICpcbiAgICogVGhlIGFsbC10eXBlcyAodXNlcikgc2NvcGUgZGVjbGFyZXMgbm8gc2luZ2xlIHJlc291cmNlIHR5cGUgLSBpdCBzdWJzY3JpYmVzXG4gICAqIG9uY2UgZm9yIGV2ZXJ5IHR5cGUgaXQgY2FuIGFwcGx5LCBsaXN0ZWQgaW4gYHNjb3BlLnJlc291cmNlVHlwZXNgIC0gc28gaXRcbiAgICogbWF0Y2hlcyBhIGJyb2FkY2FzdCBvZiBhbnkgb2YgdGhvc2UgdHlwZXMuIFR5cGVzIG91dHNpZGUgdGhhdCBsaXN0IGFyZVxuICAgKiBkcm9wcGVkIGhlcmUsIGJ5IHRoaXMgY2hlYXAgY2hlY2ssIGFuZCBuZXZlciByZWFjaCB0aGUgcGVyLWRlbGl2ZXJ5IGFjY2Vzc1xuICAgKiByZS1jaGVjayBpbiB7QGxpbmsgU3luY1dlYnNvY2tldENoYW5uZWwjX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keX06IHRoYXRcbiAgICogcmUtY2hlY2sgY2hlY2tzIG91dCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHJ1bnMgYSBxdWVyeSBwZXIgbWF0Y2hlZFxuICAgKiBicm9hZGNhc3QsIHNvIG1hdGNoaW5nIGV2ZXJ5IHR5cGUgd291bGQgcHV0IERCIHdvcmsgb24gZXZlcnkgYnJvYWRjYXN0IGZvclxuICAgKiBldmVyeSBzdWJzY3JpYmVkIGRldmljZS4gQSBicm9hZGNhc3QgY2Fycnlpbmcgbm8gcmVzb3VyY2UgdHlwZSBhdCBhbGwgc3RpbGxcbiAgICogbmV2ZXIgbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5XZWJzb2NrZXRKc29uVmFsdWV9IGJyb2FkY2FzdFBhcmFtcyAtIFB1Ymxpc2hlciBzY29waW5nIHBhcmFtcyAodGhlIHB1Ymxpc2hlZCByZXNvdXJjZVR5cGUgcGx1cyB0aGUgY2hhbmdlJ3Mgc2NvcGUtcGFydGl0aW9uIHZhbHVlcykuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBicm9hZGNhc3QgYmVsb25ncyB0byB0aGlzIHN1YnNjcmlwdGlvbidzIHNjb3BlLlxuICAgKi9cbiAgbWF0Y2hlcyhicm9hZGNhc3RQYXJhbXMpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuX3Njb3BlXG5cbiAgICBpZiAoIXNjb3BlKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHNjb3BpbmdQYXJhbXMgPSBicm9hZGNhc3RQYXJhbXMgJiYgdHlwZW9mIGJyb2FkY2FzdFBhcmFtcyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShicm9hZGNhc3RQYXJhbXMpXG4gICAgICA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChicm9hZGNhc3RQYXJhbXMpXG4gICAgICA6IHt9XG5cbiAgICBpZiAoIU9iamVjdC5oYXNPd24oc2NvcGluZ1BhcmFtcywgXCJyZXNvdXJjZVR5cGVcIikpIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHNjb3BlLnJlc291cmNlVHlwZSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHNjb3BlLnJlc291cmNlVHlwZXMgJiYgIXNjb3BlLnJlc291cmNlVHlwZXMuc29tZSgocmVzb3VyY2VUeXBlKSA9PiByZXNvdXJjZVR5cGUgPT09IFN0cmluZyhzY29waW5nUGFyYW1zLnJlc291cmNlVHlwZSkpKSByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKFN0cmluZyhzY29waW5nUGFyYW1zLnJlc291cmNlVHlwZSkgIT09IFN0cmluZyhzY29wZS5yZXNvdXJjZVR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb25kaXRpb25OYW1lLCBjb25kaXRpb25WYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGUuY29uZGl0aW9ucykpIHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihzY29waW5nUGFyYW1zLCBjb25kaXRpb25OYW1lKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IHNjb3BpbmdWYWx1ZSA9IHNjb3BpbmdQYXJhbXNbY29uZGl0aW9uTmFtZV1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uVmFsdWUpKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uVmFsdWUuc29tZSgodmFsdWUpID0+IFN0cmluZyh2YWx1ZSkgPT09IFN0cmluZyhzY29waW5nVmFsdWUpKSkgcmV0dXJuIGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKFN0cmluZyhjb25kaXRpb25WYWx1ZSkgIT09IFN0cmluZyhzY29waW5nVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogRGVsaXZlcnMgYSBtYXRjaGVkIGJyb2FkY2FzdC4gU2NvcGVkIHN1YnNjcmlwdGlvbnMgKHdpdGggZXhwbGljaXRcbiAgICogY29uZGl0aW9ucykgYWxyZWFkeSByb3V0ZWQgdGhyb3VnaCB7QGxpbmsgU3luY1dlYnNvY2tldENoYW5uZWwjbWF0Y2hlc30sIHNvXG4gICAqIHRoZSBjaGFuZ2UgaXMgaW4gc2NvcGUgYW5kIGRlbGl2ZXJzIHVuY2hhbmdlZC4gVXNlci1zY29wZSBzdWJzY3JpcHRpb25zXG4gICAqIChlbXB0eSBjb25kaXRpb25zLCBcImV2ZXJ5dGhpbmcgbXkgYWJpbGl0eSBjYW4gc2VlXCIpIG1hdGNoIGV2ZXJ5IGJyb2FkY2FzdFxuICAgKiBvZiB0aGUgcmVzb3VyY2UgdHlwZSwgc28gZWFjaCBwdWJsaXNoZWQgY2hhbmdlIGlzIHJlLWNoZWNrZWQgYWdhaW5zdCB0aGVcbiAgICogc3Vic2NyaWJlcidzIGFiaWxpdHkgYXQgZmFuLW91dCB0aHJvdWdoIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzXG4gICAqIGBjaGFuZ2VEZWxpdmVyYWJsZWA7IG9ubHkgYWNjZXNzaWJsZSBjaGFuZ2VzIGFyZSBkZWxpdmVyZWQsIGFuZCBhIGJyb2FkY2FzdFxuICAgKiB3aXRoIG5vIGFjY2Vzc2libGUgY2hhbmdlIGlzIGRyb3BwZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSBib2R5IC0gQnJvYWRjYXN0IGJvZHkgKHN5bmMgZW52ZWxvcGUpLlxuICAgKiBAcGFyYW0ge3tldmVudElkPzogc3RyaW5nfX0gW21ldGFdIC0gT3B0aW9uYWwgZXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGVsaXZlckJyb2FkY2FzdChib2R5LCBtZXRhKSB7XG4gICAgaWYgKCF0aGlzLl9pc1VzZXJTY29wZSgpKSB7XG4gICAgICB0aGlzLnNlbmRNZXNzYWdlKGJvZHksIG1ldGEpXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRlbGl2ZXJhYmxlQm9keSA9IGF3YWl0IHRoaXMuX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keShib2R5KVxuXG4gICAgaWYgKGRlbGl2ZXJhYmxlQm9keSAhPT0gbnVsbCkgdGhpcy5zZW5kTWVzc2FnZShkZWxpdmVyYWJsZUJvZHksIG1ldGEpXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN1YnNjcmlwdGlvbiBpcyBhIHVzZXIgc2NvcGU6IGF1dGhvcml6ZWQgd2l0aCBlbXB0eSBjb25kaXRpb25zXG4gICAqIChcImV2ZXJ5dGhpbmcgbXkgYWJpbGl0eSBjYW4gc2VlXCIpLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIGlzIGEgdXNlciBzY29wZS5cbiAgICovXG4gIF9pc1VzZXJTY29wZSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9zY29wZSkgJiYgT2JqZWN0LmtleXMoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5TZXJpYWxpemVkQ2hhbmdlc1Njb3BlfSAqLyAodGhpcy5fc2NvcGUpLmNvbmRpdGlvbnMpLmxlbmd0aCA9PT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYSB1c2VyLXNjb3BlIGJyb2FkY2FzdCB0byB0aGUgc3luYyBlbnRyaWVzIHRoZSBzdWJzY3JpYmVyJ3MgYWJpbGl0eVxuICAgKiBjYW4gYWNjZXNzLCByZS1jaGVja2luZyBlYWNoIHRocm91Z2ggdGhlIGFwcCBzeW5jIHJlc291cmNlJ3NcbiAgICogYGNoYW5nZURlbGl2ZXJhYmxlYC4gUmV0dXJucyB0aGUgYnJvYWRjYXN0IG5hcnJvd2VkIHRvIGFjY2Vzc2libGUgZW50cmllcyxcbiAgICogb3IgbnVsbCB3aGVuIG5vbmUgYXJlIGFjY2Vzc2libGUuIE5vbi1lbnZlbG9wZSBib2RpZXMgYW5kIGVudHJpZXMgd2l0aG91dCBhXG4gICAqIHJlc291cmNlIGlkIGFyZSBkcm9wcGVkIChmYWlsIGNsb3NlZCkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSBib2R5IC0gQnJvYWRjYXN0IGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEpzb25WYWx1ZSB8IG51bGw+fSBEZWxpdmVyYWJsZSBib2R5LCBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgX3VzZXJTY29wZURlbGl2ZXJhYmxlQm9keShib2R5KSB7XG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYm9keSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBlbnZlbG9wZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChib2R5KVxuICAgIGNvbnN0IHNjb3BlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtcmVzb3VyY2UtYmFzZS5qc1wiKS5TZXJpYWxpemVkQ2hhbmdlc1Njb3BlfSAqLyAodGhpcy5fc2NvcGUpXG4gICAgLyoqIEB0eXBlIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj59ICovXG4gICAgY29uc3Qgc3luY3MgPSBBcnJheS5pc0FycmF5KGVudmVsb3BlLnN5bmNzKSA/IGVudmVsb3BlLnN5bmNzIDogW2VudmVsb3BlXVxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuICAgIC8qKiBAdHlwZSB7QXJyYXk8UmVjb3JkPHN0cmluZywgPz4+fSAqL1xuICAgIGNvbnN0IGRlbGl2ZXJhYmxlU3luY3MgPSBbXVxuXG4gICAgLy8gQnJvYWRjYXN0IGZhbi1vdXQgcnVucyB0aHJvdWdoIGB3aXRob3V0Q3VycmVudENvbm5lY3Rpb25Db250ZXh0c2AgKHNlZVxuICAgIC8vIENvbmZpZ3VyYXRpb24jX2Jyb2FkY2FzdFRvQ2hhbm5lbExvY2FsKSwgc28gdGhlcmUgaXMgbm8gYW1iaWVudCBkYXRhYmFzZVxuICAgIC8vIGNvbm5lY3Rpb24gaGVyZS4gUmVzb2x2ZSB0aGUgcmVzb3VyY2UncyBhYmlsaXR5IGFuZCBydW4gdGhlIHBlci1kZWxpdmVyeVxuICAgIC8vIGFjY2VzcyBxdWVyeSBpbnNpZGUgYSBjaGVja2VkLW91dCBjb25uZWN0aW9uIGNvbnRleHQsIG1pcnJvcmluZyBob3cgb3RoZXJcbiAgICAvLyBicm9hZGNhc3QtdGltZSBEQiB3b3JrICh0aGUgZnJvbnRlbmQtbW9kZWwgY2hhbm5lbCkgb2J0YWlucyBjb25uZWN0aW9ucy5cbiAgICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgJHtWRUxPQ0lPVVNfU1lOQ19DSEFOTkVMfSB1c2VyLXNjb3BlIGRlbGl2ZXJ5IGFjY2VzcyBjaGVja2B9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRTeW5jUmVzb3VyY2UoKVxuXG4gICAgICBmb3IgKGNvbnN0IHN5bmMgb2Ygc3luY3MpIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IHN5bmM/LnJlc291cmNlSWRcbiAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc3luYz8ucmVzb3VyY2VUeXBlID8/IHNjb3BlLnJlc291cmNlVHlwZVxuXG4gICAgICAgIGlmIChyZXNvdXJjZUlkID09PSB1bmRlZmluZWQgfHwgcmVzb3VyY2VJZCA9PT0gbnVsbCkgY29udGludWVcblxuICAgICAgICAvLyBQYXNzIHRoZSBjb21wbGV0ZSBicm9hZGNhc3QgZW50cnkgdGhyb3VnaCBzbyB0aGUgYXBwJ3NcbiAgICAgICAgLy8gY2hhbmdlRGVsaXZlcmFibGUgY2FuIGF1dGhvcml6ZSBieSBleGFjdC1yb3cgaWRlbnRpdHkgKGltbXV0YWJsZVxuICAgICAgICAvLyBzeW5jLXJvdyBpZCwgYWN0b3Itc3BlY2lmaWMgbWV0YWRhdGEpIOKAlCBjb25jdXJyZW50IHRhcmdldGVkIGFuZFxuICAgICAgICAvLyBzaGFyZWQgYnJvYWRjYXN0cyBmb3IgdGhlIHNhbWUgcmVzb3VyY2UgaWRlbnRpdHkgYXV0aG9yaXplXG4gICAgICAgIC8vIGluZGVwZW5kZW50bHkuIE9ubHkgcmVzb3VyY2VJZC9yZXNvdXJjZVR5cGUgYXJlIG5vcm1hbGl6ZWQgdG9cbiAgICAgICAgLy8gc3RyaW5ncywgb24gYSBjb3B5IHNvIHRoZSBwdWJsaXNoZWQgZW50cnkgaXMgbmV2ZXIgbXV0YXRlZC5cbiAgICAgICAgY29uc3Qgc3luY0VudHJ5ID0ge1xuICAgICAgICAgIC4uLnN5bmMsXG4gICAgICAgICAgcmVzb3VyY2VJZDogU3RyaW5nKHJlc291cmNlSWQpLFxuICAgICAgICAgIHJlc291cmNlVHlwZTogU3RyaW5nKHJlc291cmNlVHlwZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhd2FpdCByZXNvdXJjZS5jaGFuZ2VEZWxpdmVyYWJsZSh7cGFyYW1zOiB0aGlzLnBhcmFtcywgc2NvcGUsIHN5bmM6IHN5bmNFbnRyeX0pKSB7XG4gICAgICAgICAgZGVsaXZlcmFibGVTeW5jcy5wdXNoKHN5bmMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGRlbGl2ZXJhYmxlU3luY3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICAgIGlmIChBcnJheS5pc0FycmF5KGVudmVsb3BlLnN5bmNzKSkgcmV0dXJuIHsuLi5lbnZlbG9wZSwgc3luY3M6IGRlbGl2ZXJhYmxlU3luY3N9XG5cbiAgICByZXR1cm4gZGVsaXZlcmFibGVTeW5jc1swXVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dGhvcml6ZWQgc2NvcGUgZm9yIGRlYnVnIHNuYXBzaG90cy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSBEZWJ1Zy1zYWZlIHN1YnNjcmlwdGlvbiBkZXRhaWxzLlxuICAgKi9cbiAgZGVidWdTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4ge3Njb3BlOiB0aGlzLl9zY29wZSwgdXNlclNjb3BlOiB0aGlzLl9pc1VzZXJTY29wZSgpfVxuICB9XG59XG4iXX0=
@@ -215,7 +215,7 @@ export default class SyncPublisher {
215
215
  await this.broadcaster()({
216
216
  body: {
217
217
  echoOrigin: null,
218
- syncs: [{data, resourceId, resourceType: resourceConfig.resourceType, syncType}]
218
+ syncs: [this.publishedSyncEntry({data, resourceConfig, resourceId, syncRow, syncType})]
219
219
  },
220
220
  channel: VELOCIOUS_SYNC_CHANNEL,
221
221
  params: {...scopeValues.params, resourceType: resourceConfig.resourceType}
@@ -271,6 +271,42 @@ export default class SyncPublisher {
271
271
  return {columns, params}
272
272
  }
273
273
 
274
+ /**
275
+ * Builds the framework sync channel entry for one published change: the
276
+ * snapshotted payload plus the persisted sync row's public exact-row metadata
277
+ * (id, server sequence, updated-at, and declared scope-partition attributes).
278
+ * Uses the sync model's generated typed accessors and follows the
279
+ * change-feed serializer's public field convention.
280
+ * @param {{data: Record<string, ?>, resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig, resourceId: string, syncRow: ?, syncType: string}} args - Publish args.
281
+ * @returns {Record<string, ?>} Broadcast sync entry.
282
+ */
283
+ publishedSyncEntry({data, resourceConfig, resourceId, syncRow, syncType}) {
284
+ /** @type {Record<string, ?>} */
285
+ const entry = {
286
+ data,
287
+ id: syncRow.id(),
288
+ resourceId,
289
+ resourceType: resourceConfig.resourceType,
290
+ serverSequence: syncRow.serverSequence(),
291
+ syncType,
292
+ updatedAt: isoDate(syncRow.updatedAt())
293
+ }
294
+
295
+ const scopeAttributes = declaredSyncScopeAttributes(this.config.syncModel)
296
+
297
+ for (const scopeAttribute of scopeAttributes || []) {
298
+ const scopeAccessor = syncRow[scopeAttribute]
299
+
300
+ if (typeof scopeAccessor !== "function") {
301
+ throw new Error(`Published sync row is missing the declared scope accessor ${scopeAttribute}().`)
302
+ }
303
+
304
+ entry[scopeAttribute] = scopeAccessor.call(syncRow)
305
+ }
306
+
307
+ return entry
308
+ }
309
+
274
310
  /**
275
311
  * Upserts the published server-origin sync row for a resource identity:
276
312
  * server-origin rows carry a null actor column (no device to echo the
@@ -505,3 +541,18 @@ function defaultSerializedAttributes(record) {
505
541
 
506
542
  return attributes
507
543
  }
544
+
545
+ /**
546
+ * Converts a date-like value to an ISO string, matching the change-feed
547
+ * serializer's convention for the sync entry's public updated-at metadata.
548
+ * @param {Date | null} value - Persisted updated-at value.
549
+ * @returns {string} ISO date.
550
+ * @throws {Error} When the persisted row has no valid updated-at timestamp.
551
+ */
552
+ function isoDate(value) {
553
+ if (!(value instanceof Date) || Number.isNaN(value.getTime())) {
554
+ throw new Error("Published sync row must have a valid updatedAt timestamp.")
555
+ }
556
+
557
+ return value.toISOString()
558
+ }
@@ -14,6 +14,17 @@ import VelociousError from "../velocious-error.js"
14
14
  * @property {string | null} resourceType - Client resource/model name the scope was declared for, or null for the all-types (user) scope: one scope covering every resource type this resource authorizes for the caller, so a sync authorizes once however many types it serves.
15
15
  * @property {string[] | null} resourceTypes - For the all-types scope, the resource types the client can apply. A cheap delivery/type filter only - it narrows, never widens, what the app's authorization already allows. Null for a type-declared scope.
16
16
  */
17
+
18
+ /**
19
+ * One published sync entry as delivered to the per-delivery access re-check
20
+ * ({@link SyncResourceBase#changeDeliverable}): the complete broadcast sync
21
+ * entry — including the immutable sync-row id, actor-specific metadata, and
22
+ * any other app fields the publisher put on it — with `resourceId` and
23
+ * `resourceType` normalized to strings. Apps authorizing by exact-row
24
+ * identity read the extra fields; overrides that only read
25
+ * `resourceId`/`resourceType` keep working unchanged.
26
+ * @typedef {Record<string, ?> & {resourceId: string, resourceType: string}} ChangeDeliverableSyncEntry
27
+ */
17
28
  const QUICK_SEARCH_COLUMN = "quickSearch"
18
29
 
19
30
  /**
@@ -240,7 +251,14 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
240
251
  * checks whether the published change's feed row is visible within that
241
252
  * scope. Apps get this for free from the scoping they already declared;
242
253
  * override only for custom per-delivery rules.
243
- * @param {{params: Record<string, ?>, scope: SerializedChangesScope | null, sync: {resourceId: string, resourceType: string}}} args - Request params, subscription scope, and the published change's identity.
254
+ *
255
+ * The `sync` argument is the complete broadcast sync entry — immutable
256
+ * sync-row id, actor-specific metadata, and any other publisher fields —
257
+ * with `resourceId`/`resourceType` normalized to strings, so an override
258
+ * can authorize concurrent targeted and shared broadcasts for the same
259
+ * resource identity independently by their exact-row identity. The channel
260
+ * never mutates the published entry; normalization happens on a copy.
261
+ * @param {{params: Record<string, ?>, scope: SerializedChangesScope | null, sync: ChangeDeliverableSyncEntry}} args - Request params, subscription scope, and the published sync entry.
244
262
  * @returns {Promise<boolean>} Whether the change may be delivered to this subscription.
245
263
  */
246
264
  async changeDeliverable({params, scope, sync}) {
@@ -200,6 +200,7 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
200
200
 
201
201
  const envelope = /** @type {Record<string, ?>} */ (body)
202
202
  const scope = /** @type {import("./sync-resource-base.js").SerializedChangesScope} */ (this._scope)
203
+ /** @type {Array<Record<string, ?>>} */
203
204
  const syncs = Array.isArray(envelope.syncs) ? envelope.syncs : [envelope]
204
205
  const configuration = this.session.configuration
205
206
  /** @type {Array<Record<string, ?>>} */
@@ -219,7 +220,19 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
219
220
 
220
221
  if (resourceId === undefined || resourceId === null) continue
221
222
 
222
- if (await resource.changeDeliverable({params: this.params, scope, sync: {resourceId: String(resourceId), resourceType: String(resourceType)}})) {
223
+ // Pass the complete broadcast entry through so the app's
224
+ // changeDeliverable can authorize by exact-row identity (immutable
225
+ // sync-row id, actor-specific metadata) — concurrent targeted and
226
+ // shared broadcasts for the same resource identity authorize
227
+ // independently. Only resourceId/resourceType are normalized to
228
+ // strings, on a copy so the published entry is never mutated.
229
+ const syncEntry = {
230
+ ...sync,
231
+ resourceId: String(resourceId),
232
+ resourceType: String(resourceType)
233
+ }
234
+
235
+ if (await resource.changeDeliverable({params: this.params, scope, sync: syncEntry})) {
223
236
  deliverableSyncs.push(sync)
224
237
  }
225
238
  }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.573",
6
+ "version": "1.0.574",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -215,7 +215,7 @@ export default class SyncPublisher {
215
215
  await this.broadcaster()({
216
216
  body: {
217
217
  echoOrigin: null,
218
- syncs: [{data, resourceId, resourceType: resourceConfig.resourceType, syncType}]
218
+ syncs: [this.publishedSyncEntry({data, resourceConfig, resourceId, syncRow, syncType})]
219
219
  },
220
220
  channel: VELOCIOUS_SYNC_CHANNEL,
221
221
  params: {...scopeValues.params, resourceType: resourceConfig.resourceType}
@@ -271,6 +271,42 @@ export default class SyncPublisher {
271
271
  return {columns, params}
272
272
  }
273
273
 
274
+ /**
275
+ * Builds the framework sync channel entry for one published change: the
276
+ * snapshotted payload plus the persisted sync row's public exact-row metadata
277
+ * (id, server sequence, updated-at, and declared scope-partition attributes).
278
+ * Uses the sync model's generated typed accessors and follows the
279
+ * change-feed serializer's public field convention.
280
+ * @param {{data: Record<string, ?>, resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig, resourceId: string, syncRow: ?, syncType: string}} args - Publish args.
281
+ * @returns {Record<string, ?>} Broadcast sync entry.
282
+ */
283
+ publishedSyncEntry({data, resourceConfig, resourceId, syncRow, syncType}) {
284
+ /** @type {Record<string, ?>} */
285
+ const entry = {
286
+ data,
287
+ id: syncRow.id(),
288
+ resourceId,
289
+ resourceType: resourceConfig.resourceType,
290
+ serverSequence: syncRow.serverSequence(),
291
+ syncType,
292
+ updatedAt: isoDate(syncRow.updatedAt())
293
+ }
294
+
295
+ const scopeAttributes = declaredSyncScopeAttributes(this.config.syncModel)
296
+
297
+ for (const scopeAttribute of scopeAttributes || []) {
298
+ const scopeAccessor = syncRow[scopeAttribute]
299
+
300
+ if (typeof scopeAccessor !== "function") {
301
+ throw new Error(`Published sync row is missing the declared scope accessor ${scopeAttribute}().`)
302
+ }
303
+
304
+ entry[scopeAttribute] = scopeAccessor.call(syncRow)
305
+ }
306
+
307
+ return entry
308
+ }
309
+
274
310
  /**
275
311
  * Upserts the published server-origin sync row for a resource identity:
276
312
  * server-origin rows carry a null actor column (no device to echo the
@@ -505,3 +541,18 @@ function defaultSerializedAttributes(record) {
505
541
 
506
542
  return attributes
507
543
  }
544
+
545
+ /**
546
+ * Converts a date-like value to an ISO string, matching the change-feed
547
+ * serializer's convention for the sync entry's public updated-at metadata.
548
+ * @param {Date | null} value - Persisted updated-at value.
549
+ * @returns {string} ISO date.
550
+ * @throws {Error} When the persisted row has no valid updated-at timestamp.
551
+ */
552
+ function isoDate(value) {
553
+ if (!(value instanceof Date) || Number.isNaN(value.getTime())) {
554
+ throw new Error("Published sync row must have a valid updatedAt timestamp.")
555
+ }
556
+
557
+ return value.toISOString()
558
+ }
@@ -14,6 +14,17 @@ import VelociousError from "../velocious-error.js"
14
14
  * @property {string | null} resourceType - Client resource/model name the scope was declared for, or null for the all-types (user) scope: one scope covering every resource type this resource authorizes for the caller, so a sync authorizes once however many types it serves.
15
15
  * @property {string[] | null} resourceTypes - For the all-types scope, the resource types the client can apply. A cheap delivery/type filter only - it narrows, never widens, what the app's authorization already allows. Null for a type-declared scope.
16
16
  */
17
+
18
+ /**
19
+ * One published sync entry as delivered to the per-delivery access re-check
20
+ * ({@link SyncResourceBase#changeDeliverable}): the complete broadcast sync
21
+ * entry — including the immutable sync-row id, actor-specific metadata, and
22
+ * any other app fields the publisher put on it — with `resourceId` and
23
+ * `resourceType` normalized to strings. Apps authorizing by exact-row
24
+ * identity read the extra fields; overrides that only read
25
+ * `resourceId`/`resourceType` keep working unchanged.
26
+ * @typedef {Record<string, ?> & {resourceId: string, resourceType: string}} ChangeDeliverableSyncEntry
27
+ */
17
28
  const QUICK_SEARCH_COLUMN = "quickSearch"
18
29
 
19
30
  /**
@@ -240,7 +251,14 @@ export default class SyncResourceBase extends FrontendModelBaseResource {
240
251
  * checks whether the published change's feed row is visible within that
241
252
  * scope. Apps get this for free from the scoping they already declared;
242
253
  * override only for custom per-delivery rules.
243
- * @param {{params: Record<string, ?>, scope: SerializedChangesScope | null, sync: {resourceId: string, resourceType: string}}} args - Request params, subscription scope, and the published change's identity.
254
+ *
255
+ * The `sync` argument is the complete broadcast sync entry — immutable
256
+ * sync-row id, actor-specific metadata, and any other publisher fields —
257
+ * with `resourceId`/`resourceType` normalized to strings, so an override
258
+ * can authorize concurrent targeted and shared broadcasts for the same
259
+ * resource identity independently by their exact-row identity. The channel
260
+ * never mutates the published entry; normalization happens on a copy.
261
+ * @param {{params: Record<string, ?>, scope: SerializedChangesScope | null, sync: ChangeDeliverableSyncEntry}} args - Request params, subscription scope, and the published sync entry.
244
262
  * @returns {Promise<boolean>} Whether the change may be delivered to this subscription.
245
263
  */
246
264
  async changeDeliverable({params, scope, sync}) {
@@ -200,6 +200,7 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
200
200
 
201
201
  const envelope = /** @type {Record<string, ?>} */ (body)
202
202
  const scope = /** @type {import("./sync-resource-base.js").SerializedChangesScope} */ (this._scope)
203
+ /** @type {Array<Record<string, ?>>} */
203
204
  const syncs = Array.isArray(envelope.syncs) ? envelope.syncs : [envelope]
204
205
  const configuration = this.session.configuration
205
206
  /** @type {Array<Record<string, ?>>} */
@@ -219,7 +220,19 @@ export default class SyncWebsocketChannel extends VelociousWebsocketChannel {
219
220
 
220
221
  if (resourceId === undefined || resourceId === null) continue
221
222
 
222
- if (await resource.changeDeliverable({params: this.params, scope, sync: {resourceId: String(resourceId), resourceType: String(resourceType)}})) {
223
+ // Pass the complete broadcast entry through so the app's
224
+ // changeDeliverable can authorize by exact-row identity (immutable
225
+ // sync-row id, actor-specific metadata) — concurrent targeted and
226
+ // shared broadcasts for the same resource identity authorize
227
+ // independently. Only resourceId/resourceType are normalized to
228
+ // strings, on a copy so the published entry is never mutated.
229
+ const syncEntry = {
230
+ ...sync,
231
+ resourceId: String(resourceId),
232
+ resourceType: String(resourceType)
233
+ }
234
+
235
+ if (await resource.changeDeliverable({params: this.params, scope, sync: syncEntry})) {
223
236
  deliverableSyncs.push(sync)
224
237
  }
225
238
  }