@dcl/sdk 7.20.5-22638270380.commit-3f48d5e → 7.20.5-22638863063.commit-f988f31

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.
@@ -91,9 +91,16 @@ export function addSyncTransport(engine, sendBinary, getUserData, isServerFn, na
91
91
  // Receive & Process CRDT_STATE
92
92
  binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, async (data, sender) => {
93
93
  DEBUG_NETWORK_MESSAGES() && console.log('[REQ_CRDT_STATE]', sender, Date.now());
94
- for (const chunk of engineToCrdt(engine)) {
95
- DEBUG_NETWORK_MESSAGES() && console.log('[Emiting:]', sender, Date.now());
96
- binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, chunk, [sender]);
94
+ const chunks = engineToCrdt(engine);
95
+ if (chunks.length === 0) {
96
+ DEBUG_NETWORK_MESSAGES() && console.log('[Emiting empty state:]', sender, Date.now());
97
+ binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, new Uint8Array(), [sender]);
98
+ }
99
+ else {
100
+ for (const chunk of chunks) {
101
+ DEBUG_NETWORK_MESSAGES() && console.log('[Emiting:]', sender, Date.now());
102
+ binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, chunk, [sender]);
103
+ }
97
104
  }
98
105
  });
99
106
  binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, async (data, sender) => {
@@ -102,7 +109,9 @@ export function addSyncTransport(engine, sendBinary, getUserData, isServerFn, na
102
109
  if (isServerAtom.getOrNull() || sender !== AUTH_SERVER_PEER_ID)
103
110
  return;
104
111
  DEBUG_NETWORK_MESSAGES() && console.log('[Processing CRDT State]', data.byteLength / 1024, 'KB');
105
- transport.onmessage(serverValidator.processClientMessages(data, sender));
112
+ if (data.byteLength > 0) {
113
+ transport.onmessage(serverValidator.processClientMessages(data, sender));
114
+ }
106
115
  stateIsSyncronized = true;
107
116
  // IMPORTANT: Only mark room as ready AFTER state is synchronized
108
117
  // This ensures comms is truly connected and working
@@ -220,4 +229,4 @@ export function addSyncTransport(engine, sendBinary, getUserData, isServerFn, na
220
229
  isRoomReadyAtom
221
230
  };
222
231
  }
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMtc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXR3b3JrL21lc3NhZ2UtYnVzLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQixTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFHeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRWhELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzlCLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFHN0QsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLHNCQUFzQixDQUFBO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsRUFBRSxDQUFFLFVBQWtCLENBQUMsc0JBQXNCLElBQUksS0FBSyxDQUFBO0FBRS9GLDhDQUE4QztBQUM5QyxNQUFNLGlCQUFpQixHQUFHLEdBQVksRUFBRTtJQUN0QyxJQUFJO1FBQ0YsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFDbkQsTUFBTSxpQkFBaUIsR0FBRyxVQUFzRSxDQUFBO1FBQ2hH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TyxrQkFBa0IsQ0FBQTtJQUMzQixDQUFDO0lBRUQsT0FBTztRQUNMLEdBQUcsaUJBQWlCO1FBQ3BCLFNBQVM7UUFDVCxrQkFBa0I7UUFDbEIsZ0JBQWdCO1FBQ2hCLFFBQVE7UUFDUixlQUFlO0tBQ2hCLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUVuZ2luZSwgVHJhbnNwb3J0LCBSZWFsbUluZm8gfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IHR5cGUgU2VuZEJpbmFyeVJlcXVlc3QsIHR5cGUgU2VuZEJpbmFyeVJlc3BvbnNlIH0gZnJvbSAnfnN5c3RlbS9Db21tdW5pY2F0aW9uc0NvbnRyb2xsZXInXG5cbmltcG9ydCB7IHN5bmNGaWx0ZXIgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGVuZ2luZVRvQ3JkdCB9IGZyb20gJy4vc3RhdGUnXG5pbXBvcnQgeyBCaW5hcnlNZXNzYWdlQnVzLCBDb21tc01lc3NhZ2UgfSBmcm9tICcuL2JpbmFyeS1tZXNzYWdlLWJ1cydcbmltcG9ydCB7IGZldGNoUHJvZmlsZSB9IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgeyBlbnRpdHlVdGlscyB9IGZyb20gJy4vZW50aXRpZXMnXG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXJWYWxpZGF0b3IgfSBmcm9tICcuL3NlcnZlcidcbmltcG9ydCB7IEdldFVzZXJEYXRhUmVxdWVzdCwgR2V0VXNlckRhdGFSZXNwb25zZSB9IGZyb20gJ35zeXN0ZW0vVXNlcklkZW50aXR5J1xuaW1wb3J0IHsgZGVmaW5lUGxheWVySGVscGVyIH0gZnJvbSAnLi4vcGxheWVycydcbmltcG9ydCB7IHNlcmlhbGl6ZUNyZHRNZXNzYWdlcyB9IGZyb20gJy4uL2ludGVybmFsL3RyYW5zcG9ydHMvbG9nZ2VyJ1xuaW1wb3J0IHsgSXNTZXJ2ZXJSZXF1ZXN0LCBJc1NlcnZlclJlc3BvbnNlIH0gZnJvbSAnfnN5c3RlbS9FbmdpbmVBcGknXG5pbXBvcnQgeyBBdG9tIH0gZnJvbSAnLi4vYXRvbSdcbmltcG9ydCB7IHNldEdsb2JhbFJvb20sIFJvb20gfSBmcm9tICcuL2V2ZW50cy9pbXBsZW1lbnRhdGlvbidcblxuZXhwb3J0IHR5cGUgSVByb2ZpbGUgPSB7IG5ldHdvcmtJZDogbnVtYmVyOyB1c2VySWQ6IHN0cmluZyB9XG4vLyB1c2VyIHRoYXQgd2UgYXNrZWQgZm9yIHRoZSBpbml0YWwgY3JkdCBzdGF0ZVxuZXhwb3J0IGNvbnN0IEFVVEhfU0VSVkVSX1BFRVJfSUQgPSAnYXV0aG9yaXRhdGl2ZS1zZXJ2ZXInXG5leHBvcnQgY29uc3QgREVCVUdfTkVUV09SS19NRVNTQUdFUyA9ICgpID0+IChnbG9iYWxUaGlzIGFzIGFueSkuREVCVUdfTkVUV09SS19NRVNTQUdFUyA/PyBmYWxzZVxuXG4vLyBUZXN0IGVudmlyb25tZW50IGRldGVjdGlvbiB3aXRob3V0ICdhcyBhbnknXG5jb25zdCBpc1Rlc3RFbnZpcm9ubWVudCA9ICgpOiBib29sZWFuID0+IHtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2VcbiAgICBjb25zdCBnbG9iYWxXaXRoUHJvY2VzcyA9IGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyB7IHByb2Nlc3M/OiB7IGVudj86IHsgTk9ERV9FTlY/OiBzdHJpbmcgfSB9IH1cbiAgICByZXR1cm4gZ2xvYmFsV2l0aFByb2Nlc3MucHJvY2Vzcz8uZW52Py5OT0RFX0VOViA9PT0gJ3Rlc3QnXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTeW5jVHJhbnNwb3J0KFxuICBlbmdpbmU6IElFbmdpbmUsXG4gIHNlbmRCaW5hcnk6IChtc2c6IFNlbmRCaW5hcnlSZXF1ZXN0KSA9PiBQcm9taXNlPFNlbmRCaW5hcnlSZXNwb25zZT4sXG4gIGdldFVzZXJEYXRhOiAodmFsdWU6IEdldFVzZXJEYXRhUmVxdWVzdCkgPT4gUHJvbWlzZTxHZXRVc2VyRGF0YVJlc3BvbnNlPixcbiAgaXNTZXJ2ZXJGbjogKHJlcXVlc3Q6IElzU2VydmVyUmVxdWVzdCkgPT4gUHJvbWlzZTxJc1NlcnZlclJlc3BvbnNlPixcbiAgbmFtZTogc3RyaW5nXG4pIHtcbiAgLy8gUHJvZmlsZSBJbmZvXG4gIGNvbnN0IG15UHJvZmlsZTogSVByb2ZpbGUgPSB7fSBhcyBJUHJvZmlsZVxuICBmZXRjaFByb2ZpbGUobXlQcm9maWxlISwgZ2V0VXNlckRhdGEpXG5cbiAgY29uc3QgaXNTZXJ2ZXJBdG9tID0gQXRvbTxib29sZWFuPigpXG4gIGNvbnN0IGlzUm9vbVJlYWR5QXRvbSA9IEF0b208Ym9vbGVhbj4oZmFsc2UpXG5cbiAgdm9pZCBpc1NlcnZlckZuKHt9KS50aGVuKCgkOiBJc1NlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgcmV0dXJuIGlzU2VydmVyQXRvbS5zd2FwKCEhJC5pc1NlcnZlcilcbiAgfSlcblxuICAvLyBFbnRpdHkgdXRpbHNcbiAgY29uc3QgZW50aXR5RGVmaW5pdGlvbnMgPSBlbnRpdHlVdGlscyhlbmdpbmUsIG15UHJvZmlsZSlcblxuICAvLyBMaXN0IG9mIE1lc3NhZ2VCdXNzIG1lc3NzYWdlcyB0byBiZSBzZW50IG9uIGV2ZXJ5IGZyYW1lIHRvIGNvbW1zXG4gIGNvbnN0IHBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmQ6IHsgZGF0YTogVWludDhBcnJheVtdOyBhZGRyZXNzOiBzdHJpbmdbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGJpbmFyeU1lc3NhZ2VCdXMgPSBCaW5hcnlNZXNzYWdlQnVzKChkYXRhLCBhZGRyZXNzKSA9PiB7XG4gICAgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZC5wdXNoKHsgZGF0YTogW2RhdGFdLCBhZGRyZXNzOiBhZGRyZXNzID8/IFtdIH0pXG4gIH0pXG5cbiAgZnVuY3Rpb24gZ2V0TWVzc2FnZXNUb1NlbmQoKTogdHlwZW9mIHBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmQge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gWy4uLnBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmRdXG4gICAgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZC5sZW5ndGggPSAwXG4gICAgcmV0dXJuIG1lc3NhZ2VzXG4gIH1cbiAgY29uc3QgcGxheWVycyA9IGRlZmluZVBsYXllckhlbHBlcihlbmdpbmUpXG5cbiAgbGV0IHN0YXRlSXNTeW5jcm9uaXplZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFdlIG5lZWQgdG8gd2FpdCB0aWxsIDIgdGlja3MgdGhhdCBpcyB3aGVuIHRoZSBlbmdpbmUgaXMgcmVhZHkgdG8gc2VuZCBuZXcgbWVzc2FnZXMuXG4gICAqIFRoZSBmaXJzdCB0aWNrIGlzIGZvciB0aGUgY2xpZW50IGVuZ2luZSBwcm9jZXNzaW5nIHRoZSBDUkRUIG1lc3NhZ2VzLFxuICAgKiBhbmQgdGhlIHNlY29uZCBvbmUgYXJlIHRoZSBtZXNzYWdlcyBjcmVhdGVkIGJ5IHRoZSBtYWluKCkgZnVuY3Rpb24uXG4gICAqIFNvIHRvIGF2b2lkIHNlbmRpbmcgdGhvc2UgbWVzc2FnZXMsIHRoYXQgYWxsIHRoZSBjbGllbnRzIGhhdmUsIHRocm91Z2ggdGhlIG5ldHdvcmsgd2UgcHV0IHRoaXMgdmFsaWRhdGlvbiBoZXJlLlxuICAgKi9cbiAgbGV0IHRpY2sgPSAwXG4gIGNvbnN0IFRSQU5TUE9SVF9JTklUSUFMSVpFRF9OVU1CRVIgPSBpc1Rlc3RFbnZpcm9ubWVudCgpID8gMCA6IDJcbiAgLy8gQWRkIFN5bmMgVHJhbnNwb3J0XG4gIGNvbnN0IHRyYW5zcG9ydDogVHJhbnNwb3J0ID0ge1xuICAgIGZpbHRlcjogc3luY0ZpbHRlcihlbmdpbmUpLFxuICAgIHNlbmQ6IGFzeW5jIChtZXNzYWdlcykgPT4ge1xuICAgICAgaWYgKHRpY2sgPD0gVFJBTlNQT1JUX0lOSVRJQUxJWkVEX05VTUJFUikgdGljaysrXG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdGljayA+IFRSQU5TUE9SVF9JTklUSUFMSVpFRF9OVU1CRVIgPyBbbWVzc2FnZXNdLmZsYXQoKSA6IFtdKSB7XG4gICAgICAgIGlmIChtZXNzYWdlLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLkFycmF5LmZyb20oc2VyaWFsaXplQ3JkdE1lc3NhZ2VzKCdbTmV0d29ya01lc3NhZ2Ugc2VudF06JywgbWVzc2FnZSwgZW5naW5lKSkpXG5cbiAgICAgICAgICAvLyBDb252ZXJ0IHJlZ3VsYXIgbWVzc2FnZXMgdG8gbmV0d29yayBtZXNzYWdlcyBmb3IgYnJvYWRjYXN0aW5nIHdpdGggY2h1bmtpbmdcbiAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHNlcnZlclZhbGlkYXRvci5jb252ZXJ0UmVndWxhclRvTmV0d29ya01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuQ1JEVCwgY2h1bmspXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBwZWVyTWVzc2FnZXMgPSBnZXRNZXNzYWdlc1RvU2VuZCgpXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlbmRCaW5hcnkoeyBkYXRhOiBbXSwgcGVlckRhdGE6IHBlZXJNZXNzYWdlcyB9KVxuICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5fX3Byb2Nlc3NNZXNzYWdlcyhyZXNwb25zZS5kYXRhKVxuICAgIH0sXG4gICAgdHlwZTogbmFtZVxuICB9XG5cbiAgLy8gU2VydmVyIHZhbGlkYXRpb24gc2V0dXBcbiAgY29uc3Qgc2VydmVyVmFsaWRhdG9yID0gY3JlYXRlU2VydmVyVmFsaWRhdG9yKHtcbiAgICBlbmdpbmUsXG4gICAgYmluYXJ5TWVzc2FnZUJ1c1xuICB9KVxuXG4gIC8vIEluaXRpYWxpemUgRXZlbnQgQnVzIHdpdGggcmVnaXN0ZXJlZCBzY2hlbWFzXG4gIGNvbnN0IGV2ZW50QnVzID0gbmV3IFJvb20oZW5naW5lLCBiaW5hcnlNZXNzYWdlQnVzLCBpc1NlcnZlckF0b20sIGlzUm9vbVJlYWR5QXRvbSlcblxuICAvLyBTZXQgZ2xvYmFsIGV2ZW50QnVzIGluc3RhbmNlXG4gIHNldEdsb2JhbFJvb20oZXZlbnRCdXMpXG5cbiAgZW5naW5lLmFkZFRyYW5zcG9ydCh0cmFuc3BvcnQpXG4gIC8vIEVuZCBhZGQgc3luYyB0cmFuc3BvcnRcblxuICAvLyBSZWNlaXZlICYgUHJvY2VzcyBDUkRUX1NUQVRFXG4gIGJpbmFyeU1lc3NhZ2VCdXMub24oQ29tbXNNZXNzYWdlLlJFUV9DUkRUX1NUQVRFLCBhc3luYyAoZGF0YSwgc2VuZGVyKSA9PiB7XG4gICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbUkVRX0NSRFRfU1RBVEVdJywgc2VuZGVyLCBEYXRlLm5vdygpKVxuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZW5naW5lVG9DcmR0KGVuZ2luZSkpIHtcbiAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW0VtaXRpbmc6XScsIHNlbmRlciwgRGF0ZS5ub3coKSlcbiAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuUkVTX0NSRFRfU1RBVEUsIGNodW5rLCBbc2VuZGVyXSlcbiAgICB9XG4gIH0pXG4gIGJpbmFyeU1lc3NhZ2VCdXMub24oQ29tbXNNZXNzYWdlLlJFU19DUkRUX1NUQVRFLCBhc3luYyAoZGF0YSwgc2VuZGVyKSA9PiB7XG4gICAgcmVxdWVzdGluZ1N0YXRlID0gZmFsc2VcbiAgICBlbGFwc2VkVGltZVNpbmNlUmVxdWVzdCA9IDBcbiAgICBpZiAoaXNTZXJ2ZXJBdG9tLmdldE9yTnVsbCgpIHx8IHNlbmRlciAhPT0gQVVUSF9TRVJWRVJfUEVFUl9JRCkgcmV0dXJuXG4gICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbUHJvY2Vzc2luZyBDUkRUIFN0YXRlXScsIGRhdGEuYnl0ZUxlbmd0aCAvIDEwMjQsICdLQicpXG4gICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEoc2VydmVyVmFsaWRhdG9yLnByb2Nlc3NDbGllbnRNZXNzYWdlcyhkYXRhLCBzZW5kZXIpKVxuICAgIHN0YXRlSXNTeW5jcm9uaXplZCA9IHRydWVcblxuICAgIC8vIElNUE9SVEFOVDogT25seSBtYXJrIHJvb20gYXMgcmVhZHkgQUZURVIgc3RhdGUgaXMgc3luY2hyb25pemVkXG4gICAgLy8gVGhpcyBlbnN1cmVzIGNvbW1zIGlzIHRydWx5IGNvbm5lY3RlZCBhbmQgd29ya2luZ1xuICAgIGNvbnN0IHJlYWxtSW5mbyA9IFJlYWxtSW5mby5nZXRPck51bGwoZW5naW5lLlJvb3RFbnRpdHkpXG4gICAgaWYgKHJlYWxtSW5mbykge1xuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbaXNSb29tUmVhZHldIE1hcmtpbmcgcm9vbSBhcyByZWFkeSBhZnRlciBzdGF0ZSBzeW5jJylcbiAgICAgIGlzUm9vbVJlYWR5QXRvbS5zd2FwKHRydWUpXG4gICAgfVxuICB9KVxuXG4gIC8vIHJlY2VpdmVkIG1lc3NhZ2UgZnJvbSB0aGUgbmV0d29ya1xuICBiaW5hcnlNZXNzYWdlQnVzLm9uKENvbW1zTWVzc2FnZS5DUkRULCAodmFsdWUsIHNlbmRlcikgPT4ge1xuICAgIGNvbnN0IGlzU2VydmVyID0gaXNTZXJ2ZXJBdG9tLmdldE9yTnVsbCgpXG4gICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgdHJhbnNwb3J0LnR5cGUsXG4gICAgICAgIC4uLkFycmF5LmZyb20oc2VyaWFsaXplQ3JkdE1lc3NhZ2VzKCdbTmV0d29ya01lc3NhZ2UgcmVjZWl2ZWRdOicsIHZhbHVlLCBlbmdpbmUpKSxcbiAgICAgICAgaXNTZXJ2ZXJcbiAgICAgIClcbiAgICBpZiAoaXNTZXJ2ZXIpIHtcbiAgICAgIHRyYW5zcG9ydC5vbm1lc3NhZ2UhKHNlcnZlclZhbGlkYXRvci5wcm9jZXNzU2VydmVyTWVzc2FnZXModmFsdWUsIHNlbmRlcikpXG4gICAgfSBlbHNlIGlmIChzZW5kZXIgPT09IEFVVEhfU0VSVkVSX1BFRVJfSUQpIHtcbiAgICAgIC8vIFByb2Nlc3MgbmV0d29yayBtZXNzYWdlcyBmcm9tIHNlcnZlciBhbmQgY29udmVydCB0byByZWd1bGFyIG1lc3NhZ2VzXG4gICAgICB0cmFuc3BvcnQub25tZXNzYWdlIShzZXJ2ZXJWYWxpZGF0b3IucHJvY2Vzc0NsaWVudE1lc3NhZ2VzKHZhbHVlLCBzZW5kZXIpKVxuICAgIH1cbiAgfSlcblxuICAvLyByZWNlaXZlZCBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgZnJvbSBzZXJ2ZXIgLSBmb3JjZSBhcHBseSB0byBmaXggaW52YWxpZCBsb2NhbCBzdGF0ZVxuICBiaW5hcnlNZXNzYWdlQnVzLm9uKENvbW1zTWVzc2FnZS5DUkRUX0FVVEhPUklUQVRJVkUsICh2YWx1ZSwgc2VuZGVyKSA9PiB7XG4gICAgLy8gT25seSBhY2NlcHQgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlcyBmcm9tIGF1dGhvcml0YXRpdmUgc2VydmVyXG4gICAgaWYgKHNlbmRlciAhPT0gQVVUSF9TRVJWRVJfUEVFUl9JRCkgcmV0dXJuXG5cbiAgICAvLyBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiZcbiAgICBjb25zb2xlLmxvZygnW0FVVEhPUklUQVRJVkVdIFJlY2VpdmVkIGF1dGhvcml0YXRpdmUgbWVzc2FnZSBmcm9tIHNlcnZlcjonLCB2YWx1ZS5ieXRlTGVuZ3RoLCAnYnl0ZXMnKVxuXG4gICAgLy8gUHJvY2VzcyBhdXRob3JpdGF0aXZlIG1lc3NhZ2VzIGJ5IGZvcmNpbmcgdGhlbSB0aHJvdWdoIG5vcm1hbCBDUkRUIHByb2Nlc3NpbmdcbiAgICAvLyBidXQgd2l0aCBhIHRpbWVzdGFtcCB0aGF0J3MgZ3VhcmFudGVlZCB0byBiZSBhY2NlcHRlZFxuICAgIGNvbnN0IGF1dGhvcml0YXRpdmVCdWZmZXIgPSBzZXJ2ZXJWYWxpZGF0b3IucHJvY2Vzc0NsaWVudE1lc3NhZ2VzKHZhbHVlLCBzZW5kZXIsIHRydWUpXG4gICAgaWYgKGF1dGhvcml0YXRpdmVCdWZmZXIuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEFwcGx5IGF1dGhvcml0YXRpdmUgbWVzc2FnZSB0aHJvdWdoIG5vcm1hbCB0cmFuc3BvcnQsIGJ1dCB0aGUgc2VydmVyJ3MgbWVzc2FnZXNcbiAgICAgIC8vIHNob3VsZCBiZSBwcm9jZXNzZWQgYXMgYXV0aG9yaXRhdGl2ZSB3aXRoIHNwZWNpYWwgdGltZXN0YW1wIGhhbmRsaW5nXG4gICAgICB0cmFuc3BvcnQub25tZXNzYWdlIShhdXRob3JpdGF0aXZlQnVmZmVyKVxuXG4gICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1tBVVRIT1JJVEFUSVZFXSBBcHBsaWVkIHNlcnZlciBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgdG8gbG9jYWwgc3RhdGUnKVxuICAgIH1cbiAgfSlcblxuICBwbGF5ZXJzLm9uRW50ZXJTY2VuZSgocGxheWVyKSA9PiB7XG4gICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbb25FbnRlclNjZW5lXScsIHBsYXllci51c2VySWQpXG4gICAgaWYgKCFpc1NlcnZlckF0b20uZ2V0T3JOdWxsKCkgJiYgbXlQcm9maWxlLnVzZXJJZCA9PT0gcGxheWVyLnVzZXJJZCkge1xuICAgICAgcmVxdWVzdFN0YXRlKClcbiAgICB9XG4gIH0pXG5cbiAgLy8gQXNrcyBmb3IgdGhlIFJFUV9DUkRUX1NUQVRFIHdoZW4gaXRzIGNvbm5lY3RlZCB0byBjb21tc1xuICBSZWFsbUluZm8ub25DaGFuZ2UoZW5naW5lLlJvb3RFbnRpdHksICh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGlzU2VydmVyID0gaXNTZXJ2ZXJBdG9tLmdldE9yTnVsbCgpXG5cbiAgICBpZiAoIXZhbHVlPy5pc0Nvbm5lY3RlZFNjZW5lUm9vbSkge1xuICAgICAgLy8gT25seSByZWFjdCB3aGVuIGFjdHVhbGx5IHRyYW5zaXRpb25pbmcgZnJvbSByZWFkeSB0byBub3QgcmVhZHlcbiAgICAgIGlmIChpc1Jvb21SZWFkeUF0b20uZ2V0T3JOdWxsKCkgPT09IHRydWUpIHtcbiAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdEaXNjb25uZWN0ZWQgZnJvbSBjb21tcycpXG4gICAgICAgIGlzUm9vbVJlYWR5QXRvbS5zd2FwKGZhbHNlKVxuICAgICAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICAgICAgc3RhdGVJc1N5bmNyb25pemVkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWx1ZT8uaXNDb25uZWN0ZWRTY2VuZVJvb20pIHtcbiAgICAgIHJlcXVlc3RTdGF0ZSgpXG5cbiAgICAgIC8vIEZvciBzZXJ2ZXJzLCBtYXJrIGFzIHJlYWR5IGltbWVkaWF0ZWx5IHdoZW4gY29ubmVjdGVkXG4gICAgICAvLyAoc2VydmVycyBkb24ndCBuZWVkIHRvIHN5bmMgc3RhdGUgZnJvbSBhbnlvbmUpXG4gICAgICBpZiAoaXNTZXJ2ZXIgJiYgaXNSb29tUmVhZHlBdG9tLmdldE9yTnVsbCgpID09PSBmYWxzZSkge1xuICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1tpc1Jvb21SZWFkeV0gU2VydmVyIG1hcmtpbmcgcm9vbSBhcyByZWFkeScpXG4gICAgICAgIGlzUm9vbVJlYWR5QXRvbS5zd2FwKHRydWUpXG4gICAgICB9XG4gICAgICAvLyBGb3IgY2xpZW50cywgcm9vbSB3aWxsIGJlIG1hcmtlZCByZWFkeSBhZnRlciByZWNlaXZpbmcgQ1JEVCBzdGF0ZSAoYWJvdmUpXG4gICAgfVxuICB9KVxuXG4gIGxldCByZXF1ZXN0aW5nU3RhdGUgPSBmYWxzZVxuICBsZXQgZWxhcHNlZFRpbWVTaW5jZVJlcXVlc3QgPSAwXG4gIGNvbnN0IFNUQVRFX1JFUVVFU1RfUkVUUllfSU5URVJWQUwgPSAyLjAgLy8gc2Vjb25kc1xuXG4gIC8qKlxuICAgKiBXaHkgd2UgaGF2ZSB0byByZXF1ZXN0IHRoZSBzdGF0ZSBpZiB3ZSBoYXZlIGEgc2VydmVyIHRoYXQgY2FuIHNlbmQgdXMgdGhlIHN0YXRlIHdoZW4gd2Ugam9pbmVkP1xuICAgKiBUaGUgdGhpbmcgaXMgdGhhdCB3aGVuIHRoZSBzZXJ2ZXIgZGV0ZWN0cyBhIG5ldyBKT0lOX1BBUlRJQ0lQQU5UIG9uIGxpdmVraXQgcm9vbSwgaXQgc2VuZHMgYXV0b21hdGljYWxseSB0aGUgc3RhdGUgdG8gdGhhdCBwZWVyLlxuICAgKiBCdXQgaW4gdW5pdHksIGl0IHRha2VzIG1vcmUgdGltZSwgc28gdGhhdCBtZXNzYWdlIGlzIG5vdCBiZWluZyBkZWxpdmVyZWQgdG8gdGhlIGNsaWVudC5cbiAgICogU28gaW5zdGVhZCwgd2hlbiB3ZSBhcmUgZmluYWxseSBjb25uZWN0ZWQgdG8gdGhlIHJvb20sIHdlIHJlcXVlc3QgdGhlIHN0YXRlLCBhbmQgdGhlbiB0aGUgc2VydmVyIGFuc3dlcnMgd2l0aCB0aGUgc3RhdGUgOilcbiAgICpcbiAgICogSWYgbm8gcmVzcG9uc2UgaXMgcmVjZWl2ZWQgd2l0aGluIDIgc2Vjb25kcywgdGhlIHJlcXVlc3QgaXMgYXV0b21hdGljYWxseSByZXRyaWVkLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVxdWVzdFN0YXRlKCkge1xuICAgIGlmIChpc1NlcnZlckF0b20uZ2V0T3JOdWxsKCkpIHJldHVyblxuICAgIGlmIChSZWFsbUluZm8uZ2V0T3JOdWxsKGVuZ2luZS5Sb290RW50aXR5KT8uaXNDb25uZWN0ZWRTY2VuZVJvb20gJiYgIXJlcXVlc3RpbmdTdGF0ZSkge1xuICAgICAgcmVxdWVzdGluZ1N0YXRlID0gdHJ1ZVxuICAgICAgZWxhcHNlZFRpbWVTaW5jZVJlcXVlc3QgPSAwXG4gICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1JlcXVlc3Rpbmcgc3RhdGUuLi4nKVxuICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5SRVFfQ1JEVF9TVEFURSwgbmV3IFVpbnQ4QXJyYXkoKSlcbiAgICB9XG4gIH1cblxuICAvLyBTeXN0ZW0gdG8gcmV0cnkgc3RhdGUgcmVxdWVzdCBpZiBubyByZXNwb25zZSBpcyByZWNlaXZlZCB3aXRoaW4gdGhlIHJldHJ5IGludGVydmFsXG4gIGVuZ2luZS5hZGRTeXN0ZW0oKGR0OiBudW1iZXIpID0+IHtcbiAgICBpZiAocmVxdWVzdGluZ1N0YXRlICYmICFzdGF0ZUlzU3luY3Jvbml6ZWQpIHtcbiAgICAgIGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ICs9IGR0XG4gICAgICBpZiAoZWxhcHNlZFRpbWVTaW5jZVJlcXVlc3QgPj0gU1RBVEVfUkVRVUVTVF9SRVRSWV9JTlRFUlZBTCkge1xuICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1N0YXRlIHJlcXVlc3QgdGltZWQgb3V0LCByZXRyeWluZy4uLicpXG4gICAgICAgIGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID0gMFxuICAgICAgICByZXF1ZXN0aW5nU3RhdGUgPSBmYWxzZVxuICAgICAgICByZXF1ZXN0U3RhdGUoKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBwbGF5ZXJzLm9uTGVhdmVTY2VuZSgodXNlcklkKSA9PiB7XG4gICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbb25MZWF2ZVNjZW5lXScsIHVzZXJJZClcbiAgfSlcblxuICBmdW5jdGlvbiBpc1N0YXRlU3luY3Jvbml6ZWQoKSB7XG4gICAgcmV0dXJuIHN0YXRlSXNTeW5jcm9uaXplZFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5lbnRpdHlEZWZpbml0aW9ucyxcbiAgICBteVByb2ZpbGUsXG4gICAgaXNTdGF0ZVN5bmNyb25pemVkLFxuICAgIGJpbmFyeU1lc3NhZ2VCdXMsXG4gICAgZXZlbnRCdXMsXG4gICAgaXNSb29tUmVhZHlBdG9tXG4gIH1cbn1cbiJdfQ==
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMtc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXR3b3JrL21lc3NhZ2UtYnVzLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQixTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFHeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRWhELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzlCLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFHN0QsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLHNCQUFzQixDQUFBO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsRUFBRSxDQUFFLFVBQWtCLENBQUMsc0JBQXNCLElBQUksS0FBSyxDQUFBO0FBRS9GLDhDQUE4QztBQUM5QyxNQUFNLGlCQUFpQixHQUFHLEdBQVksRUFBRTtJQUN0QyxJQUFJO1FBQ0YsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFDbkQsTUFBTSxpQkFBaUIsR0FBRyxVQUFzRSxDQUFBO1FBQ2hH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QkFBc0IsRUFBRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtnQkFDL0UsdUJBQXVCLEdBQUcsQ0FBQyxDQUFBO2dCQUMzQixlQUFlLEdBQUcsS0FBSyxDQUFBO2dCQUN2QixZQUFZLEVBQUUsQ0FBQTthQUNmO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUM5QixzQkFBc0IsRUFBRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDbkUsQ0FBQyxDQUFDLENBQUE7SUFFRixTQUFTLGtCQUFrQjtRQUN6QixPQUFPLGtCQUFrQixDQUFBO0lBQzNCLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxpQkFBaUI7UUFDcEIsU0FBUztRQUNULGtCQUFrQjtRQUNsQixnQkFBZ0I7UUFDaEIsUUFBUTtRQUNSLGVBQWU7S0FDaEIsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRW5naW5lLCBUcmFuc3BvcnQsIFJlYWxtSW5mbyB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgdHlwZSBTZW5kQmluYXJ5UmVxdWVzdCwgdHlwZSBTZW5kQmluYXJ5UmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL0NvbW11bmljYXRpb25zQ29udHJvbGxlcidcblxuaW1wb3J0IHsgc3luY0ZpbHRlciB9IGZyb20gJy4vZmlsdGVyJ1xuaW1wb3J0IHsgZW5naW5lVG9DcmR0IH0gZnJvbSAnLi9zdGF0ZSdcbmltcG9ydCB7IEJpbmFyeU1lc3NhZ2VCdXMsIENvbW1zTWVzc2FnZSB9IGZyb20gJy4vYmluYXJ5LW1lc3NhZ2UtYnVzJ1xuaW1wb3J0IHsgZmV0Y2hQcm9maWxlIH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IGVudGl0eVV0aWxzIH0gZnJvbSAnLi9lbnRpdGllcydcbmltcG9ydCB7IGNyZWF0ZVNlcnZlclZhbGlkYXRvciB9IGZyb20gJy4vc2VydmVyJ1xuaW1wb3J0IHsgR2V0VXNlckRhdGFSZXF1ZXN0LCBHZXRVc2VyRGF0YVJlc3BvbnNlIH0gZnJvbSAnfnN5c3RlbS9Vc2VySWRlbnRpdHknXG5pbXBvcnQgeyBkZWZpbmVQbGF5ZXJIZWxwZXIgfSBmcm9tICcuLi9wbGF5ZXJzJ1xuaW1wb3J0IHsgc2VyaWFsaXplQ3JkdE1lc3NhZ2VzIH0gZnJvbSAnLi4vaW50ZXJuYWwvdHJhbnNwb3J0cy9sb2dnZXInXG5pbXBvcnQgeyBJc1NlcnZlclJlcXVlc3QsIElzU2VydmVyUmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL0VuZ2luZUFwaSdcbmltcG9ydCB7IEF0b20gfSBmcm9tICcuLi9hdG9tJ1xuaW1wb3J0IHsgc2V0R2xvYmFsUm9vbSwgUm9vbSB9IGZyb20gJy4vZXZlbnRzL2ltcGxlbWVudGF0aW9uJ1xuXG5leHBvcnQgdHlwZSBJUHJvZmlsZSA9IHsgbmV0d29ya0lkOiBudW1iZXI7IHVzZXJJZDogc3RyaW5nIH1cbi8vIHVzZXIgdGhhdCB3ZSBhc2tlZCBmb3IgdGhlIGluaXRhbCBjcmR0IHN0YXRlXG5leHBvcnQgY29uc3QgQVVUSF9TRVJWRVJfUEVFUl9JRCA9ICdhdXRob3JpdGF0aXZlLXNlcnZlcidcbmV4cG9ydCBjb25zdCBERUJVR19ORVRXT1JLX01FU1NBR0VTID0gKCkgPT4gKGdsb2JhbFRoaXMgYXMgYW55KS5ERUJVR19ORVRXT1JLX01FU1NBR0VTID8/IGZhbHNlXG5cbi8vIFRlc3QgZW52aXJvbm1lbnQgZGV0ZWN0aW9uIHdpdGhvdXQgJ2FzIGFueSdcbmNvbnN0IGlzVGVzdEVudmlyb25tZW50ID0gKCk6IGJvb2xlYW4gPT4ge1xuICB0cnkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZVxuICAgIGNvbnN0IGdsb2JhbFdpdGhQcm9jZXNzID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIHsgcHJvY2Vzcz86IHsgZW52PzogeyBOT0RFX0VOVj86IHN0cmluZyB9IH0gfVxuICAgIHJldHVybiBnbG9iYWxXaXRoUHJvY2Vzcy5wcm9jZXNzPy5lbnY/Lk5PREVfRU5WID09PSAndGVzdCdcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN5bmNUcmFuc3BvcnQoXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgc2VuZEJpbmFyeTogKG1zZzogU2VuZEJpbmFyeVJlcXVlc3QpID0+IFByb21pc2U8U2VuZEJpbmFyeVJlc3BvbnNlPixcbiAgZ2V0VXNlckRhdGE6ICh2YWx1ZTogR2V0VXNlckRhdGFSZXF1ZXN0KSA9PiBQcm9taXNlPEdldFVzZXJEYXRhUmVzcG9uc2U+LFxuICBpc1NlcnZlckZuOiAocmVxdWVzdDogSXNTZXJ2ZXJSZXF1ZXN0KSA9PiBQcm9taXNlPElzU2VydmVyUmVzcG9uc2U+LFxuICBuYW1lOiBzdHJpbmdcbikge1xuICAvLyBQcm9maWxlIEluZm9cbiAgY29uc3QgbXlQcm9maWxlOiBJUHJvZmlsZSA9IHt9IGFzIElQcm9maWxlXG4gIGZldGNoUHJvZmlsZShteVByb2ZpbGUhLCBnZXRVc2VyRGF0YSlcblxuICBjb25zdCBpc1NlcnZlckF0b20gPSBBdG9tPGJvb2xlYW4+KClcbiAgY29uc3QgaXNSb29tUmVhZHlBdG9tID0gQXRvbTxib29sZWFuPihmYWxzZSlcblxuICB2b2lkIGlzU2VydmVyRm4oe30pLnRoZW4oKCQ6IElzU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICByZXR1cm4gaXNTZXJ2ZXJBdG9tLnN3YXAoISEkLmlzU2VydmVyKVxuICB9KVxuXG4gIC8vIEVudGl0eSB1dGlsc1xuICBjb25zdCBlbnRpdHlEZWZpbml0aW9ucyA9IGVudGl0eVV0aWxzKGVuZ2luZSwgbXlQcm9maWxlKVxuXG4gIC8vIExpc3Qgb2YgTWVzc2FnZUJ1c3MgbWVzc3NhZ2VzIHRvIGJlIHNlbnQgb24gZXZlcnkgZnJhbWUgdG8gY29tbXNcbiAgY29uc3QgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZDogeyBkYXRhOiBVaW50OEFycmF5W107IGFkZHJlc3M6IHN0cmluZ1tdIH1bXSA9IFtdXG5cbiAgY29uc3QgYmluYXJ5TWVzc2FnZUJ1cyA9IEJpbmFyeU1lc3NhZ2VCdXMoKGRhdGEsIGFkZHJlc3MpID0+IHtcbiAgICBwZW5kaW5nTWVzc2FnZUJ1c01lc3NhZ2VzVG9TZW5kLnB1c2goeyBkYXRhOiBbZGF0YV0sIGFkZHJlc3M6IGFkZHJlc3MgPz8gW10gfSlcbiAgfSlcblxuICBmdW5jdGlvbiBnZXRNZXNzYWdlc1RvU2VuZCgpOiB0eXBlb2YgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZCB7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBbLi4ucGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZF1cbiAgICBwZW5kaW5nTWVzc2FnZUJ1c01lc3NhZ2VzVG9TZW5kLmxlbmd0aCA9IDBcbiAgICByZXR1cm4gbWVzc2FnZXNcbiAgfVxuICBjb25zdCBwbGF5ZXJzID0gZGVmaW5lUGxheWVySGVscGVyKGVuZ2luZSlcblxuICBsZXQgc3RhdGVJc1N5bmNyb25pemVkID0gZmFsc2VcblxuICAvKipcbiAgICogV2UgbmVlZCB0byB3YWl0IHRpbGwgMiB0aWNrcyB0aGF0IGlzIHdoZW4gdGhlIGVuZ2luZSBpcyByZWFkeSB0byBzZW5kIG5ldyBtZXNzYWdlcy5cbiAgICogVGhlIGZpcnN0IHRpY2sgaXMgZm9yIHRoZSBjbGllbnQgZW5naW5lIHByb2Nlc3NpbmcgdGhlIENSRFQgbWVzc2FnZXMsXG4gICAqIGFuZCB0aGUgc2Vjb25kIG9uZSBhcmUgdGhlIG1lc3NhZ2VzIGNyZWF0ZWQgYnkgdGhlIG1haW4oKSBmdW5jdGlvbi5cbiAgICogU28gdG8gYXZvaWQgc2VuZGluZyB0aG9zZSBtZXNzYWdlcywgdGhhdCBhbGwgdGhlIGNsaWVudHMgaGF2ZSwgdGhyb3VnaCB0aGUgbmV0d29yayB3ZSBwdXQgdGhpcyB2YWxpZGF0aW9uIGhlcmUuXG4gICAqL1xuICBsZXQgdGljayA9IDBcbiAgY29uc3QgVFJBTlNQT1JUX0lOSVRJQUxJWkVEX05VTUJFUiA9IGlzVGVzdEVudmlyb25tZW50KCkgPyAwIDogMlxuICAvLyBBZGQgU3luYyBUcmFuc3BvcnRcbiAgY29uc3QgdHJhbnNwb3J0OiBUcmFuc3BvcnQgPSB7XG4gICAgZmlsdGVyOiBzeW5jRmlsdGVyKGVuZ2luZSksXG4gICAgc2VuZDogYXN5bmMgKG1lc3NhZ2VzKSA9PiB7XG4gICAgICBpZiAodGljayA8PSBUUkFOU1BPUlRfSU5JVElBTElaRURfTlVNQkVSKSB0aWNrKytcbiAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiB0aWNrID4gVFJBTlNQT1JUX0lOSVRJQUxJWkVEX05VTUJFUiA/IFttZXNzYWdlc10uZmxhdCgpIDogW10pIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coLi4uQXJyYXkuZnJvbShzZXJpYWxpemVDcmR0TWVzc2FnZXMoJ1tOZXR3b3JrTWVzc2FnZSBzZW50XTonLCBtZXNzYWdlLCBlbmdpbmUpKSlcblxuICAgICAgICAgIC8vIENvbnZlcnQgcmVndWxhciBtZXNzYWdlcyB0byBuZXR3b3JrIG1lc3NhZ2VzIGZvciBicm9hZGNhc3Rpbmcgd2l0aCBjaHVua2luZ1xuICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2Ygc2VydmVyVmFsaWRhdG9yLmNvbnZlcnRSZWd1bGFyVG9OZXR3b3JrTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5DUkRULCBjaHVuaylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHBlZXJNZXNzYWdlcyA9IGdldE1lc3NhZ2VzVG9TZW5kKClcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VuZEJpbmFyeSh7IGRhdGE6IFtdLCBwZWVyRGF0YTogcGVlck1lc3NhZ2VzIH0pXG4gICAgICBiaW5hcnlNZXNzYWdlQnVzLl9fcHJvY2Vzc01lc3NhZ2VzKHJlc3BvbnNlLmRhdGEpXG4gICAgfSxcbiAgICB0eXBlOiBuYW1lXG4gIH1cblxuICAvLyBTZXJ2ZXIgdmFsaWRhdGlvbiBzZXR1cFxuICBjb25zdCBzZXJ2ZXJWYWxpZGF0b3IgPSBjcmVhdGVTZXJ2ZXJWYWxpZGF0b3Ioe1xuICAgIGVuZ2luZSxcbiAgICBiaW5hcnlNZXNzYWdlQnVzXG4gIH0pXG5cbiAgLy8gSW5pdGlhbGl6ZSBFdmVudCBCdXMgd2l0aCByZWdpc3RlcmVkIHNjaGVtYXNcbiAgY29uc3QgZXZlbnRCdXMgPSBuZXcgUm9vbShlbmdpbmUsIGJpbmFyeU1lc3NhZ2VCdXMsIGlzU2VydmVyQXRvbSwgaXNSb29tUmVhZHlBdG9tKVxuXG4gIC8vIFNldCBnbG9iYWwgZXZlbnRCdXMgaW5zdGFuY2VcbiAgc2V0R2xvYmFsUm9vbShldmVudEJ1cylcblxuICBlbmdpbmUuYWRkVHJhbnNwb3J0KHRyYW5zcG9ydClcbiAgLy8gRW5kIGFkZCBzeW5jIHRyYW5zcG9ydFxuXG4gIC8vIFJlY2VpdmUgJiBQcm9jZXNzIENSRFRfU1RBVEVcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuUkVRX0NSRFRfU1RBVEUsIGFzeW5jIChkYXRhLCBzZW5kZXIpID0+IHtcbiAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1tSRVFfQ1JEVF9TVEFURV0nLCBzZW5kZXIsIERhdGUubm93KCkpXG4gICAgY29uc3QgY2h1bmtzID0gZW5naW5lVG9DcmR0KGVuZ2luZSlcbiAgICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbRW1pdGluZyBlbXB0eSBzdGF0ZTpdJywgc2VuZGVyLCBEYXRlLm5vdygpKVxuICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5SRVNfQ1JEVF9TVEFURSwgbmV3IFVpbnQ4QXJyYXkoKSwgW3NlbmRlcl0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW0VtaXRpbmc6XScsIHNlbmRlciwgRGF0ZS5ub3coKSlcbiAgICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5SRVNfQ1JEVF9TVEFURSwgY2h1bmssIFtzZW5kZXJdKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuUkVTX0NSRFRfU1RBVEUsIGFzeW5jIChkYXRhLCBzZW5kZXIpID0+IHtcbiAgICByZXF1ZXN0aW5nU3RhdGUgPSBmYWxzZVxuICAgIGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID0gMFxuICAgIGlmIChpc1NlcnZlckF0b20uZ2V0T3JOdWxsKCkgfHwgc2VuZGVyICE9PSBBVVRIX1NFUlZFUl9QRUVSX0lEKSByZXR1cm5cbiAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1tQcm9jZXNzaW5nIENSRFQgU3RhdGVdJywgZGF0YS5ieXRlTGVuZ3RoIC8gMTAyNCwgJ0tCJylcbiAgICBpZiAoZGF0YS5ieXRlTGVuZ3RoID4gMCkge1xuICAgICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEoc2VydmVyVmFsaWRhdG9yLnByb2Nlc3NDbGllbnRNZXNzYWdlcyhkYXRhLCBzZW5kZXIpKVxuICAgIH1cbiAgICBzdGF0ZUlzU3luY3Jvbml6ZWQgPSB0cnVlXG5cbiAgICAvLyBJTVBPUlRBTlQ6IE9ubHkgbWFyayByb29tIGFzIHJlYWR5IEFGVEVSIHN0YXRlIGlzIHN5bmNocm9uaXplZFxuICAgIC8vIFRoaXMgZW5zdXJlcyBjb21tcyBpcyB0cnVseSBjb25uZWN0ZWQgYW5kIHdvcmtpbmdcbiAgICBjb25zdCByZWFsbUluZm8gPSBSZWFsbUluZm8uZ2V0T3JOdWxsKGVuZ2luZS5Sb290RW50aXR5KVxuICAgIGlmIChyZWFsbUluZm8pIHtcbiAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW2lzUm9vbVJlYWR5XSBNYXJraW5nIHJvb20gYXMgcmVhZHkgYWZ0ZXIgc3RhdGUgc3luYycpXG4gICAgICBpc1Jvb21SZWFkeUF0b20uc3dhcCh0cnVlKVxuICAgIH1cbiAgfSlcblxuICAvLyByZWNlaXZlZCBtZXNzYWdlIGZyb20gdGhlIG5ldHdvcmtcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuQ1JEVCwgKHZhbHVlLCBzZW5kZXIpID0+IHtcbiAgICBjb25zdCBpc1NlcnZlciA9IGlzU2VydmVyQXRvbS5nZXRPck51bGwoKVxuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIHRyYW5zcG9ydC50eXBlLFxuICAgICAgICAuLi5BcnJheS5mcm9tKHNlcmlhbGl6ZUNyZHRNZXNzYWdlcygnW05ldHdvcmtNZXNzYWdlIHJlY2VpdmVkXTonLCB2YWx1ZSwgZW5naW5lKSksXG4gICAgICAgIGlzU2VydmVyXG4gICAgICApXG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICB0cmFuc3BvcnQub25tZXNzYWdlIShzZXJ2ZXJWYWxpZGF0b3IucHJvY2Vzc1NlcnZlck1lc3NhZ2VzKHZhbHVlLCBzZW5kZXIpKVxuICAgIH0gZWxzZSBpZiAoc2VuZGVyID09PSBBVVRIX1NFUlZFUl9QRUVSX0lEKSB7XG4gICAgICAvLyBQcm9jZXNzIG5ldHdvcmsgbWVzc2FnZXMgZnJvbSBzZXJ2ZXIgYW5kIGNvbnZlcnQgdG8gcmVndWxhciBtZXNzYWdlc1xuICAgICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEoc2VydmVyVmFsaWRhdG9yLnByb2Nlc3NDbGllbnRNZXNzYWdlcyh2YWx1ZSwgc2VuZGVyKSlcbiAgICB9XG4gIH0pXG5cbiAgLy8gcmVjZWl2ZWQgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlIGZyb20gc2VydmVyIC0gZm9yY2UgYXBwbHkgdG8gZml4IGludmFsaWQgbG9jYWwgc3RhdGVcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuQ1JEVF9BVVRIT1JJVEFUSVZFLCAodmFsdWUsIHNlbmRlcikgPT4ge1xuICAgIC8vIE9ubHkgYWNjZXB0IGF1dGhvcml0YXRpdmUgbWVzc2FnZXMgZnJvbSBhdXRob3JpdGF0aXZlIHNlcnZlclxuICAgIGlmIChzZW5kZXIgIT09IEFVVEhfU0VSVkVSX1BFRVJfSUQpIHJldHVyblxuXG4gICAgLy8gREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmXG4gICAgY29uc29sZS5sb2coJ1tBVVRIT1JJVEFUSVZFXSBSZWNlaXZlZCBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgZnJvbSBzZXJ2ZXI6JywgdmFsdWUuYnl0ZUxlbmd0aCwgJ2J5dGVzJylcblxuICAgIC8vIFByb2Nlc3MgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlcyBieSBmb3JjaW5nIHRoZW0gdGhyb3VnaCBub3JtYWwgQ1JEVCBwcm9jZXNzaW5nXG4gICAgLy8gYnV0IHdpdGggYSB0aW1lc3RhbXAgdGhhdCdzIGd1YXJhbnRlZWQgdG8gYmUgYWNjZXB0ZWRcbiAgICBjb25zdCBhdXRob3JpdGF0aXZlQnVmZmVyID0gc2VydmVyVmFsaWRhdG9yLnByb2Nlc3NDbGllbnRNZXNzYWdlcyh2YWx1ZSwgc2VuZGVyLCB0cnVlKVxuICAgIGlmIChhdXRob3JpdGF0aXZlQnVmZmVyLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAvLyBBcHBseSBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgdGhyb3VnaCBub3JtYWwgdHJhbnNwb3J0LCBidXQgdGhlIHNlcnZlcidzIG1lc3NhZ2VzXG4gICAgICAvLyBzaG91bGQgYmUgcHJvY2Vzc2VkIGFzIGF1dGhvcml0YXRpdmUgd2l0aCBzcGVjaWFsIHRpbWVzdGFtcCBoYW5kbGluZ1xuICAgICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEoYXV0aG9yaXRhdGl2ZUJ1ZmZlcilcblxuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbQVVUSE9SSVRBVElWRV0gQXBwbGllZCBzZXJ2ZXIgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlIHRvIGxvY2FsIHN0YXRlJylcbiAgICB9XG4gIH0pXG5cbiAgcGxheWVycy5vbkVudGVyU2NlbmUoKHBsYXllcikgPT4ge1xuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW29uRW50ZXJTY2VuZV0nLCBwbGF5ZXIudXNlcklkKVxuICAgIGlmICghaXNTZXJ2ZXJBdG9tLmdldE9yTnVsbCgpICYmIG15UHJvZmlsZS51c2VySWQgPT09IHBsYXllci51c2VySWQpIHtcbiAgICAgIHJlcXVlc3RTdGF0ZSgpXG4gICAgfVxuICB9KVxuXG4gIC8vIEFza3MgZm9yIHRoZSBSRVFfQ1JEVF9TVEFURSB3aGVuIGl0cyBjb25uZWN0ZWQgdG8gY29tbXNcbiAgUmVhbG1JbmZvLm9uQ2hhbmdlKGVuZ2luZS5Sb290RW50aXR5LCAodmFsdWUpID0+IHtcbiAgICBjb25zdCBpc1NlcnZlciA9IGlzU2VydmVyQXRvbS5nZXRPck51bGwoKVxuXG4gICAgaWYgKCF2YWx1ZT8uaXNDb25uZWN0ZWRTY2VuZVJvb20pIHtcbiAgICAgIC8vIE9ubHkgcmVhY3Qgd2hlbiBhY3R1YWxseSB0cmFuc2l0aW9uaW5nIGZyb20gcmVhZHkgdG8gbm90IHJlYWR5XG4gICAgICBpZiAoaXNSb29tUmVhZHlBdG9tLmdldE9yTnVsbCgpID09PSB0cnVlKSB7XG4gICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnRGlzY29ubmVjdGVkIGZyb20gY29tbXMnKVxuICAgICAgICBpc1Jvb21SZWFkeUF0b20uc3dhcChmYWxzZSlcbiAgICAgICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgICAgIHN0YXRlSXNTeW5jcm9uaXplZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsdWU/LmlzQ29ubmVjdGVkU2NlbmVSb29tKSB7XG4gICAgICByZXF1ZXN0U3RhdGUoKVxuXG4gICAgICAvLyBGb3Igc2VydmVycywgbWFyayBhcyByZWFkeSBpbW1lZGlhdGVseSB3aGVuIGNvbm5lY3RlZFxuICAgICAgLy8gKHNlcnZlcnMgZG9uJ3QgbmVlZCB0byBzeW5jIHN0YXRlIGZyb20gYW55b25lKVxuICAgICAgaWYgKGlzU2VydmVyICYmIGlzUm9vbVJlYWR5QXRvbS5nZXRPck51bGwoKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbaXNSb29tUmVhZHldIFNlcnZlciBtYXJraW5nIHJvb20gYXMgcmVhZHknKVxuICAgICAgICBpc1Jvb21SZWFkeUF0b20uc3dhcCh0cnVlKVxuICAgICAgfVxuICAgICAgLy8gRm9yIGNsaWVudHMsIHJvb20gd2lsbCBiZSBtYXJrZWQgcmVhZHkgYWZ0ZXIgcmVjZWl2aW5nIENSRFQgc3RhdGUgKGFib3ZlKVxuICAgIH1cbiAgfSlcblxuICBsZXQgcmVxdWVzdGluZ1N0YXRlID0gZmFsc2VcbiAgbGV0IGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID0gMFxuICBjb25zdCBTVEFURV9SRVFVRVNUX1JFVFJZX0lOVEVSVkFMID0gMi4wIC8vIHNlY29uZHNcblxuICAvKipcbiAgICogV2h5IHdlIGhhdmUgdG8gcmVxdWVzdCB0aGUgc3RhdGUgaWYgd2UgaGF2ZSBhIHNlcnZlciB0aGF0IGNhbiBzZW5kIHVzIHRoZSBzdGF0ZSB3aGVuIHdlIGpvaW5lZD9cbiAgICogVGhlIHRoaW5nIGlzIHRoYXQgd2hlbiB0aGUgc2VydmVyIGRldGVjdHMgYSBuZXcgSk9JTl9QQVJUSUNJUEFOVCBvbiBsaXZla2l0IHJvb20sIGl0IHNlbmRzIGF1dG9tYXRpY2FsbHkgdGhlIHN0YXRlIHRvIHRoYXQgcGVlci5cbiAgICogQnV0IGluIHVuaXR5LCBpdCB0YWtlcyBtb3JlIHRpbWUsIHNvIHRoYXQgbWVzc2FnZSBpcyBub3QgYmVpbmcgZGVsaXZlcmVkIHRvIHRoZSBjbGllbnQuXG4gICAqIFNvIGluc3RlYWQsIHdoZW4gd2UgYXJlIGZpbmFsbHkgY29ubmVjdGVkIHRvIHRoZSByb29tLCB3ZSByZXF1ZXN0IHRoZSBzdGF0ZSwgYW5kIHRoZW4gdGhlIHNlcnZlciBhbnN3ZXJzIHdpdGggdGhlIHN0YXRlIDopXG4gICAqXG4gICAqIElmIG5vIHJlc3BvbnNlIGlzIHJlY2VpdmVkIHdpdGhpbiAyIHNlY29uZHMsIHRoZSByZXF1ZXN0IGlzIGF1dG9tYXRpY2FsbHkgcmV0cmllZC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcXVlc3RTdGF0ZSgpIHtcbiAgICBpZiAoaXNTZXJ2ZXJBdG9tLmdldE9yTnVsbCgpKSByZXR1cm5cbiAgICBpZiAoUmVhbG1JbmZvLmdldE9yTnVsbChlbmdpbmUuUm9vdEVudGl0eSk/LmlzQ29ubmVjdGVkU2NlbmVSb29tICYmICFyZXF1ZXN0aW5nU3RhdGUpIHtcbiAgICAgIHJlcXVlc3RpbmdTdGF0ZSA9IHRydWVcbiAgICAgIGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID0gMFxuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdSZXF1ZXN0aW5nIHN0YXRlLi4uJylcbiAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuUkVRX0NSRFRfU1RBVEUsIG5ldyBVaW50OEFycmF5KCkpXG4gICAgfVxuICB9XG5cbiAgLy8gU3lzdGVtIHRvIHJldHJ5IHN0YXRlIHJlcXVlc3QgaWYgbm8gcmVzcG9uc2UgaXMgcmVjZWl2ZWQgd2l0aGluIHRoZSByZXRyeSBpbnRlcnZhbFxuICBlbmdpbmUuYWRkU3lzdGVtKChkdDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKHJlcXVlc3RpbmdTdGF0ZSAmJiAhc3RhdGVJc1N5bmNyb25pemVkKSB7XG4gICAgICBlbGFwc2VkVGltZVNpbmNlUmVxdWVzdCArPSBkdFxuICAgICAgaWYgKGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID49IFNUQVRFX1JFUVVFU1RfUkVUUllfSU5URVJWQUwpIHtcbiAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdTdGF0ZSByZXF1ZXN0IHRpbWVkIG91dCwgcmV0cnlpbmcuLi4nKVxuICAgICAgICBlbGFwc2VkVGltZVNpbmNlUmVxdWVzdCA9IDBcbiAgICAgICAgcmVxdWVzdGluZ1N0YXRlID0gZmFsc2VcbiAgICAgICAgcmVxdWVzdFN0YXRlKClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcGxheWVycy5vbkxlYXZlU2NlbmUoKHVzZXJJZCkgPT4ge1xuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW29uTGVhdmVTY2VuZV0nLCB1c2VySWQpXG4gIH0pXG5cbiAgZnVuY3Rpb24gaXNTdGF0ZVN5bmNyb25pemVkKCkge1xuICAgIHJldHVybiBzdGF0ZUlzU3luY3Jvbml6ZWRcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZW50aXR5RGVmaW5pdGlvbnMsXG4gICAgbXlQcm9maWxlLFxuICAgIGlzU3RhdGVTeW5jcm9uaXplZCxcbiAgICBiaW5hcnlNZXNzYWdlQnVzLFxuICAgIGV2ZW50QnVzLFxuICAgIGlzUm9vbVJlYWR5QXRvbVxuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dcl/sdk",
3
3
  "description": "",
4
- "version": "7.20.5-22638270380.commit-3f48d5e",
4
+ "version": "7.20.5-22638863063.commit-f988f31",
5
5
  "author": "Decentraland",
6
6
  "dependencies": {
7
- "@dcl/ecs": "7.20.5-22638270380.commit-3f48d5e",
7
+ "@dcl/ecs": "7.20.5-22638863063.commit-f988f31",
8
8
  "@dcl/ecs-math": "2.1.0",
9
9
  "@dcl/explorer": "1.0.164509-20240802172549.commit-fb95b9b",
10
- "@dcl/js-runtime": "7.20.5-22638270380.commit-3f48d5e",
11
- "@dcl/react-ecs": "7.20.5-22638270380.commit-3f48d5e",
12
- "@dcl/sdk-commands": "7.20.5-22638270380.commit-3f48d5e",
10
+ "@dcl/js-runtime": "7.20.5-22638863063.commit-f988f31",
11
+ "@dcl/react-ecs": "7.20.5-22638863063.commit-f988f31",
12
+ "@dcl/sdk-commands": "7.20.5-22638863063.commit-f988f31",
13
13
  "text-encoding": "0.7.0"
14
14
  },
15
15
  "keywords": [],
@@ -35,5 +35,5 @@
35
35
  },
