@cloudbase/realtime 2.0.2-alpha.0 → 2.5.0-beta.0

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.
@@ -58,7 +58,7 @@ var WS_READY_STATE = {
58
58
  CONNECTING: 0,
59
59
  OPEN: 1,
60
60
  CLOSING: 2,
61
- CLOSED: 3
61
+ CLOSED: 3,
62
62
  };
63
63
  var MAX_RTT_OBSERVED = 3;
64
64
  var DEFAULT_EXPECTED_EVENT_WAIT_TIME = 5000;
@@ -71,401 +71,400 @@ var DEFAULT_LOGIN_TIMEOUT = 5000;
71
71
  var RealtimeWebSocketClient = (function () {
72
72
  function RealtimeWebSocketClient(options) {
73
73
  var _this = this;
74
- this._virtualWSClient = new Set();
75
- this._queryIdClientMap = new Map();
76
- this._watchIdClientMap = new Map();
77
- this._pingFailed = 0;
78
- this._pongMissed = 0;
79
- this._logins = new Map();
80
- this._wsReadySubsribers = [];
81
- this._wsResponseWait = new Map();
82
- this._rttObserved = [];
74
+ this.virtualWSClient = new Set();
75
+ this.queryIdClientMap = new Map();
76
+ this.watchIdClientMap = new Map();
77
+ this.pingFailed = 0;
78
+ this.pongMissed = 0;
79
+ this.logins = new Map();
80
+ this.wsReadySubsribers = [];
81
+ this.wsResponseWait = new Map();
82
+ this.rttObserved = [];
83
83
  this.send = function (opts) { return __awaiter(_this, void 0, void 0, function () {
84
84
  var _this = this;
85
85
  return __generator(this, function (_a) {
86
- return [2, new Promise(function (_resolve, _reject) { return __awaiter(_this, void 0, void 0, function () {
87
- var timeoutId, _hasResolved, _hasRejected, resolve, reject, err_1, e_1;
88
- var _this = this;
89
- return __generator(this, function (_a) {
90
- switch (_a.label) {
91
- case 0:
92
- _hasResolved = false;
93
- _hasRejected = false;
94
- resolve = function (value) {
95
- _hasResolved = true;
96
- timeoutId && clearTimeout(timeoutId);
97
- _resolve(value);
98
- };
99
- reject = function (error) {
100
- _hasRejected = true;
101
- timeoutId && clearTimeout(timeoutId);
102
- _reject(error);
103
- };
104
- if (opts.timeout) {
105
- timeoutId = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
106
- return __generator(this, function (_a) {
107
- switch (_a.label) {
108
- case 0:
109
- if (!(!_hasResolved || !_hasRejected)) return [3, 2];
110
- return [4, utils_1.sleep(0)];
111
- case 1:
112
- _a.sent();
113
- if (!_hasResolved || !_hasRejected) {
114
- reject(new error_1.TimeoutError('wsclient.send timedout'));
86
+ return [2, new Promise(function (_resolve, _reject) {
87
+ void (function () { return __awaiter(_this, void 0, void 0, function () {
88
+ var timeoutId, hasResolved, hasRejected, resolve, reject, respWaitSpec, err_1, e_1;
89
+ var _this = this;
90
+ return __generator(this, function (_a) {
91
+ switch (_a.label) {
92
+ case 0:
93
+ hasResolved = false;
94
+ hasRejected = false;
95
+ resolve = function (value) {
96
+ hasResolved = true;
97
+ timeoutId && clearTimeout(timeoutId);
98
+ _resolve(value);
99
+ };
100
+ reject = function (error) {
101
+ hasRejected = true;
102
+ timeoutId && clearTimeout(timeoutId);
103
+ _reject(error);
104
+ };
105
+ if (opts.timeout) {
106
+ timeoutId = setTimeout(function () {
107
+ (function () { return __awaiter(_this, void 0, void 0, function () {
108
+ return __generator(this, function (_a) {
109
+ switch (_a.label) {
110
+ case 0:
111
+ if (!(!hasResolved || !hasRejected)) return [3, 2];
112
+ return [4, utils_1.sleep(0)];
113
+ case 1:
114
+ _a.sent();
115
+ if (!hasResolved || !hasRejected) {
116
+ reject(new error_1.TimeoutError('wsclient.send timedout'));
117
+ }
118
+ _a.label = 2;
119
+ case 2: return [2];
115
120
  }
116
- _a.label = 2;
117
- case 2: return [2];
118
- }
119
- });
120
- }); }, opts.timeout);
121
- }
122
- _a.label = 1;
123
- case 1:
124
- _a.trys.push([1, 8, , 9]);
125
- if (!this._wsInitPromise) return [3, 3];
126
- return [4, this._wsInitPromise];
127
- case 2:
128
- _a.sent();
129
- _a.label = 3;
130
- case 3:
131
- if (!this._ws) {
132
- reject(new Error('invalid state: ws connection not exists, can not send message'));
133
- return [2];
134
- }
135
- if (this._ws.readyState !== WS_READY_STATE.OPEN) {
136
- reject(new Error("ws readyState invalid: " + this._ws.readyState + ", can not send message"));
137
- return [2];
138
- }
139
- if (opts.waitResponse) {
140
- this._wsResponseWait.set(opts.msg.requestId, {
141
- resolve: resolve,
142
- reject: reject,
143
- skipOnMessage: opts.skipOnMessage
144
- });
145
- }
146
- _a.label = 4;
147
- case 4:
148
- _a.trys.push([4, 6, , 7]);
149
- return [4, this._ws.send(JSON.stringify(opts.msg))];
150
- case 5:
151
- _a.sent();
152
- if (!opts.waitResponse) {
153
- resolve();
154
- }
155
- return [3, 7];
156
- case 6:
157
- err_1 = _a.sent();
158
- if (err_1) {
159
- reject(err_1);
121
+ });
122
+ }); })();
123
+ }, opts.timeout);
124
+ }
125
+ _a.label = 1;
126
+ case 1:
127
+ _a.trys.push([1, 8, , 9]);
128
+ if (!(this.wsInitPromise !== undefined || this.wsInitPromise !== null)) return [3, 3];
129
+ return [4, this.wsInitPromise];
130
+ case 2:
131
+ _a.sent();
132
+ _a.label = 3;
133
+ case 3:
134
+ if (!this.ws) {
135
+ reject(new Error('invalid state: ws connection not exists, can not send message'));
136
+ return [2];
137
+ }
138
+ if (this.ws.readyState !== WS_READY_STATE.OPEN) {
139
+ reject(new Error("ws readyState invalid: " + this.ws.readyState + ", can not send message"));
140
+ return [2];
141
+ }
160
142
  if (opts.waitResponse) {
161
- this._wsResponseWait.delete(opts.msg.requestId);
143
+ respWaitSpec = {
144
+ resolve: resolve,
145
+ reject: reject,
146
+ skipOnMessage: opts.skipOnMessage,
147
+ };
148
+ this.wsResponseWait.set(opts.msg.requestId, respWaitSpec);
162
149
  }
163
- }
164
- return [3, 7];
165
- case 7: return [3, 9];
166
- case 8:
167
- e_1 = _a.sent();
168
- reject(e_1);
169
- return [3, 9];
170
- case 9: return [2];
171
- }
172
- });
173
- }); })];
150
+ _a.label = 4;
151
+ case 4:
152
+ _a.trys.push([4, 6, , 7]);
153
+ return [4, this.ws.send(JSON.stringify(opts.msg))];
154
+ case 5:
155
+ _a.sent();
156
+ if (!opts.waitResponse) {
157
+ resolve(void 0);
158
+ }
159
+ return [3, 7];
160
+ case 6:
161
+ err_1 = _a.sent();
162
+ if (err_1) {
163
+ reject(err_1);
164
+ if (opts.waitResponse) {
165
+ this.wsResponseWait.delete(opts.msg.requestId);
166
+ }
167
+ }
168
+ return [3, 7];
169
+ case 7: return [3, 9];
170
+ case 8:
171
+ e_1 = _a.sent();
172
+ reject(e_1);
173
+ return [3, 9];
174
+ case 9: return [2];
175
+ }
176
+ });
177
+ }); })();
178
+ })];
174
179
  });
175
180
  }); };
