active-connect-ng2 0.2.49 → 0.3.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.
Files changed (40) hide show
  1. package/fesm2022/active-connect-ng2.mjs +1186 -0
  2. package/fesm2022/active-connect-ng2.mjs.map +1 -0
  3. package/package.json +11 -17
  4. package/types/active-connect-ng2.d.ts +254 -0
  5. package/esm2020/active-connect-ng2.mjs +0 -5
  6. package/esm2020/lib/active-connect-ng2.module.mjs +0 -42
  7. package/esm2020/lib/websocket/client.mjs +0 -442
  8. package/esm2020/lib/websocket/decorators/function.mjs +0 -40
  9. package/esm2020/lib/websocket/decorators/websocket/handle.mjs +0 -9
  10. package/esm2020/lib/websocket/decorators/websocket/on-reconnect.mjs +0 -6
  11. package/esm2020/lib/websocket/decorators/websocket/on-success.mjs +0 -8
  12. package/esm2020/lib/websocket/decorators/websocket/outbound.mjs +0 -213
  13. package/esm2020/lib/websocket/decorators/websocket/route.mjs +0 -31
  14. package/esm2020/lib/websocket/decorators/websocket/shared.mjs +0 -10
  15. package/esm2020/lib/websocket/decorators/websocket/websocket-route-service.mjs +0 -2
  16. package/esm2020/lib/websocket/index.mjs +0 -11
  17. package/esm2020/lib/websocket/json/json-parser.mjs +0 -23
  18. package/esm2020/lib/websocket/lifecycle/loading-status.mjs +0 -31
  19. package/esm2020/lib/websocket/objects/outbound-object.mjs +0 -410
  20. package/esm2020/public-api.mjs +0 -7
  21. package/fesm2015/active-connect-ng2.mjs +0 -1285
  22. package/fesm2015/active-connect-ng2.mjs.map +0 -1
  23. package/fesm2020/active-connect-ng2.mjs +0 -1267
  24. package/fesm2020/active-connect-ng2.mjs.map +0 -1
  25. package/index.d.ts +0 -5
  26. package/lib/active-connect-ng2.module.d.ts +0 -7
  27. package/lib/websocket/client.d.ts +0 -65
  28. package/lib/websocket/decorators/function.d.ts +0 -30
  29. package/lib/websocket/decorators/websocket/handle.d.ts +0 -1
  30. package/lib/websocket/decorators/websocket/on-reconnect.d.ts +0 -1
  31. package/lib/websocket/decorators/websocket/on-success.d.ts +0 -1
  32. package/lib/websocket/decorators/websocket/outbound.d.ts +0 -1
  33. package/lib/websocket/decorators/websocket/route.d.ts +0 -1
  34. package/lib/websocket/decorators/websocket/shared.d.ts +0 -4
  35. package/lib/websocket/decorators/websocket/websocket-route-service.d.ts +0 -5
  36. package/lib/websocket/index.d.ts +0 -10
  37. package/lib/websocket/json/json-parser.d.ts +0 -5
  38. package/lib/websocket/lifecycle/loading-status.d.ts +0 -9
  39. package/lib/websocket/objects/outbound-object.d.ts +0 -50
  40. package/public-api.d.ts +0 -3