36
36
  "types": "./index.d.ts",
37
37
  "typings": "./index.d.ts",
38
- "commit": "3f48d5e5f12f18f7f10b855b81f353959dd6879b"
38
+ "commit": "f988f317ab5b7a53fbbbf0e6f777b31f64f67ea4"
39
39
  }
@@ -116,9 +116,15 @@ export function addSyncTransport(
116
116
  // Receive & Process CRDT_STATE
117
117
  binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, async (data, sender) => {
118
118
  DEBUG_NETWORK_MESSAGES() && console.log('[REQ_CRDT_STATE]', sender, Date.now())
119
- for (const chunk of engineToCrdt(engine)) {
120
- DEBUG_NETWORK_MESSAGES() && console.log('[Emiting:]', sender, Date.now())
121
- binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, chunk, [sender])
119
+ const chunks = engineToCrdt(engine)
120
+ if (chunks.length === 0) {
121
+ DEBUG_NETWORK_MESSAGES() && console.log('[Emiting empty state:]', sender, Date.now())
122
+ binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, new Uint8Array(), [sender])
123
+ } else {
124
+ for (const chunk of chunks) {
125
+ DEBUG_NETWORK_MESSAGES() && console.log('[Emiting:]', sender, Date.now())
126
+ binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, chunk, [sender])
127
+ }
122
128
  }
123
129
  })
124
130
  binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, async (data, sender) => {
@@ -126,7 +132,9 @@ export function addSyncTransport(
126
132
  elapsedTimeSinceRequest = 0
127
133
  if (isServerAtom.getOrNull() || sender !== AUTH_SERVER_PEER_ID) return
128
134
  DEBUG_NETWORK_MESSAGES() && console.log('[Processing CRDT State]', data.byteLength / 1024, 'KB')
129
- transport.onmessage!(serverValidator.processClientMessages(data, sender))
135
+ if (data.byteLength > 0) {
136
+ transport.onmessage!(serverValidator.processClientMessages(data, sender))
137
+ }
130
138
  stateIsSyncronized = true
131
139
 
132
140
  // IMPORTANT: Only mark room as ready AFTER state is synchronized