176
181
  this.closeAllClients = function (error) {
177
- _this._virtualWSClient.forEach(function (client) {
182
+ _this.virtualWSClient.forEach(function (client) {
178
183
  client.closeWithError(error);
179
184
  });
180
185
  };
181
186
  this.pauseClients = function (clients) {
182
- ;
183
- (clients || _this._virtualWSClient).forEach(function (client) {
187
+ (clients || _this.virtualWSClient).forEach(function (client) {
184
188
  client.pause();
185
189
  });
186
190
  };
187
191
  this.resumeClients = function (clients) {
188
- ;
189
- (clients || _this._virtualWSClient).forEach(function (client) {
192
+ (clients || _this.virtualWSClient).forEach(function (client) {
190
193
  client.resume();
191
194
  });
192
195
  };
193
196
  this.initWebSocketConnection = function (reconnect, availableRetries) {
194
- if (availableRetries === void 0) { availableRetries = _this._maxReconnect; }
197
+ if (availableRetries === void 0) { availableRetries = _this.maxReconnect; }
195
198
  return __awaiter(_this, void 0, void 0, function () {
196
199
  var e_2;
197
200
  var _this = this;
198
201
  return __generator(this, function (_a) {
199
202
  switch (_a.label) {
200
203
  case 0:
201
- if (reconnect && this._reconnectState) {
204
+ if (reconnect && this.reconnectState) {
202
205
  return [2];
203
206
  }
204
207
  if (reconnect) {
205
- this._reconnectState = true;
208
+ this.reconnectState = true;
206
209
  }
207
- if (this._wsInitPromise) {
208
- return [2, this._wsInitPromise];
210
+ if (this.wsInitPromise !== undefined && this.wsInitPromise !== null) {
211
+ return [2, this.wsInitPromise];
209
212
  }
210
213
  if (reconnect) {
211
214
  this.pauseClients();
212
215
  }
213
- this.close(ws_event_1.CLOSE_EVENT_CODE.ReconnectWebSocket);
214
- this._wsInitPromise = new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
215
- var wsSign_1, e_3, isConnected;
216
- var _this = this;
217
- return __generator(this, function (_a) {
218
- switch (_a.label) {
219
- case 0:
220
- _a.trys.push([0, 6, , 11]);
221
- return [4, this.getWsSign()];
222
- case 1:
223
- wsSign_1 = _a.sent();
224
- return [4, new Promise(function (success) {
225
- var url = wsSign_1.wsUrl || 'wss://tcb-ws.tencentcloudapi.com';
226
- var wsClass = common_1.getWsClass();
227
- _this._ws = wsClass ? new wsClass(url) : new WebSocket(url);
228
- success();
229
- })];
230
- case 2:
231
- _a.sent();
232
- if (!this._ws.connect) return [3, 4];
233
- return [4, this._ws.connect()];
234
- case 3:
235
- _a.sent();
236
- _a.label = 4;
237
- case 4: return [4, this.initWebSocketEvent()];
238
- case 5:
239
- _a.sent();
240
- resolve();
241
- if (reconnect) {
242
- this.resumeClients();
243
- this._reconnectState = false;
244
- }
245
- return [3, 11];
246
- case 6:
247
- e_3 = _a.sent();
248
- console.error('[realtime] initWebSocketConnection connect fail', e_3);
249
- if (!(availableRetries > 0)) return [3, 9];
250
- isConnected = true;
251
- this._wsInitPromise = undefined;
252
- if (!isConnected) return [3, 8];
253
- return [4, utils_1.sleep(this._reconnectInterval)];
254
- case 7:
255
- _a.sent();
256
- if (reconnect) {
257
- this._reconnectState = false;
258
- }
259
- _a.label = 8;
260
- case 8:
261
- resolve(this.initWebSocketConnection(reconnect, availableRetries - 1));
262
- return [3, 10];
263
- case 9:
264
- reject(e_3);
265
- if (reconnect) {
266
- this.closeAllClients(new error_1.CloudSDKError({
267
- errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECONNECT_WATCH_FAIL,
268
- errMsg: e_3
269
- }));
270
- }
271
- _a.label = 10;
272
- case 10: return [3, 11];
273
- case 11: return [2];
274
- }
275
- });
276
- }); });
216
+ this.close(ws_event_1.CloseEventCode.ReconnectWebSocket);
217
+ this.wsInitPromise = new Promise(function (resolve, reject) {
218
+ (function () { return __awaiter(_this, void 0, void 0, function () {
219
+ var wsSign_1, e_3, isConnected;
220
+ var _this = this;
221
+ return __generator(this, function (_a) {
222
+ switch (_a.label) {
223
+ case 0:
224
+ _a.trys.push([0, 6, , 11]);
225
+ return [4, this.getWsSign()];
226
+ case 1:
227
+ wsSign_1 = _a.sent();
228
+ return [4, new Promise(function (success) {
229
+ var url = wsSign_1.wsUrl || 'wss://tcb-ws.tencentcloudapi.com';
230
+ var wsClass = common_1.getWsClass();
231
+ _this.ws = wsClass ? new wsClass(url) : new WebSocket(url);
232
+ success(void 0);
233
+ })];
234
+ case 2:
235
+ _a.sent();
236
+ if (!this.ws.connect) return [3, 4];
237
+ return [4, this.ws.connect()];
238
+ case 3:
239
+ _a.sent();
240
+ _a.label = 4;
241
+ case 4: return [4, this.initWebSocketEvent()];
242
+ case 5:
243
+ _a.sent();
244
+ resolve();
245
+ if (reconnect) {
246
+ this.resumeClients();
247
+ this.reconnectState = false;
248
+ }
249
+ return [3, 11];
250
+ case 6:
251
+ e_3 = _a.sent();
252
+ console.error('[realtime] initWebSocketConnection connect fail', e_3);
253
+ if (!(availableRetries > 0)) return [3, 9];
254
+ isConnected = true;
255
+ this.wsInitPromise = undefined;
256
+ if (!isConnected) return [3, 8];
257
+ return [4, utils_1.sleep(this.reconnectInterval)];
258
+ case 7:
259
+ _a.sent();
260
+ if (reconnect) {
261
+ this.reconnectState = false;
262
+ }
263
+ _a.label = 8;
264
+ case 8:
265
+ resolve(this.initWebSocketConnection(reconnect, availableRetries - 1));
266
+ return [3, 10];
267
+ case 9:
268
+ reject(e_3);
269
+ if (reconnect) {
270
+ this.closeAllClients(new error_1.CloudSDKError({
271
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECONNECT_WATCH_FAIL,
272
+ errMsg: e_3,
273
+ }));
274
+ }
275
+ _a.label = 10;
276
+ case 10: return [3, 11];
277
+ case 11: return [2];
278
+ }
279
+ });
280
+ }); })();
281
+ });
277
282
  _a.label = 1;
278
283
  case 1:
279
284
  _a.trys.push([1, 3, 4, 5]);
280
- return [4, this._wsInitPromise];
285
+ return [4, this.wsInitPromise];
281
286
  case 2:
282
287
  _a.sent();
283
- this._wsReadySubsribers.forEach(function (_a) {
288
+ this.wsReadySubsribers.forEach(function (_a) {
284
289
  var resolve = _a.resolve;
285
290
  return resolve();
286
291
  });
287
292
  return [3, 5];
288
293
  case 3:
289
294
  e_2 = _a.sent();
290
- this._wsReadySubsribers.forEach(function (_a) {
295
+ this.wsReadySubsribers.forEach(function (_a) {
291
296
  var reject = _a.reject;
292
297
  return reject();
293
298
  });
294
299
  return [3, 5];
295
300
  case 4:
296
- this._wsInitPromise = undefined;
297
- this._wsReadySubsribers = [];
301
+ this.wsInitPromise = undefined;
302
+ this.wsReadySubsribers = [];
298
303
  return [7];
299
304
  case 5: return [2];
300
305
  }
301
306
  });
302
307
  });
303
308
  };
304
- this.initWebSocketEvent = function () {
305
- return new Promise(function (resolve, reject) {
306
- if (!_this._ws) {
307
- throw new Error('can not initWebSocketEvent, ws not exists');
309
+ this.initWebSocketEvent = function () { return new Promise(function (resolve, reject) {
310
+ if (!_this.ws) {
311
+ throw new Error('can not initWebSocketEvent, ws not exists');
312
+ }
313
+ var wsOpened = false;
314
+ _this.ws.onopen = function (event) {
315
+ console.warn('[realtime] ws event: open', event);
316
+ wsOpened = true;
317
+ resolve();
318
+ };
319
+ _this.ws.onerror = function (event) {
320
+ _this.logins = new Map();
321
+ if (!wsOpened) {
322
+ console.error('[realtime] ws open failed with ws event: error', event);
323
+ reject(event);
308
324
  }
309
- var wsOpened = false;
310
- _this._ws.onopen = function (event) {
311
- console.warn('[realtime] ws event: open', event);
312
- wsOpened = true;
313
- resolve();
314
- };
315
- _this._ws.onerror = function (event) {
316
- _this._logins = new Map();
317
- if (!wsOpened) {
318
- console.error('[realtime] ws open failed with ws event: error', event);
319
- reject(event);
325
+ else {
326
+ console.error('[realtime] ws event: error', event);
327
+ _this.clearHeartbeat();
328
+ _this.virtualWSClient.forEach(function (client) { return client.closeWithError(new error_1.CloudSDKError({
329
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_WEBSOCKET_CONNECTION_ERROR,
330
+ errMsg: event,
331
+ })); });
332
+ }
333
+ };
334
+ _this.ws.onclose = function (closeEvent) {
335
+ console.warn('[realtime] ws event: close', closeEvent);
336
+ _this.logins = new Map();
337
+ _this.clearHeartbeat();
338
+ switch (closeEvent.code) {
339
+ case ws_event_1.CloseEventCode.ReconnectWebSocket: {
340
+ break;
320
341
  }
321
- else {
322
- console.error('[realtime] ws event: error', event);
323
- _this.clearHeartbeat();
324
- _this._virtualWSClient.forEach(function (client) {
325
- return client.closeWithError(new error_1.CloudSDKError({
326
- errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_WEBSOCKET_CONNECTION_ERROR,
327
- errMsg: event
328
- }));
329
- });
342
+ case ws_event_1.CloseEventCode.NoRealtimeListeners: {
343
+ break;
330
344
  }
331
- };
332
- _this._ws.onclose = function (closeEvent) {
333
- console.warn('[realtime] ws event: close', closeEvent);
334
- _this._logins = new Map();
335
- _this.clearHeartbeat();
336
- switch (closeEvent.code) {
337
- case ws_event_1.CLOSE_EVENT_CODE.ReconnectWebSocket: {
338
- break;
345
+ case ws_event_1.CloseEventCode.HeartbeatPingError:
346
+ case ws_event_1.CloseEventCode.HeartbeatPongTimeoutError:
347
+ case ws_event_1.CloseEventCode.NormalClosure:
348
+ case ws_event_1.CloseEventCode.AbnormalClosure: {
349
+ if (_this.maxReconnect > 0) {
350
+ _this.initWebSocketConnection(true, _this.maxReconnect);
339
351
  }
340
- case ws_event_1.CLOSE_EVENT_CODE.NoRealtimeListeners: {
341
- break;
352
+ else {
353
+ _this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code));
342
354
  }
343
- case ws_event_1.CLOSE_EVENT_CODE.HeartbeatPingError:
344
- case ws_event_1.CLOSE_EVENT_CODE.HeartbeatPongTimeoutError:
345
- case ws_event_1.CLOSE_EVENT_CODE.NormalClosure:
346
- case ws_event_1.CLOSE_EVENT_CODE.AbnormalClosure: {
347
- if (_this._maxReconnect > 0) {
348
- _this.initWebSocketConnection(true, _this._maxReconnect);
349
- }
350
- else {
351
- _this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code));
352
- }
353
- break;
355
+ break;
356
+ }
357
+ case ws_event_1.CloseEventCode.NoAuthentication: {
358
+ _this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code, closeEvent.reason));
359
+ break;
360
+ }
361
+ default: {
362
+ if (_this.maxReconnect > 0) {
363
+ _this.initWebSocketConnection(true, _this.maxReconnect);
354
364
  }
355
- case ws_event_1.CLOSE_EVENT_CODE.NoAuthentication: {
356
- _this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code, closeEvent.reason));
357
- break;
365
+ else {
366
+ _this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code));
358
367
  }
359
- default: {
360
- if (_this._maxReconnect > 0) {
361
- _this.initWebSocketConnection(true, _this._maxReconnect);
362
- }
363
- else {
364
- _this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code));
365
- }
368
+ }
369
+ }
370
+ };
371
+ _this.ws.onmessage = function (res) {
372
+ var rawMsg = res.data;
373
+ _this.heartbeat();
374
+ var msg;
375
+ try {
376
+ msg = JSON.parse(rawMsg);
377
+ }
378
+ catch (e) {
379
+ throw new Error("[realtime] onMessage parse res.data error: " + e);
380
+ }
381
+ if (msg.msgType === 'ERROR') {
382
+ var virtualWatch_1 = null;
383
+ _this.virtualWSClient.forEach(function (item) {
384
+ if (item.watchId === msg.watchId) {
385
+ virtualWatch_1 = item;
366
386
  }
387
+ });
388
+ if (virtualWatch_1) {
389
+ virtualWatch_1.listener.onError(msg);
367
390
  }
368
- };
369
- _this._ws.onmessage = function (res) {
370
- var rawMsg = res.data;
371
- _this.heartbeat();
372
- var msg;
391
+ }
392
+ var responseWaitSpec = _this.wsResponseWait.get(msg.requestId);
393
+ if (responseWaitSpec) {
373
394
  try {
374
- msg = JSON.parse(rawMsg);
395
+ if (msg.msgType === 'ERROR') {
396
+ responseWaitSpec.reject(new error_1.RealtimeErrorMessageError(msg));
397
+ }
398
+ else {
399
+ responseWaitSpec.resolve(msg);
400
+ }
375
401
  }
376
402
  catch (e) {
377
- throw new Error("[realtime] onMessage parse res.data error: " + e);
403
+ console.error('ws onMessage responseWaitSpec.resolve(msg) errored:', e);
378
404
  }
379
- if (msg.msgType === 'ERROR') {
380
- var virtualWatch_1 = null;
381
- _this._virtualWSClient.forEach(function (item) {
382
- if (item.watchId === msg.watchId) {
383
- virtualWatch_1 = item;
384
- }
385
- });
386
- if (virtualWatch_1) {
387
- virtualWatch_1.listener.onError(msg);
388
- }
405
+ finally {
406
+ _this.wsResponseWait.delete(msg.requestId);
389
407
  }
390
- var responseWaitSpec = _this._wsResponseWait.get(msg.requestId);
391
- if (responseWaitSpec) {
392
- try {
393
- if (msg.msgType === 'ERROR') {
394
- responseWaitSpec.reject(new error_1.RealtimeErrorMessageError(msg));
395
- }
396
- else {
397
- responseWaitSpec.resolve(msg);
398
- }
399
- }
400
- catch (e) {
401
- console.error('ws onMessage responseWaitSpec.resolve(msg) errored:', e);
402
- }
403
- finally {
404
- _this._wsResponseWait.delete(msg.requestId);
405
- }
406
- if (responseWaitSpec.skipOnMessage) {
408
+ if (responseWaitSpec.skipOnMessage) {
409
+ return;
410
+ }
411
+ }
412
+ if (msg.msgType === 'PONG') {
413
+ if (_this.lastPingSendTS) {
414
+ var rtt = Date.now() - _this.lastPingSendTS;
415
+ if (rtt > DEFAULT_UNTRUSTED_RTT_THRESHOLD) {
416
+ console.warn("[realtime] untrusted rtt observed: " + rtt);
407
417
  return;
408
418
  }
419
+ if (_this.rttObserved.length >= MAX_RTT_OBSERVED) {
420
+ _this.rttObserved.splice(0, _this.rttObserved.length - MAX_RTT_OBSERVED + 1);
421
+ }
422
+ _this.rttObserved.push(rtt);
409
423
  }
410
- if (msg.msgType === 'PONG') {
411
- if (_this._lastPingSendTS) {
412
- var rtt = Date.now() - _this._lastPingSendTS;
413
- if (rtt > DEFAULT_UNTRUSTED_RTT_THRESHOLD) {
414
- console.warn("[realtime] untrusted rtt observed: " + rtt);
415
- return;
416
- }
417
- if (_this._rttObserved.length >= MAX_RTT_OBSERVED) {
418
- _this._rttObserved.splice(0, _this._rttObserved.length - MAX_RTT_OBSERVED + 1);
424
+ return;
425
+ }
426
+ var client = msg.watchId && _this.watchIdClientMap.get(msg.watchId);
427
+ if (client) {
428
+ client.onMessage(msg);
429
+ }
430
+ else {
431
+ console.error("[realtime] no realtime listener found responsible for watchId " + msg.watchId + ": ", msg);
432
+ switch (msg.msgType) {
433
+ case 'INIT_EVENT':
434
+ case 'NEXT_EVENT':
435
+ case 'CHECK_EVENT': {
436
+ client = _this.queryIdClientMap.get(msg.msgData.queryID);
437
+ if (client) {
438
+ client.onMessage(msg);
419
439
  }
420
- _this._rttObserved.push(rtt);
440
+ break;
421
441
  }
422
- return;
423
- }
424
- var client = msg.watchId && _this._watchIdClientMap.get(msg.watchId);
425
- if (client) {
426
- client.onMessage(msg);
427
- }
428
- else {
429
- console.error("[realtime] no realtime listener found responsible for watchId " + msg.watchId + ": ", msg);
430
- switch (msg.msgType) {
431
- case 'INIT_EVENT':
432
- case 'NEXT_EVENT':
433
- case 'CHECK_EVENT': {
434
- client = _this._queryIdClientMap.get(msg.msgData.queryID);
435
- if (client) {
436
- client.onMessage(msg);
437
- }
442
+ default: {
443
+ for (var _i = 0, _a = Array.from(_this.watchIdClientMap.entries()); _i < _a.length; _i++) {
444
+ var _b = _a[_i], client_1 = _b[1];
445
+ client_1.onMessage(msg);
438
446
  break;
439
447
  }
440
- default: {
441
- for (var _i = 0, _a = Array.from(_this._watchIdClientMap.entries()); _i < _a.length; _i++) {
442
- var _b = _a[_i], client_1 = _b[1];
443
- client_1.onMessage(msg);
444
- break;
445
- }
446
- }
447
448
  }
448
449
  }
449
- };
450
- _this.heartbeat();
451
- });
452
- };
453
- this.isWSConnected = function () {
454
- return Boolean(_this._ws && _this._ws.readyState === WS_READY_STATE.OPEN);
455
- };
450
+ }
451
+ };
452
+ _this.heartbeat();
453
+ }); };
454
+ this.isWSConnected = function () { return Boolean(_this.ws && _this.ws.readyState === WS_READY_STATE.OPEN); };
456
455
  this.onceWSConnected = function () { return __awaiter(_this, void 0, void 0, function () {
457
456
  var _this = this;
458
457
  return __generator(this, function (_a) {
459
458
  if (this.isWSConnected()) {
460
459
  return [2];
461
460
  }
462
- if (this._wsInitPromise) {
463
- return [2, this._wsInitPromise];
461
+ if (this.wsInitPromise !== null && this.wsInitPromise !== undefined) {
462
+ return [2, this.wsInitPromise];
464
463
  }
465
464
  return [2, new Promise(function (resolve, reject) {
466
- _this._wsReadySubsribers.push({
465
+ _this.wsReadySubsribers.push({
467
466
  resolve: resolve,
468
- reject: reject
467
+ reject: reject,
469
468
  });
470
469
  })];
471
470
  });
@@ -478,76 +477,78 @@ var RealtimeWebSocketClient = (function () {
478
477
  case 0:
479
478
  if (!refresh) {
480
479
  if (envId) {
481
- loginInfo_1 = this._logins.get(envId);
480
+ loginInfo_1 = this.logins.get(envId);
482
481
  if (loginInfo_1) {
483
482
  if (loginInfo_1.loggedIn && loginInfo_1.loginResult) {
484
483
  return [2, loginInfo_1.loginResult];
485
484
  }
486
- else if (loginInfo_1.loggingInPromise) {
485
+ if (loginInfo_1.loggingInPromise !== null && loginInfo_1.loggingInPromise !== undefined) {
487
486
  return [2, loginInfo_1.loggingInPromise];
488
487
  }
489
488
  }
490
489
  }
491
490
  else {
492
- emptyEnvLoginInfo = this._logins.get('');
493
- if (emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) {
491
+ emptyEnvLoginInfo = this.logins.get('');
492
+ if ((emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) !== null && (emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) !== undefined) {
494
493
  return [2, emptyEnvLoginInfo.loggingInPromise];
495
494
  }
496
495
  }
497
496
  }
498
- promise = new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
499
- var wsSign, msgData, loginMsg, loginResMsg, e_5;
500
- return __generator(this, function (_a) {
501
- switch (_a.label) {
502
- case 0:
503
- _a.trys.push([0, 3, , 4]);
504
- return [4, this.getWsSign()];
505
- case 1:
506
- wsSign = _a.sent();
507
- msgData = {
508
- envId: wsSign.envId || '',
509
- accessToken: '',
510
- referrer: 'web',
511
- sdkVersion: '',
512
- dataVersion: ''
513
- };
514
- loginMsg = {
515
- watchId: undefined,
516
- requestId: message_1.genRequestId(),
517
- msgType: 'LOGIN',
518
- msgData: msgData,
519
- exMsgData: {
520
- runtime: common_1.getRuntime(),
521
- signStr: wsSign.signStr,
522
- secretVersion: wsSign.secretVersion
497
+ promise = new Promise(function (resolve, reject) {
498
+ (function () { return __awaiter(_this, void 0, void 0, function () {
499
+ var wsSign, msgData, loginMsg, loginResMsg, e_5;
500
+ return __generator(this, function (_a) {
501
+ switch (_a.label) {
502
+ case 0:
503
+ _a.trys.push([0, 3, , 4]);
504
+ return [4, this.getWsSign()];
505
+ case 1:
506
+ wsSign = _a.sent();
507
+ msgData = {
508
+ envId: wsSign.envId || '',
509
+ accessToken: '',
510
+ referrer: 'web',
511
+ sdkVersion: '',
512
+ dataVersion: '',
513
+ };
514
+ loginMsg = {
515
+ watchId: undefined,
516
+ requestId: message_1.genRequestId(),
517
+ msgType: 'LOGIN',
518
+ msgData: msgData,
519
+ exMsgData: {
520
+ runtime: common_1.getRuntime(),
521
+ signStr: wsSign.signStr,
522
+ secretVersion: wsSign.secretVersion,
523
+ },
524
+ };
525
+ return [4, this.send({
526
+ msg: loginMsg,
527
+ waitResponse: true,
528
+ skipOnMessage: true,
529
+ timeout: DEFAULT_LOGIN_TIMEOUT,
530
+ })];
531
+ case 2:
532
+ loginResMsg = _a.sent();
533
+ if (!loginResMsg.msgData.code) {
534
+ resolve({
535
+ envId: wsSign.envId,
536
+ });
523
537
  }
524
- };
525
- return [4, this.send({
526
- msg: loginMsg,
527
- waitResponse: true,
528
- skipOnMessage: true,
529
- timeout: DEFAULT_LOGIN_TIMEOUT
530
- })];
531
- case 2:
532
- loginResMsg = _a.sent();
533
- if (!loginResMsg.msgData.code) {
534
- resolve({
535
- envId: wsSign.envId
536
- });
537
- }
538
- else {
539
- reject(new Error(loginResMsg.msgData.code + " " + loginResMsg.msgData.message));
540
- }
541
- return [3, 4];
542
- case 3:
543
- e_5 = _a.sent();
544
- reject(e_5);
545
- return [3, 4];
546
- case 4: return [2];
547
- }
548
- });
549
- }); });
550
- loginInfo = envId && this._logins.get(envId);
538
+ else {
539
+ reject(new Error(loginResMsg.msgData.code + " " + loginResMsg.msgData.message));
540
+ }
541
+ return [3, 4];
542
+ case 3:
543
+ e_5 = _a.sent();
544
+ reject(e_5);
545
+ return [3, 4];
546
+ case 4: return [2];
547
+ }
548
+ });
549
+ }); })();
550
+ });
551
+ loginInfo = envId && this.logins.get(envId);
551
552
  loginStartTS = Date.now();
552
553
  if (loginInfo) {
553
554
  loginInfo.loggedIn = false;
@@ -558,9 +559,9 @@ var RealtimeWebSocketClient = (function () {
558
559
  loginInfo = {
559
560
  loggedIn: false,
560
561
  loggingInPromise: promise,
561
- loginStartTS: loginStartTS
562
+ loginStartTS: loginStartTS,
562
563
  };
563
- this._logins.set(envId || '', loginInfo);
564
+ this.logins.set(envId || '', loginInfo);
564
565
  }
565
566
  _a.label = 1;
566
567
  case 1:
@@ -568,26 +569,24 @@ var RealtimeWebSocketClient = (function () {
568
569
  return [4, promise];
569
570
  case 2:
570
571
  loginResult = _a.sent();
571
- curLoginInfo = envId && this._logins.get(envId);
572
- if (curLoginInfo &&
573
- curLoginInfo === loginInfo &&
574
- curLoginInfo.loginStartTS === loginStartTS) {
572
+ curLoginInfo = envId && this.logins.get(envId);
573
+ if (curLoginInfo
574
+ && curLoginInfo === loginInfo
575
+ && curLoginInfo.loginStartTS === loginStartTS) {
575
576
  loginInfo.loggedIn = true;
576
577
  loginInfo.loggingInPromise = undefined;
577
578
  loginInfo.loginStartTS = undefined;
578
579
  loginInfo.loginResult = loginResult;
579
580
  return [2, loginResult];
580
581
  }
581
- else if (curLoginInfo) {
582
+ if (curLoginInfo) {
582
583
  if (curLoginInfo.loggedIn && curLoginInfo.loginResult) {
583
584
  return [2, curLoginInfo.loginResult];
584
585
  }
585
- else if (curLoginInfo.loggingInPromise) {
586
+ if (curLoginInfo.loggingInPromise !== null && curLoginInfo.loggingInPromise !== undefined) {
586
587
  return [2, curLoginInfo.loggingInPromise];
587
588
  }
588
- else {
589
- throw new Error('ws unexpected login info');
590
- }
589
+ throw new Error('ws unexpected login info');
591
590
  }
592
591
  else {
593
592
  throw new Error('ws login info reset');
@@ -609,11 +608,11 @@ var RealtimeWebSocketClient = (function () {
609
608
  return __generator(this, function (_b) {
610
609
  switch (_b.label) {
611
610
  case 0:
612
- if (this._wsSign && this._wsSign.expiredTs > Date.now()) {
613
- return [2, this._wsSign];
611
+ if (this.wsSign && this.wsSign.expiredTs > Date.now()) {
612
+ return [2, this.wsSign];
614
613
  }
615
614
  expiredTs = Date.now() + 60000;
616
- return [4, this._context.appConfig.request.send('auth.wsWebSign', { runtime: common_1.getRuntime() })];
615
+ return [4, this.context.appConfig.request.send('auth.wsWebSign', { runtime: common_1.getRuntime() })];
617
616
  case 1:
618
617
  res = _b.sent();
619
618
  if (res.code) {
@@ -626,23 +625,20 @@ var RealtimeWebSocketClient = (function () {
626
625
  wsUrl: wsUrl,
627
626
  secretVersion: secretVersion,
628
627
  envId: envId,
629
- expiredTs: expiredTs
628
+ expiredTs: expiredTs,
630
629
  }];
631
630
  }
632
- else {
633
- throw new Error('[tcb-js-sdk] 获取实时数据推送登录票据失败');
634
- }
635
- return [2];
631
+ throw new Error('[tcb-js-sdk] 获取实时数据推送登录票据失败');
636
632
  }
637
633
  });
638
634
  }); };
639
635
  this.getWaitExpectedTimeoutLength = function () {
640
- if (!_this._rttObserved.length) {
636
+ if (!_this.rttObserved.length) {
641
637
  return DEFAULT_EXPECTED_EVENT_WAIT_TIME;
642
638
  }
643
- return ((_this._rttObserved.reduce(function (acc, cur) { return acc + cur; }) /
644
- _this._rttObserved.length) *
645
- 1.5);
639
+ return ((_this.rttObserved.reduce(function (acc, cur) { return acc + cur; })
640
+ / _this.rttObserved.length)
641
+ * 1.5);
646
642
  };
647
643
  this.ping = function () { return __awaiter(_this, void 0, void 0, function () {
648
644
  var msg;
@@ -653,10 +649,10 @@ var RealtimeWebSocketClient = (function () {
653
649
  watchId: undefined,
654
650
  requestId: message_1.genRequestId(),
655
651
  msgType: 'PING',
656
- msgData: null
652
+ msgData: null,
657
653
  };
658
654
  return [4, this.send({
659
- msg: msg
655
+ msg: msg,
660
656
  })];
661
657
  case 1:
662
658
  _a.sent();
@@ -665,88 +661,89 @@ var RealtimeWebSocketClient = (function () {
665
661
  });
666
662
  }); };
667
663
  this.onWatchStart = function (client, queryID) {
668
- _this._queryIdClientMap.set(queryID, client);
664
+ _this.queryIdClientMap.set(queryID, client);
669
665
  };
670
666
  this.onWatchClose = function (client, queryID) {
671
667
  if (queryID) {
672
- _this._queryIdClientMap.delete(queryID);
668
+ _this.queryIdClientMap.delete(queryID);
673
669
  }
674
- _this._watchIdClientMap.delete(client.watchId);
675
- _this._virtualWSClient.delete(client);
676
- if (!_this._virtualWSClient.size) {
677
- _this.close(ws_event_1.CLOSE_EVENT_CODE.NoRealtimeListeners);
670
+ _this.watchIdClientMap.delete(client.watchId);
671
+ _this.virtualWSClient.delete(client);
672
+ if (!_this.virtualWSClient.size) {
673
+ _this.close(ws_event_1.CloseEventCode.NoRealtimeListeners);
678
674
  }
679
675
  };
680
- this._maxReconnect = options.maxReconnect || DEFAULT_MAX_RECONNECT;
681
- this._reconnectInterval =
682
- options.reconnectInterval || DEFAULT_WS_RECONNECT_INTERVAL;
683
- this._context = options.context;
676
+ this.maxReconnect = options.maxReconnect || DEFAULT_MAX_RECONNECT;
677
+ this.reconnectInterval = options.reconnectInterval || DEFAULT_WS_RECONNECT_INTERVAL;
678
+ this.context = options.context;
684
679
  }
685
680
  RealtimeWebSocketClient.prototype.clearHeartbeat = function () {
686
- this._pingTimeoutId && clearTimeout(this._pingTimeoutId);
687
- this._pongTimeoutId && clearTimeout(this._pongTimeoutId);
681
+ this.pingTimeoutId && clearTimeout(this.pingTimeoutId);
682
+ this.pongTimeoutId && clearTimeout(this.pongTimeoutId);
688
683
  };
689
684
  RealtimeWebSocketClient.prototype.close = function (code) {
690
685
  this.clearHeartbeat();
691
- if (this._ws) {
692
- this._ws.close(code, ws_event_1.CLOSE_EVENT_CODE_INFO[code].name);
693
- this._ws = undefined;
686
+ if (this.ws) {
687
+ this.ws.close(code, ws_event_1.CLOSE_EVENT_CODE_INFO[code].name);
688
+ this.ws = undefined;
694
689
  }
695
690
  };
696
691
  RealtimeWebSocketClient.prototype.watch = function (options) {
697
- if (!this._ws && !this._wsInitPromise) {
692
+ if (!this.ws && (this.wsInitPromise === undefined || this.wsInitPromise === null)) {
698
693
  this.initWebSocketConnection(false);
699
694
  }
700
695
  var virtualClient = new virtual_websocket_client_1.VirtualWebSocketClient(__assign(__assign({}, options), { send: this.send, login: this.webLogin, isWSConnected: this.isWSConnected, onceWSConnected: this.onceWSConnected, getWaitExpectedTimeoutLength: this.getWaitExpectedTimeoutLength, onWatchStart: this.onWatchStart, onWatchClose: this.onWatchClose, debug: true }));
701
- this._virtualWSClient.add(virtualClient);
702
- this._watchIdClientMap.set(virtualClient.watchId, virtualClient);
696
+ this.virtualWSClient.add(virtualClient);
697
+ this.watchIdClientMap.set(virtualClient.watchId, virtualClient);
703
698
  return virtualClient.listener;
704
699
  };
705
700
  RealtimeWebSocketClient.prototype.heartbeat = function (immediate) {
706
701
  var _this = this;
707
702
  this.clearHeartbeat();
708
- this._pingTimeoutId = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
709
- var e_6;
710
- var _this = this;
711
- return __generator(this, function (_a) {
712
- switch (_a.label) {
713
- case 0:
714
- _a.trys.push([0, 2, , 3]);
715
- if (!this._ws || this._ws.readyState !== WS_READY_STATE.OPEN) {
716
- return [2];
717
- }
718
- this._lastPingSendTS = Date.now();
719
- return [4, this.ping()];
720
- case 1:
721
- _a.sent();
722
- this._pingFailed = 0;
723
- this._pongTimeoutId = setTimeout(function () {
724
- console.error('pong timed out');
725
- if (_this._pongMissed < DEFAULT_PONG_MISS_TOLERANCE) {
726
- _this._pongMissed++;
727
- _this.heartbeat(true);
703
+ this.pingTimeoutId = setTimeout(function () {
704
+ (function () { return __awaiter(_this, void 0, void 0, function () {
705
+ var e_6;
706
+ var _this = this;
707
+ return __generator(this, function (_a) {
708
+ switch (_a.label) {
709
+ case 0:
710
+ _a.trys.push([0, 2, , 3]);
711
+ if (!this.ws || this.ws.readyState !== WS_READY_STATE.OPEN) {
712
+ return [2];
713
+ }
714
+ this.lastPingSendTS = Date.now();
715
+ return [4, this.ping()];
716
+ case 1:
717
+ _a.sent();
718
+ this.pingFailed = 0;
719
+ this.pongTimeoutId = setTimeout(function () {
720
+ console.error('pong timed out');
721
+ if (_this.pongMissed < DEFAULT_PONG_MISS_TOLERANCE) {
722
+ _this.pongMissed += 1;
723
+ _this.heartbeat(true);
724
+ }
725
+ else {
726
+ _this.initWebSocketConnection(true);
727
+ }
728
+ }, this.context.appConfig.realtimePongWaitTimeout);
729
+ return [3, 3];
730
+ case 2:
731
+ e_6 = _a.sent();
732
+ if (this.pingFailed < DEFAULT_PING_FAIL_TOLERANCE) {
733
+ this.pingFailed += 1;
734
+ this.heartbeat();
728
735
  }
729
736
  else {
730
- _this.initWebSocketConnection(true);
737
+ this.close(ws_event_1.CloseEventCode.HeartbeatPingError);
731
738
  }
732
- }, this._context.appConfig.realtimePongWaitTimeout);
733
- return [3, 3];
734
- case 2:
735
- e_6 = _a.sent();
736
- if (this._pingFailed < DEFAULT_PING_FAIL_TOLERANCE) {
737
- this._pingFailed++;
738
- this.heartbeat();
739
- }
740
- else {
741
- this.close(ws_event_1.CLOSE_EVENT_CODE.HeartbeatPingError);
742
- }
743
- return [3, 3];
744
- case 3: return [2];
745
- }
746
- });
747
- }); }, immediate ? 0 : this._context.appConfig.realtimePingInterval);
739
+ return [3, 3];
740
+ case 3: return [2];
741
+ }
742
+ });
743
+ }); })();
744
+ }, immediate ? 0 : this.context.appConfig.realtimePingInterval);
748
745
  };
749
746
  return RealtimeWebSocketClient;
750
747
  }());
751
748
  exports.RealtimeWebSocketClient = RealtimeWebSocketClient;
752
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQW1FO0FBQ25FLHFDQUF3QztBQWN4Qyx1Q0FJbUI7QUFFbkIsaUNBQXlGO0FBQ3pGLG1DQUFpRDtBQUNqRCxpQ0FBK0I7QUE0RC9CLElBQU0sY0FBYyxHQUFHO0lBQ3JCLFVBQVUsRUFBRSxDQUFDO0lBQ2IsSUFBSSxFQUFFLENBQUM7SUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNWLE1BQU0sRUFBRSxDQUFDO0NBQ1YsQ0FBQTtBQUVELElBQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO0FBQzFCLElBQU0sZ0NBQWdDLEdBQUcsSUFBSSxDQUFBO0FBQzdDLElBQU0sK0JBQStCLEdBQUcsS0FBSyxDQUFBO0FBQzdDLElBQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFBO0FBQy9CLElBQU0sNkJBQTZCLEdBQUcsS0FBSyxDQUFBO0FBRTNDLElBQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBRWxDO0lBK0JFLGlDQUFZLE9BQW1EO1FBQS9ELGlCQU1DO1FBcENPLHFCQUFnQixHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRXpELHNCQUFpQixHQUF3QyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ2xFLHNCQUFpQixHQUF3QyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBUWxFLGdCQUFXLEdBQUcsQ0FBQyxDQUFBO1FBQ2YsZ0JBQVcsR0FBRyxDQUFDLENBQUE7UUFHZixZQUFPLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFJeEQsdUJBQWtCLEdBQXFCLEVBQUUsQ0FBQTtR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RTtnQ0FDbEQsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO2dDQUNsQixLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBOzZCQUNyQjtpQ0FBTTtnQ0FFTCxLQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUE7NkJBQ25DO3dCQUNILENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBOzs7O3dCQUVuRCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsMkJBQTJCLEVBQUU7NEJBQ2xELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTs0QkFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO3lCQUNqQjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUE7eUJBQ2hEOzs7OzthQUVKLEVBQ0QsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUM3RCxDQUFBO0lBQ0gsQ0FBQztJQStCSCw4QkFBQztBQUFELENBQUMsQUEzM0JELElBMjNCQztBQTMzQlksMERBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmlydHVhbFdlYlNvY2tldENsaWVudCB9IGZyb20gJy4vdmlydHVhbC13ZWJzb2NrZXQtY2xpZW50J1xuaW1wb3J0IHsgZ2VuUmVxdWVzdElkIH0gZnJvbSAnLi9tZXNzYWdlJ1xuaW1wb3J0IHtcbiAgSURhdGFiYXNlU2VydmljZUNvbnRleHQsXG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvZGF0YWJhc2UnXG5pbXBvcnQge1xuICBJV2F0Y2hPcHRpb25zLFxuICBEQlJlYWx0aW1lTGlzdGVuZXIsXG4gIElSZXF1ZXN0TWVzc2FnZSxcbiAgSVJlc3BvbnNlTWVzc2FnZSxcbiAgSVJlcXVlc3RNZXNzYWdlUGluZ01zZyxcbiAgSVJlcXVlc3RNZXNzYWdlTG9naW5Nc2csXG4gIElSZXNwb25zZU1lc3NhZ2VMb2dpblJlc01zZyxcbiAgSVJlcXVlc3RNZXNzYWdlTG9naW5EYXRhXG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvcmVhbHRpbWUnXG5pbXBvcnQge1xuICBDTE9TRV9FVkVOVF9DT0RFLFxuICBDTE9TRV9FVkVOVF9DT0RFX0lORk8sXG4gIGdldFdTQ2xvc2VFcnJvclxufSBmcm9tICcuL3dzLWV2ZW50J1xuXG5pbXBvcnQgeyBFUlJfQ09ERSwgVGltZW91dEVycm9yLCBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yLENsb3VkU0RLRXJyb3IgfSBmcm9tICcuL2Vycm9yJ1xuaW1wb3J0IHsgZ2V0V3NDbGFzcywgZ2V0UnVudGltZSB9IGZyb20gJy4vY29tbW9uJ1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWFsdGltZVdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIG1heFJlY29ubmVjdD86IG51bWJlclxuICByZWNvbm5lY3RJbnRlcnZhbD86IG51bWJlclxuICBjb250ZXh0OiBJRGF0YWJhc2VTZXJ2aWNlQ29udGV4dFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTaWduYXR1cmUge1xuICBlbnZJZDogc3RyaW5nXG4gIHNlY3JldFZlcnNpb246IG51bWJlclxuICBzaWduU3RyOiBzdHJpbmdcbiAgd3NVcmw6IHN0cmluZ1xuICBleHBpcmVUUzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2luSW5mbyB7XG4gIGxvZ2dlZEluOiBib29sZWFuXG4gIGxvZ2dpbmdJblByb21pc2U/OiBQcm9taXNlPElMb2dpblJlc3VsdD5cbiAgbG9naW5TdGFydFRTPzogbnVtYmVyXG4gIGxvZ2luUmVzdWx0PzogSUxvZ2luUmVzdWx0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2luUmVzdWx0IHtcbiAgZW52SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXU1NlbmRPcHRpb25zIHtcbiAgbXNnOiBJUmVxdWVzdE1lc3NhZ2VcbiAgd2FpdFJlc3BvbnNlPzogYm9vbGVhblxuICAvLyB3aGVuIHdhaXRSZXNwb25zZSBpcyBzZXQgdG8gdHJ1ZSwgaWYgc2tpcE9uTWVzc2FnZSBpcyB0cnVlLCBnZW5lcmFsIG9uTWVzc2FnZSBoYW5kbGVyIHdpbGwgYmUgc2tpcHBlZFxuICBza2lwT25NZXNzYWdlPzogYm9vbGVhblxuICB0aW1lb3V0PzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdTV2F0Y2hPcHRpb25zIGV4dGVuZHMgSVdhdGNoT3B0aW9ucyB7XG4gIGVudklkPzogc3RyaW5nXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbiAgcXVlcnk6IHN0cmluZ1xuICBsaW1pdD86IG51bWJlclxuICBvcmRlckJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG5pbnRlcmZhY2UgSVJlc29sdmVSZWplY3Qge1xuICByZXNvbHZlOiAodmFsdWU/OiBhbnkgfCBQcm9taXNlTGlrZTxhbnk+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZFxufVxuXG5pbnRlcmZhY2UgSVJlc3BvbnNlV2FpdFNwZWMgZXh0ZW5kcyBJUmVzb2x2ZVJlamVjdCB7XG4gIHNraXBPbk1lc3NhZ2U/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBJV3NTaWduIHtcbiAgc2lnblN0cjogc3RyaW5nLFxuICB3c1VybDogc3RyaW5nLFxuICBzZWNyZXRWZXJzaW9uOiBzdHJpbmdcbiAgZW52SWQ6IHN0cmluZ1xuICBleHBpcmVkVHM6IG51bWJlclxufVxuXG5jb25zdCBXU19SRUFEWV9TVEFURSA9IHtcbiAgQ09OTkVDVElORzogMCxcbiAgT1BFTjogMSxcbiAgQ0xPU0lORzogMixcbiAgQ0xPU0VEOiAzXG59XG5cbmNvbnN0IE1BWF9SVFRfT0JTRVJWRUQgPSAzXG5jb25zdCBERUZBVUxUX0VYUEVDVEVEX0VWRU5UX1dBSVRfVElNRSA9IDUwMDBcbmNvbnN0IERFRkFVTFRfVU5UUlVTVEVEX1JUVF9USFJFU0hPTEQgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9NQVhfUkVDT05ORUNUID0gNVxuY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfSU5URVJWQUwgPSAxMDAwMFxuLy8gY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfTUFYX1ZBTElEX0lOVEVSVkFMID0gMyAqIDYwICogMTAwMFxuY29uc3QgREVGQVVMVF9QSU5HX0ZBSUxfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9QT05HX01JU1NfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9MT0dJTl9USU1FT1VUID0gNTAwMFxuXG5leHBvcnQgY2xhc3MgUmVhbHRpbWVXZWJTb2NrZXRDbGllbnQge1xuICBwcml2YXRlIF92aXJ0dWFsV1NDbGllbnQ6IFNldDxWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBTZXQoKVxuICAvLyBhZnRlciBsaXN0ZW5lciBpbml0V2F0Y2gsIHRoZSBsaXN0ZW5lciBoYXMgdGhlIHF1ZXJ5SUQgYW5kIGNhbiBzdG9yZSBpdCBoZXJlXG4gIHByaXZhdGUgX3F1ZXJ5SWRDbGllbnRNYXA6IE1hcDxzdHJpbmcsIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgX3dhdGNoSWRDbGllbnRNYXA6IE1hcDxzdHJpbmcsIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgX21heFJlY29ubmVjdDogbnVtYmVyXG4gIC8vIHByaXZhdGUgX2F2YWlsYWJsZVJldHJpZXM6IG51bWJlclxuICBwcml2YXRlIF9yZWNvbm5lY3RJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgX2NvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0XG4gIC8vIHByaXZhdGUgX3dzPzogV1hOUy5Tb2NrZXQuSVNvY2tldFRhc2tcbiAgcHJpdmF0ZSBfd3M/OiBhbnlcbiAgcHJpdmF0ZSBfbGFzdFBpbmdTZW5kVFM/OiBudW1iZXJcbiAgcHJpdmF0ZSBfcGluZ0ZhaWxlZCA9IDBcbiAgcHJpdmF0ZSBfcG9uZ01pc3NlZCA9IDBcbiAgcHJpdmF0ZSBfcGluZ1RpbWVvdXRJZD86IG51bWJlclxuICBwcml2YXRlIF9wb25nVGltZW91dElkPzogbnVtYmVyXG4gIHByaXZhdGUgX2xvZ2luczogTWFwPHN0cmluZyAvKiBlbnZJZCAqLywgSUxvZ2luSW5mbz4gPSBuZXcgTWFwKClcbiAgLy8gcHJpdmF0ZSBfbG9naW5JbmZvOiBJTG9naW5JbmZvXG4gIC8vIHByaXZhdGUgX3NpZ25hdHVyZXM6IE1hcDxzdHJpbmcgLyogZW52SWQgKi8sIElTaWduYXR1cmU+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgX3dzSW5pdFByb21pc2U/OiBQcm9taXNlPHZvaWQ+XG4gIHByaXZhdGUgX3dzUmVhZHlTdWJzcmliZXJzOiBJUmVzb2x2ZVJlamVjdFtdID0gW11cbiAgcHJpdmF0ZSBfd3NSZXNwb25zZVdhaXQ6IE1hcDxcbiAgICBzdHJpbmcgLyogcmVxdWVzdElkICovLFxuICAgIElSZXNwb25zZVdhaXRTcGVjXG4gID4gPSBuZXcgTWFwKClcbiAgcHJpdmF0ZSBfcnR0T2JzZXJ2ZWQ6IG51bWJlcltdID0gW11cbiAgcHJpdmF0ZSBfcmVjb25uZWN0U3RhdGU6IGJvb2xlYW5cbiAgLy8gb2J0YWluZWQgZnJvbSB0aGUgZmlyc3QgZ2V0U2lnbmF0dXJlIHdpdGggbm8gZW52SWQgcHJvdmlkZWRcbiAgLy8gcHJpdmF0ZSBfZGVmYXVsdEVudklkPzogc3RyaW5nXG4gIHByaXZhdGUgX3dzU2lnbjogSVdzU2lnblxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZWFsdGltZVdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHRoaXMuX21heFJlY29ubmVjdCA9IG9wdGlvbnMubWF4UmVjb25uZWN0IHx8IERFRkFVTFRfTUFYX1JFQ09OTkVDVFxuICAgIC8vIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPSB0aGlzLl9tYXhSZWNvbm5lY3RcbiAgICB0aGlzLl9yZWNvbm5lY3RJbnRlcnZhbCA9XG4gICAgICBvcHRpb25zLnJlY29ubmVjdEludGVydmFsIHx8IERFRkFVTFRfV1NfUkVDT05ORUNUX0lOVEVSVkFMXG4gICAgdGhpcy5fY29udGV4dCA9IG9wdGlvbnMuY29udGV4dFxuICB9XG5cbiAgY2xlYXJIZWFydGJlYXQoKSB7XG4gICAgdGhpcy5fcGluZ1RpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGhpcy5fcGluZ1RpbWVvdXRJZClcbiAgICB0aGlzLl9wb25nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLl9wb25nVGltZW91dElkKVxuICB9XG5cbiAgc2VuZCA9IGFzeW5jIDxUID0gYW55PihvcHRzOiBJV1NTZW5kT3B0aW9ucyk6IFByb21pc2U8VD4gPT5cbiAgICBuZXcgUHJvbWlzZTxUPihhc3luYyAoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICAgIGxldCB0aW1lb3V0SWQ6IG51bWJlclxuICAgICAgbGV0IF9oYXNSZXNvbHZlZCA9IGZhbHNlXG4gICAgICBsZXQgX2hhc1JlamVjdGVkID0gZmFsc2VcblxuICAgICAgY29uc3QgcmVzb2x2ZTogdHlwZW9mIF9yZXNvbHZlID0gKFxuICAgICAgICB2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPiB8IHVuZGVmaW5lZFxuICAgICAgKSA9PiB7XG4gICAgICAgIF9oYXNSZXNvbHZlZCA9IHRydWVcbiAgICAgICAgdGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgIF9yZXNvbHZlKHZhbHVlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWplY3Q6IHR5cGVvZiBfcmVqZWN0ID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgX2hhc1JlamVjdGVkID0gdHJ1ZVxuICAgICAgICB0aW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgX3JlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMudGltZW91dCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghX2hhc1Jlc29sdmVkIHx8ICFfaGFzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIHdhaXQgYW5vdGhlciBpbW1lZGlhdGUgdGltZW91dCB0byBhbGxvdyB0aGUgc3VjY2Vzcy9mYWlsIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgaWYgd3MgaGFzIGFscmVhZHkgZ290IHRoZSByZXN1bHQsXG4gICAgICAgICAgICAvLyB0aGlzIGlzIGJlY2F1c2UgdGhlIHRpbWVyIGlzIHJlZ2lzdGVyZWQgYmVmb3JlIHdzLnNlbmRcbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKDApXG4gICAgICAgICAgICBpZiAoIV9oYXNSZXNvbHZlZCB8fCAhX2hhc1JlamVjdGVkKSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKCd3c2NsaWVudC5zZW5kIHRpbWVkb3V0JykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBvcHRzLnRpbWVvdXQpXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGlmICh0aGlzLl9jb250ZXh0LmRlYnVnKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIHdzIHNlbmQgKCR7bmV3IERhdGUoKX0pOiBgLCBvcHRzKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW3JlYWx0aW1lXSB3cyBzZW5kICR7XG4gICAgICAgIC8vICAgICBvcHRzLm1zZy5tc2dUeXBlXG4gICAgICAgIC8vICAgfSAoJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCl9KTogYCxcbiAgICAgICAgLy8gICBvcHRzXG4gICAgICAgIC8vIClcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmICh0aGlzLl93c0luaXRQcm9taXNlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd3NJbml0UHJvbWlzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xuICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ2ludmFsaWQgc3RhdGU6IHdzIGNvbm5lY3Rpb24gbm90IGV4aXN0cywgY2FuIG5vdCBzZW5kIG1lc3NhZ2UnXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3dzLnJlYWR5U3RhdGUgIT09IFdTX1JFQURZX1NUQVRFLk9QRU4pIHtcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB3cyByZWFkeVN0YXRlIGludmFsaWQ6ICR7dGhpcy5fd3MucmVhZHlTdGF0ZX0sIGNhbiBub3Qgc2VuZCBtZXNzYWdlYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgIHRoaXMuX3dzUmVzcG9uc2VXYWl0LnNldChvcHRzLm1zZy5yZXF1ZXN0SWQsIHtcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBza2lwT25NZXNzYWdlOiBvcHRzLnNraXBPbk1lc3NhZ2VcbiAgICAgICAgICB9IGFzIElSZXNwb25zZVdhaXRTcGVjKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3NlbmQgbXNnOicsIG9wdHMubXNnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dzLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpKVxuICAgICAgICAgIGlmICghb3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUob3B0cy5tc2cucmVxdWVzdElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzLl93cy5zZW5kKEpTT04uc3RyaW5naWZ5KG9wdHMubXNnKSwgZXJyID0+IHtcbiAgICAgICAgLy8gICBpZiAoZXJyKSB7XG4gICAgICAgIC8vICAgICByZWplY3QoZXJyKVxuICAgICAgICAvLyAgICAgaWYgKG9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgIC8vICAgICAgIHRoaXMuX3dzUmVzcG9uc2VXYWl0LmRlbGV0ZShvcHRzLm1zZy5yZXF1ZXN0SWQpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICByZXR1cm5cbiAgICAgICAgLy8gICB9XG5cbiAgICAgICAgLy8gICBpZiAoIW9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgIC8vICAgICByZXNvbHZlKClcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH0pXG5cbiAgICAgICAgLy8gdGhpcy5fd3Muc2VuZCh7XG4gICAgICAgIC8vICAgZGF0YTogSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpLFxuICAgICAgICAvLyAgIHN1Y2Nlc3M6IHJlcyA9PiB7XG4gICAgICAgIC8vICAgICBpZiAoIW9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgIC8vICAgICAgIHJlc29sdmUocmVzKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH0sXG4gICAgICAgIC8vICAgZmFpbDogZSA9PiB7XG4gICAgICAgIC8vICAgICByZWplY3QoZSlcbiAgICAgICAgLy8gICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAvLyAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUob3B0cy5tc2cucmVxdWVzdElkKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpXG4gICAgICB9XG4gICAgfSlcblxuICBjbG9zZShjb2RlOiBDTE9TRV9FVkVOVF9DT0RFKSB7XG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdCgpXG5cbiAgICBpZiAodGhpcy5fd3MpIHtcbiAgICAgIHRoaXMuX3dzLmNsb3NlKGNvZGUsIENMT1NFX0VWRU5UX0NPREVfSU5GT1tjb2RlXS5uYW1lKVxuICAgICAgdGhpcy5fd3MgPSB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICBjbG9zZUFsbENsaWVudHMgPSAoZXJyb3I6IGFueSkgPT4ge1xuICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKGNsaWVudCA9PiB7XG4gICAgICBjbGllbnQuY2xvc2VXaXRoRXJyb3IoZXJyb3IpXG4gICAgfSlcbiAgfVxuXG4gIHBhdXNlQ2xpZW50cyA9IChjbGllbnRzPzogU2V0PFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+KSA9PiB7XG4gICAgOyhjbGllbnRzIHx8IHRoaXMuX3ZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaChjbGllbnQgPT4ge1xuICAgICAgY2xpZW50LnBhdXNlKClcbiAgICB9KVxuICB9XG5cbiAgcmVzdW1lQ2xpZW50cyA9IChjbGllbnRzPzogU2V0PFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+KSA9PiB7XG4gICAgOyhjbGllbnRzIHx8IHRoaXMuX3ZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaChjbGllbnQgPT4ge1xuICAgICAgY2xpZW50LnJlc3VtZSgpXG4gICAgfSlcbiAgfVxuXG4gIHdhdGNoKG9wdGlvbnM6IElXU1dhdGNoT3B0aW9ucyk6IERCUmVhbHRpbWVMaXN0ZW5lciB7XG4gICAgaWYgKCF0aGlzLl93cyAmJiAhdGhpcy5fd3NJbml0UHJvbWlzZSkge1xuICAgICAgdGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbihmYWxzZSlcbiAgICB9XG5cbiAgICBjb25zdCB2aXJ0dWFsQ2xpZW50ID0gbmV3IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNlbmQ6IHRoaXMuc2VuZCxcbiAgICAgIGxvZ2luOiB0aGlzLndlYkxvZ2luLFxuICAgICAgaXNXU0Nvbm5lY3RlZDogdGhpcy5pc1dTQ29ubmVjdGVkLFxuICAgICAgb25jZVdTQ29ubmVjdGVkOiB0aGlzLm9uY2VXU0Nvbm5lY3RlZCxcbiAgICAgIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGg6IHRoaXMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCxcbiAgICAgIG9uV2F0Y2hTdGFydDogdGhpcy5vbldhdGNoU3RhcnQsXG4gICAgICBvbldhdGNoQ2xvc2U6IHRoaXMub25XYXRjaENsb3NlLFxuICAgICAgZGVidWc6IHRydWVcbiAgICB9KVxuICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5hZGQodmlydHVhbENsaWVudClcbiAgICB0aGlzLl93YXRjaElkQ2xpZW50TWFwLnNldCh2aXJ0dWFsQ2xpZW50LndhdGNoSWQsIHZpcnR1YWxDbGllbnQpXG4gICAgcmV0dXJuIHZpcnR1YWxDbGllbnQubGlzdGVuZXJcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgcmVjb25uZWN0OiBib29sZWFuLFxuICAgIGF2YWlsYWJsZVJldHJpZXM6IG51bWJlciA9IHRoaXMuX21heFJlY29ubmVjdFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyDlvZPliY3lpITkuo7mraPlnKjph43ov57kuK3nmoTnirbmgIFcbiAgICBpZiAocmVjb25uZWN0ICYmIHRoaXMuX3JlY29ubmVjdFN0YXRlKSB7XG4gICAgICByZXR1cm4gLy8g5b+955WlXG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgdGhpcy5fcmVjb25uZWN0U3RhdGUgPSB0cnVlIC8vIOmHjei/nueKtuaAgeW8gOWni1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93c0luaXRQcm9taXNlKSB7XG4gICAgICAvLyB0aGVyZSBhbHJlYWR5IGV4aXN0cyBhIHdlYnNvY2tldCBpbml0aWF0aW9uLCBqdXN0IHdhaXQgZm9yIGl0XG4gICAgICByZXR1cm4gdGhpcy5fd3NJbml0UHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgYFtyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gcmVjb25uZWN0ICR7cmVjb25uZWN0fSBhdmFpbGFibGVSZXRyaWVzICR7YXZhaWxhYmxlUmV0cmllc31gXG4gICAgLy8gKVxuICAgIC8vIH1cblxuICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMucGF1c2VDbGllbnRzKClcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlKENMT1NFX0VWRU5UX0NPREUuUmVjb25uZWN0V2ViU29ja2V0KVxuXG4gICAgdGhpcy5fd3NJbml0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBzdGFydCB0aHJvd0Vycm9ySWZOZXR3b3JrT2ZmbGluZSdcbiAgICAgICAgLy8gKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8g5pqC5LiN5qOA5p+l572R57uc5oCBXG4gICAgICAgIC8vIGF3YWl0IHRocm93RXJyb3JJZk5ldHdvcmtPZmZsaW5lKClcblxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gc3RhcnQgZ2V0U2lnbmF0dXJlJylcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuZ2V0U2lnbmF0dXJlKClcbiAgICAgICAgY29uc3Qgd3NTaWduID0gYXdhaXQgdGhpcy5nZXRXc1NpZ24oKVxuXG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBnZXRTaWduYXR1cmUgc3VjY2VzcycpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHN0YXJ0IGNvbm5lY3RTb2NrZXQnKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2Uoc3VjY2VzcyA9PiB7XG4gICAgICAgICAgLy8gdGhpcy5fd3MgPSBnZXRTREsodGhpcy5fY29udGV4dC5pZGVudGlmaWVycylcbiAgICAgICAgICAvLyAgIC5fc29ja2V0U2tpcENoZWNrRG9tYWluRmFjdG9yeSgpXG4gICAgICAgICAgLy8gICAuY29ubmVjdFNvY2tldCh7XG4gICAgICAgICAgLy8gICAgIHVybDogc2lnbmF0dXJlLndzVXJsLFxuICAgICAgICAgIC8vICAgICBoZWFkZXI6IHtcbiAgICAgICAgICAvLyAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgIC8vICAgICBzdWNjZXNzOiAoKSA9PiBzdWNjZXNzKCksXG4gICAgICAgICAgLy8gICAgIGZhaWxcbiAgICAgICAgICAvLyAgIH0pXG5cbiAgICAgICAgICBjb25zdCB1cmwgPSB3c1NpZ24ud3NVcmwgfHwgJ3dzczovL3RjYi13cy50ZW5jZW50Y2xvdWRhcGkuY29tJztcbiAgICAgICAgICBjb25zdCB3c0NsYXNzID0gZ2V0V3NDbGFzcygpO1xuICAgICAgICAgIHRoaXMuX3dzID0gd3NDbGFzcyA/IG5ldyB3c0NsYXNzKHVybCkgOiBuZXcgV2ViU29ja2V0KHVybClcbiAgICAgICAgICBzdWNjZXNzKClcbiAgICAgICAgfSlcblxuICAgICAgICBpZih0aGlzLl93cy5jb25uZWN0KXtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93cy5jb25uZWN0KClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0U29ja2V0IHN1Y2Nlc3NmdWxseSBmaXJlZCdcbiAgICAgICAgLy8gKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0V2ViU29ja2V0RXZlbnQoKVxuICAgICAgICByZXNvbHZlKClcblxuICAgICAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICAgICAgdGhpcy5yZXN1bWVDbGllbnRzKClcbiAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RTdGF0ZSA9IGZhbHNlIC8vIOmHjei/nueKtuaAgee7k+adn1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIGNvbm5lY3QgZmFpbCcsIGUpXG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAoYXZhaWxhYmxlUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiwgaW4gY2FzZSBvZiBuZXR3b3JrIG9mZmxpbmUsIHdlIGRvbid0IG5lZWQgdG8gc3R1YmJvcm5seSBzbGVlcCBmb3Igc29tZXRpbWUsXG4gICAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXR3b3JrIHRvIGJlIGJhY2sgb25saW5lLCB0aGlzIGVuc3VyZXMgbWluaW11bSBkb3dudGltZVxuICAgICAgICAgIC8vIGNvbnN0IHsgaXNDb25uZWN0ZWQgfSA9IGF3YWl0IGdldE5ldHdvcmtTdGF0dXMoKVxuICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdHJ1ZVxuXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiB3YWl0aW5nIGZvciBuZXR3b3JrIG9ubGluZSdcbiAgICAgICAgICAvLyApXG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgLy8gYXV0byB3YWl0IHVudGlsIG5ldHdvcmsgb25saW5lLCBjYXVzZScgaXQgd291bGQgYmUgbWVhbmluZ2xlc3MgdG8gcmVjb25uZWN0IHdoaWxlIG5ldHdvcmsgaXMgb2ZmbGluZVxuXG4gICAgICAgICAgLy8gYXdhaXQgb25jZU5ldHdvcmtPbmxpbmUoKVxuXG4gICAgICAgICAgLy8gQ09NUEFUSUJJTElUWTogd2FpdCBmb3IgaWRlIHN0YXRlIHVwZGF0ZVxuICAgICAgICAgIC8vIGlmIChpc0RldlRvb2xzKCkpIHtcbiAgICAgICAgICAvLyAgIGF3YWl0IHNsZWVwKDApXG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gbmV0d29yayBvbmxpbmUnKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIHRoaXMuX3dzSW5pdFByb21pc2UgPSB1bmRlZmluZWRcblxuICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gc2xlZXAgJHt0aGlzLl9yZWNvbm5lY3RJbnRlcnZhbH1tc2BcbiAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKHRoaXMuX3JlY29ubmVjdEludGVydmFsKVxuICAgICAgICAgICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RTdGF0ZSA9IGZhbHNlIC8vIOmHjei/nuW8guW4uOS5n+eul+mHjei/nueKtuaAgee7k+adn1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUodGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbihyZWNvbm5lY3QsIGF2YWlsYWJsZVJldHJpZXMgLSAxKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZSlcblxuICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKFxuICAgICAgICAgICAgICBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1JFQ09OTkVDVF9XQVRDSF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gbGV0IHN1Y2Nlc3MgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dzSW5pdFByb21pc2VcbiAgICAgIC8vIHN1Y2Nlc3MgPSB0cnVlXG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlc29sdmUgfSkgPT4gcmVzb2x2ZSgpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3dzUmVhZHlTdWJzcmliZXJzLmZvckVhY2goKHsgcmVqZWN0IH0pID0+IHJlamVjdCgpKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl93c0luaXRQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycyA9IFtdXG4gICAgfVxuXG4gICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBgW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiAke3N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbCd9YFxuICAgIC8vIClcbiAgICAvLyB9XG4gIH1cblxuICBwcml2YXRlIGluaXRXZWJTb2NrZXRFdmVudCA9ICgpID0+XG4gICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl93cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgaW5pdFdlYlNvY2tldEV2ZW50LCB3cyBub3QgZXhpc3RzJylcbiAgICAgIH1cblxuICAgICAgbGV0IHdzT3BlbmVkID0gZmFsc2VcblxuICAgICAgdGhpcy5fd3Mub25vcGVuID0gZXZlbnQgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbk9wZW4oKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lXSB3cyBldmVudDogb3BlbicsIGV2ZW50KVxuICAgICAgICB3c09wZW5lZCA9IHRydWVcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3dzLm9uZXJyb3IgPSBldmVudCA9PiB7XG4gICAgICAgIC8vIHRoaXMuX3dzLm9uKFwiZXJyb3JcIiwgZXJyb3IgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbkVycm9yKGVycm9yID0+IHtcbiAgICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuX2xvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICAgIC8vIGVycm9y5YaZ6L+bZmlsZVxuXG4gICAgICAgIGlmICghd3NPcGVuZWQpIHtcbiAgICAgICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSB3cyBvcGVuIGZhaWxlZCB3aXRoIHdzIGV2ZW50OiBlcnJvcicsIGV2ZW50KVxuICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgIC8vICAgYCR7XG4gICAgICAgICAgLy8gICAgIHRoaXMuc3BlY2lhbE51bWJlclxuICAgICAgICAgIC8vICAgfSBbcmVhbHRpbWVdIHdzIG9wZW4gZmFpbGVkIHdpdGggd3MgZXZlbnQ6IGVycm9yICR7ZXJyb3J9IFxcbmBcbiAgICAgICAgICAvLyApXG5cbiAgICAgICAgICByZWplY3QoZXZlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZV0gd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpXG5cbiAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAvLyAgIGAke3RoaXMuc3BlY2lhbE51bWJlcn0gW3JlYWx0aW1lXSB3cyBldmVudDogZXJyb3IgJHtlcnJvcn0gXFxuYFxuICAgICAgICAgIC8vIClcblxuICAgICAgICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgICAgICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKGNsaWVudCA9PlxuICAgICAgICAgICAgY2xpZW50LmNsb3NlV2l0aEVycm9yKFxuICAgICAgICAgICAgICBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1dFQlNPQ0tFVF9DT05ORUNUSU9OX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGV2ZW50XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IHJlY29ubmVjdFxuICAgICAgdGhpcy5fd3Mub25jbG9zZSA9IGNsb3NlRXZlbnQgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbihcImNsb3NlXCIsIChjbG9zZUV2ZW50LCBjbG9zZXJlYXNvbikgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbkNsb3NlKGNsb3NlRXZlbnQgPT4ge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWVdIHdzIGV2ZW50OiBjbG9zZScsIGNsb3NlRXZlbnQpXG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgLy8gICBcIndzY2xvc2UudHh0XCIsXG4gICAgICAgIC8vICAgYCR7XG4gICAgICAgIC8vICAgICB0aGlzLnNwZWNpYWxOdW1iZXJcbiAgICAgICAgLy8gICB9IFtyZWFsdGltZV0gd3MgZXZlbnQ6IGNsb3NlICR7Y2xvc2VFdmVudH0gJHtjbG9zZXJlYXNvbn0gXFxuYFxuICAgICAgICAvLyApXG5cbiAgICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuX2xvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgICAgICBzd2l0Y2ggKGNsb3NlRXZlbnQuY29kZSkge1xuICAgICAgICAgIGNhc2UgQ0xPU0VfRVZFTlRfQ09ERS5SZWNvbm5lY3RXZWJTb2NrZXQ6IHtcbiAgICAgICAgICAgIC8vIGp1c3QgaWdub3JlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuTm9SZWFsdGltZUxpc3RlbmVyczoge1xuICAgICAgICAgICAgLy8gcXVpdFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLkhlYXJ0YmVhdFBpbmdFcnJvcjpcbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuSGVhcnRiZWF0UG9uZ1RpbWVvdXRFcnJvcjpcbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuTm9ybWFsQ2xvc3VyZTpcbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuQWJub3JtYWxDbG9zdXJlOiB7XG4gICAgICAgICAgICAvLyBOb3JtYWwgQ2xvc3VyZSBhbmQgQWJub3JtYWwgQ2xvc3VyZTpcbiAgICAgICAgICAgIC8vICAgZXhwZWN0ZWQgY2xvc3VyZSwgbW9zdCBsaWtlbHkgZGlzcGF0Y2hlZCBieSB3ZWNoYXQgY2xpZW50LFxuICAgICAgICAgICAgLy8gICBzaW5jZSB0aGlzIGlzIHRoZSBzdGF0dXMgY29kZSBkaXNwYXRjaGVkIGluIGNhc2Ugb2YgbmV0d29yayBmYWlsdXJlLFxuICAgICAgICAgICAgLy8gICB3ZSBzaG91bGQgcmV0cnlcblxuICAgICAgICAgICAgaWYgKHRoaXMuX21heFJlY29ubmVjdCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSwgdGhpcy5fbWF4UmVjb25uZWN0KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuTm9BdXRoZW50aWNhdGlvbjoge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoXG4gICAgICAgICAgICAgIGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUsIGNsb3NlRXZlbnQucmVhc29uKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHJldHJ5IGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXhSZWNvbm5lY3QgPiAwKSB7XG4gICAgICAgICAgICAgIC8vIGlmICh0aGlzLl9hdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUsIHRoaXMuX21heFJlY29ubmVjdClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGBbcmVhbHRpbWVdIHVucmVjb2duaXplIHdzIGNsb3NlIGV2ZW50YCwgY2xvc2VFdmVudClcbiAgICAgICAgICAgIC8vIHRoaXMuY2xvc2VBbGxDbGllbnRzKGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUpKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl93cy5vbm1lc3NhZ2UgPSByZXMgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbihcIm1lc3NhZ2VcIiwgcmVzID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub25NZXNzYWdlKHJlcyA9PiB7XG4gICAgICAgIC8vIGNvbnN0IHJhd01zZyA9IHJlcy5kYXRhXG4gICAgICAgIGNvbnN0IHJhd01zZyA9IHJlcy5kYXRhXG5cbiAgICAgICAgLy8gcmVzZXQgJiByZXN0YXJ0IGhlYXJ0YmVhdFxuICAgICAgICB0aGlzLmhlYXJ0YmVhdCgpXG5cbiAgICAgICAgbGV0IG1zZzogSVJlc3BvbnNlTWVzc2FnZVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbXNnID0gSlNPTi5wYXJzZShyYXdNc2cgYXMgc3RyaW5nKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbcmVhbHRpbWVdIG9uTWVzc2FnZSBwYXJzZSByZXMuZGF0YSBlcnJvcjogJHtlfWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW3JlYWx0aW1lXSBvbk1lc3NhZ2UgJHtcbiAgICAgICAgLy8gICAgIG1zZy5tc2dUeXBlXG4gICAgICAgIC8vICAgfSAoJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCl9KWAsXG4gICAgICAgIC8vICAgbXNnXG4gICAgICAgIC8vIClcblxuICAgICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgICAvLyDmib7liLDlvZPliY3nm5HlkKzvvIzlubblsIZlcnJvcui/lOWbnlxuICAgICAgICAgIGxldCB2aXJ0dWFsV2F0Y2ggPSBudWxsXG4gICAgICAgICAgdGhpcy5fdmlydHVhbFdTQ2xpZW50LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS53YXRjaElkID09PSBtc2cud2F0Y2hJZCkge1xuICAgICAgICAgICAgICB2aXJ0dWFsV2F0Y2ggPSBpdGVtXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICh2aXJ0dWFsV2F0Y2gpIHtcbiAgICAgICAgICAgIHZpcnR1YWxXYXRjaC5saXN0ZW5lci5vbkVycm9yKG1zZylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZVdhaXRTcGVjID0gdGhpcy5fd3NSZXNwb25zZVdhaXQuZ2V0KG1zZy5yZXF1ZXN0SWQpXG4gICAgICAgIGlmIChyZXNwb25zZVdhaXRTcGVjKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ0VSUk9SJykge1xuICAgICAgICAgICAgICByZXNwb25zZVdhaXRTcGVjLnJlamVjdChuZXcgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcihtc2cpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZXNvbHZlKG1zZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAnd3Mgb25NZXNzYWdlIHJlc3BvbnNlV2FpdFNwZWMucmVzb2x2ZShtc2cpIGVycm9yZWQ6JyxcbiAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUobXNnLnJlcXVlc3RJZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3BvbnNlV2FpdFNwZWMuc2tpcE9uTWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1zZy5tc2dUeXBlID09PSAnUE9ORycpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdFBpbmdTZW5kVFMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ0dCA9IERhdGUubm93KCkgLSB0aGlzLl9sYXN0UGluZ1NlbmRUU1xuICAgICAgICAgICAgaWYgKHJ0dCA+IERFRkFVTFRfVU5UUlVTVEVEX1JUVF9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtyZWFsdGltZV0gdW50cnVzdGVkIHJ0dCBvYnNlcnZlZDogJHtydHR9YClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fcnR0T2JzZXJ2ZWQubGVuZ3RoID49IE1BWF9SVFRfT0JTRVJWRUQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcnR0T2JzZXJ2ZWQuc3BsaWNlKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdGhpcy5fcnR0T2JzZXJ2ZWQubGVuZ3RoIC0gTUFYX1JUVF9PQlNFUlZFRCArIDFcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcnR0T2JzZXJ2ZWQucHVzaChydHQpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNsaWVudCA9IG1zZy53YXRjaElkICYmIHRoaXMuX3dhdGNoSWRDbGllbnRNYXAuZ2V0KG1zZy53YXRjaElkKVxuICAgICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgICAgY2xpZW50Lm9uTWVzc2FnZShtc2cpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVE9ETywgdGhpcyBpcyBhIHRlbXBvcmFyeSBmaXggZG9uZSBmb3Igc2VydmVyXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbcmVhbHRpbWVdIG5vIHJlYWx0aW1lIGxpc3RlbmVyIGZvdW5kIHJlc3BvbnNpYmxlIGZvciB3YXRjaElkICR7bXNnLndhdGNoSWR9OiBgLFxuICAgICAgICAgICAgbXNnXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgICBzd2l0Y2ggKG1zZy5tc2dUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdJTklUX0VWRU5UJzpcbiAgICAgICAgICAgIGNhc2UgJ05FWFRfRVZFTlQnOlxuICAgICAgICAgICAgY2FzZSAnQ0hFQ0tfRVZFTlQnOiB7XG4gICAgICAgICAgICAgIGNsaWVudCA9IHRoaXMuX3F1ZXJ5SWRDbGllbnRNYXAuZ2V0KG1zZy5tc2dEYXRhLnF1ZXJ5SUQpXG4gICAgICAgICAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFssY2xpZW50XSBvZiBBcnJheS5mcm9tKHRoaXMuX3dhdGNoSWRDbGllbnRNYXAuZW50cmllcygpKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd3YXRjaGlkKioqKionLCB3YXRjaElkKVxuICAgICAgICAgICAgICAgIGNsaWVudC5vbk1lc3NhZ2UobXNnKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oZWFydGJlYXQoKVxuICAgIH0pXG5cbiAgcHJpdmF0ZSBpc1dTQ29ubmVjdGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX3dzICYmIHRoaXMuX3dzLnJlYWR5U3RhdGUgPT09IFdTX1JFQURZX1NUQVRFLk9QRU4pXG4gIH1cblxuICBwcml2YXRlIG9uY2VXU0Nvbm5lY3RlZCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5pc1dTQ29ubmVjdGVkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl93c0luaXRQcm9taXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3NJbml0UHJvbWlzZVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5wdXNoKHtcbiAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgcmVqZWN0XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHdlYkxvZ2luID0gYXN5bmMgKFxuICAgIGVudklkPzogc3RyaW5nLFxuICAgIHJlZnJlc2g/OiBib29sZWFuXG4gICk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgaWYgKCFyZWZyZXNoKSB7XG4gICAgICAvLyBsZXQgbG9naW5JbmZvID0gdGhpcy5fbG9naW5JbmZvXG4gICAgICBpZiAoZW52SWQpIHtcbiAgICAgICAgY29uc3QgbG9naW5JbmZvID0gdGhpcy5fbG9naW5zLmdldChlbnZJZClcbiAgICAgICAgaWYgKGxvZ2luSW5mbykge1xuICAgICAgICAgIGlmIChsb2dpbkluZm8ubG9nZ2VkSW4gJiYgbG9naW5JbmZvLmxvZ2luUmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGxvZ2luOiBhbHJlYWR5IGxvZ2dlZCBpbicpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gbG9naW5JbmZvLmxvZ2luUmVzdWx0XG4gICAgICAgICAgfSBlbHNlIGlmIChsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbXB0eUVudkxvZ2luSW5mbyA9IHRoaXMuX2xvZ2lucy5nZXQoJycpXG4gICAgICAgIGlmIChlbXB0eUVudkxvZ2luSW5mbz8ubG9nZ2luZ0luUHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiBlbXB0eUVudkxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gbG9naW46IGxvZ2dpbmcgaW4nKVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPElMb2dpblJlc3VsdD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdGhpcy5nZXRTaWduYXR1cmUoZW52SWQsIHJlZnJlc2gpXG5cbiAgICAgICAgY29uc3Qgd3NTaWduID0gYXdhaXQgdGhpcy5nZXRXc1NpZ24oKVxuXG4gICAgICAgIC8vIGNvbnN0IHd4VmVyc2lvbiA9IGdldFdYVmVyc2lvbigpXG4gICAgICAgIGNvbnN0IG1zZ0RhdGE6IElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSA9IHtcbiAgICAgICAgICBlbnZJZDogd3NTaWduLmVudklkIHx8ICcnLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuOiAnJywgLy8g5bey5bqf5byD5a2X5q61XG4gICAgICAgICAgLy8gc2lnblN0cjogc2lnbmF0dXJlLnNpZ25TdHIsXG4gICAgICAgICAgLy8gc2VjcmV0VmVyc2lvbjogc2lnbmF0dXJlLnNlY3JldFZlcnNpb24sXG4gICAgICAgICAgcmVmZXJyZXI6ICd3ZWInLFxuICAgICAgICAgIHNka1ZlcnNpb246ICcnLFxuICAgICAgICAgIGRhdGFWZXJzaW9uOiAnJ1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvZ2luTXNnOiBJUmVxdWVzdE1lc3NhZ2VMb2dpbk1zZyA9IHtcbiAgICAgICAgICB3YXRjaElkOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgICBtc2dUeXBlOiAnTE9HSU4nLFxuICAgICAgICAgIG1zZ0RhdGEsXG4gICAgICAgICAgZXhNc2dEYXRhOiB7XG4gICAgICAgICAgICBydW50aW1lOiBnZXRSdW50aW1lKCksXG4gICAgICAgICAgICBzaWduU3RyOiB3c1NpZ24uc2lnblN0cixcbiAgICAgICAgICAgIHNlY3JldFZlcnNpb246IHdzU2lnbi5zZWNyZXRWZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvZ2luUmVzTXNnID0gYXdhaXQgdGhpcy5zZW5kPElSZXNwb25zZU1lc3NhZ2VMb2dpblJlc01zZz4oe1xuICAgICAgICAgIG1zZzogbG9naW5Nc2csXG4gICAgICAgICAgd2FpdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgdGltZW91dDogREVGQVVMVF9MT0dJTl9USU1FT1VUXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFsb2dpblJlc01zZy5tc2dEYXRhLmNvZGUpIHtcbiAgICAgICAgICAvLyBsb2dpbiBzdWNjZXNzXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBlbnZJZDogd3NTaWduLmVudklkXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBsb2dpbiBmYWlsZWRcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2xvZ2luUmVzTXNnLm1zZ0RhdGEuY29kZX0gJHtsb2dpblJlc01zZy5tc2dEYXRhLm1lc3NhZ2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gbGV0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2luSW5mb1xuICAgIGxldCBsb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLl9sb2dpbnMuZ2V0KGVudklkKVxuXG4gICAgY29uc3QgbG9naW5TdGFydFRTID0gRGF0ZS5ub3coKVxuXG4gICAgaWYgKGxvZ2luSW5mbykge1xuICAgICAgbG9naW5JbmZvLmxvZ2dlZEluID0gZmFsc2VcbiAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gcHJvbWlzZVxuICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IGxvZ2luU3RhcnRUU1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dpbkluZm8gPSB7XG4gICAgICAgIGxvZ2dlZEluOiBmYWxzZSxcbiAgICAgICAgbG9nZ2luZ0luUHJvbWlzZTogcHJvbWlzZSxcbiAgICAgICAgbG9naW5TdGFydFRTXG4gICAgICB9XG4gICAgICAvLyB0aGlzLl9sb2dpbkluZm8gPSBsb2dpbkluZm9cbiAgICAgIHRoaXMuX2xvZ2lucy5zZXQoZW52SWQgfHwgJycsIGxvZ2luSW5mbylcbiAgICB9XG5cbiAgICAvLyB0cnkge1xuICAgIC8vICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBwcm9taXNlXG4gICAgLy8gICBsb2dpbkluZm8ubG9nZ2VkSW4gPSB0cnVlXG4gICAgLy8gICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gbG9naW5SZXN1bHRcbiAgICAvLyAgIHJldHVybiBsb2dpblJlc3VsdFxuICAgIC8vIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgLy8gICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gdW5kZWZpbmVkXG4gICAgLy8gICB0aHJvdyBlXG4gICAgLy8gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgcHJvbWlzZVxuICAgICAgY29uc3QgY3VyTG9naW5JbmZvID0gZW52SWQgJiYgdGhpcy5fbG9naW5zLmdldChlbnZJZClcbiAgICAgIGlmIChcbiAgICAgICAgY3VyTG9naW5JbmZvICYmXG4gICAgICAgIGN1ckxvZ2luSW5mbyA9PT0gbG9naW5JbmZvICYmXG4gICAgICAgIGN1ckxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPT09IGxvZ2luU3RhcnRUU1xuICAgICAgKSB7XG4gICAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IHRydWVcbiAgICAgICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgICAgICBsb2dpbkluZm8ubG9naW5SZXN1bHQgPSBsb2dpblJlc3VsdFxuICAgICAgICByZXR1cm4gbG9naW5SZXN1bHRcbiAgICAgIH0gZWxzZSBpZiAoY3VyTG9naW5JbmZvKSB7XG4gICAgICAgIGlmIChjdXJMb2dpbkluZm8ubG9nZ2VkSW4gJiYgY3VyTG9naW5JbmZvLmxvZ2luUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGN1ckxvZ2luSW5mby5sb2dpblJlc3VsdFxuICAgICAgICB9IGVsc2UgaWYgKGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlKSB7XG4gICAgICAgICAgcmV0dXJuIGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cyB1bmV4cGVjdGVkIGxvZ2luIGluZm8nKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIGxvZ2luIGluZm8gcmVzZXQnKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gdW5kZWZpbmVkXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXc1NpZ24gPSBhc3luYyAoKTogUHJvbWlzZTxJV3NTaWduPiA9PiB7XG4gICAgaWYgKHRoaXMuX3dzU2lnbiAmJiB0aGlzLl93c1NpZ24uZXhwaXJlZFRzID4gRGF0ZS5ub3coKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dzU2lnblxuICAgIH1cbiAgICBjb25zdCBleHBpcmVkVHMgPSBEYXRlLm5vdygpICsgNjAwMDBcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9jb250ZXh0LmFwcENvbmZpZy5yZXF1ZXN0LnNlbmQoJ2F1dGgud3NXZWJTaWduJywge3J1bnRpbWU6IGdldFJ1bnRpbWUoKX0pXG5cbiAgICBpZiAocmVzLmNvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW3RjYi1qcy1zZGtdIOiOt+WPluWunuaXtuaVsOaNruaOqOmAgeeZu+W9leelqOaNruWksei0pTogJHtyZXMuY29kZX1gKVxuICAgIH1cblxuICAgIGlmIChyZXMuZGF0YSkge1xuICAgICAgY29uc3Qge3NpZ25TdHIsIHdzVXJsLCBzZWNyZXRWZXJzaW9uLCBlbnZJZH0gPSByZXMuZGF0YVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2lnblN0cixcbiAgICAgICAgd3NVcmwsXG4gICAgICAgIHNlY3JldFZlcnNpb24sXG4gICAgICAgIGVudklkLFxuICAgICAgICBleHBpcmVkVHNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbdGNiLWpzLXNka10g6I635Y+W5a6e5pe25pWw5o2u5o6o6YCB55m75b2V56Wo5o2u5aSx6LSlJylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGggPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLl9ydHRPYnNlcnZlZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBERUZBVUxUX0VYUEVDVEVEX0VWRU5UX1dBSVRfVElNRVxuICAgIH1cblxuICAgIC8vIDEuNSAqIFJUVFxuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5fcnR0T2JzZXJ2ZWQucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICsgY3VyKSAvXG4gICAgICAgIHRoaXMuX3J0dE9ic2VydmVkLmxlbmd0aCkgKlxuICAgICAgMS41XG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBoZWFydGJlYXQoaW1tZWRpYXRlPzogYm9vbGVhbikge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLl9waW5nVGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIXRoaXMuX3dzIHx8IHRoaXMuX3dzLnJlYWR5U3RhdGUgIT09IFdTX1JFQURZX1NUQVRFLk9QRU4pIHtcbiAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcGluZ1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fbGFzdFBpbmdTZW5kVFMgPSBEYXRlLm5vdygpXG4gICAgICAgICAgYXdhaXQgdGhpcy5waW5nKClcbiAgICAgICAgICB0aGlzLl9waW5nRmFpbGVkID0gMFxuXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHRoaXMuX3BvbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3BvbmcgdGltZWQgb3V0JylcbiAgICAgICAgICAgIGlmICh0aGlzLl9wb25nTWlzc2VkIDwgREVGQVVMVF9QT05HX01JU1NfVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BvbmdNaXNzZWQrK1xuICAgICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdCh0cnVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gbG9naWNhbCBwZXJjZWl2ZWQgY29ubmVjdGlvbiBsb3N0LCBldmVuIHRob3VnaCB3ZWJzb2NrZXQgZGlkIG5vdCByZWNlaXZlIGVycm9yIG9yIGNsb3NlIGV2ZW50XG4gICAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aGlzLl9jb250ZXh0LmFwcENvbmZpZy5yZWFsdGltZVBvbmdXYWl0VGltZW91dClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmICh0aGlzLl9waW5nRmFpbGVkIDwgREVGQVVMVF9QSU5HX0ZBSUxfVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICB0aGlzLl9waW5nRmFpbGVkKytcbiAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZShDTE9TRV9FVkVOVF9DT0RFLkhlYXJ0YmVhdFBpbmdFcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBpbW1lZGlhdGUgPyAwIDogdGhpcy5fY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQaW5nSW50ZXJ2YWxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHBpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbXNnOiBJUmVxdWVzdE1lc3NhZ2VQaW5nTXNnID0ge1xuICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgIG1zZ1R5cGU6ICdQSU5HJyxcbiAgICAgIG1zZ0RhdGE6IG51bGxcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgIG1zZ1xuICAgIH0pXG4gICAgLy8gY29uc29sZS5sb2coJ3Bpbmcgc2VudCcpXG4gIH1cblxuICBwcml2YXRlIG9uV2F0Y2hTdGFydCA9IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4ge1xuICAgIHRoaXMuX3F1ZXJ5SWRDbGllbnRNYXAuc2V0KHF1ZXJ5SUQsIGNsaWVudClcbiAgfVxuXG4gIHByaXZhdGUgb25XYXRjaENsb3NlID0gKGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCwgcXVlcnlJRDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHF1ZXJ5SUQpIHtcbiAgICAgIHRoaXMuX3F1ZXJ5SWRDbGllbnRNYXAuZGVsZXRlKHF1ZXJ5SUQpXG4gICAgfVxuICAgIHRoaXMuX3dhdGNoSWRDbGllbnRNYXAuZGVsZXRlKGNsaWVudC53YXRjaElkKVxuICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5kZWxldGUoY2xpZW50KVxuXG4gICAgaWYgKCF0aGlzLl92aXJ0dWFsV1NDbGllbnQuc2l6ZSkge1xuICAgICAgLy8gbm8gbW9yZSBleGlzdGluZyB3YXRjaCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICAgICB0aGlzLmNsb3NlKENMT1NFX0VWRU5UX0NPREUuTm9SZWFsdGltZUxpc3RlbmVycylcbiAgICB9XG4gIH1cbn1cbiJdfQ==
749
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQW1FO0FBQ25FLHFDQUF3QztBQWN4Qyx1Q0FJbUI7QUFFbkIsaUNBQTBGO0FBQzFGLG1DQUFpRDtBQUNqRCxpQ0FBK0I7QUE0RC9CLElBQU0sY0FBYyxHQUFHO0lBQ3JCLFVBQVUsRUFBRSxDQUFDO0lBQ2IsSUFBSSxFQUFFLENBQUM7SUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNWLE1BQU0sRUFBRSxDQUFDO0NBQ1YsQ0FBQTtBQUVELElBQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO0FBQzFCLElBQU0sZ0NBQWdDLEdBQUcsSUFBSSxDQUFBO0FBQzdDLElBQU0sK0JBQStCLEdBQUcsS0FBSyxDQUFBO0FBQzdDLElBQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFBO0FBQy9CLElBQU0sNkJBQTZCLEdBQUcsS0FBSyxDQUFBO0FBRTNDLElBQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBRWxDO0lBK0JFLGlDQUFZLE9BQW1EO1FBQS9ELGlCQUtDO1FBbkNPLG9CQUFlLEdBQWdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFFeEQscUJBQWdCLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFDakUscUJBQWdCLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFRakUsZUFBVSxHQUFHLENBQUMsQ0FBQTtRQUNkLGVBQVUsR0FBRyxDQUFDLENBQUE7UUFHZCxXQUFNLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFJdkQsc0JBQWlCLEdBQXFCLEVBQUUsQ0FBQTtRQUN4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QVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FDNUQsQ0FBQTtJQUNILENBQUM7SUE4QkgsOEJBQUM7QUFBRCxDQUFDLEFBNXFCRCxJQTRxQkM7QUE1cUJZLDBEQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQgfSBmcm9tICcuL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudCdcbmltcG9ydCB7IGdlblJlcXVlc3RJZCB9IGZyb20gJy4vbWVzc2FnZSdcbmltcG9ydCB7XG4gIElEYXRhYmFzZVNlcnZpY2VDb250ZXh0LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2RhdGFiYXNlJ1xuaW1wb3J0IHtcbiAgSVdhdGNoT3B0aW9ucyxcbiAgREJSZWFsdGltZUxpc3RlbmVyLFxuICBJUmVxdWVzdE1lc3NhZ2UsXG4gIElSZXNwb25zZU1lc3NhZ2UsXG4gIElSZXF1ZXN0TWVzc2FnZVBpbmdNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZWFsdGltZSdcbmltcG9ydCB7XG4gIENsb3NlRXZlbnRDb2RlLFxuICBDTE9TRV9FVkVOVF9DT0RFX0lORk8sXG4gIGdldFdTQ2xvc2VFcnJvcixcbn0gZnJvbSAnLi93cy1ldmVudCdcblxuaW1wb3J0IHsgRVJSX0NPREUsIFRpbWVvdXRFcnJvciwgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvciwgQ2xvdWRTREtFcnJvciB9IGZyb20gJy4vZXJyb3InXG5pbXBvcnQgeyBnZXRXc0NsYXNzLCBnZXRSdW50aW1lIH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlYWx0aW1lV2ViU29ja2V0Q2xpZW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgbWF4UmVjb25uZWN0PzogbnVtYmVyXG4gIHJlY29ubmVjdEludGVydmFsPzogbnVtYmVyXG4gIGNvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNpZ25hdHVyZSB7XG4gIGVudklkOiBzdHJpbmdcbiAgc2VjcmV0VmVyc2lvbjogbnVtYmVyXG4gIHNpZ25TdHI6IHN0cmluZ1xuICB3c1VybDogc3RyaW5nXG4gIGV4cGlyZVRTOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTG9naW5JbmZvIHtcbiAgbG9nZ2VkSW46IGJvb2xlYW5cbiAgbG9nZ2luZ0luUHJvbWlzZT86IFByb21pc2U8SUxvZ2luUmVzdWx0PlxuICBsb2dpblN0YXJ0VFM/OiBudW1iZXJcbiAgbG9naW5SZXN1bHQ/OiBJTG9naW5SZXN1bHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTG9naW5SZXN1bHQge1xuICBlbnZJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdTU2VuZE9wdGlvbnMge1xuICBtc2c6IElSZXF1ZXN0TWVzc2FnZVxuICB3YWl0UmVzcG9uc2U/OiBib29sZWFuXG4gIC8vIHdoZW4gd2FpdFJlc3BvbnNlIGlzIHNldCB0byB0cnVlLCBpZiBza2lwT25NZXNzYWdlIGlzIHRydWUsIGdlbmVyYWwgb25NZXNzYWdlIGhhbmRsZXIgd2lsbCBiZSBza2lwcGVkXG4gIHNraXBPbk1lc3NhZ2U/OiBib29sZWFuXG4gIHRpbWVvdXQ/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV1NXYXRjaE9wdGlvbnMgZXh0ZW5kcyBJV2F0Y2hPcHRpb25zIHtcbiAgZW52SWQ/OiBzdHJpbmdcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZ1xuICBxdWVyeTogc3RyaW5nXG4gIGxpbWl0PzogbnVtYmVyXG4gIG9yZGVyQnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmludGVyZmFjZSBJUmVzb2x2ZVJlamVjdCB7XG4gIHJlc29sdmU6ICh2YWx1ZT86IGFueSB8IFByb21pc2VMaWtlPGFueT4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBJUmVzcG9uc2VXYWl0U3BlYyBleHRlbmRzIElSZXNvbHZlUmVqZWN0IHtcbiAgc2tpcE9uTWVzc2FnZT86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElXc1NpZ24ge1xuICBzaWduU3RyOiBzdHJpbmcsXG4gIHdzVXJsOiBzdHJpbmcsXG4gIHNlY3JldFZlcnNpb246IHN0cmluZ1xuICBlbnZJZDogc3RyaW5nXG4gIGV4cGlyZWRUczogbnVtYmVyXG59XG5cbmNvbnN0IFdTX1JFQURZX1NUQVRFID0ge1xuICBDT05ORUNUSU5HOiAwLFxuICBPUEVOOiAxLFxuICBDTE9TSU5HOiAyLFxuICBDTE9TRUQ6IDMsXG59XG5cbmNvbnN0IE1BWF9SVFRfT0JTRVJWRUQgPSAzXG5jb25zdCBERUZBVUxUX0VYUEVDVEVEX0VWRU5UX1dBSVRfVElNRSA9IDUwMDBcbmNvbnN0IERFRkFVTFRfVU5UUlVTVEVEX1JUVF9USFJFU0hPTEQgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9NQVhfUkVDT05ORUNUID0gNVxuY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfSU5URVJWQUwgPSAxMDAwMFxuLy8gY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfTUFYX1ZBTElEX0lOVEVSVkFMID0gMyAqIDYwICogMTAwMFxuY29uc3QgREVGQVVMVF9QSU5HX0ZBSUxfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9QT05HX01JU1NfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9MT0dJTl9USU1FT1VUID0gNTAwMFxuXG5leHBvcnQgY2xhc3MgUmVhbHRpbWVXZWJTb2NrZXRDbGllbnQge1xuICBwcml2YXRlIHZpcnR1YWxXU0NsaWVudDogU2V0PFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IFNldCgpXG4gIC8vIGFmdGVyIGxpc3RlbmVyIGluaXRXYXRjaCwgdGhlIGxpc3RlbmVyIGhhcyB0aGUgcXVlcnlJRCBhbmQgY2FuIHN0b3JlIGl0IGhlcmVcbiAgcHJpdmF0ZSBxdWVyeUlkQ2xpZW50TWFwOiBNYXA8c3RyaW5nLCBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIHdhdGNoSWRDbGllbnRNYXA6IE1hcDxzdHJpbmcsIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgbWF4UmVjb25uZWN0OiBudW1iZXJcbiAgLy8gcHJpdmF0ZSBfYXZhaWxhYmxlUmV0cmllczogbnVtYmVyXG4gIHByaXZhdGUgcmVjb25uZWN0SW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIGNvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0XG4gIC8vIHByaXZhdGUgX3dzPzogV1hOUy5Tb2NrZXQuSVNvY2tldFRhc2tcbiAgcHJpdmF0ZSB3cz86IGFueVxuICBwcml2YXRlIGxhc3RQaW5nU2VuZFRTPzogbnVtYmVyXG4gIHByaXZhdGUgcGluZ0ZhaWxlZCA9IDBcbiAgcHJpdmF0ZSBwb25nTWlzc2VkID0gMFxuICBwcml2YXRlIHBpbmdUaW1lb3V0SWQ/OiBudW1iZXJcbiAgcHJpdmF0ZSBwb25nVGltZW91dElkPzogbnVtYmVyXG4gIHByaXZhdGUgbG9naW5zOiBNYXA8c3RyaW5nIC8qIGVudklkICovLCBJTG9naW5JbmZvPiA9IG5ldyBNYXAoKVxuICAvLyBwcml2YXRlIF9sb2dpbkluZm86IElMb2dpbkluZm9cbiAgLy8gcHJpdmF0ZSBfc2lnbmF0dXJlczogTWFwPHN0cmluZyAvKiBlbnZJZCAqLywgSVNpZ25hdHVyZT4gPSBuZXcgTWFwKClcbiAgcHJpdmF0ZSB3c0luaXRQcm9taXNlPzogUHJvbWlzZTx2b2lkPlxuICBwcml2YXRlIHdzUmVhZHlTdWJzcmliZXJzOiBJUmVzb2x2ZVJlamVjdFtdID0gW11cbiAgcHJpdmF0ZSB3c1Jlc3BvbnNlV2FpdDogTWFwPFxuICBzdHJpbmcgLyogcmVxdWVzdElkICovLFxuICBJUmVzcG9uc2VXYWl0U3BlY1xuICA+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgcnR0T2JzZXJ2ZWQ6IG51bWJlcltdID0gW11cbiAgcHJpdmF0ZSByZWNvbm5lY3RTdGF0ZTogYm9vbGVhblxuICAvLyBvYnRhaW5lZCBmcm9tIHRoZSBmaXJzdCBnZXRTaWduYXR1cmUgd2l0aCBubyBlbnZJZCBwcm92aWRlZFxuICAvLyBwcml2YXRlIF9kZWZhdWx0RW52SWQ/OiBzdHJpbmdcbiAgcHJpdmF0ZSB3c1NpZ246IElXc1NpZ25cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLm1heFJlY29ubmVjdCA9IG9wdGlvbnMubWF4UmVjb25uZWN0IHx8IERFRkFVTFRfTUFYX1JFQ09OTkVDVFxuICAgIC8vIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPSB0aGlzLl9tYXhSZWNvbm5lY3RcbiAgICB0aGlzLnJlY29ubmVjdEludGVydmFsID0gb3B0aW9ucy5yZWNvbm5lY3RJbnRlcnZhbCB8fCBERUZBVUxUX1dTX1JFQ09OTkVDVF9JTlRFUlZBTFxuICAgIHRoaXMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dFxuICB9XG5cbiAgY2xlYXJIZWFydGJlYXQoKSB7XG4gICAgdGhpcy5waW5nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLnBpbmdUaW1lb3V0SWQpXG4gICAgdGhpcy5wb25nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLnBvbmdUaW1lb3V0SWQpXG4gIH1cblxuICBzZW5kID0gYXN5bmMgPFQgPSBhbnk+KG9wdHM6IElXU1NlbmRPcHRpb25zKTogUHJvbWlzZTxUPiA9PiBuZXcgUHJvbWlzZTxUPigoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdGltZW91dElkOiBudW1iZXJcbiAgICAgIGxldCBoYXNSZXNvbHZlZCA9IGZhbHNlXG4gICAgICBsZXQgaGFzUmVqZWN0ZWQgPSBmYWxzZVxuXG4gICAgICBjb25zdCByZXNvbHZlOiB0eXBlb2YgX3Jlc29sdmUgPSAodmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaGFzUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIHRpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICBfcmVzb2x2ZSh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVqZWN0OiB0eXBlb2YgX3JlamVjdCA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGhhc1JlamVjdGVkID0gdHJ1ZVxuICAgICAgICB0aW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgX3JlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMudGltZW91dCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWhhc1Jlc29sdmVkIHx8ICFoYXNSZWplY3RlZCkge1xuICAgICAgICAgICAgICAvLyB3YWl0IGFub3RoZXIgaW1tZWRpYXRlIHRpbWVvdXQgdG8gYWxsb3cgdGhlIHN1Y2Nlc3MvZmFpbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIGlmIHdzIGhhcyBhbHJlYWR5IGdvdCB0aGUgcmVzdWx0LFxuICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJlY2F1c2UgdGhlIHRpbWVyIGlzIHJlZ2lzdGVyZWQgYmVmb3JlIHdzLnNlbmRcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoMClcbiAgICAgICAgICAgICAgaWYgKCFoYXNSZXNvbHZlZCB8fCAhaGFzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcignd3NjbGllbnQuc2VuZCB0aW1lZG91dCcpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKVxuICAgICAgICB9LCBvcHRzLnRpbWVvdXQpXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCB8fCB0aGlzLndzSW5pdFByb21pc2UgIT09IG51bGwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndzSW5pdFByb21pc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy53cykge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGU6IHdzIGNvbm5lY3Rpb24gbm90IGV4aXN0cywgY2FuIG5vdCBzZW5kIG1lc3NhZ2UnKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLndzLnJlYWR5U3RhdGUgIT09IFdTX1JFQURZX1NUQVRFLk9QRU4pIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGB3cyByZWFkeVN0YXRlIGludmFsaWQ6ICR7dGhpcy53cy5yZWFkeVN0YXRlfSwgY2FuIG5vdCBzZW5kIG1lc3NhZ2VgKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IHJlc3BXYWl0U3BlYzogSVJlc3BvbnNlV2FpdFNwZWMgPSB7XG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgc2tpcE9uTWVzc2FnZTogb3B0cy5za2lwT25NZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLndzUmVzcG9uc2VXYWl0LnNldChvcHRzLm1zZy5yZXF1ZXN0SWQsIHJlc3BXYWl0U3BlYylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZW5kIG1zZzonLCBvcHRzLm1zZylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndzLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpKVxuICAgICAgICAgIGlmICghb3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJlc29sdmUodm9pZCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLndzUmVzcG9uc2VXYWl0LmRlbGV0ZShvcHRzLm1zZy5yZXF1ZXN0SWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKVxuICAgICAgfVxuICAgIH0pKClcbiAgfSlcblxuICBjbG9zZShjb2RlOiBDbG9zZUV2ZW50Q29kZSkge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoY29kZSwgQ0xPU0VfRVZFTlRfQ09ERV9JTkZPW2NvZGVdLm5hbWUpXG4gICAgICB0aGlzLndzID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgY2xvc2VBbGxDbGllbnRzID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICB0aGlzLnZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC5jbG9zZVdpdGhFcnJvcihlcnJvcilcbiAgICB9KVxuICB9XG5cbiAgcGF1c2VDbGllbnRzID0gKGNsaWVudHM/OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4pID0+IHtcbiAgICAoY2xpZW50cyB8fCB0aGlzLnZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaCgoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQucGF1c2UoKVxuICAgIH0pXG4gIH1cblxuICByZXN1bWVDbGllbnRzID0gKGNsaWVudHM/OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4pID0+IHtcbiAgICAoY2xpZW50cyB8fCB0aGlzLnZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaCgoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQucmVzdW1lKClcbiAgICB9KVxuICB9XG5cbiAgd2F0Y2gob3B0aW9uczogSVdTV2F0Y2hPcHRpb25zKTogREJSZWFsdGltZUxpc3RlbmVyIHtcbiAgICBpZiAoIXRoaXMud3MgJiYgKHRoaXMud3NJbml0UHJvbWlzZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMud3NJbml0UHJvbWlzZSA9PT0gbnVsbCkpIHtcbiAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24oZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdmlydHVhbENsaWVudCA9IG5ldyBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50KHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzZW5kOiB0aGlzLnNlbmQsXG4gICAgICBsb2dpbjogdGhpcy53ZWJMb2dpbixcbiAgICAgIGlzV1NDb25uZWN0ZWQ6IHRoaXMuaXNXU0Nvbm5lY3RlZCxcbiAgICAgIG9uY2VXU0Nvbm5lY3RlZDogdGhpcy5vbmNlV1NDb25uZWN0ZWQsXG4gICAgICBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiB0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgsXG4gICAgICBvbldhdGNoU3RhcnQ6IHRoaXMub25XYXRjaFN0YXJ0LFxuICAgICAgb25XYXRjaENsb3NlOiB0aGlzLm9uV2F0Y2hDbG9zZSxcbiAgICAgIGRlYnVnOiB0cnVlLFxuICAgIH0pXG4gICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuYWRkKHZpcnR1YWxDbGllbnQpXG4gICAgdGhpcy53YXRjaElkQ2xpZW50TWFwLnNldCh2aXJ0dWFsQ2xpZW50LndhdGNoSWQsIHZpcnR1YWxDbGllbnQpXG4gICAgcmV0dXJuIHZpcnR1YWxDbGllbnQubGlzdGVuZXJcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgcmVjb25uZWN0OiBib29sZWFuLFxuICAgIGF2YWlsYWJsZVJldHJpZXM6IG51bWJlciA9IHRoaXMubWF4UmVjb25uZWN0XG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIOW9k+WJjeWkhOS6juato+WcqOmHjei/nuS4reeahOeKtuaAgVxuICAgIGlmIChyZWNvbm5lY3QgJiYgdGhpcy5yZWNvbm5lY3RTdGF0ZSkge1xuICAgICAgcmV0dXJuIC8vIOW/veeVpVxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMucmVjb25uZWN0U3RhdGUgPSB0cnVlIC8vIOmHjei/nueKtuaAgeW8gOWni1xuICAgIH1cblxuICAgIGlmICh0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndzSW5pdFByb21pc2UgIT09IG51bGwpIHtcbiAgICAgIC8vIHRoZXJlIGFscmVhZHkgZXhpc3RzIGEgd2Vic29ja2V0IGluaXRpYXRpb24sIGp1c3Qgd2FpdCBmb3IgaXRcbiAgICAgIHJldHVybiB0aGlzLndzSW5pdFByb21pc2VcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICB0aGlzLnBhdXNlQ2xpZW50cygpXG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZShDbG9zZUV2ZW50Q29kZS5SZWNvbm5lY3RXZWJTb2NrZXQpXG5cbiAgICB0aGlzLndzSW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChzdWNjZXNzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB3c1NpZ24ud3NVcmwgfHwgJ3dzczovL3RjYi13cy50ZW5jZW50Y2xvdWRhcGkuY29tJ1xuICAgICAgICAgICAgY29uc3Qgd3NDbGFzcyA9IGdldFdzQ2xhc3MoKVxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICB0aGlzLndzID0gd3NDbGFzcyA/IG5ldyB3c0NsYXNzKHVybCkgOiBuZXcgV2ViU29ja2V0KHVybClcbiAgICAgICAgICAgIHN1Y2Nlc3Modm9pZCAwKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAodGhpcy53cy5jb25uZWN0KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndzLmNvbm5lY3QoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdFdlYlNvY2tldEV2ZW50KClcbiAgICAgICAgICByZXNvbHZlKClcblxuICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lQ2xpZW50cygpXG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdFN0YXRlID0gZmFsc2UgLy8g6YeN6L+e54q25oCB57uT5p2fXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0IGZhaWwnLCBlKVxuXG4gICAgICAgICAgaWYgKGF2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiwgaW4gY2FzZSBvZiBuZXR3b3JrIG9mZmxpbmUsIHdlIGRvbid0IG5lZWQgdG8gc3R1YmJvcm5seSBzbGVlcCBmb3Igc29tZXRpbWUsXG4gICAgICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5ldHdvcmsgdG8gYmUgYmFjayBvbmxpbmUsIHRoaXMgZW5zdXJlcyBtaW5pbXVtIGRvd250aW1lXG4gICAgICAgICAgICAvLyBjb25zdCB7IGlzQ29ubmVjdGVkIH0gPSBhd2FpdCBnZXROZXR3b3JrU3RhdHVzKClcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdHJ1ZVxuXG4gICAgICAgICAgICB0aGlzLndzSW5pdFByb21pc2UgPSB1bmRlZmluZWRcblxuICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHNsZWVwKHRoaXMucmVjb25uZWN0SW50ZXJ2YWwpXG4gICAgICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFN0YXRlID0gZmFsc2UgLy8g6YeN6L+e5byC5bi45Lmf566X6YeN6L+e54q25oCB57uT5p2fXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHJlY29ubmVjdCwgYXZhaWxhYmxlUmV0cmllcyAtIDEpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZSlcblxuICAgICAgICAgICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1JFQ09OTkVDVF9XQVRDSF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGUsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53c0luaXRQcm9taXNlXG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzLmZvckVhY2goKHsgcmVzb2x2ZSB9KSA9PiByZXNvbHZlKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy53c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlamVjdCB9KSA9PiByZWplY3QoKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy53c0luaXRQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzID0gW11cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRXZWJTb2NrZXRFdmVudCA9ICgpID0+IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoIXRoaXMud3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCBpbml0V2ViU29ja2V0RXZlbnQsIHdzIG5vdCBleGlzdHMnKVxuICAgIH1cblxuICAgIGxldCB3c09wZW5lZCA9IGZhbHNlXG5cbiAgICB0aGlzLndzLm9ub3BlbiA9IChldmVudCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWVdIHdzIGV2ZW50OiBvcGVuJywgZXZlbnQpXG4gICAgICB3c09wZW5lZCA9IHRydWVcbiAgICAgIHJlc29sdmUoKVxuICAgIH1cblxuICAgIHRoaXMud3Mub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICB0aGlzLmxvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICAvLyBlcnJvcuWGmei/m2ZpbGVcblxuICAgICAgaWYgKCF3c09wZW5lZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWVdIHdzIG9wZW4gZmFpbGVkIHdpdGggd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpXG4gICAgICAgIHJlamVjdChldmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZV0gd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpXG5cbiAgICAgICAgdGhpcy5jbGVhckhlYXJ0YmVhdCgpXG4gICAgICAgIHRoaXMudmlydHVhbFdTQ2xpZW50LmZvckVhY2goY2xpZW50ID0+IGNsaWVudC5jbG9zZVdpdGhFcnJvcihuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1dFQlNPQ0tFVF9DT05ORUNUSU9OX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICBlcnJNc2c6IGV2ZW50LFxuICAgICAgICB9KSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVjb25uZWN0XG4gICAgdGhpcy53cy5vbmNsb3NlID0gKGNsb3NlRXZlbnQpID0+IHtcbiAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lXSB3cyBldmVudDogY2xvc2UnLCBjbG9zZUV2ZW50KVxuICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICB0aGlzLmxvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAgIHN3aXRjaCAoY2xvc2VFdmVudC5jb2RlKSB7XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuUmVjb25uZWN0V2ViU29ja2V0OiB7XG4gICAgICAgICAgLy8ganVzdCBpZ25vcmVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuTm9SZWFsdGltZUxpc3RlbmVyczoge1xuICAgICAgICAgIC8vIHF1aXRcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuSGVhcnRiZWF0UGluZ0Vycm9yOlxuICAgICAgICBjYXNlIENsb3NlRXZlbnRDb2RlLkhlYXJ0YmVhdFBvbmdUaW1lb3V0RXJyb3I6XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuTm9ybWFsQ2xvc3VyZTpcbiAgICAgICAgY2FzZSBDbG9zZUV2ZW50Q29kZS5BYm5vcm1hbENsb3N1cmU6IHtcbiAgICAgICAgICAvLyBOb3JtYWwgQ2xvc3VyZSBhbmQgQWJub3JtYWwgQ2xvc3VyZTpcbiAgICAgICAgICAvLyAgIGV4cGVjdGVkIGNsb3N1cmUsIG1vc3QgbGlrZWx5IGRpc3BhdGNoZWQgYnkgd2VjaGF0IGNsaWVudCxcbiAgICAgICAgICAvLyAgIHNpbmNlIHRoaXMgaXMgdGhlIHN0YXR1cyBjb2RlIGRpc3BhdGNoZWQgaW4gY2FzZSBvZiBuZXR3b3JrIGZhaWx1cmUsXG4gICAgICAgICAgLy8gICB3ZSBzaG91bGQgcmV0cnlcblxuICAgICAgICAgIGlmICh0aGlzLm1heFJlY29ubmVjdCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLl9hdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbih0cnVlLCB0aGlzLm1heFJlY29ubmVjdClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDbG9zZUV2ZW50Q29kZS5Ob0F1dGhlbnRpY2F0aW9uOiB7XG4gICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSwgY2xvc2VFdmVudC5yZWFzb24pKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIHdlIHNob3VsZCByZXRyeSBieSBkZWZhdWx0XG4gICAgICAgICAgaWYgKHRoaXMubWF4UmVjb25uZWN0ID4gMCkge1xuICAgICAgICAgICAgLy8gaWYgKHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUsIHRoaXMubWF4UmVjb25uZWN0KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChyZXMpID0+IHtcbiAgICAgIGNvbnN0IHJhd01zZyA9IHJlcy5kYXRhXG5cbiAgICAgIC8vIHJlc2V0ICYgcmVzdGFydCBoZWFydGJlYXRcbiAgICAgIHRoaXMuaGVhcnRiZWF0KClcblxuICAgICAgbGV0IG1zZzogSVJlc3BvbnNlTWVzc2FnZVxuXG4gICAgICB0cnkge1xuICAgICAgICBtc2cgPSBKU09OLnBhcnNlKHJhd01zZyBhcyBzdHJpbmcpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW3JlYWx0aW1lXSBvbk1lc3NhZ2UgcGFyc2UgcmVzLmRhdGEgZXJyb3I6ICR7ZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgLy8g5om+5Yiw5b2T5YmN55uR5ZCs77yM5bm25bCGZXJyb3Lov5Tlm55cbiAgICAgICAgbGV0IHZpcnR1YWxXYXRjaCA9IG51bGxcbiAgICAgICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLndhdGNoSWQgPT09IG1zZy53YXRjaElkKSB7XG4gICAgICAgICAgICB2aXJ0dWFsV2F0Y2ggPSBpdGVtXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh2aXJ0dWFsV2F0Y2gpIHtcbiAgICAgICAgICB2aXJ0dWFsV2F0Y2gubGlzdGVuZXIub25FcnJvcihtc2cpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2VXYWl0U3BlYyA9IHRoaXMud3NSZXNwb25zZVdhaXQuZ2V0KG1zZy5yZXF1ZXN0SWQpXG4gICAgICBpZiAocmVzcG9uc2VXYWl0U3BlYykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ0VSUk9SJykge1xuICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZWplY3QobmV3IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IobXNnKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZXNvbHZlKG1zZylcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgJ3dzIG9uTWVzc2FnZSByZXNwb25zZVdhaXRTcGVjLnJlc29sdmUobXNnKSBlcnJvcmVkOicsXG4gICAgICAgICAgICBlXG4gICAgICAgICAgKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMud3NSZXNwb25zZVdhaXQuZGVsZXRlKG1zZy5yZXF1ZXN0SWQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlV2FpdFNwZWMuc2tpcE9uTWVzc2FnZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ1BPTkcnKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RQaW5nU2VuZFRTKSB7XG4gICAgICAgICAgY29uc3QgcnR0ID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdFBpbmdTZW5kVFNcbiAgICAgICAgICBpZiAocnR0ID4gREVGQVVMVF9VTlRSVVNURURfUlRUX1RIUkVTSE9MRCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbcmVhbHRpbWVdIHVudHJ1c3RlZCBydHQgb2JzZXJ2ZWQ6ICR7cnR0fWApXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMucnR0T2JzZXJ2ZWQubGVuZ3RoID49IE1BWF9SVFRfT0JTRVJWRUQpIHtcbiAgICAgICAgICAgIHRoaXMucnR0T2JzZXJ2ZWQuc3BsaWNlKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aCAtIE1BWF9SVFRfT0JTRVJWRUQgKyAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucnR0T2JzZXJ2ZWQucHVzaChydHQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBjbGllbnQgPSBtc2cud2F0Y2hJZCAmJiB0aGlzLndhdGNoSWRDbGllbnRNYXAuZ2V0KG1zZy53YXRjaElkKVxuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtyZWFsdGltZV0gbm8gcmVhbHRpbWUgbGlzdGVuZXIgZm91bmQgcmVzcG9uc2libGUgZm9yIHdhdGNoSWQgJHttc2cud2F0Y2hJZH06IGAsXG4gICAgICAgICAgbXNnXG4gICAgICAgIClcbiAgICAgICAgc3dpdGNoIChtc2cubXNnVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0lOSVRfRVZFTlQnOlxuICAgICAgICAgIGNhc2UgJ05FWFRfRVZFTlQnOlxuICAgICAgICAgIGNhc2UgJ0NIRUNLX0VWRU5UJzoge1xuICAgICAgICAgICAgY2xpZW50ID0gdGhpcy5xdWVyeUlkQ2xpZW50TWFwLmdldChtc2cubXNnRGF0YS5xdWVyeUlEKVxuICAgICAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgWywgY2xpZW50XSBvZiBBcnJheS5mcm9tKHRoaXMud2F0Y2hJZENsaWVudE1hcC5lbnRyaWVzKCkpKSB7XG4gICAgICAgICAgICAgIGNsaWVudC5vbk1lc3NhZ2UobXNnKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgfSlcblxuICBwcml2YXRlIGlzV1NDb25uZWN0ZWQgPSAoKTogYm9vbGVhbiA9PiBCb29sZWFuKHRoaXMud3MgJiYgdGhpcy53cy5yZWFkeVN0YXRlID09PSBXU19SRUFEWV9TVEFURS5PUEVOKVxuXG4gIHByaXZhdGUgb25jZVdTQ29ubmVjdGVkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLmlzV1NDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMud3NJbml0UHJvbWlzZSAhPT0gbnVsbCAmJiB0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMud3NJbml0UHJvbWlzZVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzLnB1c2goe1xuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHdlYkxvZ2luID0gYXN5bmMgKFxuICAgIGVudklkPzogc3RyaW5nLFxuICAgIHJlZnJlc2g/OiBib29sZWFuXG4gICk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgaWYgKCFyZWZyZXNoKSB7XG4gICAgICBpZiAoZW52SWQpIHtcbiAgICAgICAgY29uc3QgbG9naW5JbmZvID0gdGhpcy5sb2dpbnMuZ2V0KGVudklkKVxuICAgICAgICBpZiAobG9naW5JbmZvKSB7XG4gICAgICAgICAgaWYgKGxvZ2luSW5mby5sb2dnZWRJbiAmJiBsb2dpbkluZm8ubG9naW5SZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2dpbkluZm8ubG9naW5SZXN1bHRcbiAgICAgICAgICB9IGlmIChsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSAhPT0gbnVsbCAmJiBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVtcHR5RW52TG9naW5JbmZvID0gdGhpcy5sb2dpbnMuZ2V0KCcnKVxuICAgICAgICBpZiAoZW1wdHlFbnZMb2dpbkluZm8/LmxvZ2dpbmdJblByb21pc2UgIT09IG51bGwgJiYgZW1wdHlFbnZMb2dpbkluZm8/LmxvZ2dpbmdJblByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBlbXB0eUVudkxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8SUxvZ2luUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAgIGNvbnN0IG1zZ0RhdGE6IElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSA9IHtcbiAgICAgICAgICAgIGVudklkOiB3c1NpZ24uZW52SWQgfHwgJycsXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogJycsIC8vIOW3suW6n+W8g+Wtl+autVxuICAgICAgICAgICAgcmVmZXJyZXI6ICd3ZWInLFxuICAgICAgICAgICAgc2RrVmVyc2lvbjogJycsXG4gICAgICAgICAgICBkYXRhVmVyc2lvbjogJycsXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxvZ2luTXNnOiBJUmVxdWVzdE1lc3NhZ2VMb2dpbk1zZyA9IHtcbiAgICAgICAgICAgIHdhdGNoSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgICAgICBtc2dUeXBlOiAnTE9HSU4nLFxuICAgICAgICAgICAgbXNnRGF0YSxcbiAgICAgICAgICAgIGV4TXNnRGF0YToge1xuICAgICAgICAgICAgICBydW50aW1lOiBnZXRSdW50aW1lKCksXG4gICAgICAgICAgICAgIHNpZ25TdHI6IHdzU2lnbi5zaWduU3RyLFxuICAgICAgICAgICAgICBzZWNyZXRWZXJzaW9uOiB3c1NpZ24uc2VjcmV0VmVyc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxvZ2luUmVzTXNnID0gYXdhaXQgdGhpcy5zZW5kPElSZXNwb25zZU1lc3NhZ2VMb2dpblJlc01zZz4oe1xuICAgICAgICAgICAgbXNnOiBsb2dpbk1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX0xPR0lOX1RJTUVPVVQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICghbG9naW5SZXNNc2cubXNnRGF0YS5jb2RlKSB7XG4gICAgICAgICAgICAvLyBsb2dpbiBzdWNjZXNzXG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgZW52SWQ6IHdzU2lnbi5lbnZJZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxvZ2luIGZhaWxlZFxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgJHtsb2dpblJlc01zZy5tc2dEYXRhLmNvZGV9ICR7bG9naW5SZXNNc2cubXNnRGF0YS5tZXNzYWdlfWApKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgfSlcblxuICAgIGxldCBsb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLmxvZ2lucy5nZXQoZW52SWQpXG5cbiAgICBjb25zdCBsb2dpblN0YXJ0VFMgPSBEYXRlLm5vdygpXG5cbiAgICBpZiAobG9naW5JbmZvKSB7XG4gICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZVxuICAgICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSBwcm9taXNlXG4gICAgICBsb2dpbkluZm8ubG9naW5TdGFydFRTID0gbG9naW5TdGFydFRTXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2luSW5mbyA9IHtcbiAgICAgICAgbG9nZ2VkSW46IGZhbHNlLFxuICAgICAgICBsb2dnaW5nSW5Qcm9taXNlOiBwcm9taXNlLFxuICAgICAgICBsb2dpblN0YXJ0VFMsXG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2lucy5zZXQoZW52SWQgfHwgJycsIGxvZ2luSW5mbylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBwcm9taXNlXG4gICAgICBjb25zdCBjdXJMb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLmxvZ2lucy5nZXQoZW52SWQpXG4gICAgICBpZiAoXG4gICAgICAgIGN1ckxvZ2luSW5mb1xuICAgICAgICAmJiBjdXJMb2dpbkluZm8gPT09IGxvZ2luSW5mb1xuICAgICAgICAmJiBjdXJMb2dpbkluZm8ubG9naW5TdGFydFRTID09PSBsb2dpblN0YXJ0VFNcbiAgICAgICkge1xuICAgICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSB0cnVlXG4gICAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gbG9naW5SZXN1bHRcbiAgICAgICAgcmV0dXJuIGxvZ2luUmVzdWx0XG4gICAgICB9IGlmIChjdXJMb2dpbkluZm8pIHtcbiAgICAgICAgaWYgKGN1ckxvZ2luSW5mby5sb2dnZWRJbiAmJiBjdXJMb2dpbkluZm8ubG9naW5SZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gY3VyTG9naW5JbmZvLmxvZ2luUmVzdWx0XG4gICAgICAgIH0gaWYgKGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlICE9PSBudWxsICYmIGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY3VyTG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2VcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIHVuZXhwZWN0ZWQgbG9naW4gaW5mbycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIGxvZ2luIGluZm8gcmVzZXQnKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gdW5kZWZpbmVkXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXc1NpZ24gPSBhc3luYyAoKTogUHJvbWlzZTxJV3NTaWduPiA9PiB7XG4gICAgaWYgKHRoaXMud3NTaWduICYmIHRoaXMud3NTaWduLmV4cGlyZWRUcyA+IERhdGUubm93KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLndzU2lnblxuICAgIH1cbiAgICBjb25zdCBleHBpcmVkVHMgPSBEYXRlLm5vdygpICsgNjAwMDBcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNvbnRleHQuYXBwQ29uZmlnLnJlcXVlc3Quc2VuZCgnYXV0aC53c1dlYlNpZ24nLCB7IHJ1bnRpbWU6IGdldFJ1bnRpbWUoKSB9KVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFt0Y2ItanMtc2RrXSDojrflj5blrp7ml7bmlbDmja7mjqjpgIHnmbvlvZXnpajmja7lpLHotKU6ICR7cmVzLmNvZGV9YClcbiAgICB9XG5cbiAgICBpZiAocmVzLmRhdGEpIHtcbiAgICAgIGNvbnN0IHsgc2lnblN0ciwgd3NVcmwsIHNlY3JldFZlcnNpb24sIGVudklkIH0gPSByZXMuZGF0YVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2lnblN0cixcbiAgICAgICAgd3NVcmwsXG4gICAgICAgIHNlY3JldFZlcnNpb24sXG4gICAgICAgIGVudklkLFxuICAgICAgICBleHBpcmVkVHMsXG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignW3RjYi1qcy1zZGtdIOiOt+WPluWunuaXtuaVsOaNruaOqOmAgeeZu+W9leelqOaNruWksei0pScpXG4gIH1cblxuICBwcml2YXRlIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGggPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIERFRkFVTFRfRVhQRUNURURfRVZFTlRfV0FJVF9USU1FXG4gICAgfVxuXG4gICAgLy8gMS41ICogUlRUXG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnJ0dE9ic2VydmVkLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1cilcbiAgICAgICAgLyB0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aClcbiAgICAgICogMS41XG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBoZWFydGJlYXQoaW1tZWRpYXRlPzogYm9vbGVhbikge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnBpbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICAoXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLndzIHx8IHRoaXMud3MucmVhZHlTdGF0ZSAhPT0gV1NfUkVBRFlfU1RBVEUuT1BFTikge1xuICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcGluZ1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5sYXN0UGluZ1NlbmRUUyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5waW5nKClcbiAgICAgICAgICAgICAgdGhpcy5waW5nRmFpbGVkID0gMFxuXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgdGhpcy5wb25nVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigncG9uZyB0aW1lZCBvdXQnKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvbmdNaXNzZWQgPCBERUZBVUxUX1BPTkdfTUlTU19UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucG9uZ01pc3NlZCArPSAxXG4gICAgICAgICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdCh0cnVlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBsb2dpY2FsIHBlcmNlaXZlZCBjb25uZWN0aW9uIGxvc3QsIGV2ZW4gdGhvdWdoIHdlYnNvY2tldCBkaWQgbm90IHJlY2VpdmUgZXJyb3Igb3IgY2xvc2UgZXZlbnRcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sIHRoaXMuY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQb25nV2FpdFRpbWVvdXQpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnBpbmdGYWlsZWQgPCBERUZBVUxUX1BJTkdfRkFJTF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbmdGYWlsZWQgKz0gMVxuICAgICAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKENsb3NlRXZlbnRDb2RlLkhlYXJ0YmVhdFBpbmdFcnJvcilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKSgpXG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlID8gMCA6IHRoaXMuY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQaW5nSW50ZXJ2YWxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHBpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbXNnOiBJUmVxdWVzdE1lc3NhZ2VQaW5nTXNnID0ge1xuICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgIG1zZ1R5cGU6ICdQSU5HJyxcbiAgICAgIG1zZ0RhdGE6IG51bGwsXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICBtc2csXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgb25XYXRjaFN0YXJ0ID0gKGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCwgcXVlcnlJRDogc3RyaW5nKSA9PiB7XG4gICAgdGhpcy5xdWVyeUlkQ2xpZW50TWFwLnNldChxdWVyeUlELCBjbGllbnQpXG4gIH1cblxuICBwcml2YXRlIG9uV2F0Y2hDbG9zZSA9IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChxdWVyeUlEKSB7XG4gICAgICB0aGlzLnF1ZXJ5SWRDbGllbnRNYXAuZGVsZXRlKHF1ZXJ5SUQpXG4gICAgfVxuICAgIHRoaXMud2F0Y2hJZENsaWVudE1hcC5kZWxldGUoY2xpZW50LndhdGNoSWQpXG4gICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuZGVsZXRlKGNsaWVudClcblxuICAgIGlmICghdGhpcy52aXJ0dWFsV1NDbGllbnQuc2l6ZSkge1xuICAgICAgLy8gbm8gbW9yZSBleGlzdGluZyB3YXRjaCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICAgICB0aGlzLmNsb3NlKENsb3NlRXZlbnRDb2RlLk5vUmVhbHRpbWVMaXN0ZW5lcnMpXG4gICAgfVxuICB9XG59XG4iXX0=