@mecanizou/telemetry-hub 1.0.0 → 1.0.2

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 (95) hide show
  1. package/.github/workflows/pull_request.yml +32 -32
  2. package/.github/workflows/release.yml +129 -129
  3. package/.prettierignore +4 -4
  4. package/CHANGELOG.md +14 -0
  5. package/DOCS_GUIDE.md +151 -0
  6. package/README.md +248 -0
  7. package/dist/core/__tests__/logger-types.test.d.ts +1 -0
  8. package/dist/core/__tests__/logger-types.test.js +325 -0
  9. package/dist/core/__tests__/logger.test.d.ts +1 -0
  10. package/dist/core/__tests__/logger.test.js +337 -0
  11. package/dist/core/__tests__/tracer.test.d.ts +1 -0
  12. package/dist/core/__tests__/tracer.test.js +330 -0
  13. package/dist/core/index.d.ts +4 -0
  14. package/dist/core/index.js +8 -0
  15. package/dist/core/logger-types.d.ts +43 -0
  16. package/dist/core/logger-types.js +3 -0
  17. package/dist/core/logger.d.ts +13 -0
  18. package/dist/core/logger.js +123 -0
  19. package/dist/core/tracer-types.d.ts +50 -0
  20. package/dist/core/tracer-types.js +3 -0
  21. package/dist/core/tracer.d.ts +10 -0
  22. package/dist/core/tracer.js +114 -0
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.js +4 -2
  25. package/dist/sst/__tests__/telemetry.test.d.ts +1 -0
  26. package/dist/sst/__tests__/telemetry.test.js +138 -0
  27. package/dist/sst/index.d.ts +1 -0
  28. package/dist/sst/index.js +18 -0
  29. package/dist/sst/middy/index.d.ts +1 -0
  30. package/dist/sst/middy/index.js +18 -0
  31. package/dist/sst/middy/middleware.d.ts +5 -0
  32. package/dist/sst/middy/middleware.js +157 -0
  33. package/dist/sst/telemetry.d.ts +4 -0
  34. package/dist/sst/telemetry.js +121 -0
  35. package/dist/telemetry/core/__tests__/logger-types.test.d.ts +1 -0
  36. package/dist/telemetry/core/__tests__/logger-types.test.js +325 -0
  37. package/dist/telemetry/core/__tests__/logger.test.d.ts +1 -0
  38. package/dist/telemetry/core/__tests__/logger.test.js +337 -0
  39. package/dist/telemetry/core/__tests__/tracer.test.d.ts +1 -0
  40. package/dist/telemetry/core/__tests__/tracer.test.js +330 -0
  41. package/dist/telemetry/core/index.d.ts +4 -0
  42. package/dist/telemetry/core/index.js +8 -0
  43. package/dist/telemetry/core/logger-types.d.ts +43 -0
  44. package/dist/telemetry/core/logger-types.js +3 -0
  45. package/dist/telemetry/core/logger.d.ts +13 -0
  46. package/dist/telemetry/core/logger.js +123 -0
  47. package/dist/telemetry/core/tracer-types.d.ts +50 -0
  48. package/dist/telemetry/core/tracer-types.js +3 -0
  49. package/dist/telemetry/core/tracer.d.ts +10 -0
  50. package/dist/telemetry/core/tracer.js +114 -0
  51. package/dist/telemetry/index.d.ts +3 -0
  52. package/dist/telemetry/index.js +20 -0
  53. package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +1 -0
  54. package/dist/telemetry/sst/__tests__/telemetry.test.js +138 -0
  55. package/dist/telemetry/sst/index.d.ts +1 -0
  56. package/dist/telemetry/sst/index.js +18 -0
  57. package/dist/telemetry/sst/middy/index.d.ts +1 -0
  58. package/dist/telemetry/sst/middy/index.js +18 -0
  59. package/dist/telemetry/sst/middy/middleware.d.ts +5 -0
  60. package/dist/telemetry/sst/middy/middleware.js +157 -0
  61. package/dist/telemetry/sst/telemetry.d.ts +4 -0
  62. package/dist/telemetry/sst/telemetry.js +121 -0
  63. package/dist/telemetry/tsed/__tests__/config.test.d.ts +1 -0
  64. package/dist/telemetry/tsed/__tests__/config.test.js +146 -0
  65. package/dist/telemetry/tsed/__tests__/service.test.d.ts +1 -0
  66. package/dist/telemetry/tsed/__tests__/service.test.js +63 -0
  67. package/dist/telemetry/tsed/config.d.ts +26 -0
  68. package/dist/telemetry/tsed/config.js +166 -0
  69. package/dist/telemetry/tsed/index.d.ts +4 -0
  70. package/dist/telemetry/tsed/index.js +21 -0
  71. package/dist/telemetry/tsed/log-telemetry.d.ts +1 -0
  72. package/dist/telemetry/tsed/log-telemetry.js +196 -0
  73. package/dist/telemetry/tsed/service.d.ts +26 -0
  74. package/dist/telemetry/tsed/service.js +150 -0
  75. package/dist/telemetry/tsed/sync-log-record-processor.d.ts +11 -0
  76. package/dist/telemetry/tsed/sync-log-record-processor.js +74 -0
  77. package/dist/tsed/__tests__/config.test.d.ts +1 -0
  78. package/dist/tsed/__tests__/config.test.js +146 -0
  79. package/dist/tsed/__tests__/service.test.d.ts +1 -0
  80. package/dist/tsed/__tests__/service.test.js +63 -0
  81. package/dist/tsed/config.d.ts +26 -0
  82. package/dist/tsed/config.js +166 -0
  83. package/dist/tsed/index.d.ts +4 -0
  84. package/dist/tsed/index.js +21 -0
  85. package/dist/tsed/log-telemetry.d.ts +1 -0
  86. package/dist/tsed/log-telemetry.js +196 -0
  87. package/dist/tsed/service.d.ts +26 -0
  88. package/dist/tsed/service.js +150 -0
  89. package/dist/tsed/sync-log-record-processor.d.ts +11 -0
  90. package/dist/tsed/sync-log-record-processor.js +74 -0
  91. package/package.json +72 -56
  92. package/release.config.js +23 -23
  93. package/vitest.config.ts +22 -0
  94. package/dist/check-if-is-working.d.ts +0 -1
  95. package/dist/check-if-is-working.js +0 -8
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const tracer_1 = require("../tracer");
5
+ const api_1 = require("@opentelemetry/api");
6
+ (0, vitest_1.describe)('StandardTracer', () => {
7
+ let mockTracer;
8
+ let mockSpan;
9
+ let standardTracer;
10
+ (0, vitest_1.beforeEach)(() => {
11
+ mockSpan = {
12
+ end: vitest_1.vi.fn(),
13
+ setAttribute: vitest_1.vi.fn(),
14
+ setStatus: vitest_1.vi.fn(),
15
+ recordException: vitest_1.vi.fn(),
16
+ };
17
+ mockTracer = {
18
+ startSpan: vitest_1.vi.fn().mockReturnValue(mockSpan),
19
+ };
20
+ standardTracer = new tracer_1.StandardTracer(mockTracer, 'test-service');
21
+ });
22
+ (0, vitest_1.describe)('startSpan', () => {
23
+ (0, vitest_1.it)('deve criar span com nome e atributos básicos', () => {
24
+ const spanResult = standardTracer.startSpan({
25
+ spanName: 'test-operation',
26
+ serviceName: 'my-service',
27
+ environment: 'production',
28
+ });
29
+ (0, vitest_1.expect)(mockTracer.startSpan).toHaveBeenCalledWith('test-operation', {
30
+ kind: api_1.SpanKind.SERVER,
31
+ attributes: {
32
+ 'service.name': 'my-service',
33
+ 'deployment.environment.name': 'production',
34
+ },
35
+ });
36
+ (0, vitest_1.expect)(spanResult.span).toBe(mockSpan);
37
+ (0, vitest_1.expect)(spanResult.end).toBeDefined();
38
+ (0, vitest_1.expect)(spanResult.setSuccess).toBeDefined();
39
+ (0, vitest_1.expect)(spanResult.setError).toBeDefined();
40
+ (0, vitest_1.expect)(spanResult.setAttribute).toBeDefined();
41
+ });
42
+ (0, vitest_1.it)('deve usar defaultServiceName quando serviceName não fornecido', () => {
43
+ standardTracer.startSpan({
44
+ spanName: 'test-operation',
45
+ serviceName: '',
46
+ environment: 'test',
47
+ });
48
+ const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
49
+ (0, vitest_1.expect)(attributes['service.name']).toBe('test-service');
50
+ });
51
+ (0, vitest_1.it)('deve incluir atributos de execução', () => {
52
+ standardTracer.startSpan({
53
+ spanName: 'process-request',
54
+ serviceName: 'api-service',
55
+ environment: 'production',
56
+ execution: {
57
+ functionName: 'processPayment',
58
+ invocationId: 'inv-123',
59
+ awsRequestId: 'aws-456',
60
+ requestId: 'req-789',
61
+ controller: 'PaymentController',
62
+ controllerMethod: 'process',
63
+ origin: 'mobile',
64
+ },
65
+ });
66
+ const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
67
+ (0, vitest_1.expect)(attributes['faas.name']).toBe('processPayment');
68
+ (0, vitest_1.expect)(attributes['faas.invocation_id']).toBe('inv-123');
69
+ (0, vitest_1.expect)(attributes['aws.request.id']).toBe('aws-456');
70
+ (0, vitest_1.expect)(attributes['request.id']).toBe('req-789');
71
+ (0, vitest_1.expect)(attributes['controller.name']).toBe('PaymentController');
72
+ (0, vitest_1.expect)(attributes['controller.method']).toBe('process');
73
+ (0, vitest_1.expect)(attributes['origin']).toBe('mobile');
74
+ });
75
+ (0, vitest_1.it)('deve incluir atributos HTTP', () => {
76
+ standardTracer.startSpan({
77
+ spanName: 'http-request',
78
+ serviceName: 'web-service',
79
+ environment: 'production',
80
+ http: {
81
+ method: 'POST',
82
+ url: 'https://api.example.com/orders',
83
+ endpoint: '/orders',
84
+ statusCode: 201,
85
+ scheme: 'https',
86
+ host: 'api.example.com',
87
+ },
88
+ });
89
+ const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
90
+ (0, vitest_1.expect)(attributes['http.method']).toBe('POST');
91
+ (0, vitest_1.expect)(attributes['http.url']).toBe('https://api.example.com/orders');
92
+ (0, vitest_1.expect)(attributes['http.target']).toBe('/orders');
93
+ (0, vitest_1.expect)(attributes['http.status_code']).toBe(201);
94
+ (0, vitest_1.expect)(attributes['http.scheme']).toBe('https');
95
+ (0, vitest_1.expect)(attributes['http.host']).toBe('api.example.com');
96
+ });
97
+ (0, vitest_1.it)('deve incluir atributos de usuário', () => {
98
+ standardTracer.startSpan({
99
+ spanName: 'user-operation',
100
+ serviceName: 'user-service',
101
+ environment: 'production',
102
+ user: {
103
+ accountUserUid: 'user-123',
104
+ accountUid: 'account-456',
105
+ applicationUid: 'app-789',
106
+ },
107
+ });
108
+ const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
109
+ (0, vitest_1.expect)(attributes['accountUser.uid']).toBe('user-123');
110
+ (0, vitest_1.expect)(attributes['account.uid']).toBe('account-456');
111
+ (0, vitest_1.expect)(attributes['application.uid']).toBe('app-789');
112
+ });
113
+ (0, vitest_1.it)('deve incluir atributos de performance', () => {
114
+ standardTracer.startSpan({
115
+ spanName: 'performance-test',
116
+ serviceName: 'perf-service',
117
+ environment: 'test',
118
+ performance: {
119
+ durationMs: 250,
120
+ success: true,
121
+ },
122
+ });
123
+ const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
124
+ (0, vitest_1.expect)(attributes['duration.ms']).toBe(250);
125
+ (0, vitest_1.expect)(attributes['execution.success']).toBe(true);
126
+ });
127
+ (0, vitest_1.it)('deve incluir atributos de erro', () => {
128
+ standardTracer.startSpan({
129
+ spanName: 'error-operation',
130
+ serviceName: 'error-service',
131
+ environment: 'production',
132
+ error: {
133
+ type: 'ValidationError',
134
+ message: 'Invalid input',
135
+ stack: 'Error stack trace',
136
+ },
137
+ });
138
+ const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
139
+ (0, vitest_1.expect)(attributes['error.type']).toBe('ValidationError');
140
+ (0, vitest_1.expect)(attributes['error.message']).toBe('Invalid input');
141
+ (0, vitest_1.expect)(attributes['error.stack']).toBe('Error stack trace');
142
+ });
143
+ (0, vitest_1.it)('deve incluir atributos customizados', () => {
144
+ standardTracer.startSpan({
145
+ spanName: 'custom-operation',
146
+ serviceName: 'custom-service',
147
+ environment: 'production',
148
+ attributes: {
149
+ 'custom.field': 'value',
150
+ 'custom.count': 42,
151
+ 'custom.enabled': true,
152
+ },
153
+ });
154
+ const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
155
+ (0, vitest_1.expect)(attributes['custom.field']).toBe('value');
156
+ (0, vitest_1.expect)(attributes['custom.count']).toBe(42);
157
+ (0, vitest_1.expect)(attributes['custom.enabled']).toBe(true);
158
+ });
159
+ (0, vitest_1.it)('deve filtrar valores undefined e null', () => {
160
+ standardTracer.startSpan({
161
+ spanName: 'filter-test',
162
+ serviceName: 'filter-service',
163
+ environment: 'production',
164
+ execution: {
165
+ functionName: 'test',
166
+ invocationId: undefined,
167
+ awsRequestId: null,
168
+ },
169
+ attributes: {
170
+ valid: 'value',
171
+ invalid: undefined,
172
+ nullValue: null,
173
+ },
174
+ });
175
+ const attributes = mockTracer.startSpan.mock.calls[0][1].attributes;
176
+ (0, vitest_1.expect)(attributes['faas.name']).toBe('test');
177
+ (0, vitest_1.expect)(attributes['faas.invocation_id']).toBeUndefined();
178
+ (0, vitest_1.expect)(attributes['aws.request.id']).toBeUndefined();
179
+ (0, vitest_1.expect)(attributes['valid']).toBe('value');
180
+ (0, vitest_1.expect)(attributes['invalid']).toBeUndefined();
181
+ (0, vitest_1.expect)(attributes['nullValue']).toBeUndefined();
182
+ });
183
+ });
184
+ (0, vitest_1.describe)('StandardSpanResult', () => {
185
+ let spanResult;
186
+ (0, vitest_1.beforeEach)(() => {
187
+ spanResult = standardTracer.startSpan({
188
+ spanName: 'test-span',
189
+ serviceName: 'test-service',
190
+ environment: 'test',
191
+ });
192
+ });
193
+ (0, vitest_1.describe)('end', () => {
194
+ (0, vitest_1.it)('deve finalizar o span', () => {
195
+ spanResult.end();
196
+ (0, vitest_1.expect)(mockSpan.end).toHaveBeenCalledTimes(1);
197
+ });
198
+ });
199
+ (0, vitest_1.describe)('setSuccess', () => {
200
+ (0, vitest_1.it)('deve marcar span como sucesso', () => {
201
+ spanResult.setSuccess(true);
202
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', true);
203
+ (0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
204
+ code: api_1.SpanStatusCode.OK,
205
+ });
206
+ });
207
+ (0, vitest_1.it)('deve marcar span como falha', () => {
208
+ spanResult.setSuccess(false);
209
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', false);
210
+ (0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
211
+ code: api_1.SpanStatusCode.ERROR,
212
+ });
213
+ });
214
+ });
215
+ (0, vitest_1.describe)('setError', () => {
216
+ (0, vitest_1.it)('deve registrar erro no span', () => {
217
+ const error = new Error('Test error');
218
+ spanResult.setError(error);
219
+ (0, vitest_1.expect)(mockSpan.recordException).toHaveBeenCalledWith(error);
220
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.type', 'Error');
221
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.message', 'Test error');
222
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', false);
223
+ (0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
224
+ code: api_1.SpanStatusCode.ERROR,
225
+ message: 'Test error',
226
+ });
227
+ });
228
+ (0, vitest_1.it)('deve incluir stack trace quando disponível', () => {
229
+ const error = new Error('Error with stack');
230
+ error.stack = 'Error: Error with stack\n at test.ts:1:1';
231
+ spanResult.setError(error);
232
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.stack', error.stack);
233
+ });
234
+ (0, vitest_1.it)('deve funcionar com erro customizado', () => {
235
+ class CustomError extends Error {
236
+ constructor(message) {
237
+ super(message);
238
+ this.name = 'CustomError';
239
+ }
240
+ }
241
+ const error = new CustomError('Custom error message');
242
+ spanResult.setError(error);
243
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.type', 'CustomError');
244
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.message', 'Custom error message');
245
+ });
246
+ });
247
+ (0, vitest_1.describe)('setAttribute', () => {
248
+ (0, vitest_1.it)('deve adicionar atributo string', () => {
249
+ spanResult.setAttribute('custom.key', 'custom value');
250
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('custom.key', 'custom value');
251
+ });
252
+ (0, vitest_1.it)('deve adicionar atributo numérico', () => {
253
+ spanResult.setAttribute('custom.count', 123);
254
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('custom.count', 123);
255
+ });
256
+ (0, vitest_1.it)('deve adicionar atributo booleano', () => {
257
+ spanResult.setAttribute('custom.enabled', true);
258
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('custom.enabled', true);
259
+ });
260
+ });
261
+ });
262
+ (0, vitest_1.describe)('recordException', () => {
263
+ (0, vitest_1.it)('deve registrar exceção com todos os atributos', () => {
264
+ const error = new Error('Exception test');
265
+ error.stack = 'Error stack trace here';
266
+ standardTracer.recordException(mockSpan, error);
267
+ (0, vitest_1.expect)(mockSpan.recordException).toHaveBeenCalledWith(error);
268
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.type', 'Error');
269
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.message', 'Exception test');
270
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.stack', 'Error stack trace here');
271
+ });
272
+ (0, vitest_1.it)('deve funcionar sem stack trace', () => {
273
+ const error = new Error('No stack');
274
+ delete error.stack;
275
+ standardTracer.recordException(mockSpan, error);
276
+ (0, vitest_1.expect)(mockSpan.recordException).toHaveBeenCalledWith(error);
277
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.type', 'Error');
278
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('error.message', 'No stack');
279
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledTimes(2);
280
+ });
281
+ });
282
+ (0, vitest_1.describe)('cenários de uso completos', () => {
283
+ (0, vitest_1.it)('deve gerenciar fluxo de sucesso completo', () => {
284
+ const spanResult = standardTracer.startSpan({
285
+ spanName: 'complete-operation',
286
+ serviceName: 'complete-service',
287
+ environment: 'production',
288
+ execution: {
289
+ functionName: 'processData',
290
+ requestId: 'req-123',
291
+ },
292
+ http: {
293
+ method: 'POST',
294
+ endpoint: '/api/data',
295
+ },
296
+ });
297
+ spanResult.setAttribute('custom.step', 'processing');
298
+ spanResult.setSuccess(true);
299
+ spanResult.end();
300
+ (0, vitest_1.expect)(mockTracer.startSpan).toHaveBeenCalled();
301
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('custom.step', 'processing');
302
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', true);
303
+ (0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
304
+ code: api_1.SpanStatusCode.OK,
305
+ });
306
+ (0, vitest_1.expect)(mockSpan.end).toHaveBeenCalled();
307
+ });
308
+ (0, vitest_1.it)('deve gerenciar fluxo de erro completo', () => {
309
+ const spanResult = standardTracer.startSpan({
310
+ spanName: 'error-operation',
311
+ serviceName: 'error-service',
312
+ environment: 'production',
313
+ user: {
314
+ accountUserUid: 'user-123',
315
+ },
316
+ });
317
+ const error = new Error('Operation failed');
318
+ spanResult.setError(error);
319
+ spanResult.end();
320
+ (0, vitest_1.expect)(mockSpan.recordException).toHaveBeenCalledWith(error);
321
+ (0, vitest_1.expect)(mockSpan.setAttribute).toHaveBeenCalledWith('execution.success', false);
322
+ (0, vitest_1.expect)(mockSpan.setStatus).toHaveBeenCalledWith({
323
+ code: api_1.SpanStatusCode.ERROR,
324
+ message: 'Operation failed',
325
+ });
326
+ (0, vitest_1.expect)(mockSpan.end).toHaveBeenCalled();
327
+ });
328
+ });
329
+ });
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2VyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9fX3Rlc3RzX18vdHJhY2VyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBOEQ7QUFDOUQsc0NBQTJDO0FBQzNDLDRDQUE4RDtBQUU5RCxJQUFBLGlCQUFRLEVBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLElBQUksVUFBZSxDQUFDO0lBQ3BCLElBQUksUUFBYSxDQUFDO0lBQ2xCLElBQUksY0FBOEIsQ0FBQztJQUVuQyxJQUFBLG1CQUFVLEVBQUMsR0FBRyxFQUFFO1FBQ2QsUUFBUSxHQUFHO1lBQ1QsR0FBRyxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDWixZQUFZLEVBQUUsV0FBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQixTQUFTLEVBQUUsV0FBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQixlQUFlLEVBQUUsV0FBRSxDQUFDLEVBQUUsRUFBRTtTQUN6QixDQUFDO1FBRUYsVUFBVSxHQUFHO1lBQ1gsU0FBUyxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1NBQzdDLENBQUM7UUFFRixjQUFjLEdBQUcsSUFBSSx1QkFBYyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsaUJBQVEsRUFBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLElBQUEsV0FBRSxFQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtZQUN0RCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO2dCQUMxQyxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsV0FBVyxFQUFFLFlBQVk7YUFDMUIsQ0FBQyxDQUFDO1lBRUgsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLG9C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TyxFQUFFLGtCQUFrQjthQUM1QixDQUFDLENBQUM7WUFDSCxJQUFBLGVBQU0sRUFBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgaXQsIGV4cGVjdCwgdmksIGJlZm9yZUVhY2ggfSBmcm9tICd2aXRlc3QnO1xyXG5pbXBvcnQgeyBTdGFuZGFyZFRyYWNlciB9IGZyb20gJy4uL3RyYWNlcic7XHJcbmltcG9ydCB7IFNwYW5TdGF0dXNDb2RlLCBTcGFuS2luZCB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XHJcblxyXG5kZXNjcmliZSgnU3RhbmRhcmRUcmFjZXInLCAoKSA9PiB7XHJcbiAgbGV0IG1vY2tUcmFjZXI6IGFueTtcclxuICBsZXQgbW9ja1NwYW46IGFueTtcclxuICBsZXQgc3RhbmRhcmRUcmFjZXI6IFN0YW5kYXJkVHJhY2VyO1xyXG5cclxuICBiZWZvcmVFYWNoKCgpID0+IHtcclxuICAgIG1vY2tTcGFuID0ge1xyXG4gICAgICBlbmQ6IHZpLmZuKCksXHJcbiAgICAgIHNldEF0dHJpYnV0ZTogdmkuZm4oKSxcclxuICAgICAgc2V0U3RhdHVzOiB2aS5mbigpLFxyXG4gICAgICByZWNvcmRFeGNlcHRpb246IHZpLmZuKCksXHJcbiAgICB9O1xyXG5cclxuICAgIG1vY2tUcmFjZXIgPSB7XHJcbiAgICAgIHN0YXJ0U3BhbjogdmkuZm4oKS5tb2NrUmV0dXJuVmFsdWUobW9ja1NwYW4pLFxyXG4gICAgfTtcclxuXHJcbiAgICBzdGFuZGFyZFRyYWNlciA9IG5ldyBTdGFuZGFyZFRyYWNlcihtb2NrVHJhY2VyLCAndGVzdC1zZXJ2aWNlJyk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdzdGFydFNwYW4nLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBjcmlhciBzcGFuIGNvbSBub21lIGUgYXRyaWJ1dG9zIGLDoXNpY29zJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBzcGFuUmVzdWx0ID0gc3RhbmRhcmRUcmFjZXIuc3RhcnRTcGFuKHtcclxuICAgICAgICBzcGFuTmFtZTogJ3Rlc3Qtb3BlcmF0aW9uJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ215LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tUcmFjZXIuc3RhcnRTcGFuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndGVzdC1vcGVyYXRpb24nLCB7XHJcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcclxuICAgICAgICAgICdzZXJ2aWNlLm5hbWUnOiAnbXktc2VydmljZScsXHJcbiAgICAgICAgICAnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJzogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZXhwZWN0KHNwYW5SZXN1bHQuc3BhbikudG9CZShtb2NrU3Bhbik7XHJcbiAgICAgIGV4cGVjdChzcGFuUmVzdWx0LmVuZCkudG9CZURlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KHNwYW5SZXN1bHQuc2V0U3VjY2VzcykudG9CZURlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KHNwYW5SZXN1bHQuc2V0RXJyb3IpLnRvQmVEZWZpbmVkKCk7XHJcbiAgICAgIGV4cGVjdChzcGFuUmVzdWx0LnNldEF0dHJpYnV0ZSkudG9CZURlZmluZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIHVzYXIgZGVmYXVsdFNlcnZpY2VOYW1lIHF1YW5kbyBzZXJ2aWNlTmFtZSBuw6NvIGZvcm5lY2lkbycsICgpID0+IHtcclxuICAgICAgc3RhbmRhcmRUcmFjZXIuc3RhcnRTcGFuKHtcclxuICAgICAgICBzcGFuTmFtZTogJ3Rlc3Qtb3BlcmF0aW9uJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9ja1RyYWNlci5zdGFydFNwYW4ubW9jay5jYWxsc1swXVsxXS5hdHRyaWJ1dGVzO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ3Rlc3Qtc2VydmljZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBhdHJpYnV0b3MgZGUgZXhlY3XDp8OjbycsICgpID0+IHtcclxuICAgICAgc3RhbmRhcmRUcmFjZXIuc3RhcnRTcGFuKHtcclxuICAgICAgICBzcGFuTmFtZTogJ3Byb2Nlc3MtcmVxdWVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdhcGktc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3Byb2Nlc3NQYXltZW50JyxcclxuICAgICAgICAgIGludm9jYXRpb25JZDogJ2ludi0xMjMnLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAnYXdzLTQ1NicsXHJcbiAgICAgICAgICByZXF1ZXN0SWQ6ICdyZXEtNzg5JyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6ICdQYXltZW50Q29udHJvbGxlcicsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiAncHJvY2VzcycsXHJcbiAgICAgICAgICBvcmlnaW46ICdtb2JpbGUnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG1vY2tUcmFjZXIuc3RhcnRTcGFuLm1vY2suY2FsbHNbMF1bMV0uYXR0cmlidXRlcztcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2ZhYXMubmFtZSddKS50b0JlKCdwcm9jZXNzUGF5bWVudCcpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZmFhcy5pbnZvY2F0aW9uX2lkJ10pLnRvQmUoJ2ludi0xMjMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2F3cy5yZXF1ZXN0LmlkJ10pLnRvQmUoJ2F3cy00NTYnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ3JlcXVlc3QuaWQnXSkudG9CZSgncmVxLTc4OScpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snY29udHJvbGxlci5uYW1lJ10pLnRvQmUoJ1BheW1lbnRDb250cm9sbGVyJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydjb250cm9sbGVyLm1ldGhvZCddKS50b0JlKCdwcm9jZXNzJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydvcmlnaW4nXSkudG9CZSgnbW9iaWxlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGF0cmlidXRvcyBIVFRQJywgKCkgPT4ge1xyXG4gICAgICBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAnaHR0cC1yZXF1ZXN0JyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3dlYi1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIGh0dHA6IHtcclxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vb3JkZXJzJyxcclxuICAgICAgICAgIGVuZHBvaW50OiAnL29yZGVycycsXHJcbiAgICAgICAgICBzdGF0dXNDb2RlOiAyMDEsXHJcbiAgICAgICAgICBzY2hlbWU6ICdodHRwcycsXHJcbiAgICAgICAgICBob3N0OiAnYXBpLmV4YW1wbGUuY29tJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBtb2NrVHJhY2VyLnN0YXJ0U3Bhbi5tb2NrLmNhbGxzWzBdWzFdLmF0dHJpYnV0ZXM7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydodHRwLm1ldGhvZCddKS50b0JlKCdQT1NUJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydodHRwLnVybCddKS50b0JlKCdodHRwczovL2FwaS5leGFtcGxlLmNvbS9vcmRlcnMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2h0dHAudGFyZ2V0J10pLnRvQmUoJy9vcmRlcnMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2h0dHAuc3RhdHVzX2NvZGUnXSkudG9CZSgyMDEpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snaHR0cC5zY2hlbWUnXSkudG9CZSgnaHR0cHMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2h0dHAuaG9zdCddKS50b0JlKCdhcGkuZXhhbXBsZS5jb20nKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgYXRyaWJ1dG9zIGRlIHVzdcOhcmlvJywgKCkgPT4ge1xyXG4gICAgICBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAndXNlci1vcGVyYXRpb24nLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndXNlci1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogJ2FjY291bnQtNDU2JyxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiAnYXBwLTc4OScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9ja1RyYWNlci5zdGFydFNwYW4ubW9jay5jYWxsc1swXVsxXS5hdHRyaWJ1dGVzO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snYWNjb3VudFVzZXIudWlkJ10pLnRvQmUoJ3VzZXItMTIzJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydhY2NvdW50LnVpZCddKS50b0JlKCdhY2NvdW50LTQ1NicpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snYXBwbGljYXRpb24udWlkJ10pLnRvQmUoJ2FwcC03ODknKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgYXRyaWJ1dG9zIGRlIHBlcmZvcm1hbmNlJywgKCkgPT4ge1xyXG4gICAgICBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAncGVyZm9ybWFuY2UtdGVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdwZXJmLXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAndGVzdCcsXHJcbiAgICAgICAgcGVyZm9ybWFuY2U6IHtcclxuICAgICAgICAgIGR1cmF0aW9uTXM6IDI1MCxcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9ja1RyYWNlci5zdGFydFNwYW4ubW9jay5jYWxsc1swXVsxXS5hdHRyaWJ1dGVzO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZHVyYXRpb24ubXMnXSkudG9CZSgyNTApO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZXhlY3V0aW9uLnN1Y2Nlc3MnXSkudG9CZSh0cnVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgYXRyaWJ1dG9zIGRlIGVycm8nLCAoKSA9PiB7XHJcbiAgICAgIHN0YW5kYXJkVHJhY2VyLnN0YXJ0U3Bhbih7XHJcbiAgICAgICAgc3Bhbk5hbWU6ICdlcnJvci1vcGVyYXRpb24nLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnZXJyb3Itc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBlcnJvcjoge1xyXG4gICAgICAgICAgdHlwZTogJ1ZhbGlkYXRpb25FcnJvcicsXHJcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBpbnB1dCcsXHJcbiAgICAgICAgICBzdGFjazogJ0Vycm9yIHN0YWNrIHRyYWNlJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBtb2NrVHJhY2VyLnN0YXJ0U3Bhbi5tb2NrLmNhbGxzWzBdWzFdLmF0dHJpYnV0ZXM7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydlcnJvci50eXBlJ10pLnRvQmUoJ1ZhbGlkYXRpb25FcnJvcicpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZXJyb3IubWVzc2FnZSddKS50b0JlKCdJbnZhbGlkIGlucHV0Jyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydlcnJvci5zdGFjayddKS50b0JlKCdFcnJvciBzdGFjayB0cmFjZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBhdHJpYnV0b3MgY3VzdG9taXphZG9zJywgKCkgPT4ge1xyXG4gICAgICBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAnY3VzdG9tLW9wZXJhdGlvbicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdjdXN0b20tc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBhdHRyaWJ1dGVzOiB7XHJcbiAgICAgICAgICAnY3VzdG9tLmZpZWxkJzogJ3ZhbHVlJyxcclxuICAgICAgICAgICdjdXN0b20uY291bnQnOiA0MixcclxuICAgICAgICAgICdjdXN0b20uZW5hYmxlZCc6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9ja1RyYWNlci5zdGFydFNwYW4ubW9jay5jYWxsc1swXVsxXS5hdHRyaWJ1dGVzO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snY3VzdG9tLmZpZWxkJ10pLnRvQmUoJ3ZhbHVlJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydjdXN0b20uY291bnQnXSkudG9CZSg0Mik7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydjdXN0b20uZW5hYmxlZCddKS50b0JlKHRydWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgZmlsdHJhciB2YWxvcmVzIHVuZGVmaW5lZCBlIG51bGwnLCAoKSA9PiB7XHJcbiAgICAgIHN0YW5kYXJkVHJhY2VyLnN0YXJ0U3Bhbih7XHJcbiAgICAgICAgc3Bhbk5hbWU6ICdmaWx0ZXItdGVzdCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdmaWx0ZXItc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3Rlc3QnLFxyXG4gICAgICAgICAgaW52b2NhdGlvbklkOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6IG51bGwgYXMgYW55LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYXR0cmlidXRlczoge1xyXG4gICAgICAgICAgdmFsaWQ6ICd2YWx1ZScsXHJcbiAgICAgICAgICBpbnZhbGlkOiB1bmRlZmluZWQgYXMgYW55LFxyXG4gICAgICAgICAgbnVsbFZhbHVlOiBudWxsIGFzIGFueSxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBtb2NrVHJhY2VyLnN0YXJ0U3Bhbi5tb2NrLmNhbGxzWzBdWzFdLmF0dHJpYnV0ZXM7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydmYWFzLm5hbWUnXSkudG9CZSgndGVzdCcpO1xyXG4gICAgICBleHBlY3QoYXR0cmlidXRlc1snZmFhcy5pbnZvY2F0aW9uX2lkJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ2F3cy5yZXF1ZXN0LmlkJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ3ZhbGlkJ10pLnRvQmUoJ3ZhbHVlJyk7XHJcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzWydpbnZhbGlkJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXNbJ251bGxWYWx1ZSddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ1N0YW5kYXJkU3BhblJlc3VsdCcsICgpID0+IHtcclxuICAgIGxldCBzcGFuUmVzdWx0OiBhbnk7XHJcblxyXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XHJcbiAgICAgIHNwYW5SZXN1bHQgPSBzdGFuZGFyZFRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgIHNwYW5OYW1lOiAndGVzdC1zcGFuJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnZW5kJywgKCkgPT4ge1xyXG4gICAgICBpdCgnZGV2ZSBmaW5hbGl6YXIgbyBzcGFuJywgKCkgPT4ge1xyXG4gICAgICAgIHNwYW5SZXN1bHQuZW5kKCk7XHJcblxyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5lbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnc2V0U3VjY2VzcycsICgpID0+IHtcclxuICAgICAgaXQoJ2RldmUgbWFyY2FyIHNwYW4gY29tbyBzdWNlc3NvJywgKCkgPT4ge1xyXG4gICAgICAgIHNwYW5SZXN1bHQuc2V0U3VjY2Vzcyh0cnVlKTtcclxuXHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgICAnZXhlY3V0aW9uLnN1Y2Nlc3MnLFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldFN0YXR1cykudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xyXG4gICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuT0ssXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaXQoJ2RldmUgbWFyY2FyIHNwYW4gY29tbyBmYWxoYScsICgpID0+IHtcclxuICAgICAgICBzcGFuUmVzdWx0LnNldFN1Y2Nlc3MoZmFsc2UpO1xyXG5cclxuICAgICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICAgICdleGVjdXRpb24uc3VjY2VzcycsXHJcbiAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldFN0YXR1cykudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xyXG4gICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGVzY3JpYmUoJ3NldEVycm9yJywgKCkgPT4ge1xyXG4gICAgICBpdCgnZGV2ZSByZWdpc3RyYXIgZXJybyBubyBzcGFuJywgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdUZXN0IGVycm9yJyk7XHJcblxyXG4gICAgICAgIHNwYW5SZXN1bHQuc2V0RXJyb3IoZXJyb3IpO1xyXG5cclxuICAgICAgICBleHBlY3QobW9ja1NwYW4ucmVjb3JkRXhjZXB0aW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChlcnJvcik7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgICAnZXJyb3IudHlwZScsXHJcbiAgICAgICAgICAnRXJyb3InXHJcbiAgICAgICAgKTtcclxuICAgICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICAgICdlcnJvci5tZXNzYWdlJyxcclxuICAgICAgICAgICdUZXN0IGVycm9yJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgICAnZXhlY3V0aW9uLnN1Y2Nlc3MnLFxyXG4gICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRTdGF0dXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcclxuICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxyXG4gICAgICAgICAgbWVzc2FnZTogJ1Rlc3QgZXJyb3InLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGl0KCdkZXZlIGluY2x1aXIgc3RhY2sgdHJhY2UgcXVhbmRvIGRpc3BvbsOtdmVsJywgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdFcnJvciB3aXRoIHN0YWNrJyk7XHJcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSAnRXJyb3I6IEVycm9yIHdpdGggc3RhY2tcXG4gIGF0IHRlc3QudHM6MToxJztcclxuXHJcbiAgICAgICAgc3BhblJlc3VsdC5zZXRFcnJvcihlcnJvcik7XHJcblxyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRBdHRyaWJ1dGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgICAgJ2Vycm9yLnN0YWNrJyxcclxuICAgICAgICAgIGVycm9yLnN0YWNrXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpdCgnZGV2ZSBmdW5jaW9uYXIgY29tIGVycm8gY3VzdG9taXphZG8nLCAoKSA9PiB7XHJcbiAgICAgICAgY2xhc3MgQ3VzdG9tRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICAgICAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9ICdDdXN0b21FcnJvcic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBDdXN0b21FcnJvcignQ3VzdG9tIGVycm9yIG1lc3NhZ2UnKTtcclxuXHJcbiAgICAgICAgc3BhblJlc3VsdC5zZXRFcnJvcihlcnJvcik7XHJcblxyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRBdHRyaWJ1dGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgICAgJ2Vycm9yLnR5cGUnLFxyXG4gICAgICAgICAgJ0N1c3RvbUVycm9yJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgICAnZXJyb3IubWVzc2FnZScsXHJcbiAgICAgICAgICAnQ3VzdG9tIGVycm9yIG1lc3NhZ2UnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnc2V0QXR0cmlidXRlJywgKCkgPT4ge1xyXG4gICAgICBpdCgnZGV2ZSBhZGljaW9uYXIgYXRyaWJ1dG8gc3RyaW5nJywgKCkgPT4ge1xyXG4gICAgICAgIHNwYW5SZXN1bHQuc2V0QXR0cmlidXRlKCdjdXN0b20ua2V5JywgJ2N1c3RvbSB2YWx1ZScpO1xyXG5cclxuICAgICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICAgICdjdXN0b20ua2V5JyxcclxuICAgICAgICAgICdjdXN0b20gdmFsdWUnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpdCgnZGV2ZSBhZGljaW9uYXIgYXRyaWJ1dG8gbnVtw6lyaWNvJywgKCkgPT4ge1xyXG4gICAgICAgIHNwYW5SZXN1bHQuc2V0QXR0cmlidXRlKCdjdXN0b20uY291bnQnLCAxMjMpO1xyXG5cclxuICAgICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY3VzdG9tLmNvdW50JywgMTIzKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpdCgnZGV2ZSBhZGljaW9uYXIgYXRyaWJ1dG8gYm9vbGVhbm8nLCAoKSA9PiB7XHJcbiAgICAgICAgc3BhblJlc3VsdC5zZXRBdHRyaWJ1dGUoJ2N1c3RvbS5lbmFibGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRBdHRyaWJ1dGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgICAgJ2N1c3RvbS5lbmFibGVkJyxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgncmVjb3JkRXhjZXB0aW9uJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgcmVnaXN0cmFyIGV4Y2XDp8OjbyBjb20gdG9kb3Mgb3MgYXRyaWJ1dG9zJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignRXhjZXB0aW9uIHRlc3QnKTtcclxuICAgICAgZXJyb3Iuc3RhY2sgPSAnRXJyb3Igc3RhY2sgdHJhY2UgaGVyZSc7XHJcblxyXG4gICAgICBzdGFuZGFyZFRyYWNlci5yZWNvcmRFeGNlcHRpb24obW9ja1NwYW4sIGVycm9yKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5yZWNvcmRFeGNlcHRpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVycm9yKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yLnR5cGUnLCAnRXJyb3InKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2Vycm9yLm1lc3NhZ2UnLFxyXG4gICAgICAgICdFeGNlcHRpb24gdGVzdCdcclxuICAgICAgKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2Vycm9yLnN0YWNrJyxcclxuICAgICAgICAnRXJyb3Igc3RhY2sgdHJhY2UgaGVyZSdcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGZ1bmNpb25hciBzZW0gc3RhY2sgdHJhY2UnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdObyBzdGFjaycpO1xyXG4gICAgICBkZWxldGUgZXJyb3Iuc3RhY2s7XHJcblxyXG4gICAgICBzdGFuZGFyZFRyYWNlci5yZWNvcmRFeGNlcHRpb24obW9ja1NwYW4sIGVycm9yKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5yZWNvcmRFeGNlcHRpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVycm9yKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yLnR5cGUnLCAnRXJyb3InKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2Vycm9yLm1lc3NhZ2UnLFxyXG4gICAgICAgICdObyBzdGFjaydcclxuICAgICAgKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpOyAvLyBBcGVuYXMgdHlwZSBlIG1lc3NhZ2VcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnY2Vuw6FyaW9zIGRlIHVzbyBjb21wbGV0b3MnLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBnZXJlbmNpYXIgZmx1eG8gZGUgc3VjZXNzbyBjb21wbGV0bycsICgpID0+IHtcclxuICAgICAgY29uc3Qgc3BhblJlc3VsdCA9IHN0YW5kYXJkVHJhY2VyLnN0YXJ0U3Bhbih7XHJcbiAgICAgICAgc3Bhbk5hbWU6ICdjb21wbGV0ZS1vcGVyYXRpb24nLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnY29tcGxldGUtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ3Byb2Nlc3NEYXRhJyxcclxuICAgICAgICAgIHJlcXVlc3RJZDogJ3JlcS0xMjMnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvZGF0YScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzcGFuUmVzdWx0LnNldEF0dHJpYnV0ZSgnY3VzdG9tLnN0ZXAnLCAncHJvY2Vzc2luZycpO1xyXG4gICAgICBzcGFuUmVzdWx0LnNldFN1Y2Nlc3ModHJ1ZSk7XHJcbiAgICAgIHNwYW5SZXN1bHQuZW5kKCk7XHJcblxyXG4gICAgICBleHBlY3QobW9ja1RyYWNlci5zdGFydFNwYW4pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2N1c3RvbS5zdGVwJyxcclxuICAgICAgICAncHJvY2Vzc2luZydcclxuICAgICAgKTtcclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnNldEF0dHJpYnV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgJ2V4ZWN1dGlvbi5zdWNjZXNzJyxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRTdGF0dXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcclxuICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyxcclxuICAgICAgfSk7XHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5lbmQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGdlcmVuY2lhciBmbHV4byBkZSBlcnJvIGNvbXBsZXRvJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBzcGFuUmVzdWx0ID0gc3RhbmRhcmRUcmFjZXIuc3RhcnRTcGFuKHtcclxuICAgICAgICBzcGFuTmFtZTogJ2Vycm9yLW9wZXJhdGlvbicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICdlcnJvci1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ09wZXJhdGlvbiBmYWlsZWQnKTtcclxuXHJcbiAgICAgIHNwYW5SZXN1bHQuc2V0RXJyb3IoZXJyb3IpO1xyXG4gICAgICBzcGFuUmVzdWx0LmVuZCgpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tTcGFuLnJlY29yZEV4Y2VwdGlvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXJyb3IpO1xyXG4gICAgICBleHBlY3QobW9ja1NwYW4uc2V0QXR0cmlidXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICAnZXhlY3V0aW9uLnN1Y2Nlc3MnLFxyXG4gICAgICAgIGZhbHNlXHJcbiAgICAgICk7XHJcbiAgICAgIGV4cGVjdChtb2NrU3Bhbi5zZXRTdGF0dXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcclxuICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUixcclxuICAgICAgICBtZXNzYWdlOiAnT3BlcmF0aW9uIGZhaWxlZCcsXHJcbiAgICAgIH0pO1xyXG4gICAgICBleHBlY3QobW9ja1NwYW4uZW5kKS50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufSk7XHJcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export { StandardLogger } from './logger';
2
+ export { IStandardLogger, StandardLogData } from './logger-types';
3
+ export { StandardTracer } from './tracer';
4
+ export { IStandardTracer, StandardTraceData, StandardSpanResult, } from './tracer-types';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StandardTracer = exports.StandardLogger = void 0;
4
+ var logger_1 = require("./logger");
5
+ Object.defineProperty(exports, "StandardLogger", { enumerable: true, get: function () { return logger_1.StandardLogger; } });
6
+ var tracer_1 = require("./tracer");
7
+ Object.defineProperty(exports, "StandardTracer", { enumerable: true, get: function () { return tracer_1.StandardTracer; } });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBMEM7QUFBakMsd0dBQUEsY0FBYyxPQUFBO0FBRXZCLG1DQUEwQztBQUFqQyx3R0FBQSxjQUFjLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBTdGFuZGFyZExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcclxuZXhwb3J0IHsgSVN0YW5kYXJkTG9nZ2VyLCBTdGFuZGFyZExvZ0RhdGEgfSBmcm9tICcuL2xvZ2dlci10eXBlcyc7XHJcbmV4cG9ydCB7IFN0YW5kYXJkVHJhY2VyIH0gZnJvbSAnLi90cmFjZXInO1xyXG5leHBvcnQge1xyXG4gIElTdGFuZGFyZFRyYWNlcixcclxuICBTdGFuZGFyZFRyYWNlRGF0YSxcclxuICBTdGFuZGFyZFNwYW5SZXN1bHQsXHJcbn0gZnJvbSAnLi90cmFjZXItdHlwZXMnO1xyXG4iXX0=
@@ -0,0 +1,43 @@
1
+ export interface StandardLogData {
2
+ severity: 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
3
+ message: string;
4
+ error?: Error;
5
+ serviceName: string;
6
+ environment: string;
7
+ http?: {
8
+ method?: string;
9
+ url?: string;
10
+ endpoint?: string;
11
+ statusCode?: number;
12
+ headers?: Record<string, any>;
13
+ body?: any;
14
+ params?: Record<string, any>;
15
+ query?: Record<string, any>;
16
+ };
17
+ user?: {
18
+ accountUserUid?: string;
19
+ accountUid?: string;
20
+ applicationUid?: string;
21
+ };
22
+ execution?: {
23
+ requestId?: string;
24
+ awsRequestId?: string;
25
+ functionName?: string;
26
+ invocationId?: string;
27
+ controller?: string;
28
+ controllerMethod?: string;
29
+ origin?: string;
30
+ };
31
+ performance?: {
32
+ durationMs?: number;
33
+ success?: boolean;
34
+ };
35
+ context?: Record<string, any>;
36
+ timestamp: string;
37
+ }
38
+ export interface IStandardLogger {
39
+ logError(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
40
+ logInfo(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
41
+ logWarn(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
42
+ logDebug(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
43
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvbG9nZ2VyLXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogSW50ZXJmYWNlIHBhZHLDo28gcGFyYSBsb2dzIGVzdHJ1dHVyYWRvcyBlbSB0b2RhIGEgYXBsaWNhw6fDo28uXHJcbiAqIENvbWJpbmEgY2FtcG9zIGltcG9ydGFudGVzIGRlIGFtYmFzIGltcGxlbWVudGHDp8O1ZXMgKFRzZWQgZSBTU1QpLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFyZExvZ0RhdGEge1xyXG4gIC8vIEluZm9ybWHDp8O1ZXMgZG8gZXJyby9ldmVudG9cclxuICBzZXZlcml0eTogJ0VSUk9SJyB8ICdXQVJOJyB8ICdJTkZPJyB8ICdERUJVRyc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIGVycm9yPzogRXJyb3I7XHJcblxyXG4gIC8vIElkZW50aWZpY2HDp8OjbyBkbyBzZXJ2acOnb1xyXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XHJcbiAgZW52aXJvbm1lbnQ6IHN0cmluZzsgLy8gZGV2ZWxvcG1lbnQsIHN0YWdpbmcsIHByb2R1Y3Rpb25cclxuXHJcbiAgLy8gQ29udGV4dG8gZGEgcmVxdWlzacOnw6NvIEhUVFBcclxuICBodHRwPzoge1xyXG4gICAgbWV0aG9kPzogc3RyaW5nO1xyXG4gICAgdXJsPzogc3RyaW5nO1xyXG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XHJcbiAgICBzdGF0dXNDb2RlPzogbnVtYmVyO1xyXG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiAgICBib2R5PzogYW55O1xyXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICB9O1xyXG5cclxuICAvLyBJZGVudGlmaWNhw6fDo28gZG8gdXN1w6FyaW8vY29udGFcclxuICB1c2VyPzoge1xyXG4gICAgYWNjb3VudFVzZXJVaWQ/OiBzdHJpbmc7XHJcbiAgICBhY2NvdW50VWlkPzogc3RyaW5nO1xyXG4gICAgYXBwbGljYXRpb25VaWQ/OiBzdHJpbmc7XHJcbiAgfTtcclxuXHJcbiAgLy8gQ29udGV4dG8gZGEgZXhlY3XDp8Ojb1xyXG4gIGV4ZWN1dGlvbj86IHtcclxuICAgIHJlcXVlc3RJZD86IHN0cmluZztcclxuICAgIGF3c1JlcXVlc3RJZD86IHN0cmluZztcclxuICAgIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcclxuICAgIGludm9jYXRpb25JZD86IHN0cmluZztcclxuICAgIGNvbnRyb2xsZXI/OiBzdHJpbmc7XHJcbiAgICBjb250cm9sbGVyTWV0aG9kPzogc3RyaW5nO1xyXG4gICAgb3JpZ2luPzogc3RyaW5nOyAvLyBvcmlnZW0gZGEgcmVxdWlzacOnw6NvIChleDogd2ViLCBtb2JpbGUpXHJcbiAgfTtcclxuXHJcbiAgLy8gUGVyZm9ybWFuY2VcclxuICBwZXJmb3JtYW5jZT86IHtcclxuICAgIGR1cmF0aW9uTXM/OiBudW1iZXI7XHJcbiAgICBzdWNjZXNzPzogYm9vbGVhbjtcclxuICB9O1xyXG5cclxuICAvLyBDb250ZXh0byBhZGljaW9uYWwgbGl2cmVcclxuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuXHJcbiAgLy8gVGltZXN0YW1wXHJcbiAgdGltZXN0YW1wOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgcGFyYSBvIGxvZ2dlciBjb3JlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElTdGFuZGFyZExvZ2dlciB7XHJcbiAgbG9nRXJyb3IoXHJcbiAgICBkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPlxyXG4gICk6IFByb21pc2U8dm9pZD47XHJcbiAgbG9nSW5mbyhkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPik6IFByb21pc2U8dm9pZD47XHJcbiAgbG9nV2FybihkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPik6IFByb21pc2U8dm9pZD47XHJcbiAgbG9nRGVidWcoXHJcbiAgICBkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPlxyXG4gICk6IFByb21pc2U8dm9pZD47XHJcbn1cclxuIl19
@@ -0,0 +1,13 @@
1
+ import { Logger } from '@opentelemetry/api-logs';
2
+ import { IStandardLogger, StandardLogData } from './logger-types';
3
+ export declare class StandardLogger implements IStandardLogger {
4
+ private readonly defaultServiceName;
5
+ private logger;
6
+ constructor(logger: Logger, defaultServiceName?: string);
7
+ logError(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
8
+ logInfo(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
9
+ logWarn(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
10
+ logDebug(data: Omit<StandardLogData, 'severity' | 'timestamp'>): Promise<void>;
11
+ private log;
12
+ private buildAttributes;
13
+ }
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.StandardLogger = void 0;
13
+ const api_logs_1 = require("@opentelemetry/api-logs");
14
+ class StandardLogger {
15
+ constructor(logger, defaultServiceName = 'unknown-service') {
16
+ this.defaultServiceName = defaultServiceName;
17
+ this.logger = logger;
18
+ }
19
+ logError(data) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ yield this.log(Object.assign(Object.assign({}, data), { severity: 'ERROR' }));
22
+ });
23
+ }
24
+ logInfo(data) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ yield this.log(Object.assign(Object.assign({}, data), { severity: 'INFO' }));
27
+ });
28
+ }
29
+ logWarn(data) {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ yield this.log(Object.assign(Object.assign({}, data), { severity: 'WARN' }));
32
+ });
33
+ }
34
+ logDebug(data) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ yield this.log(Object.assign(Object.assign({}, data), { severity: 'DEBUG' }));
37
+ });
38
+ }
39
+ log(data) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ const fullData = Object.assign(Object.assign({}, data), { timestamp: new Date().toISOString(), serviceName: data.serviceName || this.defaultServiceName });
42
+ const severityMap = {
43
+ ERROR: api_logs_1.SeverityNumber.ERROR,
44
+ WARN: api_logs_1.SeverityNumber.WARN,
45
+ INFO: api_logs_1.SeverityNumber.INFO,
46
+ DEBUG: api_logs_1.SeverityNumber.DEBUG,
47
+ };
48
+ const logRecord = {
49
+ severityNumber: severityMap[fullData.severity],
50
+ severityText: fullData.severity,
51
+ body: fullData.message,
52
+ attributes: this.buildAttributes(fullData),
53
+ };
54
+ this.logger.emit(logRecord);
55
+ });
56
+ }
57
+ buildAttributes(data) {
58
+ const attributes = {
59
+ timestamp: data.timestamp,
60
+ 'service.name': data.serviceName,
61
+ 'deployment.environment.name': data.environment,
62
+ };
63
+ if (data.error) {
64
+ attributes['error.type'] = data.error.name;
65
+ attributes['error.message'] = data.error.message;
66
+ attributes['error.stack'] = data.error.stack || '';
67
+ }
68
+ if (data.http) {
69
+ if (data.http.method)
70
+ attributes['http.method'] = data.http.method;
71
+ if (data.http.url)
72
+ attributes['http.url'] = data.http.url;
73
+ if (data.http.endpoint)
74
+ attributes['http.endpoint'] = data.http.endpoint;
75
+ if (data.http.statusCode)
76
+ attributes['http.status_code'] = data.http.statusCode;
77
+ if (data.http.headers)
78
+ attributes['http.headers'] = JSON.stringify(data.http.headers);
79
+ if (data.http.body)
80
+ attributes['http.body'] = JSON.stringify(data.http.body);
81
+ if (data.http.params)
82
+ attributes['http.params'] = JSON.stringify(data.http.params);
83
+ if (data.http.query)
84
+ attributes['http.query'] = JSON.stringify(data.http.query);
85
+ }
86
+ if (data.user) {
87
+ if (data.user.accountUserUid)
88
+ attributes['accountUser.uid'] = data.user.accountUserUid;
89
+ if (data.user.accountUid)
90
+ attributes['account.uid'] = data.user.accountUid;
91
+ if (data.user.applicationUid)
92
+ attributes['application.uid'] = data.user.applicationUid;
93
+ }
94
+ if (data.execution) {
95
+ if (data.execution.requestId)
96
+ attributes['request.id'] = data.execution.requestId;
97
+ if (data.execution.awsRequestId)
98
+ attributes['aws.request.id'] = data.execution.awsRequestId;
99
+ if (data.execution.functionName)
100
+ attributes['faas.name'] = data.execution.functionName;
101
+ if (data.execution.invocationId)
102
+ attributes['faas.invocation_id'] = data.execution.invocationId;
103
+ if (data.execution.controller)
104
+ attributes['controller.name'] = data.execution.controller;
105
+ if (data.execution.controllerMethod)
106
+ attributes['controller.method'] = data.execution.controllerMethod;
107
+ if (data.execution.origin)
108
+ attributes['origin'] = data.execution.origin;
109
+ }
110
+ if (data.performance) {
111
+ if (data.performance.durationMs)
112
+ attributes['duration.ms'] = data.performance.durationMs;
113
+ if (data.performance.success !== undefined)
114
+ attributes['execution.success'] = data.performance.success;
115
+ }
116
+ if (data.context) {
117
+ attributes['context'] = JSON.stringify(data.context);
118
+ }
119
+ return Object.fromEntries(Object.entries(attributes).filter(([, value]) => value !== undefined && value !== null));
120
+ }
121
+ }
122
+ exports.StandardLogger = StandardLogger;
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFpRTtBQU9qRSxNQUFhLGNBQWM7SUFHekIsWUFDRSxNQUFjLEVBQ0cscUJBQTZCLGlCQUFpQjtRQUE5Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTRCO1FBRS9ELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFSyxRQUFRLENBQ1osSUFBcUQ7O1lBRXJELE1BQU0sSUFBSSxDQUFDLEdBQUcsaUNBQU0sSUFBSSxLQUFFLFFBQVEsRUFBRSxPQUFPLElBQUcsQ0FBQztRQUNqRCxDQUFDO0tBQUE7SUFFSyxPQUFPLENBQ1gsSUFBcUQ7O1lBRXJELE1BQU0sSUFBSSxDQUFDLEdBQUcsaUNBQU0sSUFBSSxLQUFFLFFBQVEsRUFBRSxNQUFNLElBQUcsQ0FBQztRQUNoRCxDQUFDO0tBQUE7SUFFSyxPQUFPLENBQ1gsSUFBcUQ7O1lBRXJELE1BQU0sSUFBSSxDQUFDLEdBQUcsaUNBQU0sSUFBSSxLQUFFLFFBQVEsRUFBRSxNQUFNLElBQUcsQ0FBQztRQUNoRCxDQUFDO0tBQUE7SUFFSyxRQUFRLENBQ1osSUFBcUQ7O1lBRXJELE1BQU0sSUFBSSxDQUFDLEdBQUcsaUNBQU0sSUFBSSxLQUFFLFFBQVEsRUFBRSxPQUFPLElBQUcsQ0FBQztRQUNqRCxDQUFDO0tBQUE7SUFFYSxHQUFHLENBQ2YsSUFFQzs7WUFFRCxNQUFNLFFBQVEsbUNBQ1QsSUFBSSxLQUNQLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUNuQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQ3pELENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRztnQkFDbEIsS0FBSyxFQUFFLHlCQUFjLENBQUMsS0FBSztnQkFDM0Is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QUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDMUUsQ0FBQztRQUdELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVO2dCQUM3QixVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDMUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTO2dCQUN4QyxVQUFVLENBQUMsbUJBQW1CLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUMvRCxDQUFDO1FBR0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFHRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUMvQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUNyRCxDQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE1SUQsd0NBNElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2V2ZXJpdHlOdW1iZXIsIExvZ2dlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzJztcclxuaW1wb3J0IHsgSVN0YW5kYXJkTG9nZ2VyLCBTdGFuZGFyZExvZ0RhdGEgfSBmcm9tICcuL2xvZ2dlci10eXBlcyc7XHJcblxyXG4vKipcclxuICogTG9nZ2VyIGNvcmUgcXVlIGltcGxlbWVudGEgbyBwYWRyw6NvIGRlIGxvZ3MgZXN0cnV0dXJhZG9zLlxyXG4gKiBSZWNlYmUgdW0gTG9nZ2VyUHJvdmlkZXIgZG8gT3BlblRlbGVtZXRyeSBwYXJhIGVtaXRpciBvcyBsb2dzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN0YW5kYXJkTG9nZ2VyIGltcGxlbWVudHMgSVN0YW5kYXJkTG9nZ2VyIHtcclxuICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGxvZ2dlcjogTG9nZ2VyLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0U2VydmljZU5hbWU6IHN0cmluZyA9ICd1bmtub3duLXNlcnZpY2UnXHJcbiAgKSB7XHJcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvZ0Vycm9yKFxyXG4gICAgZGF0YTogT21pdDxTdGFuZGFyZExvZ0RhdGEsICdzZXZlcml0eScgfCAndGltZXN0YW1wJz5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubG9nKHsgLi4uZGF0YSwgc2V2ZXJpdHk6ICdFUlJPUicgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2dJbmZvKFxyXG4gICAgZGF0YTogT21pdDxTdGFuZGFyZExvZ0RhdGEsICdzZXZlcml0eScgfCAndGltZXN0YW1wJz5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubG9nKHsgLi4uZGF0YSwgc2V2ZXJpdHk6ICdJTkZPJyB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvZ1dhcm4oXHJcbiAgICBkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPlxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sb2coeyAuLi5kYXRhLCBzZXZlcml0eTogJ1dBUk4nIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9nRGVidWcoXHJcbiAgICBkYXRhOiBPbWl0PFN0YW5kYXJkTG9nRGF0YSwgJ3NldmVyaXR5JyB8ICd0aW1lc3RhbXAnPlxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sb2coeyAuLi5kYXRhLCBzZXZlcml0eTogJ0RFQlVHJyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9nKFxyXG4gICAgZGF0YTogT21pdDxTdGFuZGFyZExvZ0RhdGEsICd0aW1lc3RhbXAnPiAmIHtcclxuICAgICAgc2V2ZXJpdHk6IFN0YW5kYXJkTG9nRGF0YVsnc2V2ZXJpdHknXTtcclxuICAgIH1cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGZ1bGxEYXRhOiBTdGFuZGFyZExvZ0RhdGEgPSB7XHJcbiAgICAgIC4uLmRhdGEsXHJcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogZGF0YS5zZXJ2aWNlTmFtZSB8fCB0aGlzLmRlZmF1bHRTZXJ2aWNlTmFtZSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc2V2ZXJpdHlNYXAgPSB7XHJcbiAgICAgIEVSUk9SOiBTZXZlcml0eU51bWJlci5FUlJPUixcclxuICAgICAgV0FSTjogU2V2ZXJpdHlOdW1iZXIuV0FSTixcclxuICAgICAgSU5GTzogU2V2ZXJpdHlOdW1iZXIuSU5GTyxcclxuICAgICAgREVCVUc6IFNldmVyaXR5TnVtYmVyLkRFQlVHLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBsb2dSZWNvcmQgPSB7XHJcbiAgICAgIHNldmVyaXR5TnVtYmVyOiBzZXZlcml0eU1hcFtmdWxsRGF0YS5zZXZlcml0eV0sXHJcbiAgICAgIHNldmVyaXR5VGV4dDogZnVsbERhdGEuc2V2ZXJpdHksXHJcbiAgICAgIGJvZHk6IGZ1bGxEYXRhLm1lc3NhZ2UsXHJcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuYnVpbGRBdHRyaWJ1dGVzKGZ1bGxEYXRhKSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5sb2dnZXIuZW1pdChsb2dSZWNvcmQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEF0dHJpYnV0ZXMoZGF0YTogU3RhbmRhcmRMb2dEYXRhKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBjb25zdCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICB0aW1lc3RhbXA6IGRhdGEudGltZXN0YW1wLFxyXG4gICAgICAnc2VydmljZS5uYW1lJzogZGF0YS5zZXJ2aWNlTmFtZSxcclxuICAgICAgJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSc6IGRhdGEuZW52aXJvbm1lbnQsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEluZm9ybWHDp8O1ZXMgZG8gZXJyb1xyXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcclxuICAgICAgYXR0cmlidXRlc1snZXJyb3IudHlwZSddID0gZGF0YS5lcnJvci5uYW1lO1xyXG4gICAgICBhdHRyaWJ1dGVzWydlcnJvci5tZXNzYWdlJ10gPSBkYXRhLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgIGF0dHJpYnV0ZXNbJ2Vycm9yLnN0YWNrJ10gPSBkYXRhLmVycm9yLnN0YWNrIHx8ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhUVFBcclxuICAgIGlmIChkYXRhLmh0dHApIHtcclxuICAgICAgaWYgKGRhdGEuaHR0cC5tZXRob2QpIGF0dHJpYnV0ZXNbJ2h0dHAubWV0aG9kJ10gPSBkYXRhLmh0dHAubWV0aG9kO1xyXG4gICAgICBpZiAoZGF0YS5odHRwLnVybCkgYXR0cmlidXRlc1snaHR0cC51cmwnXSA9IGRhdGEuaHR0cC51cmw7XHJcbiAgICAgIGlmIChkYXRhLmh0dHAuZW5kcG9pbnQpIGF0dHJpYnV0ZXNbJ2h0dHAuZW5kcG9pbnQnXSA9IGRhdGEuaHR0cC5lbmRwb2ludDtcclxuICAgICAgaWYgKGRhdGEuaHR0cC5zdGF0dXNDb2RlKVxyXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2h0dHAuc3RhdHVzX2NvZGUnXSA9IGRhdGEuaHR0cC5zdGF0dXNDb2RlO1xyXG4gICAgICBpZiAoZGF0YS5odHRwLmhlYWRlcnMpXHJcbiAgICAgICAgYXR0cmlidXRlc1snaHR0cC5oZWFkZXJzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLmh0dHAuaGVhZGVycyk7XHJcbiAgICAgIGlmIChkYXRhLmh0dHAuYm9keSlcclxuICAgICAgICBhdHRyaWJ1dGVzWydodHRwLmJvZHknXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuaHR0cC5ib2R5KTtcclxuICAgICAgaWYgKGRhdGEuaHR0cC5wYXJhbXMpXHJcbiAgICAgICAgYXR0cmlidXRlc1snaHR0cC5wYXJhbXMnXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuaHR0cC5wYXJhbXMpO1xyXG4gICAgICBpZiAoZGF0YS5odHRwLnF1ZXJ5KVxyXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2h0dHAucXVlcnknXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuaHR0cC5xdWVyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXN1w6FyaW9cclxuICAgIGlmIChkYXRhLnVzZXIpIHtcclxuICAgICAgaWYgKGRhdGEudXNlci5hY2NvdW50VXNlclVpZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydhY2NvdW50VXNlci51aWQnXSA9IGRhdGEudXNlci5hY2NvdW50VXNlclVpZDtcclxuICAgICAgaWYgKGRhdGEudXNlci5hY2NvdW50VWlkKVxyXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2FjY291bnQudWlkJ10gPSBkYXRhLnVzZXIuYWNjb3VudFVpZDtcclxuICAgICAgaWYgKGRhdGEudXNlci5hcHBsaWNhdGlvblVpZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydhcHBsaWNhdGlvbi51aWQnXSA9IGRhdGEudXNlci5hcHBsaWNhdGlvblVpZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeGVjdcOnw6NvXHJcbiAgICBpZiAoZGF0YS5leGVjdXRpb24pIHtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLnJlcXVlc3RJZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydyZXF1ZXN0LmlkJ10gPSBkYXRhLmV4ZWN1dGlvbi5yZXF1ZXN0SWQ7XHJcbiAgICAgIGlmIChkYXRhLmV4ZWN1dGlvbi5hd3NSZXF1ZXN0SWQpXHJcbiAgICAgICAgYXR0cmlidXRlc1snYXdzLnJlcXVlc3QuaWQnXSA9IGRhdGEuZXhlY3V0aW9uLmF3c1JlcXVlc3RJZDtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLmZ1bmN0aW9uTmFtZSlcclxuICAgICAgICBhdHRyaWJ1dGVzWydmYWFzLm5hbWUnXSA9IGRhdGEuZXhlY3V0aW9uLmZ1bmN0aW9uTmFtZTtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLmludm9jYXRpb25JZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydmYWFzLmludm9jYXRpb25faWQnXSA9IGRhdGEuZXhlY3V0aW9uLmludm9jYXRpb25JZDtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLmNvbnRyb2xsZXIpXHJcbiAgICAgICAgYXR0cmlidXRlc1snY29udHJvbGxlci5uYW1lJ10gPSBkYXRhLmV4ZWN1dGlvbi5jb250cm9sbGVyO1xyXG4gICAgICBpZiAoZGF0YS5leGVjdXRpb24uY29udHJvbGxlck1ldGhvZClcclxuICAgICAgICBhdHRyaWJ1dGVzWydjb250cm9sbGVyLm1ldGhvZCddID0gZGF0YS5leGVjdXRpb24uY29udHJvbGxlck1ldGhvZDtcclxuICAgICAgaWYgKGRhdGEuZXhlY3V0aW9uLm9yaWdpbikgYXR0cmlidXRlc1snb3JpZ2luJ10gPSBkYXRhLmV4ZWN1dGlvbi5vcmlnaW47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGVyZm9ybWFuY2VcclxuICAgIGlmIChkYXRhLnBlcmZvcm1hbmNlKSB7XHJcbiAgICAgIGlmIChkYXRhLnBlcmZvcm1hbmNlLmR1cmF0aW9uTXMpXHJcbiAgICAgICAgYXR0cmlidXRlc1snZHVyYXRpb24ubXMnXSA9IGRhdGEucGVyZm9ybWFuY2UuZHVyYXRpb25NcztcclxuICAgICAgaWYgKGRhdGEucGVyZm9ybWFuY2Uuc3VjY2VzcyAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2V4ZWN1dGlvbi5zdWNjZXNzJ10gPSBkYXRhLnBlcmZvcm1hbmNlLnN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udGV4dG8gYWRpY2lvbmFsXHJcbiAgICBpZiAoZGF0YS5jb250ZXh0KSB7XHJcbiAgICAgIGF0dHJpYnV0ZXNbJ2NvbnRleHQnXSA9IEpTT04uc3RyaW5naWZ5KGRhdGEuY29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmlsdHJhciB2YWxvcmVzIHVuZGVmaW5lZC9udWxsXHJcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxyXG4gICAgICBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKS5maWx0ZXIoXHJcbiAgICAgICAgKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbFxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=