velocious 1.0.670 → 1.0.671

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
@@ -15,7 +15,7 @@
15
15
  * Controllers and views for HTTP endpoints
16
16
  * Frontend-model transport for creating, updating, querying, and subscribing to query-filtered lifecycle events over HTTP/WebSocket, including committed counter-cache parent updates, structured per-attribute validation error responses, immutable per-operation remote request context, registration-local tenant subscription partitioning, and one-budget WebSocket startup controls (see [docs/frontend-models.md](docs/frontend-models.md), [docs/remote-request-context.md](docs/remote-request-context.md), and [docs/websocket-channels.md](docs/websocket-channels.md))
17
17
  * Client-side offline sync mutation logs and frontend-model optimistic queueing primitives (see the [shared-resource sync developer guide](docs/shared-resource-sync-guide.md) and [offline sync architecture](docs/offline-sync.md))
18
- * Declarative client sync scopes with per-scope cursors, generation-fenced identity replacement and selected-scope cache reset, automatic mutation tracking, opt-in durable base-version conflict replay, realtime delivery and reconnect gap closure, computed server-publish scope metadata with atomic null-safe publisher row identities and legacy-duplicate reconciliation, and immutable-handle project clients whose local database state plus remote pull/replay/realtime request context stay tenant-bound through reconnect (see [docs/sync-client.md](docs/sync-client.md), [docs/remote-request-context.md](docs/remote-request-context.md), and [docs/offline-sync.md](docs/offline-sync.md))
18
+ * Declarative client sync scopes with per-scope cursors, generation-fenced identity replacement and selected-scope cache reset, automatic mutation tracking, opt-in durable base-version conflict replay, realtime delivery and reconnect gap closure, computed server-publish scope metadata with atomic null-safe publisher row identities, a shared public maintenance upsert helper and legacy-duplicate reconciliation, and immutable-handle project clients whose local database state plus remote pull/replay/realtime request context stay tenant-bound through reconnect (see [docs/sync-client.md](docs/sync-client.md), [docs/remote-request-context.md](docs/remote-request-context.md), and [docs/offline-sync.md](docs/offline-sync.md))
19
19
  * Reactive `useLiveQuery(Model.where(...))` queries for default databases plus immutable-handle tenant live-query sources whose committed events and refreshes stay on the captured physical tenant (see [docs/live-queries.md](docs/live-queries.md))
20
20
  * Server-side sync envelope replay orchestration for app-owned sync receivers, including allowlisted authoritative conflict snapshots that retain submitted aliases in conflict metadata while keying `serverModel` by canonical model attributes (see [docs/sync-envelope-replay-service.md](docs/sync-envelope-replay-service.md))
21
21
  * Self-sustaining sync feeds: upstream imports triggered by the changes pull itself, with framework-owned coalescing and throttling (see [docs/sync-upstream-imports.md](docs/sync-upstream-imports.md))