@@ -1,442 +0,0 @@
1
- import { JsonParser } from './json/json-parser';
2
- export class WebsocketClient {
3
- constructor(url, supportsCache, dbService) {
4
- this.url = url;
5
- this.supportsCache = supportsCache;
6
- this.dbService = dbService;
7
- this.requestStack = [];
8
- this.requestHistoryLogs = [];
9
- this._token = '';
10
- this.connectionEstablishedOnce = false;
11
- this.messageId = 0;
12
- this.rejectCallbacks = new Map();
13
- this.expectedMethods = new Map();
14
- this.closed = false;
15
- if (supportsCache)
16
- this.initCache();
17
- this.setUrl(this.url);
18
- }
19
- setUrl(url) {
20
- if (!url) {
21
- let protocol;
22
- let port;
23
- switch (document.location.protocol) {
24
- case 'https:': {
25
- protocol = 'wss:';
26
- port = ':443';
27
- break;
28
- }
29
- default: {
30
- protocol = 'ws:';
31
- port = ':80';
32
- break;
33
- }
34
- }
35
- url = protocol + '//' + document.location.hostname + port + '/wss';
36
- }
37
- this.url = url;
38
- // Initial setup: nothing to tear down yet, just open the first connection.
39
- this.closed = false;
40
- this.connect(this.url);
41
- }
42
- connect(url) {
43
- if (!this.target.___connectionId) {
44
- this.target.___connectionId = 0;
45
- }
46
- this.target.___connectionId++;
47
- if (this.ws &&
48
- (this.ws.readyState === WebSocket.CONNECTING ||
49
- this.ws.readyState === WebSocket.OPEN)) {
50
- return;
51
- }
52
- this.create(url);
53
- }
54
- initTabSuspendedListener() {
55
- if (document) {
56
- document.addEventListener('visibilitychange', () => {
57
- if (document.visibilityState === 'hidden') {
58
- console.log('ActiveConnect: Closing WebSocket due to tab suspension...');
59
- this.disconnect(true);
60
- }
61
- else if (document.visibilityState === 'visible') {
62
- console.log('ActiveConnect: Reconnecting WebSocket...');
63
- this.closed = false;
64
- this.connect(this.url);
65
- }
66
- });
67
- }
68
- }
69
- logEntry(method) {
70
- this.requestHistoryLogs.push({ timestamp: new Date(Date.now()), method });
71
- }
72
- get logs() {
73
- return this.requestHistoryLogs;
74
- }
75
- get Token() {
76
- if (!this._token) {
77
- if (window.localStorage)
78
- this._token = window.localStorage.getItem('token') || '';
79
- }
80
- return this._token;
81
- }
82
- set Token(val) {
83
- this._token = val;
84
- if (window.localStorage)
85
- window.localStorage.setItem('token', val);
86
- }
87
- set Connected(value) {
88
- if (value) {
89
- this.sendBrowserInfoToServer();
90
- this.auth(this.Token)
91
- .catch((err) => {
92
- console.log('ActiveConnect: auth failed on reconnect: ' + err);
93
- })
94
- .then(() => {
95
- Promise.all(WebsocketClient.onReconnectCallback.map((c) => c.Func ? c.Func() : null)).then(() => {
96
- setTimeout(() => {
97
- this.resetRequestedState();
98
- this.requestStack.forEach((e) => {
99
- this.sendToSocket(e.method, e.data, false, e.messageId);
100
- this.requestStack = this.requestStack.filter((e1) => e1 != e);
101
- });
102
- }, 2000);
103
- });
104
- });
105
- }
106
- if (this.pool && this.pool.WssConnected)
107
- this.pool.WssConnected = value;
108
- }
109
- resetRequestedState() {
110
- if (this.connectionEstablishedOnce) {
111
- // reset requested state for outbounds
112
- WebsocketClient.resetRequestedStateCallbacks.forEach((reset) => {
113
- reset(this);
114
- });
115
- }
116
- else {
117
- this.connectionEstablishedOnce = true;
118
- }
119
- }
120
- static addResetRequestingStateCallback(callback) {
121
- WebsocketClient.resetRequestedStateCallbacks.push(callback);
122
- }
123
- clearHandshakeTimer() {
124
- if (this.handshakeTimer !== undefined) {
125
- clearTimeout(this.handshakeTimer);
126
- this.handshakeTimer = undefined;
127
- }
128
- }
129
- create(url) {
130
- if (this.ws) {
131
- // Detach handlers first so the old socket's close event can't trigger
132
- // another reconnect cycle once it's no longer the "current" socket.
133
- this.ws.onopen = null;
134
- this.ws.onmessage = null;
135
- this.ws.onerror = null;
136
- this.ws.onclose = null;
137
- if (this.ws.readyState === WebSocket.CONNECTING ||
138
- this.ws.readyState === WebSocket.OPEN) {
139
- this.ws.close();
140
- }
141
- }
142
- this.clearReconnectTimer();
143
- this.clearHandshakeTimer();
144
- this.closed = false;
145
- // create new connection
146
- this.logEntry('TCP/HTTP:CONNECT-SERVER');
147
- this.ws = new WebSocket(url + (this.supportsCache ? '?cache=true' : ''));
148
- this.handshakeTimer = setTimeout(() => {
149
- if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {
150
- this.logEntry('TCP/HTTP:HANDSHAKE-TIMEOUT');
151
- console.log('ActiveConnect: Handshake timed out, retrying connection...');
152
- // Detach so the forced close below doesn't double-trigger reconnect logic.
153
- this.ws.onopen = null;
154
- this.ws.onmessage = null;
155
- this.ws.onerror = null;
156
- this.ws.onclose = null;
157
- try {
158
- this.ws.close();
159
- }
160
- catch (err) {
161
- // ignore - socket may already be in a bad state
162
- }
163
- if (!this.closed) {
164
- this.clearReconnectTimer();
165
- this.reconnectTimer = setTimeout(() => {
166
- this.reconnectTimer = undefined;
167
- this.connect(url);
168
- }, 1000);
169
- }
170
- }
171
- }, WebsocketClient.HANDSHAKE_TIMEOUT_MS);
172
- this.ws.onerror = (err) => {
173
- this.ws.close();
174
- this.logEntry('TCP/HTTP:ERROR:' + err);
175
- console.log('ActiveConnect: ' + err);
176
- };
177
- this.ws.onopen = () => {
178
- this.clearHandshakeTimer();
179
- this.logEntry('TCP/HTTP:CONNECTED');
180
- this.Connected = true;
181
- };
182
- this.ws.onmessage = (e) => {
183
- let parsed;
184
- try {
185
- parsed = JsonParser.parse(e.data.toString());
186
- }
187
- catch (err) {
188
- // A malformed frame must not throw inside the onmessage handler -
189
- // that would silently kill message processing for the rest of the
190
- // connection's lifetime without ever surfacing an error.
191
- console.log('ActiveConnect: failed to parse incoming message: ' + err);
192
- return;
193
- }
194
- this.messageReceived(parsed);
195
- };
196
- this.ws.onclose = () => {
197
- this.clearHandshakeTimer();
198
- this.logEntry('TCP/HTTP:CLOSED');
199
- if (!this.closed) {
200
- if (this.pool && this.pool.WssConnected)
201
- this.pool.WssConnected = false;
202
- this.logEntry('TCP/HTTP:RESET-REQUESTED-OUTBOUND-STATE');
203
- this.resetRequestedState();
204
- this.clearReconnectTimer();
205
- this.reconnectTimer = setTimeout(() => {
206
- this.reconnectTimer = undefined;
207
- this.connect(url);
208
- }, 1000);
209
- }
210
- };
211
- }
212
- clearReconnectTimer() {
213
- if (this.reconnectTimer !== undefined) {
214
- clearTimeout(this.reconnectTimer);
215
- this.reconnectTimer = undefined;
216
- }
217
- }
218
- sendToSocket(method, data, dontEnsureTransmission, forcedMessageId) {
219
- const messageId = forcedMessageId ?? ++this.messageId;
220
- if (this.ws.readyState != this.ws.OPEN) {
221
- if (!dontEnsureTransmission)
222
- this.requestStack.push({ method, data, messageId });
223
- else
224
- return false;
225
- }
226
- else {
227
- this.ws.send(JsonParser.stringify({ method, value: data, messageId }));
228
- }
229
- return messageId;
230
- }
231
- async auth(token) {
232
- return this.sendToSocket('auth.token', token);
233
- }
234
- send(method, data, dontEnsureTransmission) {
235
- this.logEntry('SEND:' + method);
236
- const messageId = this.sendToSocket(method, data, dontEnsureTransmission || false);
237
- if (messageId) {
238
- return this.expectMethod(`m.${method}`, messageId);
239
- }
240
- else {
241
- return new Promise((resolve) => {
242
- resolve(false);
243
- });
244
- }
245
- }
246
- expectMethod(method, messageId) {
247
- return new Promise((resolve, reject) => {
248
- if (messageId) {
249
- this.expectedMethods.set(messageId, [resolve]);
250
- this.rejectCallbacks.set(messageId, reject);
251
- }
252
- else {
253
- if (this.expectedMethods.has(method)) {
254
- let arr = this.expectedMethods.get(method);
255
- arr.push(resolve);
256
- }
257
- else {
258
- this.expectedMethods.set(method, [resolve]);
259
- }
260
- }
261
- });
262
- }
263
- messageReceived({ method, value, messageId, specificHash, inserted, updated, deleted, length }) {
264
- this.logEntry('RECEIVED:' + method);
265
- if (method == '___cache') {
266
- this.handleOutboundCacheRequest(value);
267
- }
268
- if (messageId) {
269
- if (method == 'm.error') {
270
- const reject = this.rejectCallbacks.get(messageId);
271
- if (reject) {
272
- reject(value);
273
- }
274
- messageId = -1;
275
- }
276
- }
277
- if (messageId != null) {
278
- const callback = this.expectedMethods.get(messageId);
279
- if (callback) {
280
- const func = callback.shift();
281
- if (func)
282
- func(value);
283
- this.invokeSuccessHandlers(method);
284
- }
285
- else {
286
- const callback = this.expectedMethods.get(method);
287
- if (callback && callback.length > 0) {
288
- const func = callback.shift();
289
- if (func)
290
- func(value);
291
- }
292
- else {
293
- const out = WebsocketClient.outbounds.get(method);
294
- if (out) {
295
- out(value, specificHash, inserted, updated, deleted, length, this);
296
- }
297
- const handle = WebsocketClient.handles.get(method);
298
- if (handle) {
299
- handle.Func(value);
300
- }
301
- }
302
- }
303
- }
304
- else {
305
- throw Error('No MessageId was provided, the connection is not supported.');
306
- }
307
- }
308
- handleOutboundCacheRequest(method) {
309
- if (this.dbService) {
310
- try {
311
- this.dbService.getByKey('outbound', method).subscribe((item) => {
312
- if (item) {
313
- this.send('___cache', {
314
- method,
315
- specificHash: item.specificHash || null
316
- });
317
- }
318
- else {
319
- this.send('___cache', {
320
- method,
321
- specificHash: null
322
- });
323
- }
324
- });
325
- }
326
- catch (e) {
327
- this.send('___cache', {
328
- method,
329
- specificHash: null
330
- });
331
- console.error('ActiveConnect: ' + e);
332
- }
333
- }
334
- else {
335
- this.send('___cache', {
336
- method,
337
- specificHash: null
338
- });
339
- console.error('Active-Connect: Caching not possible as the indexedDB has not been initialized');
340
- }
341
- }
342
- static expectOutbound(method, callback) {
343
- WebsocketClient.outbounds.set(method, callback);
344
- }
345
- static registerHandle(method, callback) {
346
- WebsocketClient.handles.set(method, callback);
347
- }
348
- get isConnected() {
349
- if (this.ws)
350
- return this.ws.readyState == WebSocket.OPEN;
351
- return true;
352
- }
353
- sendBrowserInfoToServer() {
354
- // send browser / os information
355
- const browser = this.getBrowser();
356
- const os = this.getOS();
357
- this.send('___browser', {
358
- browser: `${browser.name} ${browser.version} ${os}`
359
- });
360
- }
361
- getBrowser() {
362
- // https://www.gregoryvarghese.com/how-to-get-browser-name-and-version-via-javascript/
363
- var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
364
- if (/trident/i.test(M[1])) {
365
- tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
366
- return { name: 'IE ', version: tem[1] || '' };
367
- }
368
- if (M[1] === 'Chrome') {
369
- tem = ua.match(/\bOPR\/(\d+)/);
370
- if (tem != null) {
371
- return { name: 'Opera', version: tem[1] };
372
- }
373
- }
374
- M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
375
- if ((tem = ua.match(/version\/(\d+)/i)) != null) {
376
- M.splice(1, 1, tem[1]);
377
- }
378
- return {
379
- name: M[0],
380
- version: M[1]
381
- };
382
- }
383
- getOS() {
384
- var userAgent = window.navigator.userAgent, platform = window.navigator.platform, macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'], windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'], iosPlatforms = ['iPhone', 'iPad', 'iPod'], os = null;
385
- if (macosPlatforms.indexOf(platform) !== -1) {
386
- os = 'Mac OS';
387
- }
388
- else if (iosPlatforms.indexOf(platform) !== -1) {
389
- os = 'iOS';
390
- }
391
- else if (windowsPlatforms.indexOf(platform) !== -1) {
392
- os = 'Windows';
393
- }
394
- else if (/Android/.test(userAgent)) {
395
- os = 'Android';
396
- }
397
- else if (!os && /Linux/.test(platform)) {
398
- os = 'Linux';
399
- }
400
- return os || '';
401
- }
402
- static onSuccess(callback, regexp) {
403
- this.onSuccessHandlers.push({ callback, regexp });
404
- }
405
- static onReconnect(callback) {
406
- WebsocketClient.onReconnectCallback.push(callback);
407
- }
408
- invokeSuccessHandlers(method) {
409
- WebsocketClient.onSuccessHandlers
410
- .filter((e) => e.regexp.test(method))
411
- .forEach((e) => {
412
- var res = e.callback.Func();
413
- if (res && res.then) {
414
- res.then();
415
- }
416
- });
417
- }
418
- disconnect(restart) {
419
- this.closed = true;
420
- this.clearReconnectTimer();
421
- this.clearHandshakeTimer();
422
- if (this.ws)
423
- this.ws.close();
424
- if (!restart) {
425
- this.ws.onopen = null;
426
- this.ws.onmessage = null;
427
- this.ws.onerror = null;
428
- this.ws.onclose = null;
429
- }
430
- }
431
- initCache() { }
432
- get target() {
433
- return this.__proto__;
434
- }
435
- }
436
- WebsocketClient.resetRequestedStateCallbacks = [];
437
- WebsocketClient.HANDSHAKE_TIMEOUT_MS = 10000;
438
- WebsocketClient.outbounds = new Map();
439
- WebsocketClient.handles = new Map();
440
- WebsocketClient.onSuccessHandlers = [];
441
- WebsocketClient.onReconnectCallback = [];
442
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9saWIvd2Vic29ja2V0L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQsTUFBTSxPQUFPLGVBQWU7SUFJMUIsWUFDVSxHQUFZLEVBQ1osYUFBdUIsRUFDeEIsU0FBK0I7UUFGOUIsUUFBRyxHQUFILEdBQUcsQ0FBUztRQUNaLGtCQUFhLEdBQWIsYUFBYSxDQUFVO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBZ0VoQyxpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6Qix1QkFBa0IsR0FBMEMsRUFBRSxDQUFDO1FBUS9ELFdBQU0sR0FBRyxFQUFFLENBQUM7UUF3Q1osOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBMEgzQyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBMEN0QixvQkFBZSxHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ25ELG9CQUFlLEdBQTBDLElBQUksR0FBRyxFQUFFLENBQUM7UUEwT3BFLFdBQU0sR0FBRyxLQUFLLENBQUM7UUE5ZnBCLElBQUksYUFBYTtZQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRVMsTUFBTSxDQUFDLEdBQXVCO1FBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixJQUFJLFFBQVEsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDO1lBQ1QsUUFBUSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtnQkFDbEMsS0FBSyxRQUFRLENBQUMsQ0FBQztvQkFDYixRQUFRLEdBQUcsTUFBTSxDQUFDO29CQUNsQixJQUFJLEdBQUcsTUFBTSxDQUFDO29CQUNk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QUFJLEVBQUUsQ0FBQzthQUNaO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBR00sVUFBVSxDQUFDLE9BQWlCO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLEVBQUU7WUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTdCLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRU8sU0FBUyxLQUFJLENBQUM7SUFFdEIsSUFBSSxNQUFNO1FBQ1IsT0FBUSxJQUFZLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUM7O0FBcmFjLDRDQUE0QixHQUFlLEVBQUUsQ0FBQztBQWdCckMsb0NBQW9CLEdBQUcsS0FBSyxDQUFDO0FBdVF0Qyx5QkFBUyxHQVdwQixJQUFJLEdBQUcsRUFBRSxDQUFDO0FBZ0JDLHVCQUFPLEdBQW1DLElBQUksR0FBRyxFQUFFLENBQUM7QUFzRXBELGlDQUFpQixHQUcxQixFQUFFLENBQUM7QUFLTSxtQ0FBbUIsR0FBd0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmd4SW5kZXhlZERCU2VydmljZSB9IGZyb20gJ25neC1pbmRleGVkLWRiJztcclxuaW1wb3J0IHsgRGVjb3JhYmxlRnVuY3Rpb24gfSBmcm9tICcuL2RlY29yYXRvcnMvZnVuY3Rpb24nO1xyXG5pbXBvcnQgeyBKc29uUGFyc2VyIH0gZnJvbSAnLi9qc29uL2pzb24tcGFyc2VyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRDbGllbnQge1xyXG4gIHdzITogV2ViU29ja2V0O1xyXG4gIHBvb2whOiB7IFdzc0Nvbm5lY3RlZDogYm9vbGVhbiB9IHwgbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHVybD86IHN0cmluZyxcclxuICAgIHByaXZhdGUgc3VwcG9ydHNDYWNoZT86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgZGJTZXJ2aWNlPzogTmd4SW5kZXhlZERCU2VydmljZVxyXG4gICkge1xyXG4gICAgaWYgKHN1cHBvcnRzQ2FjaGUpIHRoaXMuaW5pdENhY2hlKCk7XHJcbiAgICB0aGlzLnNldFVybCh0aGlzLnVybCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0VXJsKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAoIXVybCkge1xyXG4gICAgICBsZXQgcHJvdG9jb2w7XHJcbiAgICAgIGxldCBwb3J0O1xyXG4gICAgICBzd2l0Y2ggKGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSB7XHJcbiAgICAgICAgY2FzZSAnaHR0cHM6Jzoge1xyXG4gICAgICAgICAgcHJvdG9jb2wgPSAnd3NzOic7XHJcbiAgICAgICAgICBwb3J0ID0gJzo0NDMnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIHByb3RvY29sID0gJ3dzOic7XHJcbiAgICAgICAgICBwb3J0ID0gJzo4MCc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdXJsID0gcHJvdG9jb2wgKyAnLy8nICsgZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgKyBwb3J0ICsgJy93c3MnO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cmwgPSB1cmw7XHJcbiAgICAvLyBJbml0aWFsIHNldHVwOiBub3RoaW5nIHRvIHRlYXIgZG93biB5ZXQsIGp1c3Qgb3BlbiB0aGUgZmlyc3QgY29ubmVjdGlvbi5cclxuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLmNvbm5lY3QodGhpcy51cmwgYXMgc3RyaW5nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29ubmVjdCh1cmw6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLnRhcmdldC5fX19jb25uZWN0aW9uSWQpIHtcclxuICAgICAgdGhpcy50YXJnZXQuX19fY29ubmVjdGlvbklkID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMudGFyZ2V0Ll9fX2Nvbm5lY3Rpb25JZCsrO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy53cyAmJlxyXG4gICAgICAodGhpcy53cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORyB8fFxyXG4gICAgICAgIHRoaXMud3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3JlYXRlKHVybCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdFRhYlN1c3BlbmRlZExpc3RlbmVyKCkge1xyXG4gICAgaWYgKGRvY3VtZW50KSB7XHJcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAnQWN0aXZlQ29ubmVjdDogQ2xvc2luZyBXZWJTb2NrZXQgZHVlIHRvIHRhYiBzdXNwZW5zaW9uLi4uJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQWN0aXZlQ29ubmVjdDogUmVjb25uZWN0aW5nIFdlYlNvY2tldC4uLicpO1xyXG4gICAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY29ubmVjdCh0aGlzLnVybCBhcyBzdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RTdGFjazogYW55W10gPSBbXTtcclxuICBwcml2YXRlIHJlcXVlc3RIaXN0b3J5TG9nczogeyB0aW1lc3RhbXA6IERhdGU7IG1ldGhvZDogc3RyaW5nIH1bXSA9IFtdO1xyXG4gIHByaXZhdGUgbG9nRW50cnkobWV0aG9kOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucmVxdWVzdEhpc3RvcnlMb2dzLnB1c2goeyB0aW1lc3RhbXA6IG5ldyBEYXRlKERhdGUubm93KCkpLCBtZXRob2QgfSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgbG9ncygpOiB7IHRpbWVzdGFtcDogRGF0ZTsgbWV0aG9kOiBzdHJpbmcgfVtdIHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3RIaXN0b3J5TG9ncztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Rva2VuID0gJyc7XHJcbiAgcHVibGljIGdldCBUb2tlbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLl90b2tlbikge1xyXG4gICAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZSlcclxuICAgICAgICB0aGlzLl90b2tlbiA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKSB8fCAnJztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl90b2tlbjtcclxuICB9XHJcbiAgcHVibGljIHNldCBUb2tlbih2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5fdG9rZW4gPSB2YWw7XHJcbiAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZSkgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2tlbicsIHZhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldCBDb25uZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlbmRCcm93c2VySW5mb1RvU2VydmVyKCk7XHJcblxyXG4gICAgICB0aGlzLmF1dGgodGhpcy5Ub2tlbilcclxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0FjdGl2ZUNvbm5lY3Q6IGF1dGggZmFpbGVkIG9uIHJlY29ubmVjdDogJyArIGVycik7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgV2Vic29ja2V0Q2xpZW50Lm9uUmVjb25uZWN0Q2FsbGJhY2subWFwKChjKSA9PlxyXG4gICAgICAgICAgICAgIGMuRnVuYyA/IGMuRnVuYygpIDogbnVsbFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdGVkU3RhdGUoKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RTdGFjay5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRUb1NvY2tldChlLm1ldGhvZCwgZS5kYXRhLCBmYWxzZSwgZS5tZXNzYWdlSWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0U3RhY2sgPSB0aGlzLnJlcXVlc3RTdGFjay5maWx0ZXIoKGUxKSA9PiBlMSAhPSBlKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBvb2wgJiYgdGhpcy5wb29sLldzc0Nvbm5lY3RlZCkgdGhpcy5wb29sLldzc0Nvbm5lY3RlZCA9IHZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyByZXNldFJlcXVlc3RlZFN0YXRlQ2FsbGJhY2tzOiBGdW5jdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBjb25uZWN0aW9uRXN0YWJsaXNoZWRPbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZXNldFJlcXVlc3RlZFN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkT25jZSkge1xyXG4gICAgICAvLyByZXNldCByZXF1ZXN0ZWQgc3RhdGUgZm9yIG91dGJvdW5kc1xyXG4gICAgICBXZWJzb2NrZXRDbGllbnQucmVzZXRSZXF1ZXN0ZWRTdGF0ZUNhbGxiYWNrcy5mb3JFYWNoKChyZXNldCkgPT4ge1xyXG4gICAgICAgIHJlc2V0KHRoaXMpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkT25jZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgYWRkUmVzZXRSZXF1ZXN0aW5nU3RhdGVDYWxsYmFjayhjYWxsYmFjazogRnVuY3Rpb24pIHtcclxuICAgIFdlYnNvY2tldENsaWVudC5yZXNldFJlcXVlc3RlZFN0YXRlQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSEFORFNIQUtFX1RJTUVPVVRfTVMgPSAxMDAwMDtcclxuICBwcml2YXRlIGhhbmRzaGFrZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNsZWFySGFuZHNoYWtlVGltZXIoKSB7XHJcbiAgICBpZiAodGhpcy5oYW5kc2hha2VUaW1lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhhbmRzaGFrZVRpbWVyKTtcclxuICAgICAgdGhpcy5oYW5kc2hha2VUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlKHVybDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy53cykge1xyXG4gICAgICAvLyBEZXRhY2ggaGFuZGxlcnMgZmlyc3Qgc28gdGhlIG9sZCBzb2NrZXQncyBjbG9zZSBldmVudCBjYW4ndCB0cmlnZ2VyXHJcbiAgICAgIC8vIGFub3RoZXIgcmVjb25uZWN0IGN5Y2xlIG9uY2UgaXQncyBubyBsb25nZXIgdGhlIFwiY3VycmVudFwiIHNvY2tldC5cclxuICAgICAgdGhpcy53cy5vbm9wZW4gPSBudWxsO1xyXG4gICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25lcnJvciA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25jbG9zZSA9IG51bGw7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLndzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XHJcbiAgICAgICAgdGhpcy53cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTlxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLndzLmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsZWFyUmVjb25uZWN0VGltZXIoKTtcclxuICAgIHRoaXMuY2xlYXJIYW5kc2hha2VUaW1lcigpO1xyXG5cclxuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gY3JlYXRlIG5ldyBjb25uZWN0aW9uXHJcbiAgICB0aGlzLmxvZ0VudHJ5KCdUQ1AvSFRUUDpDT05ORUNULVNFUlZFUicpO1xyXG4gICAgdGhpcy53cyA9IG5ldyBXZWJTb2NrZXQodXJsICsgKHRoaXMuc3VwcG9ydHNDYWNoZSA/ICc/Y2FjaGU9dHJ1ZScgOiAnJykpO1xyXG5cclxuICAgIHRoaXMuaGFuZHNoYWtlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMud3MgJiYgdGhpcy53cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykge1xyXG4gICAgICAgIHRoaXMubG9nRW50cnkoJ1RDUC9IVFRQOkhBTkRTSEFLRS1USU1FT1VUJyk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAnQWN0aXZlQ29ubmVjdDogSGFuZHNoYWtlIHRpbWVkIG91dCwgcmV0cnlpbmcgY29ubmVjdGlvbi4uLidcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIERldGFjaCBzbyB0aGUgZm9yY2VkIGNsb3NlIGJlbG93IGRvZXNuJ3QgZG91YmxlLXRyaWdnZXIgcmVjb25uZWN0IGxvZ2ljLlxyXG4gICAgICAgIHRoaXMud3Mub25vcGVuID0gbnVsbDtcclxuICAgICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy53cy5vbmVycm9yID0gbnVsbDtcclxuICAgICAgICB0aGlzLndzLm9uY2xvc2UgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLndzLmNsb3NlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAvLyBpZ25vcmUgLSBzb2NrZXQgbWF5IGFscmVhZHkgYmUgaW4gYSBiYWQgc3RhdGVcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xyXG4gICAgICAgICAgdGhpcy5jbGVhclJlY29ubmVjdFRpbWVyKCk7XHJcbiAgICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdCh1cmwpO1xyXG4gICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCBXZWJzb2NrZXRDbGllbnQuSEFORFNIQUtFX1RJTUVPVVRfTVMpO1xyXG5cclxuICAgIHRoaXMud3Mub25lcnJvciA9IChlcnIpID0+IHtcclxuICAgICAgdGhpcy53cy5jbG9zZSgpO1xyXG4gICAgICB0aGlzLmxvZ0VudHJ5KCdUQ1AvSFRUUDpFUlJPUjonICsgZXJyKTtcclxuICAgICAgY29uc29sZS5sb2coJ0FjdGl2ZUNvbm5lY3Q6ICcgKyBlcnIpO1xyXG4gICAgfTtcclxuICAgIHRoaXMud3Mub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsZWFySGFuZHNoYWtlVGltZXIoKTtcclxuICAgICAgdGhpcy5sb2dFbnRyeSgnVENQL0hUVFA6Q09OTkVDVEVEJyk7XHJcbiAgICAgIHRoaXMuQ29ubmVjdGVkID0gdHJ1ZTtcclxuICAgIH07XHJcbiAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChlKSA9PiB7XHJcbiAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcGFyc2VkID0gSnNvblBhcnNlci5wYXJzZShlLmRhdGEudG9TdHJpbmcoKSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIC8vIEEgbWFsZm9ybWVkIGZyYW1lIG11c3Qgbm90IHRocm93IGluc2lkZSB0aGUgb25tZXNzYWdlIGhhbmRsZXIgLVxyXG4gICAgICAgIC8vIHRoYXQgd291bGQgc2lsZW50bHkga2lsbCBtZXNzYWdlIHByb2Nlc3NpbmcgZm9yIHRoZSByZXN0IG9mIHRoZVxyXG4gICAgICAgIC8vIGNvbm5lY3Rpb24ncyBsaWZldGltZSB3aXRob3V0IGV2ZXIgc3VyZmFjaW5nIGFuIGVycm9yLlxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdBY3RpdmVDb25uZWN0OiBmYWlsZWQgdG8gcGFyc2UgaW5jb21pbmcgbWVzc2FnZTogJyArIGVycik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkKHBhcnNlZCk7XHJcbiAgICB9O1xyXG4gICAgdGhpcy53cy5vbmNsb3NlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsZWFySGFuZHNoYWtlVGltZXIoKTtcclxuICAgICAgdGhpcy5sb2dFbnRyeSgnVENQL0hUVFA6Q0xPU0VEJyk7XHJcbiAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5wb29sICYmIHRoaXMucG9vbC5Xc3NDb25uZWN0ZWQpIHRoaXMucG9vbC5Xc3NDb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvZ0VudHJ5KCdUQ1AvSFRUUDpSRVNFVC1SRVFVRVNURUQtT1VUQk9VTkQtU1RBVEUnKTtcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdGVkU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmNsZWFyUmVjb25uZWN0VGltZXIoKTtcclxuICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgdGhpcy5jb25uZWN0KHVybCk7XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY29ubmVjdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNsZWFyUmVjb25uZWN0VGltZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yZWNvbm5lY3RUaW1lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVyKTtcclxuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVzc2FnZUlkOiBudW1iZXIgPSAwO1xyXG4gIHByb3RlY3RlZCBzZW5kVG9Tb2NrZXQoXHJcbiAgICBtZXRob2Q6IHN0cmluZyxcclxuICAgIGRhdGE6IGFueSxcclxuICAgIGRvbnRFbnN1cmVUcmFuc21pc3Npb24/OiBib29sZWFuLFxyXG4gICAgZm9yY2VkTWVzc2FnZUlkPzogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBtZXNzYWdlSWQgPSBmb3JjZWRNZXNzYWdlSWQgPz8gKyt0aGlzLm1lc3NhZ2VJZDtcclxuICAgIGlmICh0aGlzLndzLnJlYWR5U3RhdGUgIT0gdGhpcy53cy5PUEVOKSB7XHJcbiAgICAgIGlmICghZG9udEVuc3VyZVRyYW5zbWlzc2lvbilcclxuICAgICAgICB0aGlzLnJlcXVlc3RTdGFjay5wdXNoKHsgbWV0aG9kLCBkYXRhLCBtZXNzYWdlSWQgfSk7XHJcbiAgICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53cy5zZW5kKEpzb25QYXJzZXIuc3RyaW5naWZ5KHsgbWV0aG9kLCB2YWx1ZTogZGF0YSwgbWVzc2FnZUlkIH0pKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZXNzYWdlSWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhdXRoKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFRvU29ja2V0KCdhdXRoLnRva2VuJywgdG9rZW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbmQoXHJcbiAgICBtZXRob2Q6IHN0cmluZyxcclxuICAgIGRhdGE6IGFueSxcclxuICAgIGRvbnRFbnN1cmVUcmFuc21pc3Npb24/OiBib29sZWFuXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMubG9nRW50cnkoJ1NFTkQ6JyArIG1ldGhvZCk7XHJcbiAgICBjb25zdCBtZXNzYWdlSWQgPSB0aGlzLnNlbmRUb1NvY2tldChcclxuICAgICAgbWV0aG9kLFxyXG4gICAgICBkYXRhLFxyXG4gICAgICBkb250RW5zdXJlVHJhbnNtaXNzaW9uIHx8IGZhbHNlXHJcbiAgICApO1xyXG4gICAgaWYgKG1lc3NhZ2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5leHBlY3RNZXRob2QoYG0uJHttZXRob2R9YCwgbWVzc2FnZUlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVqZWN0Q2FsbGJhY2tzOiBNYXA8bnVtYmVyLCBGdW5jdGlvbj4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBleHBlY3RlZE1ldGhvZHM6IE1hcDxzdHJpbmcgfCBudW1iZXIsIEFycmF5PEZ1bmN0aW9uPj4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBleHBlY3RNZXRob2QobWV0aG9kOiBzdHJpbmcsIG1lc3NhZ2VJZD86IG51bWJlciB8IG51bGwpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChtZXNzYWdlSWQpIHtcclxuICAgICAgICB0aGlzLmV4cGVjdGVkTWV0aG9kcy5zZXQobWVzc2FnZUlkLCBbcmVzb2x2ZV0pO1xyXG4gICAgICAgIHRoaXMucmVqZWN0Q2FsbGJhY2tzLnNldChtZXNzYWdlSWQsIHJlamVjdCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwZWN0ZWRNZXRob2RzLmhhcyhtZXRob2QpKSB7XHJcbiAgICAgICAgICBsZXQgYXJyID0gdGhpcy5leHBlY3RlZE1ldGhvZHMuZ2V0KG1ldGhvZCk7XHJcbiAgICAgICAgICAoYXJyIGFzIEFycmF5PEZ1bmN0aW9uPikucHVzaChyZXNvbHZlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5leHBlY3RlZE1ldGhvZHMuc2V0KG1ldGhvZCwgW3Jlc29sdmVdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXNzYWdlUmVjZWl2ZWQoe1xyXG4gICAgbWV0aG9kLFxyXG4gICAgdmFsdWUsXHJcbiAgICBtZXNzYWdlSWQsXHJcbiAgICBzcGVjaWZpY0hhc2gsXHJcbiAgICBpbnNlcnRlZCxcclxuICAgIHVwZGF0ZWQsXHJcbiAgICBkZWxldGVkLFxyXG4gICAgbGVuZ3RoXHJcbiAgfToge1xyXG4gICAgbWV0aG9kOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogYW55O1xyXG4gICAgbWVzc2FnZUlkOiBudW1iZXIgfCBudWxsO1xyXG4gICAgc3BlY2lmaWNIYXNoOiBudW1iZXIgfCBudWxsO1xyXG4gICAgaW5zZXJ0ZWQ6IGFueVtdIHwgbnVsbDtcclxuICAgIHVwZGF0ZWQ6IGFueVtdIHwgbnVsbDtcclxuICAgIGRlbGV0ZWQ6IGFueVtdIHwgbnVsbDtcclxuICAgIGxlbmd0aDogbnVtYmVyIHwgbnVsbDtcclxuICB9KSB7XHJcbiAgICB0aGlzLmxvZ0VudHJ5KCdSRUNFSVZFRDonICsgbWV0aG9kKTtcclxuICAgIGlmIChtZXRob2QgPT0gJ19fX2NhY2hlJykge1xyXG4gICAgICB0aGlzLmhhbmRsZU91dGJvdW5kQ2FjaGVSZXF1ZXN0KHZhbHVlKTtcclxuICAgIH1cclxuICAgIGlmIChtZXNzYWdlSWQpIHtcclxuICAgICAgaWYgKG1ldGhvZCA9PSAnbS5lcnJvcicpIHtcclxuICAgICAgICBjb25zdCByZWplY3QgPSB0aGlzLnJlamVjdENhbGxiYWNrcy5nZXQobWVzc2FnZUlkKTtcclxuICAgICAgICBpZiAocmVqZWN0KSB7XHJcbiAgICAgICAgICByZWplY3QodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtZXNzYWdlSWQgPSAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXNzYWdlSWQgIT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuZXhwZWN0ZWRNZXRob2RzLmdldChtZXNzYWdlSWQpO1xyXG4gICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBmdW5jID0gY2FsbGJhY2suc2hpZnQoKTtcclxuICAgICAgICBpZiAoZnVuYykgZnVuYyh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5pbnZva2VTdWNjZXNzSGFuZGxlcnMobWV0aG9kKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuZXhwZWN0ZWRNZXRob2RzLmdldChtZXRob2QpO1xyXG4gICAgICAgIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjay5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBmdW5jID0gY2FsbGJhY2suc2hpZnQoKTtcclxuICAgICAgICAgIGlmIChmdW5jKSBmdW5jKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgb3V0ID0gV2Vic29ja2V0Q2xpZW50Lm91dGJvdW5kcy5nZXQobWV0aG9kKTtcclxuICAgICAgICAgIGlmIChvdXQpIHtcclxuICAgICAgICAgICAgb3V0KHZhbHVlLCBzcGVjaWZpY0hhc2gsIGluc2VydGVkLCB1cGRhdGVkLCBkZWxldGVkLCBsZW5ndGgsIHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgaGFuZGxlID0gV2Vic29ja2V0Q2xpZW50LmhhbmRsZXMuZ2V0KG1ldGhvZCk7XHJcbiAgICAgICAgICBpZiAoaGFuZGxlKSB7XHJcbiAgICAgICAgICAgIChoYW5kbGUuRnVuYyBhcyBGdW5jdGlvbikodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgJ05vIE1lc3NhZ2VJZCB3YXMgcHJvdmlkZWQsIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVPdXRib3VuZENhY2hlUmVxdWVzdChtZXRob2Q6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuZGJTZXJ2aWNlKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYlNlcnZpY2UuZ2V0QnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKS5zdWJzY3JpYmUoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5zZW5kKCdfX19jYWNoZScsIHtcclxuICAgICAgICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgICAgICAgc3BlY2lmaWNIYXNoOiBpdGVtLnNwZWNpZmljSGFzaCB8fCBudWxsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZW5kKCdfX19jYWNoZScsIHtcclxuICAgICAgICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgICAgICAgc3BlY2lmaWNIYXNoOiBudWxsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhpcy5zZW5kKCdfX19jYWNoZScsIHtcclxuICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgIHNwZWNpZmljSGFzaDogbnVsbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6ICcgKyBlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZW5kKCdfX19jYWNoZScsIHtcclxuICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgc3BlY2lmaWNIYXNoOiBudWxsXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICdBY3RpdmUtQ29ubmVjdDogQ2FjaGluZyBub3QgcG9zc2libGUgYXMgdGhlIGluZGV4ZWREQiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBvdXRib3VuZHM6IE1hcDxcclxuICAgIHN0cmluZyxcclxuICAgIChcclxuICAgICAgZGF0YTogYW55LFxyXG4gICAgICBzcGVjaWZpY0hhc2g6IG51bWJlciB8IG51bGwsXHJcbiAgICAgIGluc2VydGVkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgIHVwZGF0ZWQ6IGFueVtdIHwgbnVsbCxcclxuICAgICAgZGVsZXRlZDogYW55W10gfCBudWxsLFxyXG4gICAgICBsZW5ndGg6IG51bWJlciB8IG51bGwsXHJcbiAgICAgIF90aGlzOiBXZWJzb2NrZXRDbGllbnRcclxuICAgICkgPT4gdm9pZFxyXG4gID4gPSBuZXcgTWFwKCk7XHJcbiAgc3RhdGljIGV4cGVjdE91dGJvdW5kKFxyXG4gICAgbWV0aG9kOiBzdHJpbmcsXHJcbiAgICBjYWxsYmFjazogKFxyXG4gICAgICBkYXRhOiBhbnksXHJcbiAgICAgIHNwZWNpZmljSGFzaDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgaW5zZXJ0ZWQ6IGFueVtdIHwgbnVsbCxcclxuICAgICAgdXBkYXRlZDogYW55W10gfCBudWxsLFxyXG4gICAgICBkZWxldGVkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgIGxlbmd0aDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgX3RoaXM6IFdlYnNvY2tldENsaWVudFxyXG4gICAgKSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBXZWJzb2NrZXRDbGllbnQub3V0Ym91bmRzLnNldChtZXRob2QsIGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGhhbmRsZXM6IE1hcDxzdHJpbmcsIERlY29yYWJsZUZ1bmN0aW9uPiA9IG5ldyBNYXAoKTtcclxuICBzdGF0aWMgcmVnaXN0ZXJIYW5kbGUobWV0aG9kOiBzdHJpbmcsIGNhbGxiYWNrOiBEZWNvcmFibGVGdW5jdGlvbikge1xyXG4gICAgV2Vic29ja2V0Q2xpZW50LmhhbmRsZXMuc2V0KG1ldGhvZCwgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLndzKSByZXR1cm4gdGhpcy53cy5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5PUEVOO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmRCcm93c2VySW5mb1RvU2VydmVyKCkge1xyXG4gICAgLy8gc2VuZCBicm93c2VyIC8gb3MgaW5mb3JtYXRpb25cclxuICAgIGNvbnN0IGJyb3dzZXIgPSB0aGlzLmdldEJyb3dzZXIoKTtcclxuICAgIGNvbnN0IG9zID0gdGhpcy5nZXRPUygpO1xyXG4gICAgdGhpcy5zZW5kKCdfX19icm93c2VyJywge1xyXG4gICAgICBicm93c2VyOiBgJHticm93c2VyLm5hbWV9ICR7YnJvd3Nlci52ZXJzaW9ufSAke29zfWBcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEJyb3dzZXIoKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHtcclxuICAgIC8vIGh0dHBzOi8vd3d3LmdyZWdvcnl2YXJnaGVzZS5jb20vaG93LXRvLWdldC1icm93c2VyLW5hbWUtYW5kLXZlcnNpb24tdmlhLWphdmFzY3JpcHQvXHJcbiAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LFxyXG4gICAgICB0ZW0sXHJcbiAgICAgIE0gPVxyXG4gICAgICAgIHVhLm1hdGNoKFxyXG4gICAgICAgICAgLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XFwvKSlcXC8/XFxzKihcXGQrKS9pXHJcbiAgICAgICAgKSB8fCBbXTtcclxuICAgIGlmICgvdHJpZGVudC9pLnRlc3QoTVsxXSkpIHtcclxuICAgICAgdGVtID0gL1xcYnJ2WyA6XSsoXFxkKykvZy5leGVjKHVhKSB8fCBbXTtcclxuICAgICAgcmV0dXJuIHsgbmFtZTogJ0lFICcsIHZlcnNpb246IHRlbVsxXSB8fCAnJyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKE1bMV0gPT09ICdDaHJvbWUnKSB7XHJcbiAgICAgIHRlbSA9IHVhLm1hdGNoKC9cXGJPUFJcXC8oXFxkKykvKTtcclxuICAgICAgaWYgKHRlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgbmFtZTogJ09wZXJhJywgdmVyc2lvbjogdGVtWzFdIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIE0gPSBNWzJdID8gW01bMV0sIE1bMl1dIDogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XHJcbiAgICBpZiAoKHRlbSA9IHVhLm1hdGNoKC92ZXJzaW9uXFwvKFxcZCspL2kpKSAhPSBudWxsKSB7XHJcbiAgICAgIE0uc3BsaWNlKDEsIDEsIHRlbVsxXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lOiBNWzBdLFxyXG4gICAgICB2ZXJzaW9uOiBNWzFdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE9TKCk6IHN0cmluZyB7XHJcbiAgICB2YXIgdXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsXHJcbiAgICAgIHBsYXRmb3JtID0gd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSxcclxuICAgICAgbWFjb3NQbGF0Zm9ybXMgPSBbJ01hY2ludG9zaCcsICdNYWNJbnRlbCcsICdNYWNQUEMnLCAnTWFjNjhLJ10sXHJcbiAgICAgIHdpbmRvd3NQbGF0Zm9ybXMgPSBbJ1dpbjMyJywgJ1dpbjY0JywgJ1dpbmRvd3MnLCAnV2luQ0UnXSxcclxuICAgICAgaW9zUGxhdGZvcm1zID0gWydpUGhvbmUnLCAnaVBhZCcsICdpUG9kJ10sXHJcbiAgICAgIG9zID0gbnVsbDtcclxuXHJcbiAgICBpZiAobWFjb3NQbGF0Zm9ybXMuaW5kZXhPZihwbGF0Zm9ybSkgIT09IC0xKSB7XHJcbiAgICAgIG9zID0gJ01hYyBPUyc7XHJcbiAgICB9IGVsc2UgaWYgKGlvc1BsYXRmb3Jtcy5pbmRleE9mKHBsYXRmb3JtKSAhPT0gLTEpIHtcclxuICAgICAgb3MgPSAnaU9TJztcclxuICAgIH0gZWxzZSBpZiAod2luZG93c1BsYXRmb3Jtcy5pbmRleE9mKHBsYXRmb3JtKSAhPT0gLTEpIHtcclxuICAgICAgb3MgPSAnV2luZG93cyc7XHJcbiAgICB9IGVsc2UgaWYgKC9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCkpIHtcclxuICAgICAgb3MgPSAnQW5kcm9pZCc7XHJcbiAgICB9IGVsc2UgaWYgKCFvcyAmJiAvTGludXgvLnRlc3QocGxhdGZvcm0pKSB7XHJcbiAgICAgIG9zID0gJ0xpbnV4JztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3MgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBvblN1Y2Nlc3NIYW5kbGVyczoge1xyXG4gICAgY2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uO1xyXG4gICAgcmVnZXhwOiBSZWdFeHA7XHJcbiAgfVtdID0gW107XHJcbiAgcHVibGljIHN0YXRpYyBvblN1Y2Nlc3MoY2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uLCByZWdleHA6IFJlZ0V4cCkge1xyXG4gICAgdGhpcy5vblN1Y2Nlc3NIYW5kbGVycy5wdXNoKHsgY2FsbGJhY2ssIHJlZ2V4cCB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIG9uUmVjb25uZWN0Q2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uW10gPSBbXTtcclxuICBzdGF0aWMgb25SZWNvbm5lY3QoY2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uKSB7XHJcbiAgICBXZWJzb2NrZXRDbGllbnQub25SZWNvbm5lY3RDYWxsYmFjay5wdXNoKGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW52b2tlU3VjY2Vzc0hhbmRsZXJzKG1ldGhvZDogc3RyaW5nKSB7XHJcbiAgICBXZWJzb2NrZXRDbGllbnQub25TdWNjZXNzSGFuZGxlcnNcclxuICAgICAgLmZpbHRlcigoZSkgPT4gZS5yZWdleHAudGVzdChtZXRob2QpKVxyXG4gICAgICAuZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgIHZhciByZXMgPSAoZS5jYWxsYmFjay5GdW5jIGFzIEZ1bmN0aW9uKSgpO1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnRoZW4pIHtcclxuICAgICAgICAgIHJlcy50aGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgZGlzY29ubmVjdChyZXN0YXJ0PzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuY2xlYXJSZWNvbm5lY3RUaW1lcigpO1xyXG4gICAgdGhpcy5jbGVhckhhbmRzaGFrZVRpbWVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMud3MpIHRoaXMud3MuY2xvc2UoKTtcclxuXHJcbiAgICBpZiAoIXJlc3RhcnQpIHtcclxuICAgICAgdGhpcy53cy5vbm9wZW4gPSBudWxsO1xyXG4gICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25lcnJvciA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25jbG9zZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDYWNoZSgpIHt9XHJcblxyXG4gIGdldCB0YXJnZXQoKTogYW55IHtcclxuICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9fcHJvdG9fXztcclxuICB9XHJcbn1cclxuIl19
@@ -1,40 +0,0 @@
1
- /**
2
- * Represents the reference to an object method used for websocket routes and outbounds.
3
- */
4
- export class DecorableFunction {
5
- /**
6
- * Creates an instance of DecorableFunction.
7
- * @param objConfig - The configuration object for the object method.
8
- * @param objConfig.target - The target object.
9
- * @param objConfig.propertyKey - The property key of the target object.
10
- */
11
- constructor(objConfig) {
12
- this.objConfig = objConfig;
13
- // singelton service - fetch from angular
14
- const prototype = this.objConfig.target.prototype || this.objConfig.target;
15
- if (!prototype.___constructorOverridden) {
16
- prototype.___constructorOverridden = true;
17
- }
18
- }
19
- /**
20
- * Returns the decorated function.
21
- * @returns - The decorated function.
22
- */
23
- get Func() {
24
- if (this.objConfig?.target &&
25
- this.objConfig.target[this.objConfig.propertyKey]) {
26
- return this.objConfig.target[this.objConfig.propertyKey].bind(this.getBindObject());
27
- }
28
- return null;
29
- }
30
- /**
31
- * Returns the bind object.
32
- * @private
33
- * @returns - The bind object.
34
- */
35
- getBindObject() {
36
- const prototype = this.objConfig.target.prototype || this.objConfig.target;
37
- return prototype.___data._obj;
38
- }
39
- }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY3RpdmUtY29ubmVjdC1uZzIvc3JjL2xpYi93ZWJzb2NrZXQvZGVjb3JhdG9ycy9mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUI7Ozs7O09BS0c7SUFDSCxZQUFzQixTQUErQztRQUEvQyxjQUFTLEdBQVQsU0FBUyxDQUFzQztRQUNuRSx5Q0FBeUM7UUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzNFLElBQUksQ0FBQyxTQUFTLENBQUMsd0JBQXdCLEVBQUU7WUFDdkMsU0FBUyxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztTQUMzQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLElBQUk7UUFDYixJQUNFLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTTtZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUNqRDtZQUNBLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQzNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FDckIsQ0FBQztTQUNIO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWE7UUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzNFLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgbWV0aG9kIHVzZWQgZm9yIHdlYnNvY2tldCByb3V0ZXMgYW5kIG91dGJvdW5kcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBEZWNvcmFibGVGdW5jdGlvbiB7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEZWNvcmFibGVGdW5jdGlvbi5cclxuICAgKiBAcGFyYW0gb2JqQ29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgb2JqZWN0IG1ldGhvZC5cclxuICAgKiBAcGFyYW0gb2JqQ29uZmlnLnRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBvYmpDb25maWcucHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSB0YXJnZXQgb2JqZWN0LlxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBvYmpDb25maWc6IHsgdGFyZ2V0OiBhbnk7IHByb3BlcnR5S2V5OiBzdHJpbmcgfSkge1xyXG4gICAgLy8gc2luZ2VsdG9uIHNlcnZpY2UgLSBmZXRjaCBmcm9tIGFuZ3VsYXJcclxuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMub2JqQ29uZmlnLnRhcmdldC5wcm90b3R5cGUgfHwgdGhpcy5vYmpDb25maWcudGFyZ2V0O1xyXG4gICAgaWYgKCFwcm90b3R5cGUuX19fY29uc3RydWN0b3JPdmVycmlkZGVuKSB7XHJcbiAgICAgIHByb3RvdHlwZS5fX19jb25zdHJ1Y3Rvck92ZXJyaWRkZW4gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZGVjb3JhdGVkIGZ1bmN0aW9uLlxyXG4gICAqIEByZXR1cm5zIC0gVGhlIGRlY29yYXRlZCBmdW5jdGlvbi5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IEZ1bmMoKTogKCguLi5kYXRhOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+IHwgYW55KSB8IG51bGwge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9iakNvbmZpZz8udGFyZ2V0ICYmXHJcbiAgICAgIHRoaXMub2JqQ29uZmlnLnRhcmdldFt0aGlzLm9iakNvbmZpZy5wcm9wZXJ0eUtleV1cclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy5vYmpDb25maWcudGFyZ2V0W3RoaXMub2JqQ29uZmlnLnByb3BlcnR5S2V5XS5iaW5kKFxyXG4gICAgICAgIHRoaXMuZ2V0QmluZE9iamVjdCgpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGJpbmQgb2JqZWN0LlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHJldHVybnMgLSBUaGUgYmluZCBvYmplY3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRCaW5kT2JqZWN0KCk6IGFueSB7XHJcbiAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLm9iakNvbmZpZy50YXJnZXQucHJvdG90eXBlIHx8IHRoaXMub2JqQ29uZmlnLnRhcmdldDtcclxuICAgIHJldHVybiBwcm90b3R5cGUuX19fZGF0YS5fb2JqO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,9 +0,0 @@
1
- import { WebsocketClient } from '../../client';
2
- import { DecorableFunction } from '../function';
3
- export function Handle(method) {
4
- return function _Handle(target, propertyKey) {
5
- // method annotation
6
- WebsocketClient.registerHandle(method, new DecorableFunction({ target, propertyKey }));
7
- };
8
- }
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9saWIvd2Vic29ja2V0L2RlY29yYXRvcnMvd2Vic29ja2V0L2hhbmRsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxNQUFNLFVBQVUsTUFBTSxDQUFDLE1BQWM7SUFDbkMsT0FBTyxTQUFTLE9BQU8sQ0FBQyxNQUFXLEVBQUUsV0FBbUI7UUFDdEQsb0JBQW9CO1FBQ3BCLGVBQWUsQ0FBQyxjQUFjLENBQzVCLE1BQU0sRUFDTixJQUFJLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQy9DLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2Vic29ja2V0Q2xpZW50IH0gZnJvbSAnLi4vLi4vY2xpZW50JztcclxuaW1wb3J0IHsgRGVjb3JhYmxlRnVuY3Rpb24gfSBmcm9tICcuLi9mdW5jdGlvbic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSGFuZGxlKG1ldGhvZDogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIF9IYW5kbGUodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgLy8gbWV0aG9kIGFubm90YXRpb25cclxuICAgIFdlYnNvY2tldENsaWVudC5yZWdpc3RlckhhbmRsZShcclxuICAgICAgbWV0aG9kLFxyXG4gICAgICBuZXcgRGVjb3JhYmxlRnVuY3Rpb24oeyB0YXJnZXQsIHByb3BlcnR5S2V5IH0pXHJcbiAgICApO1xyXG4gIH07XHJcbn1cclxuIl19
@@ -1,6 +0,0 @@
1
- import { WebsocketClient } from '../../client';
2
- import { DecorableFunction } from '../function';
3
- export function OnReconnect(target, propertyKey) {
4
- WebsocketClient.onReconnect(new DecorableFunction({ target, propertyKey }));
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib24tcmVjb25uZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9saWIvd2Vic29ja2V0L2RlY29yYXRvcnMvd2Vic29ja2V0L29uLXJlY29ubmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQVcsRUFBRSxXQUFtQjtJQUMxRCxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksaUJBQWlCLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXZWJzb2NrZXRDbGllbnQgfSBmcm9tICcuLi8uLi9jbGllbnQnO1xyXG5pbXBvcnQgeyBEZWNvcmFibGVGdW5jdGlvbiB9IGZyb20gJy4uL2Z1bmN0aW9uJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBPblJlY29ubmVjdCh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykge1xyXG4gIFdlYnNvY2tldENsaWVudC5vblJlY29ubmVjdChuZXcgRGVjb3JhYmxlRnVuY3Rpb24oeyB0YXJnZXQsIHByb3BlcnR5S2V5IH0pKTtcclxufVxyXG4iXX0=
@@ -1,8 +0,0 @@
1
- import { WebsocketClient } from '../../client';
2
- import { DecorableFunction } from '../function';
3
- export function OnSuccess(regexp) {
4
- return function _Route(target, propertyKey) {
5
- WebsocketClient.onSuccess(new DecorableFunction({ target, propertyKey }), regexp);
6
- };
7
- }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib24tc3VjY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZS1jb25uZWN0LW5nMi9zcmMvbGliL3dlYnNvY2tldC9kZWNvcmF0b3JzL3dlYnNvY2tldC9vbi1zdWNjZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWhELE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBYztJQUN0QyxPQUFPLFNBQVMsTUFBTSxDQUFDLE1BQVcsRUFBRSxXQUFtQjtRQUNyRCxlQUFlLENBQUMsU0FBUyxDQUN2QixJQUFJLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQzlDLE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdlYnNvY2tldENsaWVudCB9IGZyb20gJy4uLy4uL2NsaWVudCc7XHJcbmltcG9ydCB7IERlY29yYWJsZUZ1bmN0aW9uIH0gZnJvbSAnLi4vZnVuY3Rpb24nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIE9uU3VjY2VzcyhyZWdleHA6IFJlZ0V4cCkge1xyXG4gIHJldHVybiBmdW5jdGlvbiBfUm91dGUodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgV2Vic29ja2V0Q2xpZW50Lm9uU3VjY2VzcyhcclxuICAgICAgbmV3IERlY29yYWJsZUZ1bmN0aW9uKHsgdGFyZ2V0LCBwcm9wZXJ0eUtleSB9KSxcclxuICAgICAgcmVnZXhwXHJcbiAgICApO1xyXG4gIH07XHJcbn1cclxuIl19