@esfaenza/extensions 15.2.48 → 15.2.50

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 (65) hide show
  1. package/{esm2022 → esm2020}/esfaenza-extensions.mjs +4 -4
  2. package/esm2020/lib/models/CallResult.mjs +6 -0
  3. package/esm2020/lib/models/CsvHeaders.mjs +6 -0
  4. package/{esm2022 → esm2020}/lib/models/ExportConsts.mjs +31 -31
  5. package/esm2020/lib/models/ExtensionsModuleConfig.mjs +4 -0
  6. package/esm2020/lib/models/GenericItem.mjs +6 -0
  7. package/{esm2022 → esm2020}/lib/models/InboundMessageTypes.mjs +6 -6
  8. package/esm2020/lib/models/InterComMessage.mjs +14 -0
  9. package/{esm2022 → esm2020}/lib/models/TypeCode.mjs +24 -24
  10. package/{esm2022 → esm2020}/lib/modules/extensions.module.mjs +32 -32
  11. package/esm2020/lib/pipes/loc_date.pipe.mjs +37 -0
  12. package/esm2020/lib/services/extensions.base.mjs +29 -0
  13. package/esm2020/lib/services/extensions.clipboard.service.mjs +219 -0
  14. package/esm2020/lib/services/extensions.dates.service.mjs +246 -0
  15. package/esm2020/lib/services/extensions.embedding.service.mjs +208 -0
  16. package/esm2020/lib/services/extensions.exports.service.mjs +615 -0
  17. package/esm2020/lib/services/extensions.hashing.service.mjs +310 -0
  18. package/esm2020/lib/services/extensions.intercom.service.mjs +54 -0
  19. package/esm2020/lib/services/extensions.messages.service.mjs +433 -0
  20. package/esm2020/lib/services/extensions.utilities.service.mjs +252 -0
  21. package/{esm2022 → esm2020}/lib/tokens.mjs +11 -11
  22. package/{esm2022 → esm2020}/public-api.mjs +21 -21
  23. package/fesm2015/esfaenza-extensions.mjs +2517 -0
  24. package/fesm2015/esfaenza-extensions.mjs.map +1 -0
  25. package/{fesm2022 → fesm2020}/esfaenza-extensions.mjs +2445 -2509
  26. package/fesm2020/esfaenza-extensions.mjs.map +1 -0
  27. package/index.d.ts +5 -5
  28. package/lib/models/CallResult.d.ts +23 -23
  29. package/lib/models/CsvHeaders.d.ts +25 -25
  30. package/lib/models/ExportConsts.d.ts +31 -31
  31. package/lib/models/ExtensionsModuleConfig.d.ts +9 -9
  32. package/lib/models/GenericItem.d.ts +9 -9
  33. package/lib/models/InboundMessageTypes.d.ts +5 -5
  34. package/lib/models/InterComMessage.d.ts +12 -12
  35. package/lib/models/TypeCode.d.ts +23 -23
  36. package/lib/modules/extensions.module.d.ts +11 -11
  37. package/lib/pipes/loc_date.pipe.d.ts +24 -24
  38. package/lib/services/extensions.base.d.ts +22 -22
  39. package/lib/services/extensions.clipboard.service.d.ts +54 -54
  40. package/lib/services/extensions.dates.service.d.ts +101 -99
  41. package/lib/services/extensions.embedding.service.d.ts +28 -28
  42. package/lib/services/extensions.exports.service.d.ts +234 -234
  43. package/lib/services/extensions.hashing.service.d.ts +121 -121
  44. package/lib/services/extensions.intercom.service.d.ts +28 -28
  45. package/lib/services/extensions.messages.service.d.ts +195 -195
  46. package/lib/services/extensions.utilities.service.d.ts +107 -107
  47. package/lib/tokens.d.ts +11 -11
  48. package/package.json +11 -5
  49. package/public-api.d.ts +18 -18
  50. package/esm2022/lib/models/CallResult.mjs +0 -24
  51. package/esm2022/lib/models/CsvHeaders.mjs +0 -26
  52. package/esm2022/lib/models/ExtensionsModuleConfig.mjs +0 -10
  53. package/esm2022/lib/models/GenericItem.mjs +0 -10
  54. package/esm2022/lib/models/InterComMessage.mjs +0 -16
  55. package/esm2022/lib/pipes/loc_date.pipe.mjs +0 -38
  56. package/esm2022/lib/services/extensions.base.mjs +0 -30
  57. package/esm2022/lib/services/extensions.clipboard.service.mjs +0 -221
  58. package/esm2022/lib/services/extensions.dates.service.mjs +0 -244
  59. package/esm2022/lib/services/extensions.embedding.service.mjs +0 -213
  60. package/esm2022/lib/services/extensions.exports.service.mjs +0 -617
  61. package/esm2022/lib/services/extensions.hashing.service.mjs +0 -308
  62. package/esm2022/lib/services/extensions.intercom.service.mjs +0 -52
  63. package/esm2022/lib/services/extensions.messages.service.mjs +0 -450
  64. package/esm2022/lib/services/extensions.utilities.service.mjs +0 -250
  65. package/fesm2022/esfaenza-extensions.mjs.map +0 -1