@@ -18,6 +18,7 @@ export default class ServerSequenceAllocator {
18
18
  tableName: string;
19
19
  _memorySequence: number;
20
20
  _isReady: boolean;
21
+ _transactionalReadinessPending: boolean;
21
22
  /** @type {Promise<void> | null} */
22
23
  _readyPromise: Promise<void> | null;
23
24
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"server-sequence-allocator.d.ts","sourceRoot":"","sources":["../../../src/sync/server-sequence-allocator.js"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAU/C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAUnC,aAAa;IACb,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,eAAe;IACf,QAAQ;IACb,mCAAmC;IAC9B,aAAa,EADP,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAfjC;;;;;;;OAOG;IACH,YAAY,EAAC,aAAa,EAAE,kBAA8B,EAAE,UAAU,EAAE,SAAwC,EAAC,AAN9G,CAKF,EAJE;QAAqD,aAAa,AAAlE,CACA,EADQ,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAsB,kBAAkB,AAAxC,CACA,EADQ,MAAM,CACd;QAA6D,UAAU,AAAvE,CACA,EADQ,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAAsB,SAAS,AAA/B,CACF,EADU,MAAM,CAChB;KACqH,EASrH;IAED;;;;;;;;;OASG;IACG,IAAI,CAAC,EAAC,UAAU,EAAC,AAHpB,CACA,EADQ;QAAC,UAAU,CAAC,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAA;KAG1C,GAFf,OAAO,CAAC,MAAM,CAAC,CAU3B;IAED;;;;OAIG;IACG,cAAc,CAAC,MAAM,EAHhB,OAAO,6BAA6B,EAAE,OAGtB,GAFd,OAAO,CAAC,MAAM,CAAC,CAsB3B;IAED;;;;OAIG;IACG,WAAW,CAAC,UAAU,AAHzB,CACA,EADQ,OAAO,6BAA6B,EAAE,OAGrB,GAFf,OAAO,CAAC,IAAI,CAAC,CA6BzB;IAED;;;;OAIG;IACG,aAAa,CAAC,UAAU,AAH3B,CACA,EADQ,OAAO,6BAA6B,EAAE,OAGnB,GAFjB,OAAO,CAAC,MAAM,CAAC,CA4B3B;IAED;;;OAGG;IACH,cAAc,IAFD,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAIzD;IAED;;;OAGG;IACH,iBAAiB,IAFJ,OAAO,qBAAqB,EAAE,OAAO,CAIjD;IAED;;;OAGG;IACH,kBAAkB,IAFL,OAAO,CAQnB;IAED;;;;;;OAMG;IACG,OAAO,CALA,MAAM,EAKL,QAAQ,EAJX,CAAC,EAAE,EAAE,OAAO,6BAA6B,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAI1D,EAAE,UAAU,AAH/B,CACA,EADQ,OAAO,6BAA6B,EAAE,OAGf,GAFrB,OAAO,CAAC,MAAM,CAAC,CAY3B;IAED;;;;OAIG;IACG,qBAAqB,CAAC,EAAE,EAHnB,OAAO,6BAA6B,EAAE,OAGnB,GAFjB,OAAO,CAAC,OAAO,CAAC,CAa5B;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAPkC,WAAW,SAAjE,cAAc,6BAA6B,EAAE,OAAoB,EAO5C,UAAU,EANlC,WAMkC,EAAE,EAAC,SAAS,EAAE,MAAyB,EAAC,EAJlF;IAAsC,SAAS,EAAvC,uBAAuB,CAC/B;IAAsB,MAAM,AAA5B,CACA,EADQ,MAAM,CACd;CAEkF,GAFxE,WAAW,CAwCvB"}
1
+ {"version":3,"file":"server-sequence-allocator.d.ts","sourceRoot":"","sources":["../../../src/sync/server-sequence-allocator.js"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAU/C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAUnC,aAAa;IACb,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,eAAe;IACf,QAAQ;IACR,8BAA8B;IACnC,mCAAmC;IAC9B,aAAa,EADP,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAhBjC;;;;;;;OAOG;IACH,YAAY,EAAC,aAAa,EAAE,kBAA8B,EAAE,UAAU,EAAE,SAAwC,EAAC,AAN9G,CAKF,EAJE;QAAqD,aAAa,AAAlE,CACA,EADQ,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAsB,kBAAkB,AAAxC,CACA,EADQ,MAAM,CACd;QAA6D,UAAU,AAAvE,CACA,EADQ,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAAsB,SAAS,AAA/B,CACF,EADU,MAAM,CAChB;KACqH,EAUrH;IAED;;;;;;;;;OASG;IACG,IAAI,CAAC,EAAC,UAAU,EAAC,AAHpB,CACA,EADQ;QAAC,UAAU,CAAC,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAA;KAG1C,GAFf,OAAO,CAAC,MAAM,CAAC,CAU3B;IAED;;;;OAIG;IACG,cAAc,CAAC,MAAM,EAHhB,OAAO,6BAA6B,EAAE,OAGtB,GAFd,OAAO,CAAC,MAAM,CAAC,CAsB3B;IAED;;;;OAIG;IACG,WAAW,CAAC,UAAU,AAHzB,CACA,EADQ,OAAO,6BAA6B,EAAE,OAGrB,GAFf,OAAO,CAAC,IAAI,CAAC,CA+CzB;IAED;;;;OAIG;IACG,aAAa,CAAC,UAAU,AAH3B,CACA,EADQ,OAAO,6BAA6B,EAAE,OAGnB,GAFjB,OAAO,CAAC,MAAM,CAAC,CA4B3B;IAED;;;OAGG;IACH,cAAc,IAFD,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAIzD;IAED;;;OAGG;IACH,iBAAiB,IAFJ,OAAO,qBAAqB,EAAE,OAAO,CAIjD;IAED;;;OAGG;IACH,kBAAkB,IAFL,OAAO,CAQnB;IAED;;;;;;OAMG;IACG,OAAO,CALA,MAAM,EAKL,QAAQ,EAJX,CAAC,EAAE,EAAE,OAAO,6BAA6B,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAI1D,EAAE,UAAU,AAH/B,CACA,EADQ,OAAO,6BAA6B,EAAE,OAGf,GAFrB,OAAO,CAAC,MAAM,CAAC,CAY3B;IAED;;;;OAIG;IACG,qBAAqB,CAAC,EAAE,EAHnB,OAAO,6BAA6B,EAAE,OAGnB,GAFjB,OAAO,CAAC,OAAO,CAAC,CAa5B;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAPkC,WAAW,SAAjE,cAAc,6BAA6B,EAAE,OAAoB,EAO5C,UAAU,EANlC,WAMkC,EAAE,EAAC,SAAS,EAAE,MAAyB,EAAC,EAJlF;IAAsC,SAAS,EAAvC,uBAAuB,CAC/B;IAAsB,MAAM,AAA5B,CACA,EADQ,MAAM,CACd;CAEkF,GAFxE,WAAW,CAwCvB"}
@@ -35,6 +35,7 @@ export default class ServerSequenceAllocator {
35
35
  this.tableName = tableName;
36
36
  this._memorySequence = 0;
37
37
  this._isReady = false;
38
+ this._transactionalReadinessPending = false;
38
39
  /** @type {Promise<void> | null} */
39
40
  this._readyPromise = null;
40
41
  }
@@ -94,11 +95,28 @@ export default class ServerSequenceAllocator {
94
95
  // DDL joins any transaction already open on this connection (the mixin's
95
96
  // beforeCreate allocation always runs inside the record save transaction),
96
97
  // and on transactional-DDL databases (MSSQL, PostgreSQL, SQLite) a rollback
97
- // of that outer transaction removes the just-created table again. Only
98
- // cache readiness when the table was not created inside an active
99
- // transaction; otherwise the next allocation re-verifies the table.
100
- if (!created || !db.insideTransaction())
98
+ // of that outer transaction removes the just-created table again. Keep
99
+ // readiness pending for every later allocation in that same transaction;
100
+ // otherwise its table-exists check would incorrectly cache readiness before
101
+ // the outer transaction commits.
102
+ if (!created) {
103
+ if (!this._transactionalReadinessPending)
104
+ this._isReady = true;
105
+ return;
106
+ }
107
+ if (db.insideTransaction()) {
108
+ this._transactionalReadinessPending = true;
109
+ void db.transactionCompletion().then(() => {
110
+ // The transaction may have committed or rolled back. Re-check once
111
+ // on the next allocation, then cache the durable outcome normally.
112
+ this._isReady = false;
113
+ this._transactionalReadinessPending = false;
114
+ });
115
+ }
116
+ else {
101
117
  this._isReady = true;
118
+ this._transactionalReadinessPending = false;
119
+ }
102
120
  }, connection);
103
121
  try {
104
122
  await this._readyPromise;
@@ -243,4 +261,4 @@ export function withServerSequence(ModelClass, { allocator, column = "serverSequ
243
261
  });
244
262
  return ModelClass;
245
263
  }
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLXNlcXVlbmNlLWFsbG9jYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3NlcnZlci1zZXF1ZW5jZS1hbGxvY2F0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBRXZEOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHVCQUF1QjtJQUMxQzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsR0FBRyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRyw0QkFBNEIsRUFBQyxHQUFHLEVBQUU7UUFDcEgsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFBO1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDLFVBQVUsRUFBQyxHQUFHLEVBQUU7UUFDMUIsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUMsR0FB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LElBQUksVUFBVSxJQUFJLE9BQU8sU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ3RHLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLGdCQUFnQixRQUFRLGFBQWEsaUJBQWlCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ25JLENBQUM7SUFFRCxJQUFJLE9BQU8sU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7UUFDdEQ7Ozs7V0FJRztRQUNILFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssVUFBVSxxQ0FBcUM7WUFDakYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDOUQsQ0FBQyxDQUFBO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3ZDLDhFQUE4RTtRQUM5RSxNQUFNLGFBQWEsR0FBRyw0REFBNEQsQ0FBQyxFQUFDLDRDQUE2QyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFFMUksSUFBSSxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFBRSxPQUFNO1FBRTFDLE1BQU0sYUFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQTtJQUMxQyxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5cbi8qKlxuICogQWxsb2NhdGlvbiBxdWV1ZXMgcGVyIGRhdGFiYXNlK3RhYmxlLCBzZXJpYWxpemluZyBpbnNlcnQvbGFzdC1pbnNlcnQtaWRcbiAqIHBhaXJzIGFjcm9zcyBhbGwgYWxsb2NhdG9yIGluc3RhbmNlcyBpbiB0aGlzIHByb2Nlc3MuXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj59XG4gKi9cbmNvbnN0IGFsbG9jYXRpb25RdWV1ZXMgPSBuZXcgTWFwKClcblxuLyoqXG4gKiBBbGxvY2F0ZXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHNlcnZlciBzeW5jIHNlcXVlbmNlcyBmcm9tIGFuXG4gKiBBVVRPX0lOQ1JFTUVOVCBpZCB0YWJsZTogZXZlcnkgYWxsb2NhdGlvbiBpbnNlcnRzIGEgcm93IGFuZCByZXR1cm5zIHRoZVxuICogZHJpdmVyJ3MgbGFzdC1pbnNlcnQgaWQsIHNvIHNlcXVlbmNlcyBzdGF5IHVuaXF1ZSBhbmQgaW5jcmVhc2luZyBhY3Jvc3NcbiAqIHByb2Nlc3NlcyBzaGFyaW5nIHRoZSBzYW1lIGRhdGFiYXNlLlxuICpcbiAqIEJhY2tlZCBieSBhbiBhdXRvLWNyZWF0ZWQgYHZlbG9jaW91c19zZXJ2ZXJfc2VxdWVuY2VzYCB0YWJsZSBvbiB0aGVcbiAqIGNvbmZpZ3VyZWQgZGF0YWJhc2UsIHdpdGggYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBjb3VudGVyIGZhbGxiYWNrIHdoZW4gbm9cbiAqIGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWQgKG1pcnJvcmluZyB0aGUgc3luYyBzY29wZSBzdG9yZSkuIEFwcHMgd2l0aCBhblxuICogZXhpc3Rpbmcgc2VxdWVuY2UgdGFibGUgKGZvciBleGFtcGxlIGEgYmFyZSBgaWRgLW9ubHkgQVVUT19JTkNSRU1FTlQgdGFibGUpXG4gKiBwb2ludCBgdGFibGVOYW1lYCBhdCBpdCBhbmQgcGFzcyBgaW5zZXJ0RGF0YToge31gIHRvIGluc2VydCBlbXB0eSByb3dzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJ2ZXJTZXF1ZW5jZUFsbG9jYXRvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2VydmVyIHNlcXVlbmNlIGFsbG9jYXRvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgcmVzb2x2ZWQgbGF6aWx5IHBlciBhbGxvY2F0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGF0YWJhc2VJZGVudGlmaWVyXSAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJncy5pbnNlcnREYXRhXSAtIFJvdyBwYXlsb2FkIGluc2VydGVkIHBlciBhbGxvY2F0aW9uLiBEZWZhdWx0cyB0byBge2NyZWF0ZWRfYXQ6IG5ldyBEYXRlKCl9YCBtYXRjaGluZyB0aGUgYXV0by1jcmVhdGVkIHRhYmxlOyBwYXNzIGB7fWAgZm9yIGJhcmUgaWQtb25seSB0YWJsZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50YWJsZU5hbWVdIC0gU2VxdWVuY2UgdGFibGUgbmFtZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXIgPSBcImRlZmF1bHRcIiwgaW5zZXJ0RGF0YSwgdGFibGVOYW1lID0gXCJ2ZWxvY2lvdXNfc2VydmVyX3NlcXVlbmNlc1wifSA9IHt9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuZGF0YWJhc2VJZGVudGlmaWVyID0gZGF0YWJhc2VJZGVudGlmaWVyXG4gICAgdGhpcy5pbnNlcnREYXRhID0gaW5zZXJ0RGF0YVxuICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lXG4gICAgdGhpcy5fbWVtb3J5U2VxdWVuY2UgPSAwXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIHRoZSBuZXh0IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBzZXF1ZW5jZS5cbiAgICpcbiAgICogQWxsb2NhdGlvbnMgc2VyaWFsaXplIHRocm91Z2ggYSBtb2R1bGUtbGV2ZWwgcXVldWUgcGVyIGRhdGFiYXNlK3RhYmxlIHNvXG4gICAqIHBhcmFsbGVsIGBuZXh0KClgIGNhbGxzIC0gaW5jbHVkaW5nIGNhbGxzIGZyb20gb3RoZXIgYWxsb2NhdG9yIGluc3RhbmNlc1xuICAgKiBzaGFyaW5nIHRoZSBzYW1lIHRhYmxlIGFuZCBjb25uZWN0aW9uIC0gY2Fubm90IGludGVybGVhdmUgdGhlaXIgaW5zZXJ0XG4gICAqIGFuZCBsYXN0LWluc2VydC1pZCByZWFkcyBhbmQgaGFuZCBvdXQgZHVwbGljYXRlIHNlcXVlbmNlcy5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbj86IGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fX0gW29wdGlvbnNdIC0gRXhwbGljaXQgcmVjb3JkLW93bmVkIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IE5leHQgc2VxdWVuY2UgdmFsdWUuXG4gICAqL1xuICBhc3luYyBuZXh0KHtjb25uZWN0aW9ufSA9IHt9KSB7XG4gICAgY29uc3QgcXVldWVLZXkgPSBgJHt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcn06OiR7dGhpcy50YWJsZU5hbWV9YFxuICAgIGNvbnN0IHByZXZpb3VzQWxsb2NhdGlvbiA9IGFsbG9jYXRpb25RdWV1ZXMuZ2V0KHF1ZXVlS2V5KSA/PyBQcm9taXNlLnJlc29sdmUoKVxuICAgIGNvbnN0IGFsbG9jYXRpb24gPSBwcmV2aW91c0FsbG9jYXRpb24udGhlbigoKSA9PiB0aGlzLl9hbGxvY2F0ZU5leHQoY29ubmVjdGlvbikpXG5cbiAgICBhbGxvY2F0aW9uUXVldWVzLnNldChxdWV1ZUtleSwgYWxsb2NhdGlvbi50aGVuKCgpID0+IHVuZGVmaW5lZCwgKCkgPT4gdW5kZWZpbmVkKSlcblxuICAgIHJldHVybiBhd2FpdCBhbGxvY2F0aW9uXG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIGZvciBhIHJlY29yZCB3aGlsZSBwcmVzZXJ2aW5nIGFsbG9jYXRvciByb3V0aW5nIGFuZCBvcGVyYXRpb24gb3duZXJzaGlwLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgcmVjZWl2aW5nIHRoZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gTmV4dCBzZXF1ZW5jZSB2YWx1ZS5cbiAgICovXG4gIGFzeW5jIF9uZXh0Rm9yUmVjb3JkKHJlY29yZCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHJlY29yZC5kYXRhYmFzZU9wZXJhdGlvbigpXG5cbiAgICBpZiAoIW9wZXJhdGlvbikgcmV0dXJuIGF3YWl0IHRoaXMubmV4dCgpXG5cbiAgICBjb25zdCBNb2RlbENsYXNzID0gcmVjb3JkLmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgaWYgKHRoaXMuX2dldENvbmZpZ3VyYXRpb24oKSAhPT0gTW9kZWxDbGFzcy5fZ2V0Q29uZmlndXJhdGlvbigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZXJ2ZXIgc2VxdWVuY2UgYWxsb2NhdG9yIGJlbG9uZ3MgdG8gYW5vdGhlciBWZWxvY2lvdXMgY29uZmlndXJhdGlvblwiKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsRGF0YWJhc2VJZGVudGlmaWVyID0gTW9kZWxDbGFzcy5nZXREYXRhYmFzZUlkZW50aWZpZXIoKVxuXG4gICAgaWYgKHRoaXMuZGF0YWJhc2VJZGVudGlmaWVyICE9PSBtb2RlbERhdGFiYXNlSWRlbnRpZmllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJ2ZXIgc2VxdWVuY2UgYWxsb2NhdG9yIHVzZXMgZGF0YWJhc2UgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGFiYXNlSWRlbnRpZmllcil9LCBub3Qgb3BlcmF0aW9uIG1vZGVsIGRhdGFiYXNlICR7SlNPTi5zdHJpbmdpZnkobW9kZWxEYXRhYmFzZUlkZW50aWZpZXIpfWApXG4gICAgfVxuXG4gICAgY29uc3Qgb3BlcmF0aW9uU2NvcGUgPSBvcGVyYXRpb24uZm9yTW9kZWwoTW9kZWxDbGFzcylcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLm5leHQoe2Nvbm5lY3Rpb246IG9wZXJhdGlvblNjb3BlLmRyaXZlcn0pXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgYmFja2luZyB0YWJsZSBleGlzdHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IFtjb25uZWN0aW9uXSAtIEV4cGxpY2l0IHJlY29yZC1vd25lZCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiByZWFkeS5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVJlYWR5KGNvbm5lY3Rpb24pIHtcbiAgICBpZiAodGhpcy5faXNSZWFkeSkgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkge1xuICAgICAgdGhpcy5faXNSZWFkeSA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZWFkeVByb21pc2UpIHJldHVybiBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcblxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0aGlzLl9lbnN1cmVTZXF1ZW5jZXNUYWJsZShkYilcblxuICAgICAgLy8gRERMIGpvaW5zIGFueSB0cmFuc2FjdGlvbiBhbHJlYWR5IG9wZW4gb24gdGhpcyBjb25uZWN0aW9uICh0aGUgbWl4aW4nc1xuICAgICAgLy8gYmVmb3JlQ3JlYXRlIGFsbG9jYXRpb24gYWx3YXlzIHJ1bnMgaW5zaWRlIHRoZSByZWNvcmQgc2F2ZSB0cmFuc2FjdGlvbiksXG4gICAgICAvLyBhbmQgb24gdHJhbnNhY3Rpb25hbC1EREwgZGF0YWJhc2VzIChNU1NRTCwgUG9zdGdyZVNRTCwgU1FMaXRlKSBhIHJvbGxiYWNrXG4gICAgICAvLyBvZiB0aGF0IG91dGVyIHRyYW5zYWN0aW9uIHJlbW92ZXMgdGhlIGp1c3QtY3JlYXRlZCB0YWJsZSBhZ2Fpbi4gT25seVxuICAgICAgLy8gY2FjaGUgcmVhZGluZXNzIHdoZW4gdGhlIHRhYmxlIHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYW4gYWN0aXZlXG4gICAgICAvLyB0cmFuc2FjdGlvbjsgb3RoZXJ3aXNlIHRoZSBuZXh0IGFsbG9jYXRpb24gcmUtdmVyaWZpZXMgdGhlIHRhYmxlLlxuICAgICAgaWYgKCFjcmVhdGVkIHx8ICFkYi5pbnNpZGVUcmFuc2FjdGlvbigpKSB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgIH0sIGNvbm5lY3Rpb24pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVhZHlQcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghdGhpcy5faXNSZWFkeSkgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvY2F0ZXMgb25lIHNlcXVlbmNlIHZhbHVlIGFmdGVyIHF1ZXVlaW5nLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBbY29ubmVjdGlvbl0gLSBFeHBsaWNpdCByZWNvcmQtb3duZWQgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQWxsb2NhdGVkIHNlcXVlbmNlIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgX2FsbG9jYXRlTmV4dChjb25uZWN0aW9uKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeShjb25uZWN0aW9uKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiArK3RoaXMuX21lbW9yeVNlcXVlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIC8vIFRoZSBhbGxvY2F0ZWQgaWQgbXVzdCBiZSByZXR1cm5lZCBieSB0aGUgaW5zZXJ0IHN0YXRlbWVudCBpdHNlbGYgKE9VVFBVVFxuICAgICAgLy8gSU5TRVJURUQvUkVUVVJOSU5HKSwgbGlrZSB0aGUgcmVjb3JkIGNyZWF0ZSBwYXRoIGRvZXM6IE1TU1FMJ3NcbiAgICAgIC8vIFNDT1BFX0lERU5USVRZKCkgb25seSBzZWVzIGluc2VydHMgZnJvbSB0aGUgc2FtZSBiYXRjaC9zY29wZSwgc28gcmVhZGluZ1xuICAgICAgLy8gdGhlIGxhc3QtaW5zZXJ0IGlkIGFzIGEgc2VwYXJhdGUgcXVlcnkgYWx3YXlzIHJldHVybnMgTlVMTCB0aGVyZS4gRHJpdmVyc1xuICAgICAgLy8gd2l0aG91dCBpbnNlcnQtcmV0dXJuaW5nIHN1cHBvcnQgKG9sZGVyIFNRTGl0ZSkga2VlcCB0aGUgcmVsaWFibGVcbiAgICAgIC8vIGNvbm5lY3Rpb24tc2NvcGVkIGxhc3QtaW5zZXJ0LWlkIGZhbGxiYWNrLlxuICAgICAgY29uc3QgaW5zZXJ0U3FsID0gZGIuaW5zZXJ0U3FsKHtcbiAgICAgICAgZGF0YTogdGhpcy5faW5zZXJ0UGF5bG9hZCgpLFxuICAgICAgICByZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWVcbiAgICAgIH0pXG4gICAgICBjb25zdCBpbnNlcnRSZXN1bHQgPSBhd2FpdCBkYi5xdWVyeShpbnNlcnRTcWwpXG4gICAgICBjb25zdCBpbnNlcnRlZElkID0gQXJyYXkuaXNBcnJheShpbnNlcnRSZXN1bHQpID8gaW5zZXJ0UmVzdWx0WzBdPy5pZCA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkICYmIGluc2VydGVkSWQgIT09IG51bGwpIHJldHVybiBOdW1iZXIoaW5zZXJ0ZWRJZClcblxuICAgICAgcmV0dXJuIE51bWJlcihhd2FpdCBkYi5sYXN0SW5zZXJ0SUQoKSlcbiAgICB9LCBjb25uZWN0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcm93IHBheWxvYWQgaW5zZXJ0ZWQgcGVyIGFsbG9jYXRpb24uXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IEluc2VydCBwYXlsb2FkLlxuICAgKi9cbiAgX2luc2VydFBheWxvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGF0YSA/PyB7Y3JlYXRlZF9hdDogbmV3IERhdGUoKX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHNlcXVlbmNlIHRhYmxlLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBSZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgX2dldENvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbiA/PyBDb25maWd1cmF0aW9uLmN1cnJlbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFsbG9jYXRvciBydW5zIHdpdGhvdXQgYSBjb25maWd1cmVkIGRhdGFiYXNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtZW1vcnkgc3RvcmFnZSBpcyB1c2VkLlxuICAgKi9cbiAgX3VzZXNNZW1vcnlTdG9yYWdlKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIXRoaXMuX2dldENvbmZpZ3VyYXRpb24oKS5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKVt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayB3aXRoIGEgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFJlc3VsdFxuICAgKiBAcGFyYW0geyhkYjogaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8UmVzdWx0Pn0gY2FsbGJhY2sgLSBEYXRhYmFzZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gW2Nvbm5lY3Rpb25dIC0gRXhwbGljaXQgcmVjb3JkLW93bmVkIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlc3VsdD59IENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF93aXRoRGIoY2FsbGJhY2ssIGNvbm5lY3Rpb24pIHtcbiAgICBpZiAoY29ubmVjdGlvbikgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpLmVuc3VyZUNvbm5lY3Rpb25zKHtkYXRhYmFzZUlkZW50aWZpZXJzOiBbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdLCBuYW1lOiBcIlNlcnZlciBzZXF1ZW5jZSBhbGxvY2F0b3JcIn0sIGFzeW5jIChkYnMpID0+IHtcbiAgICAgIGNvbnN0IGRiID0gZGJzW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgICBpZiAoIWRiKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGRhdGFiYXNlIGNvbm5lY3Rpb24gYXZhaWxhYmxlIGZvciBpZGVudGlmaWVyOiAke3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyfWApXG5cbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhkYilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIHNlcXVlbmNlcyB0YWJsZSBleGlzdHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIHRhYmxlIGhhZCB0byBiZSBjcmVhdGVkLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZVNlcXVlbmNlc1RhYmxlKGRiKSB7XG4gICAgaWYgKGF3YWl0IGRiLnRhYmxlRXhpc3RzKHRoaXMudGFibGVOYW1lKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZURhdGEodGhpcy50YWJsZU5hbWUsIHtpZk5vdEV4aXN0czogdHJ1ZX0pXG5cbiAgICB0YWJsZS5iaWdpbnQoXCJpZFwiLCB7YXV0b0luY3JlbWVudDogdHJ1ZSwgbnVsbDogZmFsc2UsIHByaW1hcnlLZXk6IHRydWV9KVxuICAgIHRhYmxlLmRhdGV0aW1lKFwiY3JlYXRlZF9hdFwiLCB7bnVsbDogZmFsc2V9KVxuXG4gICAgYXdhaXQgZGIuY3JlYXRlVGFibGUodGFibGUpXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbi8qKlxuICogV2lyZXMgc2VydmVyIHNlcXVlbmNpbmcgb250byBhIHN5bmMgbW9kZWwgY2xhc3M6IHJlZ2lzdGVycyBhIGJlZm9yZUNyZWF0ZVxuICogbGlmZWN5Y2xlIGNhbGxiYWNrIGFzc2lnbmluZyB0aGUgbmV4dCBzZXF1ZW5jZSB3aGVuIHRoZSByZWNvcmQgaGFzIG5vbmUsIGFuZFxuICogZGVmaW5lcyBhbiBgYWR2YW5jZTxDb2x1bW4+KClgIGluc3RhbmNlIG1ldGhvZCAod2hlbiB0aGUgbW9kZWwgZG9lcyBub3RcbiAqIGFscmVhZHkgZGVmaW5lIG9uZSkgdGhhdCByZS1zZXF1ZW5jZXMgdGhlIHJlY29yZCB0aHJvdWdoIHRoZSBhbGxvY2F0b3IuXG4gKlxuICogVGhlIHNlcXVlbmNlIGlzIGFsd2F5cyB3cml0dGVuIHRocm91Z2ggdGhlIG1vZGVsJ3MgZ2VuZXJhdGVkIHR5cGVkIHNldHRlclxuICogKGZvciBleGFtcGxlIGBzZXRTZXJ2ZXJTZXF1ZW5jZWApLCBzbyB0aGUgbW9kZWwgbXVzdCBleHBvc2UgdGhlIGdlbmVyYXRlZFxuICogYHNldDxDb2x1bW4+YC9gaGFzPENvbHVtbj5gIGFjY2Vzc29ycyBmb3IgdGhlIGNvbHVtbi5cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBUTW9kZWxDbGFzc1xuICogQHBhcmFtIHtUTW9kZWxDbGFzc30gTW9kZWxDbGFzcyAtIFN5bmMgbW9kZWwgY2xhc3MgdG8gc2VxdWVuY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1NlcnZlclNlcXVlbmNlQWxsb2NhdG9yfSBhcmdzLmFsbG9jYXRvciAtIEFsbG9jYXRvciBwcm92aWRpbmcgc2VxdWVuY2UgdmFsdWVzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvbHVtbl0gLSBTZXF1ZW5jZSBhdHRyaWJ1dGUgbmFtZS5cbiAqIEByZXR1cm5zIHtUTW9kZWxDbGFzc30gVGhlIGdpdmVuIG1vZGVsIGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNlcnZlclNlcXVlbmNlKE1vZGVsQ2xhc3MsIHthbGxvY2F0b3IsIGNvbHVtbiA9IFwic2VydmVyU2VxdWVuY2VcIn0pIHtcbiAgaWYgKCEoYWxsb2NhdG9yIGluc3RhbmNlb2YgU2VydmVyU2VxdWVuY2VBbGxvY2F0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoU2VydmVyU2VxdWVuY2UgcmVxdWlyZXMgYSBTZXJ2ZXJTZXF1ZW5jZUFsbG9jYXRvciwgZ290OiAke1N0cmluZyhhbGxvY2F0b3IpfWApXG4gIH1cblxuICBjb25zdCB1cHBlckNvbHVtbiA9IGAke2NvbHVtbi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2NvbHVtbi5zbGljZSgxKX1gXG4gIGNvbnN0IGFkdmFuY2VNZXRob2ROYW1lID0gYGFkdmFuY2Uke3VwcGVyQ29sdW1ufWBcbiAgY29uc3QgaGFzTWV0aG9kTmFtZSA9IGBoYXMke3VwcGVyQ29sdW1ufWBcbiAgY29uc3Qgc2V0dGVyTWV0aG9kTmFtZSA9IGBzZXQke3VwcGVyQ29sdW1ufWBcblxuICAvLyBOYXJyb3dzIHRoZSBwcm90b3R5cGUgdG8gZHluYW1pYyBtZXRob2QgYWNjZXNzIGZvciB0aGUgY29uZmlndXJlZCBjb2x1bW4gbmFtZS5cbiAgY29uc3QgcHJvdG90eXBlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChNb2RlbENsYXNzLnByb3RvdHlwZSlcblxuICBpZiAodHlwZW9mIHByb3RvdHlwZVtzZXR0ZXJNZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHByb3RvdHlwZVtoYXNNZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhTZXJ2ZXJTZXF1ZW5jZSByZXF1aXJlcyBnZW5lcmF0ZWQgJHtzZXR0ZXJNZXRob2ROYW1lfSBhbmQgJHtoYXNNZXRob2ROYW1lfSBhY2Nlc3NvcnMgb24gJHtNb2RlbENsYXNzLm5hbWV9YClcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJvdG90eXBlW2FkdmFuY2VNZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIHRoZSBuZXh0IHNlcnZlci1zaWRlIHNlcXVlbmNlLlxuICAgICAqIEB0aGlzIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCAmIFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVbYWR2YW5jZU1ldGhvZE5hbWVdID0gYXN5bmMgZnVuY3Rpb24gYWR2YW5jZVNlcnZlclNlcXVlbmNlVGhyb3VnaEFsbG9jYXRvcigpIHtcbiAgICAgIHRoaXNbc2V0dGVyTWV0aG9kTmFtZV0oYXdhaXQgYWxsb2NhdG9yLl9uZXh0Rm9yUmVjb3JkKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIE1vZGVsQ2xhc3MuYmVmb3JlQ3JlYXRlKGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAvLyBOYXJyb3dzIHRoZSByZWNvcmQgdG8gZHluYW1pYyBtZXRob2QgYWNjZXNzIGZvciB0aGUgY29uZmlndXJlZCBjb2x1bW4gbmFtZS5cbiAgICBjb25zdCBkeW5hbWljUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovICgvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAocmVjb3JkKSlcblxuICAgIGlmIChkeW5hbWljUmVjb3JkW2hhc01ldGhvZE5hbWVdKCkpIHJldHVyblxuXG4gICAgYXdhaXQgZHluYW1pY1JlY29yZFthZHZhbmNlTWV0aG9kTmFtZV0oKVxuICB9KVxuXG4gIHJldHVybiBNb2RlbENsYXNzXG59XG4iXX0=
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLXNlcXVlbmNlLWFsbG9jYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL3NlcnZlci1zZXF1ZW5jZS1hbGxvY2F0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBRXZEOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHVCQUF1QjtJQUMxQzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsR0FBRyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRyw0QkFBNEIsRUFBQyxHQUFHLEVBQUU7UUFDcEgsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFBO1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUE7UUFDM0MsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsVUFBVSxFQUFDLEdBQUcsRUFBRTtRQUMxQixNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7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RTtRQUM5RSxNQUFNLGFBQWEsR0FBRyw0REFBNEQsQ0FBQyxFQUFDLDRDQUE2QyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFFMUksSUFBSSxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFBRSxPQUFNO1FBRTFDLE1BQU0sYUFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQTtJQUMxQyxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5cbi8qKlxuICogQWxsb2NhdGlvbiBxdWV1ZXMgcGVyIGRhdGFiYXNlK3RhYmxlLCBzZXJpYWxpemluZyBpbnNlcnQvbGFzdC1pbnNlcnQtaWRcbiAqIHBhaXJzIGFjcm9zcyBhbGwgYWxsb2NhdG9yIGluc3RhbmNlcyBpbiB0aGlzIHByb2Nlc3MuXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj59XG4gKi9cbmNvbnN0IGFsbG9jYXRpb25RdWV1ZXMgPSBuZXcgTWFwKClcblxuLyoqXG4gKiBBbGxvY2F0ZXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHNlcnZlciBzeW5jIHNlcXVlbmNlcyBmcm9tIGFuXG4gKiBBVVRPX0lOQ1JFTUVOVCBpZCB0YWJsZTogZXZlcnkgYWxsb2NhdGlvbiBpbnNlcnRzIGEgcm93IGFuZCByZXR1cm5zIHRoZVxuICogZHJpdmVyJ3MgbGFzdC1pbnNlcnQgaWQsIHNvIHNlcXVlbmNlcyBzdGF5IHVuaXF1ZSBhbmQgaW5jcmVhc2luZyBhY3Jvc3NcbiAqIHByb2Nlc3NlcyBzaGFyaW5nIHRoZSBzYW1lIGRhdGFiYXNlLlxuICpcbiAqIEJhY2tlZCBieSBhbiBhdXRvLWNyZWF0ZWQgYHZlbG9jaW91c19zZXJ2ZXJfc2VxdWVuY2VzYCB0YWJsZSBvbiB0aGVcbiAqIGNvbmZpZ3VyZWQgZGF0YWJhc2UsIHdpdGggYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBjb3VudGVyIGZhbGxiYWNrIHdoZW4gbm9cbiAqIGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWQgKG1pcnJvcmluZyB0aGUgc3luYyBzY29wZSBzdG9yZSkuIEFwcHMgd2l0aCBhblxuICogZXhpc3Rpbmcgc2VxdWVuY2UgdGFibGUgKGZvciBleGFtcGxlIGEgYmFyZSBgaWRgLW9ubHkgQVVUT19JTkNSRU1FTlQgdGFibGUpXG4gKiBwb2ludCBgdGFibGVOYW1lYCBhdCBpdCBhbmQgcGFzcyBgaW5zZXJ0RGF0YToge31gIHRvIGluc2VydCBlbXB0eSByb3dzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJ2ZXJTZXF1ZW5jZUFsbG9jYXRvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2VydmVyIHNlcXVlbmNlIGFsbG9jYXRvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgcmVzb2x2ZWQgbGF6aWx5IHBlciBhbGxvY2F0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGF0YWJhc2VJZGVudGlmaWVyXSAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJncy5pbnNlcnREYXRhXSAtIFJvdyBwYXlsb2FkIGluc2VydGVkIHBlciBhbGxvY2F0aW9uLiBEZWZhdWx0cyB0byBge2NyZWF0ZWRfYXQ6IG5ldyBEYXRlKCl9YCBtYXRjaGluZyB0aGUgYXV0by1jcmVhdGVkIHRhYmxlOyBwYXNzIGB7fWAgZm9yIGJhcmUgaWQtb25seSB0YWJsZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50YWJsZU5hbWVdIC0gU2VxdWVuY2UgdGFibGUgbmFtZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXIgPSBcImRlZmF1bHRcIiwgaW5zZXJ0RGF0YSwgdGFibGVOYW1lID0gXCJ2ZWxvY2lvdXNfc2VydmVyX3NlcXVlbmNlc1wifSA9IHt9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuZGF0YWJhc2VJZGVudGlmaWVyID0gZGF0YWJhc2VJZGVudGlmaWVyXG4gICAgdGhpcy5pbnNlcnREYXRhID0gaW5zZXJ0RGF0YVxuICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lXG4gICAgdGhpcy5fbWVtb3J5U2VxdWVuY2UgPSAwXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fdHJhbnNhY3Rpb25hbFJlYWRpbmVzc1BlbmRpbmcgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG9jYXRlcyB0aGUgbmV4dCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgc2VxdWVuY2UuXG4gICAqXG4gICAqIEFsbG9jYXRpb25zIHNlcmlhbGl6ZSB0aHJvdWdoIGEgbW9kdWxlLWxldmVsIHF1ZXVlIHBlciBkYXRhYmFzZSt0YWJsZSBzb1xuICAgKiBwYXJhbGxlbCBgbmV4dCgpYCBjYWxscyAtIGluY2x1ZGluZyBjYWxscyBmcm9tIG90aGVyIGFsbG9jYXRvciBpbnN0YW5jZXNcbiAgICogc2hhcmluZyB0aGUgc2FtZSB0YWJsZSBhbmQgY29ubmVjdGlvbiAtIGNhbm5vdCBpbnRlcmxlYXZlIHRoZWlyIGluc2VydFxuICAgKiBhbmQgbGFzdC1pbnNlcnQtaWQgcmVhZHMgYW5kIGhhbmQgb3V0IGR1cGxpY2F0ZSBzZXF1ZW5jZXMuXG4gICAqIEBwYXJhbSB7e2Nvbm5lY3Rpb24/OiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH19IFtvcHRpb25zXSAtIEV4cGxpY2l0IHJlY29yZC1vd25lZCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBOZXh0IHNlcXVlbmNlIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgbmV4dCh7Y29ubmVjdGlvbn0gPSB7fSkge1xuICAgIGNvbnN0IHF1ZXVlS2V5ID0gYCR7dGhpcy5kYXRhYmFzZUlkZW50aWZpZXJ9Ojoke3RoaXMudGFibGVOYW1lfWBcbiAgICBjb25zdCBwcmV2aW91c0FsbG9jYXRpb24gPSBhbGxvY2F0aW9uUXVldWVzLmdldChxdWV1ZUtleSkgPz8gUHJvbWlzZS5yZXNvbHZlKClcbiAgICBjb25zdCBhbGxvY2F0aW9uID0gcHJldmlvdXNBbGxvY2F0aW9uLnRoZW4oKCkgPT4gdGhpcy5fYWxsb2NhdGVOZXh0KGNvbm5lY3Rpb24pKVxuXG4gICAgYWxsb2NhdGlvblF1ZXVlcy5zZXQocXVldWVLZXksIGFsbG9jYXRpb24udGhlbigoKSA9PiB1bmRlZmluZWQsICgpID0+IHVuZGVmaW5lZCkpXG5cbiAgICByZXR1cm4gYXdhaXQgYWxsb2NhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG9jYXRlcyBmb3IgYSByZWNvcmQgd2hpbGUgcHJlc2VydmluZyBhbGxvY2F0b3Igcm91dGluZyBhbmQgb3BlcmF0aW9uIG93bmVyc2hpcC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHJlY2VpdmluZyB0aGUgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IE5leHQgc2VxdWVuY2UgdmFsdWUuXG4gICAqL1xuICBhc3luYyBfbmV4dEZvclJlY29yZChyZWNvcmQpIHtcbiAgICBjb25zdCBvcGVyYXRpb24gPSByZWNvcmQuZGF0YWJhc2VPcGVyYXRpb24oKVxuXG4gICAgaWYgKCFvcGVyYXRpb24pIHJldHVybiBhd2FpdCB0aGlzLm5leHQoKVxuXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHJlY29yZC5nZXRNb2RlbENsYXNzKClcblxuICAgIGlmICh0aGlzLl9nZXRDb25maWd1cmF0aW9uKCkgIT09IE1vZGVsQ2xhc3MuX2dldENvbmZpZ3VyYXRpb24oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VydmVyIHNlcXVlbmNlIGFsbG9jYXRvciBiZWxvbmdzIHRvIGFub3RoZXIgVmVsb2Npb3VzIGNvbmZpZ3VyYXRpb25cIilcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbERhdGFiYXNlSWRlbnRpZmllciA9IE1vZGVsQ2xhc3MuZ2V0RGF0YWJhc2VJZGVudGlmaWVyKClcblxuICAgIGlmICh0aGlzLmRhdGFiYXNlSWRlbnRpZmllciAhPT0gbW9kZWxEYXRhYmFzZUlkZW50aWZpZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VydmVyIHNlcXVlbmNlIGFsbG9jYXRvciB1c2VzIGRhdGFiYXNlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhYmFzZUlkZW50aWZpZXIpfSwgbm90IG9wZXJhdGlvbiBtb2RlbCBkYXRhYmFzZSAke0pTT04uc3RyaW5naWZ5KG1vZGVsRGF0YWJhc2VJZGVudGlmaWVyKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IG9wZXJhdGlvblNjb3BlID0gb3BlcmF0aW9uLmZvck1vZGVsKE1vZGVsQ2xhc3MpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5uZXh0KHtjb25uZWN0aW9uOiBvcGVyYXRpb25TY29wZS5kcml2ZXJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGJhY2tpbmcgdGFibGUgZXhpc3RzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBbY29ubmVjdGlvbl0gLSBFeHBsaWNpdCByZWNvcmQtb3duZWQgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gcmVhZHkuXG4gICAqL1xuICBhc3luYyBlbnN1cmVSZWFkeShjb25uZWN0aW9uKSB7XG4gICAgaWYgKHRoaXMuX2lzUmVhZHkpIHJldHVyblxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHtcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVhZHlQcm9taXNlKSByZXR1cm4gYXdhaXQgdGhpcy5fcmVhZHlQcm9taXNlXG5cbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdGhpcy5fZW5zdXJlU2VxdWVuY2VzVGFibGUoZGIpXG5cbiAgICAgIC8vIERETCBqb2lucyBhbnkgdHJhbnNhY3Rpb24gYWxyZWFkeSBvcGVuIG9uIHRoaXMgY29ubmVjdGlvbiAodGhlIG1peGluJ3NcbiAgICAgIC8vIGJlZm9yZUNyZWF0ZSBhbGxvY2F0aW9uIGFsd2F5cyBydW5zIGluc2lkZSB0aGUgcmVjb3JkIHNhdmUgdHJhbnNhY3Rpb24pLFxuICAgICAgLy8gYW5kIG9uIHRyYW5zYWN0aW9uYWwtRERMIGRhdGFiYXNlcyAoTVNTUUwsIFBvc3RncmVTUUwsIFNRTGl0ZSkgYSByb2xsYmFja1xuICAgICAgLy8gb2YgdGhhdCBvdXRlciB0cmFuc2FjdGlvbiByZW1vdmVzIHRoZSBqdXN0LWNyZWF0ZWQgdGFibGUgYWdhaW4uIEtlZXBcbiAgICAgIC8vIHJlYWRpbmVzcyBwZW5kaW5nIGZvciBldmVyeSBsYXRlciBhbGxvY2F0aW9uIGluIHRoYXQgc2FtZSB0cmFuc2FjdGlvbjtcbiAgICAgIC8vIG90aGVyd2lzZSBpdHMgdGFibGUtZXhpc3RzIGNoZWNrIHdvdWxkIGluY29ycmVjdGx5IGNhY2hlIHJlYWRpbmVzcyBiZWZvcmVcbiAgICAgIC8vIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBjb21taXRzLlxuICAgICAgaWYgKCFjcmVhdGVkKSB7XG4gICAgICAgIGlmICghdGhpcy5fdHJhbnNhY3Rpb25hbFJlYWRpbmVzc1BlbmRpbmcpIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGIuaW5zaWRlVHJhbnNhY3Rpb24oKSkge1xuICAgICAgICB0aGlzLl90cmFuc2FjdGlvbmFsUmVhZGluZXNzUGVuZGluZyA9IHRydWVcblxuICAgICAgICB2b2lkIGRiLnRyYW5zYWN0aW9uQ29tcGxldGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIFRoZSB0cmFuc2FjdGlvbiBtYXkgaGF2ZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIFJlLWNoZWNrIG9uY2VcbiAgICAgICAgICAvLyBvbiB0aGUgbmV4dCBhbGxvY2F0aW9uLCB0aGVuIGNhY2hlIHRoZSBkdXJhYmxlIG91dGNvbWUgbm9ybWFsbHkuXG4gICAgICAgICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25hbFJlYWRpbmVzc1BlbmRpbmcgPSBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNSZWFkeSA9IHRydWVcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25hbFJlYWRpbmVzc1BlbmRpbmcgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sIGNvbm5lY3Rpb24pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVhZHlQcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghdGhpcy5faXNSZWFkeSkgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvY2F0ZXMgb25lIHNlcXVlbmNlIHZhbHVlIGFmdGVyIHF1ZXVlaW5nLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBbY29ubmVjdGlvbl0gLSBFeHBsaWNpdCByZWNvcmQtb3duZWQgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQWxsb2NhdGVkIHNlcXVlbmNlIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgX2FsbG9jYXRlTmV4dChjb25uZWN0aW9uKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeShjb25uZWN0aW9uKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiArK3RoaXMuX21lbW9yeVNlcXVlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIC8vIFRoZSBhbGxvY2F0ZWQgaWQgbXVzdCBiZSByZXR1cm5lZCBieSB0aGUgaW5zZXJ0IHN0YXRlbWVudCBpdHNlbGYgKE9VVFBVVFxuICAgICAgLy8gSU5TRVJURUQvUkVUVVJOSU5HKSwgbGlrZSB0aGUgcmVjb3JkIGNyZWF0ZSBwYXRoIGRvZXM6IE1TU1FMJ3NcbiAgICAgIC8vIFNDT1BFX0lERU5USVRZKCkgb25seSBzZWVzIGluc2VydHMgZnJvbSB0aGUgc2FtZSBiYXRjaC9zY29wZSwgc28gcmVhZGluZ1xuICAgICAgLy8gdGhlIGxhc3QtaW5zZXJ0IGlkIGFzIGEgc2VwYXJhdGUgcXVlcnkgYWx3YXlzIHJldHVybnMgTlVMTCB0aGVyZS4gRHJpdmVyc1xuICAgICAgLy8gd2l0aG91dCBpbnNlcnQtcmV0dXJuaW5nIHN1cHBvcnQgKG9sZGVyIFNRTGl0ZSkga2VlcCB0aGUgcmVsaWFibGVcbiAgICAgIC8vIGNvbm5lY3Rpb24tc2NvcGVkIGxhc3QtaW5zZXJ0LWlkIGZhbGxiYWNrLlxuICAgICAgY29uc3QgaW5zZXJ0U3FsID0gZGIuaW5zZXJ0U3FsKHtcbiAgICAgICAgZGF0YTogdGhpcy5faW5zZXJ0UGF5bG9hZCgpLFxuICAgICAgICByZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWVcbiAgICAgIH0pXG4gICAgICBjb25zdCBpbnNlcnRSZXN1bHQgPSBhd2FpdCBkYi5xdWVyeShpbnNlcnRTcWwpXG4gICAgICBjb25zdCBpbnNlcnRlZElkID0gQXJyYXkuaXNBcnJheShpbnNlcnRSZXN1bHQpID8gaW5zZXJ0UmVzdWx0WzBdPy5pZCA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkICYmIGluc2VydGVkSWQgIT09IG51bGwpIHJldHVybiBOdW1iZXIoaW5zZXJ0ZWRJZClcblxuICAgICAgcmV0dXJuIE51bWJlcihhd2FpdCBkYi5sYXN0SW5zZXJ0SUQoKSlcbiAgICB9LCBjb25uZWN0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcm93IHBheWxvYWQgaW5zZXJ0ZWQgcGVyIGFsbG9jYXRpb24uXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IEluc2VydCBwYXlsb2FkLlxuICAgKi9cbiAgX2luc2VydFBheWxvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0RGF0YSA/PyB7Y3JlYXRlZF9hdDogbmV3IERhdGUoKX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgY29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHNlcXVlbmNlIHRhYmxlLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBSZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgX2dldENvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbiA/PyBDb25maWd1cmF0aW9uLmN1cnJlbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFsbG9jYXRvciBydW5zIHdpdGhvdXQgYSBjb25maWd1cmVkIGRhdGFiYXNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtZW1vcnkgc3RvcmFnZSBpcyB1c2VkLlxuICAgKi9cbiAgX3VzZXNNZW1vcnlTdG9yYWdlKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIXRoaXMuX2dldENvbmZpZ3VyYXRpb24oKS5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKVt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayB3aXRoIGEgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFJlc3VsdFxuICAgKiBAcGFyYW0geyhkYjogaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8UmVzdWx0Pn0gY2FsbGJhY2sgLSBEYXRhYmFzZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gW2Nvbm5lY3Rpb25dIC0gRXhwbGljaXQgcmVjb3JkLW93bmVkIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlc3VsdD59IENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF93aXRoRGIoY2FsbGJhY2ssIGNvbm5lY3Rpb24pIHtcbiAgICBpZiAoY29ubmVjdGlvbikgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpLmVuc3VyZUNvbm5lY3Rpb25zKHtkYXRhYmFzZUlkZW50aWZpZXJzOiBbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdLCBuYW1lOiBcIlNlcnZlciBzZXF1ZW5jZSBhbGxvY2F0b3JcIn0sIGFzeW5jIChkYnMpID0+IHtcbiAgICAgIGNvbnN0IGRiID0gZGJzW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgICBpZiAoIWRiKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGRhdGFiYXNlIGNvbm5lY3Rpb24gYXZhaWxhYmxlIGZvciBpZGVudGlmaWVyOiAke3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyfWApXG5cbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhkYilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIHNlcXVlbmNlcyB0YWJsZSBleGlzdHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIHRhYmxlIGhhZCB0byBiZSBjcmVhdGVkLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZVNlcXVlbmNlc1RhYmxlKGRiKSB7XG4gICAgaWYgKGF3YWl0IGRiLnRhYmxlRXhpc3RzKHRoaXMudGFibGVOYW1lKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZURhdGEodGhpcy50YWJsZU5hbWUsIHtpZk5vdEV4aXN0czogdHJ1ZX0pXG5cbiAgICB0YWJsZS5iaWdpbnQoXCJpZFwiLCB7YXV0b0luY3JlbWVudDogdHJ1ZSwgbnVsbDogZmFsc2UsIHByaW1hcnlLZXk6IHRydWV9KVxuICAgIHRhYmxlLmRhdGV0aW1lKFwiY3JlYXRlZF9hdFwiLCB7bnVsbDogZmFsc2V9KVxuXG4gICAgYXdhaXQgZGIuY3JlYXRlVGFibGUodGFibGUpXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbi8qKlxuICogV2lyZXMgc2VydmVyIHNlcXVlbmNpbmcgb250byBhIHN5bmMgbW9kZWwgY2xhc3M6IHJlZ2lzdGVycyBhIGJlZm9yZUNyZWF0ZVxuICogbGlmZWN5Y2xlIGNhbGxiYWNrIGFzc2lnbmluZyB0aGUgbmV4dCBzZXF1ZW5jZSB3aGVuIHRoZSByZWNvcmQgaGFzIG5vbmUsIGFuZFxuICogZGVmaW5lcyBhbiBgYWR2YW5jZTxDb2x1bW4+KClgIGluc3RhbmNlIG1ldGhvZCAod2hlbiB0aGUgbW9kZWwgZG9lcyBub3RcbiAqIGFscmVhZHkgZGVmaW5lIG9uZSkgdGhhdCByZS1zZXF1ZW5jZXMgdGhlIHJlY29yZCB0aHJvdWdoIHRoZSBhbGxvY2F0b3IuXG4gKlxuICogVGhlIHNlcXVlbmNlIGlzIGFsd2F5cyB3cml0dGVuIHRocm91Z2ggdGhlIG1vZGVsJ3MgZ2VuZXJhdGVkIHR5cGVkIHNldHRlclxuICogKGZvciBleGFtcGxlIGBzZXRTZXJ2ZXJTZXF1ZW5jZWApLCBzbyB0aGUgbW9kZWwgbXVzdCBleHBvc2UgdGhlIGdlbmVyYXRlZFxuICogYHNldDxDb2x1bW4+YC9gaGFzPENvbHVtbj5gIGFjY2Vzc29ycyBmb3IgdGhlIGNvbHVtbi5cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBUTW9kZWxDbGFzc1xuICogQHBhcmFtIHtUTW9kZWxDbGFzc30gTW9kZWxDbGFzcyAtIFN5bmMgbW9kZWwgY2xhc3MgdG8gc2VxdWVuY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1NlcnZlclNlcXVlbmNlQWxsb2NhdG9yfSBhcmdzLmFsbG9jYXRvciAtIEFsbG9jYXRvciBwcm92aWRpbmcgc2VxdWVuY2UgdmFsdWVzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmNvbHVtbl0gLSBTZXF1ZW5jZSBhdHRyaWJ1dGUgbmFtZS5cbiAqIEByZXR1cm5zIHtUTW9kZWxDbGFzc30gVGhlIGdpdmVuIG1vZGVsIGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNlcnZlclNlcXVlbmNlKE1vZGVsQ2xhc3MsIHthbGxvY2F0b3IsIGNvbHVtbiA9IFwic2VydmVyU2VxdWVuY2VcIn0pIHtcbiAgaWYgKCEoYWxsb2NhdG9yIGluc3RhbmNlb2YgU2VydmVyU2VxdWVuY2VBbGxvY2F0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoU2VydmVyU2VxdWVuY2UgcmVxdWlyZXMgYSBTZXJ2ZXJTZXF1ZW5jZUFsbG9jYXRvciwgZ290OiAke1N0cmluZyhhbGxvY2F0b3IpfWApXG4gIH1cblxuICBjb25zdCB1cHBlckNvbHVtbiA9IGAke2NvbHVtbi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2NvbHVtbi5zbGljZSgxKX1gXG4gIGNvbnN0IGFkdmFuY2VNZXRob2ROYW1lID0gYGFkdmFuY2Uke3VwcGVyQ29sdW1ufWBcbiAgY29uc3QgaGFzTWV0aG9kTmFtZSA9IGBoYXMke3VwcGVyQ29sdW1ufWBcbiAgY29uc3Qgc2V0dGVyTWV0aG9kTmFtZSA9IGBzZXQke3VwcGVyQ29sdW1ufWBcblxuICAvLyBOYXJyb3dzIHRoZSBwcm90b3R5cGUgdG8gZHluYW1pYyBtZXRob2QgYWNjZXNzIGZvciB0aGUgY29uZmlndXJlZCBjb2x1bW4gbmFtZS5cbiAgY29uc3QgcHJvdG90eXBlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChNb2RlbENsYXNzLnByb3RvdHlwZSlcblxuICBpZiAodHlwZW9mIHByb3RvdHlwZVtzZXR0ZXJNZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHByb3RvdHlwZVtoYXNNZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhTZXJ2ZXJTZXF1ZW5jZSByZXF1aXJlcyBnZW5lcmF0ZWQgJHtzZXR0ZXJNZXRob2ROYW1lfSBhbmQgJHtoYXNNZXRob2ROYW1lfSBhY2Nlc3NvcnMgb24gJHtNb2RlbENsYXNzLm5hbWV9YClcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJvdG90eXBlW2FkdmFuY2VNZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIHRoZSBuZXh0IHNlcnZlci1zaWRlIHNlcXVlbmNlLlxuICAgICAqIEB0aGlzIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCAmIFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVbYWR2YW5jZU1ldGhvZE5hbWVdID0gYXN5bmMgZnVuY3Rpb24gYWR2YW5jZVNlcnZlclNlcXVlbmNlVGhyb3VnaEFsbG9jYXRvcigpIHtcbiAgICAgIHRoaXNbc2V0dGVyTWV0aG9kTmFtZV0oYXdhaXQgYWxsb2NhdG9yLl9uZXh0Rm9yUmVjb3JkKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIE1vZGVsQ2xhc3MuYmVmb3JlQ3JlYXRlKGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAvLyBOYXJyb3dzIHRoZSByZWNvcmQgdG8gZHluYW1pYyBtZXRob2QgYWNjZXNzIGZvciB0aGUgY29uZmlndXJlZCBjb2x1bW4gbmFtZS5cbiAgICBjb25zdCBkeW5hbWljUmVjb3JkID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovICgvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAocmVjb3JkKSlcblxuICAgIGlmIChkeW5hbWljUmVjb3JkW2hhc01ldGhvZE5hbWVdKCkpIHJldHVyblxuXG4gICAgYXdhaXQgZHluYW1pY1JlY29yZFthZHZhbmNlTWV0aG9kTmFtZV0oKVxuICB9KVxuXG4gIHJldHVybiBNb2RlbENsYXNzXG59XG4iXX0=
@@ -150,23 +150,6 @@ export default class SyncPublisher {
150
150
  syncRow: ReturnType<typeof JSON.parse>;
151
151
  syncType: string;
152
152
  }): Record<string, ReturnType<typeof JSON.parse>>;
153
- /**
154
- * Upserts the published server-origin sync row for a resource identity:
155
- * server-origin rows carry a null actor column (no device to echo the
156
- * change back to), so repeated server changes to one complete resource and
157
- * scope identity reuse and re-sequence one feed row. A database advisory
158
- * lock serializes reconciliation plus the shared upsert because unique
159
- * constraints containing nullable actor/scope columns do not enforce this
160
- * identity portably across supported databases. Reconciliation retains the
161
- * row with the newest feed sequence (then lowest id for a deterministic tie)
162
- * and removes older matching server-origin rows before applying the current
163
- * mutation.
164
- * @param {Record<string, ReturnType<typeof JSON.parse>>} attributes - Snapshotted sync row attributes.
165
- * @param {ReturnType<typeof JSON.parse>} syncModel - Operation-bound or static Sync model interface.
166
- * @param {string[]} scopeColumnNames - Persisted scope columns participating in the complete identity.
167
- * @returns {Promise<ReturnType<typeof JSON.parse>>} Upserted sync row.
168
- */
169
- upsertPublishedSyncRow(attributes: Record<string, ReturnType<typeof JSON.parse>>, syncModel?: ReturnType<typeof JSON.parse>, scopeColumnNames?: string[]): Promise<ReturnType<typeof JSON.parse>>;
170
153
  /**
171
154
  * Returns the broadcaster delivering declared broadcasts: the injected one,
172
155
  * or the configuration's channel broadcast awaited through the pending
@@ -1 +1 @@
1
- {"version":3,"file":"sync-publisher.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-publisher.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher.js"],"names":[],"mappings":"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"}