@@ -0,0 +1,310 @@
1
+ // Angular
2
+ import { Injectable } from "@angular/core";
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Service che fornisce alcuni semplici funzioni di Hashing / GUID / ecc...
6
+ */
7
+ export class HashingService {
8
+ constructor() {
9
+ /**
10
+ * Blacklist dei tipi da ignorare quando si effettua l'hashing degli oggetti
11
+ */
12
+ this.objBlacklist = {
13
+ "NgForm": true, "ElementRef": true, "ExtensionsService": true, "ToastrService": true, "LocaleService": true, "AppState": true, "Router": true,
14
+ "ActivatedRoute": true, "HTTPService": true, "Location": true, "CanvasComponent": true, "ModalDirective": true, "ChangeDetectorRef": true,
15
+ "DateService": true, "EventEmitter": true, "ViewRef_": true, "Subscriber": true, "ItemLocalization": true
16
+ };
17
+ /**
18
+ * Array dei possibili valori di un simbolo esadecimale
19
+ */
20
+ this.hex_chr = '0123456789abcdef'.split('');
21
+ }
22
+ /**
23
+ * Generazione di un GUID pseudo-univoco
24
+ *
25
+ * @returns {string} il GUID generato
26
+ */
27
+ getGUID() {
28
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c => {
29
+ var r = Math.random() * 16 | 0, v = c == "x" ? r : (r & 0x3 | 0x8);
30
+ return v.toString(16);
31
+ });
32
+ }
33
+ /**
34
+ * Calcolo dell'hash su un oggetto
35
+ *
36
+ * @param {any} o Oggetto di cui calcolare l'hash
37
+ * @param {number} level Livello di ricorsione nel caso venga effettuato l'hash di un oggetto che contiene altri oggetti
38
+ * @param {boolean} navigateFullDepth Indica se navigare l'oggetto per l'intera lunghezza. In caso contrario si ferma al secondo livello
39
+ *
40
+ * @returns {string} Hash generato per l'oggetto in questione
41
+ */
42
+ hashObject(o, level = 0, navigateFullDepth = false, precise = false) {
43
+ var strDef = this.stringify(o, level, navigateFullDepth);
44
+ var hash = precise ? this.md5(strDef) : this.simpleHash(strDef);
45
+ return hash;
46
+ }
47
+ /**
48
+ * Hash più semplice e più veloce dell'md5, ma meno sicuro
49
+ *
50
+ * Vedi https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript
51
+ *
52
+ * @param {string} str Stringa di cui calcolare l'hash
53
+ */
54
+ simpleHash(str, seed = 0) {
55
+ let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
56
+ for (let i = 0, ch; i < str.length; i++) {
57
+ ch = str.charCodeAt(i);
58
+ h1 = Math.imul(h1 ^ ch, 2654435761);
59
+ h2 = Math.imul(h2 ^ ch, 1597334677);
60
+ }
61
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
62
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
63
+ return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString();
64
+ }
65
+ /**
66
+ * Genera una stringa che identifica univocamente l'oggetto in questione
67
+ *
68
+ * @param {any} o Oggetto di cui calcolare la stringa univoca
69
+ * @param {number} level Livello di ricorsione nel caso venga effettuato l'hash di un oggetto che contiene altri oggetti
70
+ * @param {boolean} navigateFullDepth Indica se navigare l'oggetto per l'intera lunghezza. In caso contrario si ferma al secondo livello
71
+ */
72
+ stringify(o, level, navigateFullDepth) {
73
+ var i, r;
74
+ if (o === null)
75
+ return "n";
76
+ if (o === true)
77
+ return "t";
78
+ if (o === false)
79
+ return "f";
80
+ if (o instanceof Date)
81
+ return 'd:' + o.valueOf().toString();
82
+ i = typeof o;
83
+ if (i === "string")
84
+ return "s:" + o;
85
+ if (i === "number")
86
+ return "n:" + o;
87
+ if (o instanceof Function)
88
+ return "m:" + o.toString();
89
+ if (o instanceof Array) {
90
+ r = [];
91
+ for (i = 0; i < o.length; i++) {
92
+ let res = this.stringify(o[i], level, navigateFullDepth);
93
+ if (res)
94
+ r.push(res);
95
+ }
96
+ return r.length > 0 ? "a:" + r.join(";") : "";
97
+ }
98
+ r = [];
99
+ //Se è oggetto, escludo tutti quelli di sistema/inutili
100
+ if (o) {
101
+ var name = o.__proto__.constructor.name;
102
+ if (!this.objBlacklist[name]) {
103
+ for (i in o) {
104
+ if (o.hasOwnProperty(i) && (level <= 2 || navigateFullDepth)) {
105
+ let res = this.stringify(o[i], level + 1, navigateFullDepth);
106
+ if (res)
107
+ r.push(i + ":" + res);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ return r.length > 0 ? "o:" + r.join(";") : "";
113
+ }
114
+ /**
115
+ * Data una stringa restituisce l'md5
116
+ *
117
+ * @param {string} s Stringa di cui calcolare l'md5
118
+ * @returns {string} md5 della stringa **s**
119
+ */
120
+ md5(s) {
121
+ return this.hex(this.md51(s));
122
+ }
123
+ /**
124
+ * @ignore
125
+ *
126
+ * Metodo di utilità per il calcolo dell'md5
127
+ */
128
+ md5cycle(x, k) {
129
+ var a = x[0], b = x[1], c = x[2], d = x[3];
130
+ a = this.ff(a, b, c, d, k[0], 7, -680876936);
131
+ d = this.ff(d, a, b, c, k[1], 12, -389564586);
132
+ c = this.ff(c, d, a, b, k[2], 17, 606105819);
133
+ b = this.ff(b, c, d, a, k[3], 22, -1044525330);
134
+ a = this.ff(a, b, c, d, k[4], 7, -176418897);
135
+ d = this.ff(d, a, b, c, k[5], 12, 1200080426);
136
+ c = this.ff(c, d, a, b, k[6], 17, -1473231341);
137
+ b = this.ff(b, c, d, a, k[7], 22, -45705983);
138
+ a = this.ff(a, b, c, d, k[8], 7, 1770035416);
139
+ d = this.ff(d, a, b, c, k[9], 12, -1958414417);
140
+ c = this.ff(c, d, a, b, k[10], 17, -42063);
141
+ b = this.ff(b, c, d, a, k[11], 22, -1990404162);
142
+ a = this.ff(a, b, c, d, k[12], 7, 1804603682);
143
+ d = this.ff(d, a, b, c, k[13], 12, -40341101);
144
+ c = this.ff(c, d, a, b, k[14], 17, -1502002290);
145
+ b = this.ff(b, c, d, a, k[15], 22, 1236535329);
146
+ a = this.gg(a, b, c, d, k[1], 5, -165796510);
147
+ d = this.gg(d, a, b, c, k[6], 9, -1069501632);
148
+ c = this.gg(c, d, a, b, k[11], 14, 643717713);
149
+ b = this.gg(b, c, d, a, k[0], 20, -373897302);
150
+ a = this.gg(a, b, c, d, k[5], 5, -701558691);
151
+ d = this.gg(d, a, b, c, k[10], 9, 38016083);
152
+ c = this.gg(c, d, a, b, k[15], 14, -660478335);
153
+ b = this.gg(b, c, d, a, k[4], 20, -405537848);
154
+ a = this.gg(a, b, c, d, k[9], 5, 568446438);
155
+ d = this.gg(d, a, b, c, k[14], 9, -1019803690);
156
+ c = this.gg(c, d, a, b, k[3], 14, -187363961);
157
+ b = this.gg(b, c, d, a, k[8], 20, 1163531501);
158
+ a = this.gg(a, b, c, d, k[13], 5, -1444681467);
159
+ d = this.gg(d, a, b, c, k[2], 9, -51403784);
160
+ c = this.gg(c, d, a, b, k[7], 14, 1735328473);
161
+ b = this.gg(b, c, d, a, k[12], 20, -1926607734);
162
+ a = this.hh(a, b, c, d, k[5], 4, -378558);
163
+ d = this.hh(d, a, b, c, k[8], 11, -2022574463);
164
+ c = this.hh(c, d, a, b, k[11], 16, 1839030562);
165
+ b = this.hh(b, c, d, a, k[14], 23, -35309556);
166
+ a = this.hh(a, b, c, d, k[1], 4, -1530992060);
167
+ d = this.hh(d, a, b, c, k[4], 11, 1272893353);
168
+ c = this.hh(c, d, a, b, k[7], 16, -155497632);
169
+ b = this.hh(b, c, d, a, k[10], 23, -1094730640);
170
+ a = this.hh(a, b, c, d, k[13], 4, 681279174);
171
+ d = this.hh(d, a, b, c, k[0], 11, -358537222);
172
+ c = this.hh(c, d, a, b, k[3], 16, -722521979);
173
+ b = this.hh(b, c, d, a, k[6], 23, 76029189);
174
+ a = this.hh(a, b, c, d, k[9], 4, -640364487);
175
+ d = this.hh(d, a, b, c, k[12], 11, -421815835);
176
+ c = this.hh(c, d, a, b, k[15], 16, 530742520);
177
+ b = this.hh(b, c, d, a, k[2], 23, -995338651);
178
+ a = this.ii(a, b, c, d, k[0], 6, -198630844);
179
+ d = this.ii(d, a, b, c, k[7], 10, 1126891415);
180
+ c = this.ii(c, d, a, b, k[14], 15, -1416354905);
181
+ b = this.ii(b, c, d, a, k[5], 21, -57434055);
182
+ a = this.ii(a, b, c, d, k[12], 6, 1700485571);
183
+ d = this.ii(d, a, b, c, k[3], 10, -1894986606);
184
+ c = this.ii(c, d, a, b, k[10], 15, -1051523);
185
+ b = this.ii(b, c, d, a, k[1], 21, -2054922799);
186
+ a = this.ii(a, b, c, d, k[8], 6, 1873313359);
187
+ d = this.ii(d, a, b, c, k[15], 10, -30611744);
188
+ c = this.ii(c, d, a, b, k[6], 15, -1560198380);
189
+ b = this.ii(b, c, d, a, k[13], 21, 1309151649);
190
+ a = this.ii(a, b, c, d, k[4], 6, -145523070);
191
+ d = this.ii(d, a, b, c, k[11], 10, -1120210379);
192
+ c = this.ii(c, d, a, b, k[2], 15, 718787259);
193
+ b = this.ii(b, c, d, a, k[9], 21, -343485551);
194
+ x[0] = this.add32(a, x[0]);
195
+ x[1] = this.add32(b, x[1]);
196
+ x[2] = this.add32(c, x[2]);
197
+ x[3] = this.add32(d, x[3]);
198
+ }
199
+ /**
200
+ * @ignore
201
+ *
202
+ * Metodo di utilità per il calcolo dell'md5
203
+ */
204
+ cmn(q, a, b, x, s, t) {
205
+ a = this.add32(this.add32(a, q), this.add32(x, t));
206
+ return this.add32((a << s) | (a >>> (32 - s)), b);
207
+ }
208
+ /**
209
+ * @ignore
210
+ *
211
+ * Metodo di utilità per il calcolo dell'md5
212
+ */
213
+ ff(a, b, c, d, x, s, t) {
214
+ return this.cmn((b & c) | ((~b) & d), a, b, x, s, t);
215
+ }
216
+ /**
217
+ * @ignore
218
+ *
219
+ * Metodo di utilità per il calcolo dell'md5
220
+ */
221
+ gg(a, b, c, d, x, s, t) {
222
+ return this.cmn((b & d) | (c & (~d)), a, b, x, s, t);
223
+ }
224
+ /**
225
+ * @ignore
226
+ *
227
+ * Metodo di utilità per il calcolo dell'md5
228
+ */
229
+ hh(a, b, c, d, x, s, t) {
230
+ return this.cmn(b ^ c ^ d, a, b, x, s, t);
231
+ }
232
+ /**
233
+ * @ignore
234
+ *
235
+ * Metodo di utilità per il calcolo dell'md5
236
+ */
237
+ ii(a, b, c, d, x, s, t) {
238
+ return this.cmn(c ^ (b | (~d)), a, b, x, s, t);
239
+ }
240
+ /**
241
+ * @ignore
242
+ *
243
+ * Metodo di utilità per il calcolo dell'md5
244
+ */
245
+ md51(s) {
246
+ var n = s.length, state = [1732584193, -271733879, -1732584194, 271733878], i;
247
+ for (i = 64; i <= s.length; i += 64)
248
+ this.md5cycle(state, this.md5blk(s.substring(i - 64, i)));
249
+ s = s.substring(i - 64);
250
+ var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
251
+ for (i = 0; i < s.length; i++)
252
+ tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
253
+ tail[i >> 2] |= 0x80 << ((i % 4) << 3);
254
+ if (i > 55) {
255
+ this.md5cycle(state, tail);
256
+ for (i = 0; i < 16; i++)
257
+ tail[i] = 0;
258
+ }
259
+ tail[14] = n * 8;
260
+ this.md5cycle(state, tail);
261
+ return state;
262
+ }
263
+ /**
264
+ * @ignore
265
+ *
266
+ * Metodo di utilità per il calcolo dell'md5
267
+ */
268
+ md5blk(s) {
269
+ var md5blks = [], i;
270
+ for (i = 0; i < 64; i += 4)
271
+ md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
272
+ return md5blks;
273
+ }
274
+ /**
275
+ * @ignore
276
+ *
277
+ * Metodo di utilità per il calcolo dell'md5
278
+ */
279
+ rhex(n) {
280
+ var s = '', j = 0;
281
+ for (; j < 4; j++)
282
+ s += this.hex_chr[(n >> (j * 8 + 4)) & 0x0F] + this.hex_chr[(n >> (j * 8)) & 0x0F];
283
+ return s;
284
+ }
285
+ /**
286
+ * @ignore
287
+ *
288
+ * Metodo di utilità per il calcolo dell'md5
289
+ */
290
+ hex(x) {
291
+ for (var i = 0; i < x.length; i++)
292
+ x[i] = this.rhex(x[i]);
293
+ return x.join('');
294
+ }
295
+ /**
296
+ * @ignore
297
+ *
298
+ * Metodo di utilità per il calcolo dell'md5
299
+ */
300
+ add32(a, b) {
301
+ return (a + b) & 0xFFFFFFFF;
302
+ }
303
+ }
304
+ HashingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HashingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
305
+ HashingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HashingService, providedIn: "root" });
306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HashingService, decorators: [{
307
+ type: Injectable,
308
+ args: [{ providedIn: "root" }]
309
+ }] });
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5oYXNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5oYXNoaW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNDOztHQUVHO0FBRUgsTUFBTSxPQUFPLGNBQWM7SUFEM0I7UUFpREk7O1dBRUc7UUFDSyxpQkFBWSxHQUFHO1lBQ25CLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk7WUFDN0ksZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLElBQUk7WUFDekksYUFBYSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJO1NBQzVHLENBQUM7UUE0TkY7O1dBRUc7UUFDSyxZQUFPLEdBQWEsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBaUM1RDtJQXJURzs7OztPQUlHO0lBQ0ksT0FBTztRQUNWLE9BQU8sc0NBQXNDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRTtZQUMvRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENB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RUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLElBQUksQ0FBQyxDQUFTO1FBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU5RSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlELENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN4QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN4QztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLENBQUM7UUFDWixJQUFJLE9BQU8sR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvSCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBT0Q7Ozs7T0FJRztJQUNLLElBQUksQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNiLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2RixPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssR0FBRyxDQUFDLENBQUM7UUFDVCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDaEMsQ0FBQzs7MkdBdFRRLGNBQWM7K0dBQWQsY0FBYyxjQURGLE1BQU07MkZBQ2xCLGNBQWM7a0JBRDFCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIGNoZSBmb3JuaXNjZSBhbGN1bmkgc2VtcGxpY2kgZnVuemlvbmkgZGkgSGFzaGluZyAvIEdVSUQgLyBlY2MuLi5cclxuICovXHJcbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiBcInJvb3RcIn0pXHJcbmV4cG9ydCBjbGFzcyBIYXNoaW5nU2VydmljZSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF6aW9uZSBkaSB1biBHVUlEIHBzZXVkby11bml2b2NvXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGlsIEdVSUQgZ2VuZXJhdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEdVSUQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gXCJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHhcIi5yZXBsYWNlKC9beHldL2csIGMgPT4ge1xyXG4gICAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09IFwieFwiID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY29sbyBkZWxsJ2hhc2ggc3UgdW4gb2dnZXR0b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gbyBPZ2dldHRvIGRpIGN1aSBjYWxjb2xhcmUgbCdoYXNoXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGV2ZWwgTGl2ZWxsbyBkaSByaWNvcnNpb25lIG5lbCBjYXNvIHZlbmdhIGVmZmV0dHVhdG8gbCdoYXNoIGRpIHVuIG9nZ2V0dG8gY2hlIGNvbnRpZW5lIGFsdHJpIG9nZ2V0dGlcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmF2aWdhdGVGdWxsRGVwdGggSW5kaWNhIHNlIG5hdmlnYXJlIGwnb2dnZXR0byBwZXIgbCdpbnRlcmEgbHVuZ2hlenphLiBJbiBjYXNvIGNvbnRyYXJpbyBzaSBmZXJtYSBhbCBzZWNvbmRvIGxpdmVsbG9cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gSGFzaCBnZW5lcmF0byBwZXIgbCdvZ2dldHRvIGluIHF1ZXN0aW9uZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFzaE9iamVjdChvOiBhbnksIGxldmVsOiBudW1iZXIgPSAwLCBuYXZpZ2F0ZUZ1bGxEZXB0aDogYm9vbGVhbiA9IGZhbHNlLCBwcmVjaXNlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHJEZWYgPSB0aGlzLnN0cmluZ2lmeShvLCBsZXZlbCwgbmF2aWdhdGVGdWxsRGVwdGgpO1xyXG4gICAgICAgIHZhciBoYXNoOiBzdHJpbmcgPSBwcmVjaXNlID8gdGhpcy5tZDUoc3RyRGVmKSA6IHRoaXMuc2ltcGxlSGFzaChzdHJEZWYpO1xyXG4gICAgICAgIHJldHVybiBoYXNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFzaCBwacO5IHNlbXBsaWNlIGUgcGnDuSB2ZWxvY2UgZGVsbCdtZDUsIG1hIG1lbm8gc2ljdXJvXHJcbiAgICAgKiBcclxuICAgICAqIFZlZGkgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzYxNjQ2MS9nZW5lcmF0ZS1hLWhhc2gtZnJvbS1zdHJpbmctaW4tamF2YXNjcmlwdFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nYSBkaSBjdWkgY2FsY29sYXJlIGwnaGFzaFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNpbXBsZUhhc2goc3RyOiBzdHJpbmcsIHNlZWQgPSAwKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgaDEgPSAweGRlYWRiZWVmIF4gc2VlZCwgaDIgPSAweDQxYzZjZTU3IF4gc2VlZDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgY2g7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY2ggPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAgICAgaDEgPSBNYXRoLmltdWwoaDEgXiBjaCwgMjY1NDQzNTc2MSk7XHJcbiAgICAgICAgICAgIGgyID0gTWF0aC5pbXVsKGgyIF4gY2gsIDE1OTczMzQ2NzcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoMSA9IE1hdGguaW11bChoMSBeIChoMT4+PjE2KSwgMjI0NjgyMjUwNykgXiBNYXRoLmltdWwoaDIgXiAoaDI+Pj4xMyksIDMyNjY0ODk5MDkpO1xyXG4gICAgICAgIGgyID0gTWF0aC5pbXVsKGgyIF4gKGgyPj4+MTYpLCAyMjQ2ODIyNTA3KSBeIE1hdGguaW11bChoMSBeIChoMT4+PjEzKSwgMzI2NjQ4OTkwOSk7XHJcbiAgICAgICAgcmV0dXJuICg0Mjk0OTY3Mjk2ICogKDIwOTcxNTEgJiBoMikgKyAoaDE+Pj4wKSkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJsYWNrbGlzdCBkZWkgdGlwaSBkYSBpZ25vcmFyZSBxdWFuZG8gc2kgZWZmZXR0dWEgbCdoYXNoaW5nIGRlZ2xpIG9nZ2V0dGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvYmpCbGFja2xpc3QgPSB7XHJcbiAgICAgICAgXCJOZ0Zvcm1cIjogdHJ1ZSwgXCJFbGVtZW50UmVmXCI6IHRydWUsIFwiRXh0ZW5zaW9uc1NlcnZpY2VcIjogdHJ1ZSwgXCJUb2FzdHJTZXJ2aWNlXCI6IHRydWUsIFwiTG9jYWxlU2VydmljZVwiOiB0cnVlLCBcIkFwcFN0YXRlXCI6IHRydWUsIFwiUm91dGVyXCI6IHRydWUsXHJcbiAgICAgICAgXCJBY3RpdmF0ZWRSb3V0ZVwiOiB0cnVlLCBcIkhUVFBTZXJ2aWNlXCI6IHRydWUsIFwiTG9jYXRpb25cIjogdHJ1ZSwgXCJDYW52YXNDb21wb25lbnRcIjogdHJ1ZSwgXCJNb2RhbERpcmVjdGl2ZVwiOiB0cnVlLCBcIkNoYW5nZURldGVjdG9yUmVmXCI6IHRydWUsXHJcbiAgICAgICAgXCJEYXRlU2VydmljZVwiOiB0cnVlLCBcIkV2ZW50RW1pdHRlclwiOiB0cnVlLCBcIlZpZXdSZWZfXCI6IHRydWUsIFwiU3Vic2NyaWJlclwiOiB0cnVlLCBcIkl0ZW1Mb2NhbGl6YXRpb25cIjogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSB1bmEgc3RyaW5nYSBjaGUgaWRlbnRpZmljYSB1bml2b2NhbWVudGUgbCdvZ2dldHRvIGluIHF1ZXN0aW9uZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gbyBPZ2dldHRvIGRpIGN1aSBjYWxjb2xhcmUgbGEgc3RyaW5nYSB1bml2b2NhXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGV2ZWwgTGl2ZWxsbyBkaSByaWNvcnNpb25lIG5lbCBjYXNvIHZlbmdhIGVmZmV0dHVhdG8gbCdoYXNoIGRpIHVuIG9nZ2V0dG8gY2hlIGNvbnRpZW5lIGFsdHJpIG9nZ2V0dGlcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmF2aWdhdGVGdWxsRGVwdGggSW5kaWNhIHNlIG5hdmlnYXJlIGwnb2dnZXR0byBwZXIgbCdpbnRlcmEgbHVuZ2hlenphLiBJbiBjYXNvIGNvbnRyYXJpbyBzaSBmZXJtYSBhbCBzZWNvbmRvIGxpdmVsbG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdHJpbmdpZnkobzogYW55LCBsZXZlbDogbnVtYmVyLCBuYXZpZ2F0ZUZ1bGxEZXB0aDogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBpOiBhbnksIHI6IGFueTtcclxuICAgICAgICBpZiAobyA9PT0gbnVsbCkgcmV0dXJuIFwiblwiO1xyXG4gICAgICAgIGlmIChvID09PSB0cnVlKSByZXR1cm4gXCJ0XCI7XHJcbiAgICAgICAgaWYgKG8gPT09IGZhbHNlKSByZXR1cm4gXCJmXCI7XHJcbiAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gJ2Q6Jysgby52YWx1ZU9mKCkudG9TdHJpbmcoKTtcclxuICAgICAgICBpID0gdHlwZW9mIG87XHJcbiAgICAgICAgaWYgKGkgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInM6XCIgKyBvO1xyXG4gICAgICAgIGlmIChpID09PSBcIm51bWJlclwiKSByZXR1cm4gXCJuOlwiICsgbztcclxuICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSByZXR1cm4gXCJtOlwiICsgby50b1N0cmluZygpO1xyXG4gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgciA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlcyA9IHRoaXMuc3RyaW5naWZ5KG9baV0sIGxldmVsLCBuYXZpZ2F0ZUZ1bGxEZXB0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzKSByLnB1c2gocmVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gci5sZW5ndGggPiAwID8gXCJhOlwiICsgci5qb2luKFwiO1wiKSA6IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHIgPSBbXTtcclxuXHJcbiAgICAgICAgLy9TZSDDqCBvZ2dldHRvLCBlc2NsdWRvIHR1dHRpIHF1ZWxsaSBkaSBzaXN0ZW1hL2ludXRpbGlcclxuICAgICAgICBpZiAobykge1xyXG4gICAgICAgICAgICB2YXIgbmFtZSA9IG8uX19wcm90b19fLmNvbnN0cnVjdG9yLm5hbWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMub2JqQmxhY2tsaXN0W25hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgaW4gbykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvLmhhc093blByb3BlcnR5KGkpICYmIChsZXZlbCA8PSAyIHx8IG5hdmlnYXRlRnVsbERlcHRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gdGhpcy5zdHJpbmdpZnkob1tpXSwgbGV2ZWwgKyAxLCBuYXZpZ2F0ZUZ1bGxEZXB0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMpIHIucHVzaChpICsgXCI6XCIgKyByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gci5sZW5ndGggPiAwID8gXCJvOlwiICsgci5qb2luKFwiO1wiKSA6IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIHVuYSBzdHJpbmdhIHJlc3RpdHVpc2NlIGwnbWQ1XHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzIFN0cmluZ2EgZGkgY3VpIGNhbGNvbGFyZSBsJ21kNVxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gbWQ1IGRlbGxhIHN0cmluZ2EgKipzKipcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1kNShzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhleCh0aGlzLm1kNTEocykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBNZXRvZG8gZGkgdXRpbGl0w6AgcGVyIGlsIGNhbGNvbG8gZGVsbCdtZDVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBtZDVjeWNsZSh4LCBrKSB7XHJcbiAgICAgICAgdmFyIGEgPSB4WzBdLCBiID0geFsxXSwgYyA9IHhbMl0sIGQgPSB4WzNdO1xyXG5cclxuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCBrWzBdLCA3LCAtNjgwODc2OTM2KTtcclxuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCBrWzFdLCAxMiwgLTM4OTU2NDU4Nik7XHJcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwga1syXSwgMTcsIDYwNjEwNTgxOSk7XHJcbiAgICAgICAgYiA9IHRoaXMuZmYoYiwgYywgZCwgYSwga1szXSwgMjIsIC0xMDQ0NTI1MzMwKTtcclxuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCBrWzRdLCA3LCAtMTc2NDE4ODk3KTtcclxuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCBrWzVdLCAxMiwgMTIwMDA4MDQyNik7XHJcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwga1s2XSwgMTcsIC0xNDczMjMxMzQxKTtcclxuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCBrWzddLCAyMiwgLTQ1NzA1OTgzKTtcclxuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCBrWzhdLCA3LCAxNzcwMDM1NDE2KTtcclxuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCBrWzldLCAxMiwgLTE5NTg0MTQ0MTcpO1xyXG4gICAgICAgIGMgPSB0aGlzLmZmKGMsIGQsIGEsIGIsIGtbMTBdLCAxNywgLTQyMDYzKTtcclxuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCBrWzExXSwgMjIsIC0xOTkwNDA0MTYyKTtcclxuICAgICAgICBhID0gdGhpcy5mZihhLCBiLCBjLCBkLCBrWzEyXSwgNywgMTgwNDYwMzY4Mik7XHJcbiAgICAgICAgZCA9IHRoaXMuZmYoZCwgYSwgYiwgYywga1sxM10sIDEyLCAtNDAzNDExMDEpO1xyXG4gICAgICAgIGMgPSB0aGlzLmZmKGMsIGQsIGEsIGIsIGtbMTRdLCAxNywgLTE1MDIwMDIyOTApO1xyXG4gICAgICAgIGIgPSB0aGlzLmZmKGIsIGMsIGQsIGEsIGtbMTVdLCAyMiwgMTIzNjUzNTMyOSk7XHJcblxyXG4gICAgICAgIGEgPSB0aGlzLmdnKGEsIGIsIGMsIGQsIGtbMV0sIDUsIC0xNjU3OTY1MTApO1xyXG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIGtbNl0sIDksIC0xMDY5NTAxNjMyKTtcclxuICAgICAgICBjID0gdGhpcy5nZyhjLCBkLCBhLCBiLCBrWzExXSwgMTQsIDY0MzcxNzcxMyk7XHJcbiAgICAgICAgYiA9IHRoaXMuZ2coYiwgYywgZCwgYSwga1swXSwgMjAsIC0zNzM4OTczMDIpO1xyXG4gICAgICAgIGEgPSB0aGlzLmdnKGEsIGIsIGMsIGQsIGtbNV0sIDUsIC03MDE1NTg2OTEpO1xyXG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIGtbMTBdLCA5LCAzODAxNjA4Myk7XHJcbiAgICAgICAgYyA9IHRoaXMuZ2coYywgZCwgYSwgYiwga1sxNV0sIDE0LCAtNjYwNDc4MzM1KTtcclxuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCBrWzRdLCAyMCwgLTQwNTUzNzg0OCk7XHJcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwga1s5XSwgNSwgNTY4NDQ2NDM4KTtcclxuICAgICAgICBkID0gdGhpcy5nZyhkLCBhLCBiLCBjLCBrWzE0XSwgOSwgLTEwMTk4MDM2OTApO1xyXG4gICAgICAgIGMgPSB0aGlzLmdnKGMsIGQsIGEsIGIsIGtbM10sIDE0LCAtMTg3MzYzOTYxKTtcclxuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCBrWzhdLCAyMCwgMTE2MzUzMTUwMSk7XHJcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwga1sxM10sIDUsIC0xNDQ0NjgxNDY3KTtcclxuICAgICAgICBkID0gdGhpcy5nZyhkLCBhLCBiLCBjLCBrWzJdLCA5LCAtNTE0MDM3ODQpO1xyXG4gICAgICAgIGMgPSB0aGlzLmdnKGMsIGQsIGEsIGIsIGtbN10sIDE0LCAxNzM1MzI4NDczKTtcclxuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCBrWzEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcclxuXHJcbiAgICAgICAgYSA9IHRoaXMuaGgoYSwgYiwgYywgZCwga1s1XSwgNCwgLTM3ODU1OCk7XHJcbiAgICAgICAgZCA9IHRoaXMuaGgoZCwgYSwgYiwgYywga1s4XSwgMTEsIC0yMDIyNTc0NDYzKTtcclxuICAgICAgICBjID0gdGhpcy5oaChjLCBkLCBhLCBiLCBrWzExXSwgMTYsIDE4MzkwMzA1NjIpO1xyXG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIGtbMTRdLCAyMywgLTM1MzA5NTU2KTtcclxuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCBrWzFdLCA0LCAtMTUzMDk5MjA2MCk7XHJcbiAgICAgICAgZCA9IHRoaXMuaGgoZCwgYSwgYiwgYywga1s0XSwgMTEsIDEyNzI4OTMzNTMpO1xyXG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIGtbN10sIDE2LCAtMTU1NDk3NjMyKTtcclxuICAgICAgICBiID0gdGhpcy5oaChiLCBjLCBkLCBhLCBrWzEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcclxuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCBrWzEzXSwgNCwgNjgxMjc5MTc0KTtcclxuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCBrWzBdLCAxMSwgLTM1ODUzNzIyMik7XHJcbiAgICAgICAgYyA9IHRoaXMuaGgoYywgZCwgYSwgYiwga1szXSwgMTYsIC03MjI1MjE5NzkpO1xyXG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIGtbNl0sIDIzLCA3NjAyOTE4OSk7XHJcbiAgICAgICAgYSA9IHRoaXMuaGgoYSwgYiwgYywgZCwga1s5XSwgNCwgLTY0MDM2NDQ4Nyk7XHJcbiAgICAgICAgZCA9IHRoaXMuaGgoZCwgYSwgYiwgYywga1sxMl0sIDExLCAtNDIxODE1ODM1KTtcclxuICAgICAgICBjID0gdGhpcy5oaChjLCBkLCBhLCBiLCBrWzE1XSwgMTYsIDUzMDc0MjUyMCk7XHJcbiAgICAgICAgYiA9IHRoaXMuaGgoYiwgYywgZCwgYSwga1syXSwgMjMsIC05OTUzMzg2NTEpO1xyXG5cclxuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCBrWzBdLCA2LCAtMTk4NjMwODQ0KTtcclxuICAgICAgICBkID0gdGhpcy5paShkLCBhLCBiLCBjLCBrWzddLCAxMCwgMTEyNjg5MTQxNSk7XHJcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwga1sxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XHJcbiAgICAgICAgYiA9IHRoaXMuaWkoYiwgYywgZCwgYSwga1s1XSwgMjEsIC01NzQzNDA1NSk7XHJcbiAgICAgICAgYSA9IHRoaXMuaWkoYSwgYiwgYywgZCwga1sxMl0sIDYsIDE3MDA0ODU1NzEpO1xyXG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIGtbM10sIDEwLCAtMTg5NDk4NjYwNik7XHJcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwga1sxMF0sIDE1LCAtMTA1MTUyMyk7XHJcbiAgICAgICAgYiA9IHRoaXMuaWkoYiwgYywgZCwgYSwga1sxXSwgMjEsIC0yMDU0OTIyNzk5KTtcclxuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCBrWzhdLCA2LCAxODczMzEzMzU5KTtcclxuICAgICAgICBkID0gdGhpcy5paShkLCBhLCBiLCBjLCBrWzE1XSwgMTAsIC0zMDYxMTc0NCk7XHJcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwga1s2XSwgMTUsIC0xNTYwMTk4MzgwKTtcclxuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCBrWzEzXSwgMjEsIDEzMDkxNTE2NDkpO1xyXG4gICAgICAgIGEgPSB0aGlzLmlpKGEsIGIsIGMsIGQsIGtbNF0sIDYsIC0xNDU1MjMwNzApO1xyXG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIGtbMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xyXG4gICAgICAgIGMgPSB0aGlzLmlpKGMsIGQsIGEsIGIsIGtbMl0sIDE1LCA3MTg3ODcyNTkpO1xyXG4gICAgICAgIGIgPSB0aGlzLmlpKGIsIGMsIGQsIGEsIGtbOV0sIDIxLCAtMzQzNDg1NTUxKTtcclxuXHJcbiAgICAgICAgeFswXSA9IHRoaXMuYWRkMzIoYSwgeFswXSk7XHJcbiAgICAgICAgeFsxXSA9IHRoaXMuYWRkMzIoYiwgeFsxXSk7XHJcbiAgICAgICAgeFsyXSA9IHRoaXMuYWRkMzIoYywgeFsyXSk7XHJcbiAgICAgICAgeFszXSA9IHRoaXMuYWRkMzIoZCwgeFszXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XHJcbiAgICAgICAgYSA9IHRoaXMuYWRkMzIodGhpcy5hZGQzMihhLCBxKSwgdGhpcy5hZGQzMih4LCB0KSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkMzIoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIFxyXG4gICAgICogTWV0b2RvIGRpIHV0aWxpdMOgIHBlciBpbCBjYWxjb2xvIGRlbGwnbWQ1XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNtbigoYiAmIGMpIHwgKCh+YikgJiBkKSwgYSwgYiwgeCwgcywgdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jbW4oKGIgJiBkKSB8IChjICYgKH5kKSksIGEsIGIsIHgsIHMsIHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBNZXRvZG8gZGkgdXRpbGl0w6AgcGVyIGlsIGNhbGNvbG8gZGVsbCdtZDVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jbW4oYyBeIChiIHwgKH5kKSksIGEsIGIsIHgsIHMsIHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBNZXRvZG8gZGkgdXRpbGl0w6AgcGVyIGlsIGNhbGNvbG8gZGVsbCdtZDVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBtZDUxKHM6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBuID0gcy5sZW5ndGgsIHN0YXRlID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdLCBpO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBzLmxlbmd0aDsgaSArPSA2NClcclxuICAgICAgICAgICAgdGhpcy5tZDVjeWNsZShzdGF0ZSwgdGhpcy5tZDVibGsocy5zdWJzdHJpbmcoaSAtIDY0LCBpKSkpO1xyXG5cclxuICAgICAgICBzID0gcy5zdWJzdHJpbmcoaSAtIDY0KTtcclxuICAgICAgICB2YXIgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgdGFpbFtpID4+IDJdIHw9IHMuY2hhckNvZGVBdChpKSA8PCAoKGkgJSA0KSA8PCAzKTtcclxuICAgICAgICB0YWlsW2kgPj4gMl0gfD0gMHg4MCA8PCAoKGkgJSA0KSA8PCAzKTtcclxuICAgICAgICBpZiAoaSA+IDU1KSB7XHJcbiAgICAgICAgICAgIHRoaXMubWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgdGFpbFtpXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhaWxbMTRdID0gbiAqIDg7XHJcbiAgICAgICAgdGhpcy5tZDVjeWNsZShzdGF0ZSwgdGFpbCk7XHJcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBNZXRvZG8gZGkgdXRpbGl0w6AgcGVyIGlsIGNhbGNvbG8gZGVsbCdtZDVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBtZDVibGsocykge1xyXG4gICAgICAgIHZhciBtZDVibGtzID0gW10sIGk7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpXHJcbiAgICAgICAgICAgIG1kNWJsa3NbaSA+PiAyXSA9IHMuY2hhckNvZGVBdChpKSArIChzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDgpICsgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpICsgKHMuY2hhckNvZGVBdChpICsgMykgPDwgMjQpO1xyXG4gICAgICAgIHJldHVybiBtZDVibGtzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJyYXkgZGVpIHBvc3NpYmlsaSB2YWxvcmkgZGkgdW4gc2ltYm9sbyBlc2FkZWNpbWFsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhleF9jaHI6IHN0cmluZ1tdID0gJzAxMjM0NTY3ODlhYmNkZWYnLnNwbGl0KCcnKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIFxyXG4gICAgICogTWV0b2RvIGRpIHV0aWxpdMOgIHBlciBpbCBjYWxjb2xvIGRlbGwnbWQ1XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmhleChuKSB7XHJcbiAgICAgICAgdmFyIHMgPSAnJywgaiA9IDA7XHJcbiAgICAgICAgZm9yICg7IGogPCA0OyBqKyspXHJcbiAgICAgICAgICAgIHMgKz0gdGhpcy5oZXhfY2hyWyhuID4+IChqICogOCArIDQpKSAmIDB4MEZdICsgdGhpcy5oZXhfY2hyWyhuID4+IChqICogOCkpICYgMHgwRl07XHJcbiAgICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhleCh4KSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB4W2ldID0gdGhpcy5yaGV4KHhbaV0pO1xyXG4gICAgICAgIHJldHVybiB4LmpvaW4oJycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBNZXRvZG8gZGkgdXRpbGl0w6AgcGVyIGlsIGNhbGNvbG8gZGVsbCdtZDVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGQzMihhLCBiKSB7XHJcbiAgICAgICAgcmV0dXJuIChhICsgYikgJiAweEZGRkZGRkZGO1xyXG4gICAgfVxyXG59Il19
@@ -0,0 +1,54 @@
1
+ // Angular
2
+ import { Injectable } from "@angular/core";
3
+ // Librerie
4
+ import { Subject } from "rxjs";
5
+ // Modelli
6
+ import { InterComMessage } from "../models/InterComMessage";
7
+ import * as i0 from "@angular/core";
8
+ /** Service che si occupa di gestire la comunicazione fra i moduli interni ed esterni dell'applicativo */
9
+ export class InterComService {
10
+ constructor() {
11
+ /** Messaggi in uscita, uno per ogni recipient registratosi dall'entrypoint **register** */
12
+ this.outbounds = {};
13
+ /** Messaggi in entrata, unico per applicazione principale */
14
+ this.inbounds = new Subject();
15
+ }
16
+ /**
17
+ * Metodo che permette di inviare un messaggio dall'applicazione ad un modulo esterno o viceversa
18
+ *
19
+ * @param {any} messageType Tipologia di messaggio. Sarà di tipo **InboundMessageTypes** per tutti i messaggi inbound, dinamico per tutti i mesaggi outbound (il tipo dipenderà dagli enum dei messaggi dei moduli esterni)
20
+ * @param {any} message Messaggio da inviare che può essere un dto in casi complessi ma dovrà essere gestito a dovere lato implementativo
21
+ * @param {string} recipient Destinatario del messaggio. Per i messaggi inbound dev'essere lasciato vuoto, per i messaggi outbound sarà valorizzato alla chiave del modulo a cui si vuole inviare il messaggio
22
+ */
23
+ send(messageType, message, recipient) {
24
+ let msg = new InterComMessage(messageType, message);
25
+ // Se non c'è un recipient significa che è un modulo esterno che invia messaggi al modulo main (quindi messaggio in entrata - inbound)
26
+ // Altrimenti significa che è il modulo main ad inviare messaggi ai moduli esterni (messaggio in uscita - outbound)
27
+ if (!recipient) {
28
+ this.inbounds.next(msg);
29
+ }
30
+ else {
31
+ if (!this.outbounds[recipient])
32
+ console.warn("@esfaenza/extensions - InterComService: Impossibile inviare il messaggio al recipient " + recipient + " assicurarsi che il modulo sia caricato e che effettui la chiamata al metodo 'regisster'");
33
+ else
34
+ this.outbounds[recipient].next(msg);
35
+ }
36
+ }
37
+ /**
38
+ * Permette di registrare un modulo esterno alla lista dei moduli in listening sulla coda di messaggi
39
+ *
40
+ * @param {string} key Chiave del modulo da registrare. Tutti i messaggi inbound saranno inviati dall'applicazione principale su questa chiave
41
+ */
42
+ register(key) {
43
+ if (this.outbounds[key])
44
+ throw "@esfaenza/extensions - InterComService: Impossibile registrare più volte lo stesso modulo";
45
+ this.outbounds[key] = new Subject();
46
+ }
47
+ }
48
+ InterComService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: InterComService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
49
+ InterComService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: InterComService, providedIn: "root" });
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: InterComService, decorators: [{
51
+ type: Injectable,
52
+ args: [{ providedIn: "root" }]
53
+ }] });
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5pbnRlcmNvbS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL3NlcnZpY2VzL2V4dGVuc2lvbnMuaW50ZXJjb20uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxXQUFXO0FBQ1gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixVQUFVO0FBQ1YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUU1RCx5R0FBeUc7QUFFekcsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFHSSwyRkFBMkY7UUFDcEYsY0FBUyxHQUErQyxFQUFFLENBQUM7UUFDbEUsNkRBQTZEO1FBQ3RELGFBQVEsR0FBNkIsSUFBSSxPQUFPLEVBQW1CLENBQUM7S0FtQzlFO0lBakNHOzs7Ozs7T0FNRztJQUNJLElBQUksQ0FBQyxXQUFnQixFQUFFLE9BQVksRUFBRSxTQUFrQjtRQUMxRCxJQUFJLEdBQUcsR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFcEQsc0lBQXNJO1FBQ3RJLG1IQUFtSDtRQUNuSCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0I7YUFDSTtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyx3RkFBd0YsR0FBRyxTQUFTLEdBQUcsMEZBQTBGLENBQUMsQ0FBQzs7Z0JBRWhOLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQzFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsR0FBVztRQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ25CLE1BQU0sMkZBQTJGLENBQUM7UUFDdEcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztJQUN6RCxDQUFDOzs0R0F2Q1EsZUFBZTtnSEFBZixlQUFlLGNBREgsTUFBTTsyRkFDbEIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gTGlicmVyaWVcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IEludGVyQ29tTWVzc2FnZSB9IGZyb20gXCIuLi9tb2RlbHMvSW50ZXJDb21NZXNzYWdlXCI7XHJcblxyXG4vKiogU2VydmljZSBjaGUgc2kgb2NjdXBhIGRpIGdlc3RpcmUgbGEgY29tdW5pY2F6aW9uZSBmcmEgaSBtb2R1bGkgaW50ZXJuaSBlZCBlc3Rlcm5pIGRlbGwnYXBwbGljYXRpdm8gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIEludGVyQ29tU2VydmljZSB7XHJcblxyXG4gICAgLyoqIE1lc3NhZ2dpIGluIHVzY2l0YSwgdW5vIHBlciBvZ25pIHJlY2lwaWVudCByZWdpc3RyYXRvc2kgZGFsbCdlbnRyeXBvaW50ICoqcmVnaXN0ZXIqKiAqL1xyXG4gICAgcHVibGljIG91dGJvdW5kczogeyBbaWQ6IHN0cmluZ106IFN1YmplY3Q8SW50ZXJDb21NZXNzYWdlPiB9ID0ge307XHJcbiAgICAvKiogTWVzc2FnZ2kgaW4gZW50cmF0YSwgdW5pY28gcGVyIGFwcGxpY2F6aW9uZSBwcmluY2lwYWxlICovXHJcbiAgICBwdWJsaWMgaW5ib3VuZHM6IFN1YmplY3Q8SW50ZXJDb21NZXNzYWdlPiA9IG5ldyBTdWJqZWN0PEludGVyQ29tTWVzc2FnZT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgcGVybWV0dGUgZGkgaW52aWFyZSB1biBtZXNzYWdnaW8gZGFsbCdhcHBsaWNhemlvbmUgYWQgdW4gbW9kdWxvIGVzdGVybm8gbyB2aWNldmVyc2FcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IG1lc3NhZ2VUeXBlIFRpcG9sb2dpYSBkaSBtZXNzYWdnaW8uIFNhcsOgIGRpIHRpcG8gKipJbmJvdW5kTWVzc2FnZVR5cGVzKiogcGVyIHR1dHRpIGkgbWVzc2FnZ2kgaW5ib3VuZCwgZGluYW1pY28gcGVyIHR1dHRpIGkgbWVzYWdnaSBvdXRib3VuZCAoaWwgdGlwbyBkaXBlbmRlcsOgIGRhZ2xpIGVudW0gZGVpIG1lc3NhZ2dpIGRlaSBtb2R1bGkgZXN0ZXJuaSlcclxuICAgICAqIEBwYXJhbSB7YW55fSBtZXNzYWdlIE1lc3NhZ2dpbyBkYSBpbnZpYXJlIGNoZSBwdcOyIGVzc2VyZSB1biBkdG8gaW4gY2FzaSBjb21wbGVzc2kgbWEgZG92csOgIGVzc2VyZSBnZXN0aXRvIGEgZG92ZXJlIGxhdG8gaW1wbGVtZW50YXRpdm9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnQgRGVzdGluYXRhcmlvIGRlbCBtZXNzYWdnaW8uIFBlciBpIG1lc3NhZ2dpIGluYm91bmQgZGV2J2Vzc2VyZSBsYXNjaWF0byB2dW90bywgcGVyIGkgbWVzc2FnZ2kgb3V0Ym91bmQgc2Fyw6AgdmFsb3JpenphdG8gYWxsYSBjaGlhdmUgZGVsIG1vZHVsbyBhIGN1aSBzaSB2dW9sZSBpbnZpYXJlIGlsIG1lc3NhZ2dpb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VuZChtZXNzYWdlVHlwZTogYW55LCBtZXNzYWdlOiBhbnksIHJlY2lwaWVudD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGxldCBtc2cgPSBuZXcgSW50ZXJDb21NZXNzYWdlKG1lc3NhZ2VUeXBlLCBtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgLy8gU2Ugbm9uIGMnw6ggdW4gcmVjaXBpZW50IHNpZ25pZmljYSBjaGUgw6ggdW4gbW9kdWxvIGVzdGVybm8gY2hlIGludmlhIG1lc3NhZ2dpIGFsIG1vZHVsbyBtYWluIChxdWluZGkgbWVzc2FnZ2lvIGluIGVudHJhdGEgLSBpbmJvdW5kKVxyXG4gICAgICAgIC8vIEFsdHJpbWVudGkgc2lnbmlmaWNhIGNoZSDDqCBpbCBtb2R1bG8gbWFpbiBhZCBpbnZpYXJlIG1lc3NhZ2dpIGFpIG1vZHVsaSBlc3Rlcm5pIChtZXNzYWdnaW8gaW4gdXNjaXRhIC0gb3V0Ym91bmQpXHJcbiAgICAgICAgaWYgKCFyZWNpcGllbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmJvdW5kcy5uZXh0KG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3V0Ym91bmRzW3JlY2lwaWVudF0pXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJAZXNmYWVuemEvZXh0ZW5zaW9ucyAtIEludGVyQ29tU2VydmljZTogSW1wb3NzaWJpbGUgaW52aWFyZSBpbCBtZXNzYWdnaW8gYWwgcmVjaXBpZW50IFwiICsgcmVjaXBpZW50ICsgXCIgYXNzaWN1cmFyc2kgY2hlIGlsIG1vZHVsbyBzaWEgY2FyaWNhdG8gZSBjaGUgZWZmZXR0dWkgbGEgY2hpYW1hdGEgYWwgbWV0b2RvICdyZWdpc3N0ZXInXCIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLm91dGJvdW5kc1tyZWNpcGllbnRdLm5leHQobXNnKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcm1ldHRlIGRpIHJlZ2lzdHJhcmUgdW4gbW9kdWxvIGVzdGVybm8gYWxsYSBsaXN0YSBkZWkgbW9kdWxpIGluIGxpc3RlbmluZyBzdWxsYSBjb2RhIGRpIG1lc3NhZ2dpXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQ2hpYXZlIGRlbCBtb2R1bG8gZGEgcmVnaXN0cmFyZS4gVHV0dGkgaSBtZXNzYWdnaSBpbmJvdW5kIHNhcmFubm8gaW52aWF0aSBkYWxsJ2FwcGxpY2F6aW9uZSBwcmluY2lwYWxlIHN1IHF1ZXN0YSBjaGlhdmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMub3V0Ym91bmRzW2tleV0pXHJcbiAgICAgICAgICAgIHRocm93IFwiQGVzZmFlbnphL2V4dGVuc2lvbnMgLSBJbnRlckNvbVNlcnZpY2U6IEltcG9zc2liaWxlIHJlZ2lzdHJhcmUgcGnDuSB2b2x0ZSBsbyBzdGVzc28gbW9kdWxvXCI7XHJcbiAgICAgICAgdGhpcy5vdXRib3VuZHNba2V5XSA9IG5ldyBTdWJqZWN0PEludGVyQ29tTWVzc2FnZT4oKTtcclxuICAgIH1cclxufSJdfQ==