@railhook/node 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const client_1 = require("../client");
37
+ const http = __importStar(require("http"));
38
+ // Minimal mock HTTP server to verify request paths & methods
39
+ let server;
40
+ let lastRequest;
41
+ let mockResponse = { status: 200, body: {} };
42
+ const PORT = 19876;
43
+ beforeAll((done) => {
44
+ server = http.createServer((req, res) => {
45
+ let body = '';
46
+ req.on('data', (chunk) => (body += chunk));
47
+ req.on('end', () => {
48
+ lastRequest = {
49
+ method: req.method || '',
50
+ url: req.url || '',
51
+ body,
52
+ headers: req.headers,
53
+ };
54
+ res.writeHead(mockResponse.status, { 'Content-Type': 'application/json' });
55
+ res.end(JSON.stringify(mockResponse.body));
56
+ });
57
+ });
58
+ server.listen(PORT, done);
59
+ });
60
+ afterAll((done) => {
61
+ server.close(done);
62
+ });
63
+ function setMockResponse(status, body) {
64
+ mockResponse = { status, body };
65
+ }
66
+ function createClient() {
67
+ return new client_1.Railhook({
68
+ apiKey: 'test_key',
69
+ baseUrl: `http://localhost:${PORT}`,
70
+ });
71
+ }
72
+ describe('IncomingSources', () => {
73
+ const client = createClient();
74
+ const projectId = 'proj-123';
75
+ const sourceId = 'src-456';
76
+ const sourceResponse = {
77
+ id: sourceId,
78
+ projectId,
79
+ name: 'Stripe Webhooks',
80
+ slug: 'stripe',
81
+ providerType: 'STRIPE',
82
+ status: 'ACTIVE',
83
+ ingressPathToken: 'tok_abc',
84
+ ingressUrl: `http://localhost:${PORT}/ingress/tok_abc`,
85
+ verificationMode: 'HMAC_GENERIC',
86
+ hmacHeaderName: 'Stripe-Signature',
87
+ hmacSecretConfigured: true,
88
+ createdAt: '2024-01-01T00:00:00Z',
89
+ };
90
+ describe('create', () => {
91
+ it('should POST to correct path with params', async () => {
92
+ setMockResponse(200, sourceResponse);
93
+ const result = await client.incomingSources.create(projectId, {
94
+ name: 'Stripe Webhooks',
95
+ slug: 'stripe',
96
+ providerType: 'STRIPE',
97
+ verificationMode: 'HMAC_GENERIC',
98
+ hmacSecret: 'whsec_test',
99
+ hmacHeaderName: 'Stripe-Signature',
100
+ });
101
+ expect(lastRequest.method).toBe('POST');
102
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources`);
103
+ const body = JSON.parse(lastRequest.body);
104
+ expect(body.name).toBe('Stripe Webhooks');
105
+ expect(body.providerType).toBe('STRIPE');
106
+ expect(body.hmacSecret).toBe('whsec_test');
107
+ expect(result.id).toBe(sourceId);
108
+ expect(result.ingressUrl).toContain('tok_abc');
109
+ });
110
+ });
111
+ describe('get', () => {
112
+ it('should GET by source ID', async () => {
113
+ setMockResponse(200, sourceResponse);
114
+ const result = await client.incomingSources.get(projectId, sourceId);
115
+ expect(lastRequest.method).toBe('GET');
116
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}`);
117
+ expect(result.name).toBe('Stripe Webhooks');
118
+ });
119
+ });
120
+ describe('list', () => {
121
+ it('should GET sources list', async () => {
122
+ setMockResponse(200, { content: [sourceResponse], totalElements: 1, totalPages: 1, size: 20, number: 0 });
123
+ const result = await client.incomingSources.list(projectId);
124
+ expect(lastRequest.method).toBe('GET');
125
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources`);
126
+ expect(result.content).toHaveLength(1);
127
+ expect(result.content[0].slug).toBe('stripe');
128
+ });
129
+ });
130
+ describe('update', () => {
131
+ it('should PUT with update params', async () => {
132
+ setMockResponse(200, { ...sourceResponse, name: 'Updated' });
133
+ const result = await client.incomingSources.update(projectId, sourceId, {
134
+ name: 'Updated',
135
+ status: 'DISABLED',
136
+ });
137
+ expect(lastRequest.method).toBe('PUT');
138
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}`);
139
+ const body = JSON.parse(lastRequest.body);
140
+ expect(body.name).toBe('Updated');
141
+ expect(body.status).toBe('DISABLED');
142
+ expect(result.name).toBe('Updated');
143
+ });
144
+ });
145
+ describe('delete', () => {
146
+ it('should DELETE by source ID', async () => {
147
+ setMockResponse(204, '');
148
+ await client.incomingSources.delete(projectId, sourceId);
149
+ expect(lastRequest.method).toBe('DELETE');
150
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}`);
151
+ });
152
+ });
153
+ // ── Destinations ──
154
+ const destId = 'dest-789';
155
+ const destResponse = {
156
+ id: destId,
157
+ incomingSourceId: sourceId,
158
+ url: 'https://api.example.com/webhooks/stripe',
159
+ authType: 'NONE',
160
+ authConfigured: false,
161
+ enabled: true,
162
+ maxAttempts: 5,
163
+ timeoutSeconds: 30,
164
+ createdAt: '2024-01-01T00:00:00Z',
165
+ };
166
+ describe('createDestination', () => {
167
+ it('should POST to destinations path', async () => {
168
+ setMockResponse(200, destResponse);
169
+ const result = await client.incomingSources.createDestination(projectId, sourceId, {
170
+ url: 'https://api.example.com/webhooks/stripe',
171
+ enabled: true,
172
+ maxAttempts: 5,
173
+ });
174
+ expect(lastRequest.method).toBe('POST');
175
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations`);
176
+ const body = JSON.parse(lastRequest.body);
177
+ expect(body.url).toBe('https://api.example.com/webhooks/stripe');
178
+ expect(result.id).toBe(destId);
179
+ });
180
+ });
181
+ describe('getDestination', () => {
182
+ it('should GET destination by ID', async () => {
183
+ setMockResponse(200, destResponse);
184
+ const result = await client.incomingSources.getDestination(projectId, sourceId, destId);
185
+ expect(lastRequest.method).toBe('GET');
186
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destId}`);
187
+ expect(result.url).toBe('https://api.example.com/webhooks/stripe');
188
+ });
189
+ });
190
+ describe('listDestinations', () => {
191
+ it('should GET destinations list', async () => {
192
+ setMockResponse(200, { content: [destResponse], totalElements: 1, totalPages: 1, size: 20, number: 0 });
193
+ const result = await client.incomingSources.listDestinations(projectId, sourceId);
194
+ expect(lastRequest.method).toBe('GET');
195
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations`);
196
+ expect(result.content).toHaveLength(1);
197
+ });
198
+ });
199
+ describe('updateDestination', () => {
200
+ it('should PUT with update params', async () => {
201
+ setMockResponse(200, { ...destResponse, enabled: false });
202
+ const result = await client.incomingSources.updateDestination(projectId, sourceId, destId, {
203
+ enabled: false,
204
+ });
205
+ expect(lastRequest.method).toBe('PUT');
206
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destId}`);
207
+ expect(result.enabled).toBe(false);
208
+ });
209
+ });
210
+ describe('deleteDestination', () => {
211
+ it('should DELETE destination', async () => {
212
+ setMockResponse(204, '');
213
+ await client.incomingSources.deleteDestination(projectId, sourceId, destId);
214
+ expect(lastRequest.method).toBe('DELETE');
215
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destId}`);
216
+ });
217
+ });
218
+ });
219
+ describe('IncomingEvents', () => {
220
+ const client = createClient();
221
+ const projectId = 'proj-123';
222
+ const eventId = 'evt-abc';
223
+ const eventResponse = {
224
+ id: eventId,
225
+ incomingSourceId: 'src-456',
226
+ sourceName: 'Stripe Webhooks',
227
+ requestId: 'req-xyz',
228
+ method: 'POST',
229
+ path: '/ingress/tok_abc',
230
+ bodyRaw: '{"type":"checkout.session.completed"}',
231
+ contentType: 'application/json',
232
+ verified: true,
233
+ receivedAt: '2024-01-01T00:00:00Z',
234
+ };
235
+ describe('list', () => {
236
+ it('should GET events without params', async () => {
237
+ setMockResponse(200, { content: [eventResponse], totalElements: 1, totalPages: 1, size: 20, number: 0 });
238
+ const result = await client.incomingEvents.list(projectId);
239
+ expect(lastRequest.method).toBe('GET');
240
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-events`);
241
+ expect(result.content).toHaveLength(1);
242
+ expect(result.content[0].requestId).toBe('req-xyz');
243
+ });
244
+ it('should pass sourceId filter as query param', async () => {
245
+ setMockResponse(200, { content: [], totalElements: 0, totalPages: 0, size: 20, number: 0 });
246
+ await client.incomingEvents.list(projectId, { sourceId: 'src-456' });
247
+ expect(lastRequest.url).toContain('sourceId=src-456');
248
+ });
249
+ it('should pass pagination params', async () => {
250
+ setMockResponse(200, { content: [], totalElements: 0, totalPages: 0, size: 10, number: 2 });
251
+ await client.incomingEvents.list(projectId, { page: 2, size: 10 });
252
+ expect(lastRequest.url).toContain('page=2');
253
+ expect(lastRequest.url).toContain('size=10');
254
+ });
255
+ });
256
+ describe('get', () => {
257
+ it('should GET event by ID', async () => {
258
+ setMockResponse(200, eventResponse);
259
+ const result = await client.incomingEvents.get(projectId, eventId);
260
+ expect(lastRequest.method).toBe('GET');
261
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-events/${eventId}`);
262
+ expect(result.verified).toBe(true);
263
+ expect(result.method).toBe('POST');
264
+ });
265
+ });
266
+ describe('getAttempts', () => {
267
+ it('should GET forward attempts', async () => {
268
+ const attemptResponse = {
269
+ content: [{
270
+ id: 'att-1',
271
+ incomingEventId: eventId,
272
+ destinationId: 'dest-789',
273
+ destinationUrl: 'https://api.example.com/webhooks/stripe',
274
+ attemptNumber: 1,
275
+ status: 'SUCCESS',
276
+ startedAt: '2024-01-01T00:00:00Z',
277
+ finishedAt: '2024-01-01T00:00:01Z',
278
+ responseCode: 200,
279
+ responseBodySnippet: 'OK',
280
+ createdAt: '2024-01-01T00:00:00Z',
281
+ }],
282
+ totalElements: 1,
283
+ totalPages: 1,
284
+ size: 20,
285
+ number: 0,
286
+ };
287
+ setMockResponse(200, attemptResponse);
288
+ const result = await client.incomingEvents.getAttempts(projectId, eventId);
289
+ expect(lastRequest.method).toBe('GET');
290
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-events/${eventId}/attempts`);
291
+ expect(result.content).toHaveLength(1);
292
+ expect(result.content[0].responseCode).toBe(200);
293
+ expect(result.content[0].status).toBe('SUCCESS');
294
+ expect(result.content[0].attemptNumber).toBe(1);
295
+ expect(result.content[0].destinationUrl).toBe('https://api.example.com/webhooks/stripe');
296
+ });
297
+ });
298
+ describe('replay', () => {
299
+ it('should POST replay', async () => {
300
+ setMockResponse(200, { status: 'replayed', eventId, destinationsCount: 2 });
301
+ const result = await client.incomingEvents.replay(projectId, eventId);
302
+ expect(lastRequest.method).toBe('POST');
303
+ expect(lastRequest.url).toBe(`/api/v1/projects/${projectId}/incoming-events/${eventId}/replay`);
304
+ expect(result.status).toBe('replayed');
305
+ expect(result.destinationsCount).toBe(2);
306
+ });
307
+ });
308
+ });
309
+ describe('Client initialization includes incoming modules', () => {
310
+ it('should have incomingSources and incomingEvents', () => {
311
+ const client = new client_1.Railhook({ apiKey: 'test_key' });
312
+ expect(client.incomingSources).toBeDefined();
313
+ expect(client.incomingEvents).toBeDefined();
314
+ });
315
+ });
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jb21pbmcudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5jb21pbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNDQUFxQztBQUNyQywyQ0FBNkI7QUFFN0IsNkRBQTZEO0FBQzdELElBQUksTUFBbUIsQ0FBQztBQUN4QixJQUFJLFdBQTZGLENBQUM7QUFDbEcsSUFBSSxZQUFZLEdBQXNDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFaEYsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBRW5CLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2pCLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3RDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNqQixXQUFXLEdBQUc7Z0JBQ1osTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRTtnQkFDeEIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRTtnQkFDbEIsSUFBSTtnQkFDSixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87YUFDckIsQ0FBQztZQUNGLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDM0UsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxD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QyxDQUFDO1lBRTVFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXRFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixTQUFTLG9CQUFvQixPQUFPLFNBQVMsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtJQUMvRCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksaUJBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmFpbGhvb2sgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcblxuLy8gTWluaW1hbCBtb2NrIEhUVFAgc2VydmVyIHRvIHZlcmlmeSByZXF1ZXN0IHBhdGhzICYgbWV0aG9kc1xubGV0IHNlcnZlcjogaHR0cC5TZXJ2ZXI7XG5sZXQgbGFzdFJlcXVlc3Q6IHsgbWV0aG9kOiBzdHJpbmc7IHVybDogc3RyaW5nOyBib2R5OiBzdHJpbmc7IGhlYWRlcnM6IGh0dHAuSW5jb21pbmdIdHRwSGVhZGVycyB9O1xubGV0IG1vY2tSZXNwb25zZTogeyBzdGF0dXM6IG51bWJlcjsgYm9keTogdW5rbm93biB9ID0geyBzdGF0dXM6IDIwMCwgYm9keToge30gfTtcblxuY29uc3QgUE9SVCA9IDE5ODc2O1xuXG5iZWZvcmVBbGwoKGRvbmUpID0+IHtcbiAgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKHJlcSwgcmVzKSA9PiB7XG4gICAgbGV0IGJvZHkgPSAnJztcbiAgICByZXEub24oJ2RhdGEnLCAoY2h1bmspID0+IChib2R5ICs9IGNodW5rKSk7XG4gICAgcmVxLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBsYXN0UmVxdWVzdCA9IHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kIHx8ICcnLFxuICAgICAgICB1cmw6IHJlcS51cmwgfHwgJycsXG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgfTtcbiAgICAgIHJlcy53cml0ZUhlYWQobW9ja1Jlc3BvbnNlLnN0YXR1cywgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgcmVzLmVuZChKU09OLnN0cmluZ2lmeShtb2NrUmVzcG9uc2UuYm9keSkpO1xuICAgIH0pO1xuICB9KTtcbiAgc2VydmVyLmxpc3RlbihQT1JULCBkb25lKTtcbn0pO1xuXG5hZnRlckFsbCgoZG9uZSkgPT4ge1xuICBzZXJ2ZXIuY2xvc2UoZG9uZSk7XG59KTtcblxuZnVuY3Rpb24gc2V0TW9ja1Jlc3BvbnNlKHN0YXR1czogbnVtYmVyLCBib2R5OiB1bmtub3duKSB7XG4gIG1vY2tSZXNwb25zZSA9IHsgc3RhdHVzLCBib2R5IH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudCgpOiBSYWlsaG9vayB7XG4gIHJldHVybiBuZXcgUmFpbGhvb2soe1xuICAgIGFwaUtleTogJ3Rlc3Rfa2V5JyxcbiAgICBiYXNlVXJsOiBgaHR0cDovL2xvY2FsaG9zdDoke1BPUlR9YCxcbiAgfSk7XG59XG5cbmRlc2NyaWJlKCdJbmNvbWluZ1NvdXJjZXMnLCAoKSA9PiB7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUNsaWVudCgpO1xuICBjb25zdCBwcm9qZWN0SWQgPSAncHJvai0xMjMnO1xuICBjb25zdCBzb3VyY2VJZCA9ICdzcmMtNDU2JztcblxuICBjb25zdCBzb3VyY2VSZXNwb25zZSA9IHtcbiAgICBpZDogc291cmNlSWQsXG4gICAgcHJvamVjdElkLFxuICAgIG5hbWU6ICdTdHJpcGUgV2ViaG9va3MnLFxuICAgIHNsdWc6ICdzdHJpcGUnLFxuICAgIHByb3ZpZGVyVHlwZTogJ1NUUklQRScsXG4gICAgc3RhdHVzOiAnQUNUSVZFJyxcbiAgICBpbmdyZXNzUGF0aFRva2VuOiAndG9rX2FiYycsXG4gICAgaW5ncmVzc1VybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtQT1JUfS9pbmdyZXNzL3Rva19hYmNgLFxuICAgIHZlcmlmaWNhdGlvbk1vZGU6ICdITUFDX0dFTkVSSUMnLFxuICAgIGhtYWNIZWFkZXJOYW1lOiAnU3RyaXBlLVNpZ25hdHVyZScsXG4gICAgaG1hY1NlY3JldENvbmZpZ3VyZWQ6IHRydWUsXG4gICAgY3JlYXRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICB9O1xuXG4gIGRlc2NyaWJlKCdjcmVhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBQT1NUIHRvIGNvcnJlY3QgcGF0aCB3aXRoIHBhcmFtcycsIGFzeW5jICgpID0+IHtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIHNvdXJjZVJlc3BvbnNlKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmluY29taW5nU291cmNlcy5jcmVhdGUocHJvamVjdElkLCB7XG4gICAgICAgIG5hbWU6ICdTdHJpcGUgV2ViaG9va3MnLFxuICAgICAgICBzbHVnOiAnc3RyaXBlJyxcbiAgICAgICAgcHJvdmlkZXJUeXBlOiAnU1RSSVBFJyxcbiAgICAgICAgdmVyaWZpY2F0aW9uTW9kZTogJ0hNQUNfR0VORVJJQycsXG4gICAgICAgIGhtYWNTZWNyZXQ6ICd3aHNlY190ZXN0JyxcbiAgICAgICAgaG1hY0hlYWRlck5hbWU6ICdTdHJpcGUtU2lnbmF0dXJlJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdQT1NUJyk7XG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QudXJsKS50b0JlKGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzYCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShsYXN0UmVxdWVzdC5ib2R5KTtcbiAgICAgIGV4cGVjdChib2R5Lm5hbWUpLnRvQmUoJ1N0cmlwZSBXZWJob29rcycpO1xuICAgICAgZXhwZWN0KGJvZHkucHJvdmlkZXJUeXBlKS50b0JlKCdTVFJJUEUnKTtcbiAgICAgIGV4cGVjdChib2R5LmhtYWNTZWNyZXQpLnRvQmUoJ3doc2VjX3Rlc3QnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuaWQpLnRvQmUoc291cmNlSWQpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5pbmdyZXNzVXJsKS50b0NvbnRhaW4oJ3Rva19hYmMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIEdFVCBieSBzb3VyY2UgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXRNb2NrUmVzcG9uc2UoMjAwLCBzb3VyY2VSZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5pbmNvbWluZ1NvdXJjZXMuZ2V0KHByb2plY3RJZCwgc291cmNlSWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH1gKTtcbiAgICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9CZSgnU3RyaXBlIFdlYmhvb2tzJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsaXN0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgR0VUIHNvdXJjZXMgbGlzdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIHsgY29udGVudDogW3NvdXJjZVJlc3BvbnNlXSwgdG90YWxFbGVtZW50czogMSwgdG90YWxQYWdlczogMSwgc2l6ZTogMjAsIG51bWJlcjogMCB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmluY29taW5nU291cmNlcy5saXN0KHByb2plY3RJZCk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ0dFVCcpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9CZShgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlc2ApO1xuICAgICAgZXhwZWN0KHJlc3VsdC5jb250ZW50KS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRbMF0uc2x1ZykudG9CZSgnc3RyaXBlJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd1cGRhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBQVVQgd2l0aCB1cGRhdGUgcGFyYW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyAuLi5zb3VyY2VSZXNwb25zZSwgbmFtZTogJ1VwZGF0ZWQnIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdTb3VyY2VzLnVwZGF0ZShwcm9qZWN0SWQsIHNvdXJjZUlkLCB7XG4gICAgICAgIG5hbWU6ICdVcGRhdGVkJyxcbiAgICAgICAgc3RhdHVzOiAnRElTQUJMRUQnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ1BVVCcpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9CZShgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlcy8ke3NvdXJjZUlkfWApO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UobGFzdFJlcXVlc3QuYm9keSk7XG4gICAgICBleHBlY3QoYm9keS5uYW1lKS50b0JlKCdVcGRhdGVkJyk7XG4gICAgICBleHBlY3QoYm9keS5zdGF0dXMpLnRvQmUoJ0RJU0FCTEVEJyk7XG4gICAgICBleHBlY3QocmVzdWx0Lm5hbWUpLnRvQmUoJ1VwZGF0ZWQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlbGV0ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIERFTEVURSBieSBzb3VyY2UgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXRNb2NrUmVzcG9uc2UoMjA0LCAnJyk7XG5cbiAgICAgIGF3YWl0IGNsaWVudC5pbmNvbWluZ1NvdXJjZXMuZGVsZXRlKHByb2plY3RJZCwgc291cmNlSWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdERUxFVEUnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH1gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8g4pSA4pSAIERlc3RpbmF0aW9ucyDilIDilIBcblxuICBjb25zdCBkZXN0SWQgPSAnZGVzdC03ODknO1xuICBjb25zdCBkZXN0UmVzcG9uc2UgPSB7XG4gICAgaWQ6IGRlc3RJZCxcbiAgICBpbmNvbWluZ1NvdXJjZUlkOiBzb3VyY2VJZCxcbiAgICB1cmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJob29rcy9zdHJpcGUnLFxuICAgIGF1dGhUeXBlOiAnTk9ORScsXG4gICAgYXV0aENvbmZpZ3VyZWQ6IGZhbHNlLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgbWF4QXR0ZW1wdHM6IDUsXG4gICAgdGltZW91dFNlY29uZHM6IDMwLFxuICAgIGNyZWF0ZWRBdDogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAgfTtcblxuICBkZXNjcmliZSgnY3JlYXRlRGVzdGluYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBQT1NUIHRvIGRlc3RpbmF0aW9ucyBwYXRoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgZGVzdFJlc3BvbnNlKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmluY29taW5nU291cmNlcy5jcmVhdGVEZXN0aW5hdGlvbihwcm9qZWN0SWQsIHNvdXJjZUlkLCB7XG4gICAgICAgIHVybDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3dlYmhvb2tzL3N0cmlwZScsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIG1heEF0dGVtcHRzOiA1LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ1BPU1QnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoXG4gICAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzLyR7c291cmNlSWR9L2Rlc3RpbmF0aW9uc2BcbiAgICAgICk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShsYXN0UmVxdWVzdC5ib2R5KTtcbiAgICAgIGV4cGVjdChib2R5LnVybCkudG9CZSgnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vd2ViaG9va3Mvc3RyaXBlJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmlkKS50b0JlKGRlc3RJZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXREZXN0aW5hdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIEdFVCBkZXN0aW5hdGlvbiBieSBJRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIGRlc3RSZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5pbmNvbWluZ1NvdXJjZXMuZ2V0RGVzdGluYXRpb24ocHJvamVjdElkLCBzb3VyY2VJZCwgZGVzdElkKTtcblxuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0Lm1ldGhvZCkudG9CZSgnR0VUJyk7XG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QudXJsKS50b0JlKFxuICAgICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlcy8ke3NvdXJjZUlkfS9kZXN0aW5hdGlvbnMvJHtkZXN0SWR9YFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQudXJsKS50b0JlKCdodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJob29rcy9zdHJpcGUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xpc3REZXN0aW5hdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBHRVQgZGVzdGluYXRpb25zIGxpc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXRNb2NrUmVzcG9uc2UoMjAwLCB7IGNvbnRlbnQ6IFtkZXN0UmVzcG9uc2VdLCB0b3RhbEVsZW1lbnRzOiAxLCB0b3RhbFBhZ2VzOiAxLCBzaXplOiAyMCwgbnVtYmVyOiAwIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdTb3VyY2VzLmxpc3REZXN0aW5hdGlvbnMocHJvamVjdElkLCBzb3VyY2VJZCk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ0dFVCcpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9CZShcbiAgICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH0vZGVzdGluYXRpb25zYFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuY29udGVudCkudG9IYXZlTGVuZ3RoKDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXBkYXRlRGVzdGluYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBQVVQgd2l0aCB1cGRhdGUgcGFyYW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyAuLi5kZXN0UmVzcG9uc2UsIGVuYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdTb3VyY2VzLnVwZGF0ZURlc3RpbmF0aW9uKHByb2plY3RJZCwgc291cmNlSWQsIGRlc3RJZCwge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdQVVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoXG4gICAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzLyR7c291cmNlSWR9L2Rlc3RpbmF0aW9ucy8ke2Rlc3RJZH1gXG4gICAgICApO1xuICAgICAgZXhwZWN0KHJlc3VsdC5lbmFibGVkKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlbGV0ZURlc3RpbmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgREVMRVRFIGRlc3RpbmF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwNCwgJycpO1xuXG4gICAgICBhd2FpdCBjbGllbnQuaW5jb21pbmdTb3VyY2VzLmRlbGV0ZURlc3RpbmF0aW9uKHByb2plY3RJZCwgc291cmNlSWQsIGRlc3RJZCk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ0RFTEVURScpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9CZShcbiAgICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH0vZGVzdGluYXRpb25zLyR7ZGVzdElkfWBcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdJbmNvbWluZ0V2ZW50cycsICgpID0+IHtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlQ2xpZW50KCk7XG4gIGNvbnN0IHByb2plY3RJZCA9ICdwcm9qLTEyMyc7XG4gIGNvbnN0IGV2ZW50SWQgPSAnZXZ0LWFiYyc7XG5cbiAgY29uc3QgZXZlbnRSZXNwb25zZSA9IHtcbiAgICBpZDogZXZlbnRJZCxcbiAgICBpbmNvbWluZ1NvdXJjZUlkOiAnc3JjLTQ1NicsXG4gICAgc291cmNlTmFtZTogJ1N0cmlwZSBXZWJob29rcycsXG4gICAgcmVxdWVzdElkOiAncmVxLXh5eicsXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgcGF0aDogJy9pbmdyZXNzL3Rva19hYmMnLFxuICAgIGJvZHlSYXc6ICd7XCJ0eXBlXCI6XCJjaGVja291dC5zZXNzaW9uLmNvbXBsZXRlZFwifScsXG4gICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICByZWNlaXZlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICB9O1xuXG4gIGRlc2NyaWJlKCdsaXN0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgR0VUIGV2ZW50cyB3aXRob3V0IHBhcmFtcycsIGFzeW5jICgpID0+IHtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIHsgY29udGVudDogW2V2ZW50UmVzcG9uc2VdLCB0b3RhbEVsZW1lbnRzOiAxLCB0b3RhbFBhZ2VzOiAxLCBzaXplOiAyMCwgbnVtYmVyOiAwIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdFdmVudHMubGlzdChwcm9qZWN0SWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLWV2ZW50c2ApO1xuICAgICAgZXhwZWN0KHJlc3VsdC5jb250ZW50KS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRbMF0ucmVxdWVzdElkKS50b0JlKCdyZXEteHl6Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhc3Mgc291cmNlSWQgZmlsdGVyIGFzIHF1ZXJ5IHBhcmFtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyBjb250ZW50OiBbXSwgdG90YWxFbGVtZW50czogMCwgdG90YWxQYWdlczogMCwgc2l6ZTogMjAsIG51bWJlcjogMCB9KTtcblxuICAgICAgYXdhaXQgY2xpZW50LmluY29taW5nRXZlbnRzLmxpc3QocHJvamVjdElkLCB7IHNvdXJjZUlkOiAnc3JjLTQ1NicgfSk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQ29udGFpbignc291cmNlSWQ9c3JjLTQ1NicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIHBhZ2luYXRpb24gcGFyYW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyBjb250ZW50OiBbXSwgdG90YWxFbGVtZW50czogMCwgdG90YWxQYWdlczogMCwgc2l6ZTogMTAsIG51bWJlcjogMiB9KTtcblxuICAgICAgYXdhaXQgY2xpZW50LmluY29taW5nRXZlbnRzLmxpc3QocHJvamVjdElkLCB7IHBhZ2U6IDIsIHNpemU6IDEwIH0pO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QudXJsKS50b0NvbnRhaW4oJ3BhZ2U9MicpO1xuICAgICAgZXhwZWN0KGxhc3RSZXF1ZXN0LnVybCkudG9Db250YWluKCdzaXplPTEwJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBHRVQgZXZlbnQgYnkgSUQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXRNb2NrUmVzcG9uc2UoMjAwLCBldmVudFJlc3BvbnNlKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmluY29taW5nRXZlbnRzLmdldChwcm9qZWN0SWQsIGV2ZW50SWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLWV2ZW50cy8ke2V2ZW50SWR9YCk7XG4gICAgICBleHBlY3QocmVzdWx0LnZlcmlmaWVkKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5tZXRob2QpLnRvQmUoJ1BPU1QnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEF0dGVtcHRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgR0VUIGZvcndhcmQgYXR0ZW1wdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhdHRlbXB0UmVzcG9uc2UgPSB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgaWQ6ICdhdHQtMScsXG4gICAgICAgICAgaW5jb21pbmdFdmVudElkOiBldmVudElkLFxuICAgICAgICAgIGRlc3RpbmF0aW9uSWQ6ICdkZXN0LTc4OScsXG4gICAgICAgICAgZGVzdGluYXRpb25Vcmw6ICdodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJob29rcy9zdHJpcGUnLFxuICAgICAgICAgIGF0dGVtcHROdW1iZXI6IDEsXG4gICAgICAgICAgc3RhdHVzOiAnU1VDQ0VTUycsXG4gICAgICAgICAgc3RhcnRlZEF0OiAnMjAyNC0wMS0wMVQwMDowMDowMFonLFxuICAgICAgICAgIGZpbmlzaGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAxWicsXG4gICAgICAgICAgcmVzcG9uc2VDb2RlOiAyMDAsXG4gICAgICAgICAgcmVzcG9uc2VCb2R5U25pcHBldDogJ09LJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6ICcyMDI0LTAxLTAxVDAwOjAwOjAwWicsXG4gICAgICAgIH1dLFxuICAgICAgICB0b3RhbEVsZW1lbnRzOiAxLFxuICAgICAgICB0b3RhbFBhZ2VzOiAxLFxuICAgICAgICBzaXplOiAyMCxcbiAgICAgICAgbnVtYmVyOiAwLFxuICAgICAgfTtcbiAgICAgIHNldE1vY2tSZXNwb25zZSgyMDAsIGF0dGVtcHRSZXNwb25zZSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5pbmNvbWluZ0V2ZW50cy5nZXRBdHRlbXB0cyhwcm9qZWN0SWQsIGV2ZW50SWQpO1xuXG4gICAgICBleHBlY3QobGFzdFJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLWV2ZW50cy8ke2V2ZW50SWR9L2F0dGVtcHRzYCk7XG4gICAgICBleHBlY3QocmVzdWx0LmNvbnRlbnQpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuY29udGVudFswXS5yZXNwb25zZUNvZGUpLnRvQmUoMjAwKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuY29udGVudFswXS5zdGF0dXMpLnRvQmUoJ1NVQ0NFU1MnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuY29udGVudFswXS5hdHRlbXB0TnVtYmVyKS50b0JlKDEpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5jb250ZW50WzBdLmRlc3RpbmF0aW9uVXJsKS50b0JlKCdodHRwczovL2FwaS5leGFtcGxlLmNvbS93ZWJob29rcy9zdHJpcGUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlcGxheScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIFBPU1QgcmVwbGF5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0TW9ja1Jlc3BvbnNlKDIwMCwgeyBzdGF0dXM6ICdyZXBsYXllZCcsIGV2ZW50SWQsIGRlc3RpbmF0aW9uc0NvdW50OiAyIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuaW5jb21pbmdFdmVudHMucmVwbGF5KHByb2plY3RJZCwgZXZlbnRJZCk7XG5cbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC5tZXRob2QpLnRvQmUoJ1BPU1QnKTtcbiAgICAgIGV4cGVjdChsYXN0UmVxdWVzdC51cmwpLnRvQmUoYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLWV2ZW50cy8ke2V2ZW50SWR9L3JlcGxheWApO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zdGF0dXMpLnRvQmUoJ3JlcGxheWVkJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmRlc3RpbmF0aW9uc0NvdW50KS50b0JlKDIpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnQ2xpZW50IGluaXRpYWxpemF0aW9uIGluY2x1ZGVzIGluY29taW5nIG1vZHVsZXMnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgaGF2ZSBpbmNvbWluZ1NvdXJjZXMgYW5kIGluY29taW5nRXZlbnRzJywgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBSYWlsaG9vayh7IGFwaUtleTogJ3Rlc3Rfa2V5JyB9KTtcbiAgICBleHBlY3QoY2xpZW50LmluY29taW5nU291cmNlcykudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoY2xpZW50LmluY29taW5nRXZlbnRzKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_1 = require("@railhook/node");
4
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
5
+ const pkg = require('../../package.json');
6
+ // Guards the published identity of this SDK: the manifest name and the export
7
+ // surface a consumer gets from `npm install @railhook/node` must not
8
+ // drift apart.
9
+ describe('package identity (@railhook/node)', () => {
10
+ it('is published under the @railhook/node package name', () => {
11
+ expect(pkg.name).toBe('@railhook/node');
12
+ });
13
+ it('smoke: importing "@railhook/node" constructs a working client', () => {
14
+ const client = new node_1.Railhook({ apiKey: 'test_api_key' });
15
+ expect(client).toBeInstanceOf(node_1.Railhook);
16
+ expect(client.events).toBeDefined();
17
+ });
18
+ });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1pZGVudGl0eS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9wYWNrYWdlLWlkZW50aXR5LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBMEM7QUFDMUMsOERBQThEO0FBQzlELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRTFDLDhFQUE4RTtBQUM5RSxxRUFBcUU7QUFDckUsZUFBZTtBQUNmLFFBQVEsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7SUFDakQsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEdBQUcsRUFBRTtRQUN2RSxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsZUFBUSxDQUFDLENBQUM7UUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmFpbGhvb2sgfSBmcm9tICdAcmFpbGhvb2svbm9kZSc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgcGtnID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5cbi8vIEd1YXJkcyB0aGUgcHVibGlzaGVkIGlkZW50aXR5IG9mIHRoaXMgU0RLOiB0aGUgbWFuaWZlc3QgbmFtZSBhbmQgdGhlIGV4cG9ydFxuLy8gc3VyZmFjZSBhIGNvbnN1bWVyIGdldHMgZnJvbSBgbnBtIGluc3RhbGwgQHJhaWxob29rL25vZGVgIG11c3Qgbm90XG4vLyBkcmlmdCBhcGFydC5cbmRlc2NyaWJlKCdwYWNrYWdlIGlkZW50aXR5IChAcmFpbGhvb2svbm9kZSknLCAoKSA9PiB7XG4gIGl0KCdpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIEByYWlsaG9vay9ub2RlIHBhY2thZ2UgbmFtZScsICgpID0+IHtcbiAgICBleHBlY3QocGtnLm5hbWUpLnRvQmUoJ0ByYWlsaG9vay9ub2RlJyk7XG4gIH0pO1xuXG4gIGl0KCdzbW9rZTogaW1wb3J0aW5nIFwiQHJhaWxob29rL25vZGVcIiBjb25zdHJ1Y3RzIGEgd29ya2luZyBjbGllbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJhaWxob29rKHsgYXBpS2V5OiAndGVzdF9hcGlfa2V5JyB9KTtcbiAgICBleHBlY3QoY2xpZW50KS50b0JlSW5zdGFuY2VPZihSYWlsaG9vayk7XG4gICAgZXhwZWN0KGNsaWVudC5ldmVudHMpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const webhooks_1 = require("../webhooks");
37
+ const errors_1 = require("../errors");
38
+ const crypto = __importStar(require("crypto"));
39
+ /**
40
+ * The point of this scheme is that a receiver can verify with a library they already have,
41
+ * so the first test is the reference algorithm rather than a round-trip against ourselves —
42
+ * a round-trip would only prove we agree with our own bug.
43
+ */
44
+ describe('verifyStandardWebhook', () => {
45
+ const id = 'msg_p5jXN8AQM9LWM0D4loKWxJek';
46
+ const payload = '{"test": 2432232314}';
47
+ const secretB64 = 'MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw';
48
+ const sharedSecret = `whsec_${secretB64}`;
49
+ /** Exactly what the reference libraries do: hmac(b64decode(secret), `${id}.${ts}.${body}`). */
50
+ const sign = (ts, secret = secretB64) => crypto
51
+ .createHmac('sha256', Buffer.from(secret, 'base64'))
52
+ .update(`${id}.${ts}.${payload}`)
53
+ .digest('base64');
54
+ const headers = (ts, signature) => ({
55
+ 'webhook-id': id,
56
+ 'webhook-timestamp': String(ts),
57
+ 'webhook-signature': signature,
58
+ });
59
+ it('accepts a signature produced the way the reference libraries produce one', () => {
60
+ const ts = Math.floor(Date.now() / 1000);
61
+ expect((0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, `v1,${sign(ts)}`), sharedSecret)).toBe(true);
62
+ });
63
+ it('accepts either signature during a secret rotation', () => {
64
+ const ts = Math.floor(Date.now() / 1000);
65
+ const retired = 'b2xkLXNlY3JldC1ieXRlcy1oZXJlLXBhZGRpbmc=';
66
+ // What Railhook sends through the grace window: one signature per valid secret.
67
+ const header = `v1,${sign(ts)} v1,${sign(ts, retired)}`;
68
+ expect((0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, header), sharedSecret)).toBe(true);
69
+ expect((0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, header), `whsec_${retired}`)).toBe(true);
70
+ });
71
+ it('rejects a replayed request even though its signature is still valid', () => {
72
+ // A signature over a fixed body never expires by itself, so without the timestamp check
73
+ // a captured request stays replayable for as long as the secret lives.
74
+ const old = Math.floor(Date.now() / 1000) - 3600;
75
+ expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, headers(old, `v1,${sign(old)}`), sharedSecret))
76
+ .toThrow(errors_1.RailhookError);
77
+ });
78
+ it('rejects a signature lifted from a different message', () => {
79
+ const ts = Math.floor(Date.now() / 1000);
80
+ const forAnotherMessage = crypto
81
+ .createHmac('sha256', Buffer.from(secretB64, 'base64'))
82
+ .update(`msg_somethingelse.${ts}.${payload}`)
83
+ .digest('base64');
84
+ expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, `v1,${forAnotherMessage}`), sharedSecret)).toThrow(errors_1.RailhookError);
85
+ });
86
+ it('rejects a tampered body', () => {
87
+ const ts = Math.floor(Date.now() / 1000);
88
+ expect(() => (0, webhooks_1.verifyStandardWebhook)('{"test": 1}', headers(ts, `v1,${sign(ts)}`), sharedSecret)).toThrow(errors_1.RailhookError);
89
+ });
90
+ it('reports missing headers rather than treating them as unsigned', () => {
91
+ const ts = Math.floor(Date.now() / 1000);
92
+ expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, { 'webhook-id': id }, sharedSecret))
93
+ .toThrow(errors_1.RailhookError);
94
+ expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, { ...headers(ts, `v1,${sign(ts)}`), 'webhook-id': undefined }, sharedSecret)).toThrow(errors_1.RailhookError);
95
+ });
96
+ it('ignores signature entries of an unknown version', () => {
97
+ const ts = Math.floor(Date.now() / 1000);
98
+ expect(() => (0, webhooks_1.verifyStandardWebhook)(payload, headers(ts, `v2,${sign(ts)}`), sharedSecret))
99
+ .toThrow(errors_1.RailhookError);
100
+ });
101
+ });
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRXZWJob29rcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9zdGFuZGFyZFdlYmhvb2tzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBb0Q7QUFDcEQsc0NBQTBDO0FBQzFDLCtDQUFpQztBQUVqQzs7OztHQUlHO0FBQ0gsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxNQUFNLEVBQUUsR0FBRyw4QkFBOEIsQ0FBQztJQUMxQyxNQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQztJQUN2QyxNQUFNLFNBQVMsR0FBRyxrQ0FBa0MsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxTQUFTLFNBQVMsRUFBRSxDQUFDO0lBRTFDLCtGQUErRjtJQUMvRixNQUFNLElBQUksR0FBRyxDQUFDLEVBQVUsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FDOUMsTUFBTTtTQUNILFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDbkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQztTQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFdEIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFVLEVBQUUsU0FBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxZQUFZLEVBQUUsRUFBRTtRQUNoQixtQkFBbUIsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQy9CLG1CQUFtQixFQUFFLFNBQVM7S0FDL0IsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBFQUEwRSxFQUFFLEdBQUcsRUFBRTtRQUNsRixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxH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Li4vd2ViaG9va3MnO1xuaW1wb3J0IHsgUmFpbGhvb2tFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuLyoqXG4gKiBUaGUgcG9pbnQgb2YgdGhpcyBzY2hlbWUgaXMgdGhhdCBhIHJlY2VpdmVyIGNhbiB2ZXJpZnkgd2l0aCBhIGxpYnJhcnkgdGhleSBhbHJlYWR5IGhhdmUsXG4gKiBzbyB0aGUgZmlyc3QgdGVzdCBpcyB0aGUgcmVmZXJlbmNlIGFsZ29yaXRobSByYXRoZXIgdGhhbiBhIHJvdW5kLXRyaXAgYWdhaW5zdCBvdXJzZWx2ZXMg4oCUXG4gKiBhIHJvdW5kLXRyaXAgd291bGQgb25seSBwcm92ZSB3ZSBhZ3JlZSB3aXRoIG91ciBvd24gYnVnLlxuICovXG5kZXNjcmliZSgndmVyaWZ5U3RhbmRhcmRXZWJob29rJywgKCkgPT4ge1xuICBjb25zdCBpZCA9ICdtc2dfcDVqWE44QVFNOUxXTTBENGxvS1d4SmVrJztcbiAgY29uc3QgcGF5bG9hZCA9ICd7XCJ0ZXN0XCI6IDI0MzIyMzIzMTR9JztcbiAgY29uc3Qgc2VjcmV0QjY0ID0gJ01mS1E5cjhHS1lxclR3alVQRDhJTFBaSW8yTGFMYVN3JztcbiAgY29uc3Qgc2hhcmVkU2VjcmV0ID0gYHdoc2VjXyR7c2VjcmV0QjY0fWA7XG5cbiAgLyoqIEV4YWN0bHkgd2hhdCB0aGUgcmVmZXJlbmNlIGxpYnJhcmllcyBkbzogaG1hYyhiNjRkZWNvZGUoc2VjcmV0KSwgYCR7aWR9LiR7dHN9LiR7Ym9keX1gKS4gKi9cbiAgY29uc3Qgc2lnbiA9ICh0czogbnVtYmVyLCBzZWNyZXQgPSBzZWNyZXRCNjQpID0+XG4gICAgY3J5cHRvXG4gICAgICAuY3JlYXRlSG1hYygnc2hhMjU2JywgQnVmZmVyLmZyb20oc2VjcmV0LCAnYmFzZTY0JykpXG4gICAgICAudXBkYXRlKGAke2lkfS4ke3RzfS4ke3BheWxvYWR9YClcbiAgICAgIC5kaWdlc3QoJ2Jhc2U2NCcpO1xuXG4gIGNvbnN0IGhlYWRlcnMgPSAodHM6IG51bWJlciwgc2lnbmF0dXJlOiBzdHJpbmcpID0+ICh7XG4gICAgJ3dlYmhvb2staWQnOiBpZCxcbiAgICAnd2ViaG9vay10aW1lc3RhbXAnOiBTdHJpbmcodHMpLFxuICAgICd3ZWJob29rLXNpZ25hdHVyZSc6IHNpZ25hdHVyZSxcbiAgfSk7XG5cbiAgaXQoJ2FjY2VwdHMgYSBzaWduYXR1cmUgcHJvZHVjZWQgdGhlIHdheSB0aGUgcmVmZXJlbmNlIGxpYnJhcmllcyBwcm9kdWNlIG9uZScsICgpID0+IHtcbiAgICBjb25zdCB0cyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIGV4cGVjdCh2ZXJpZnlTdGFuZGFyZFdlYmhvb2socGF5bG9hZCwgaGVhZGVycyh0cywgYHYxLCR7c2lnbih0cyl9YCksIHNoYXJlZFNlY3JldCkpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGVpdGhlciBzaWduYXR1cmUgZHVyaW5nIGEgc2VjcmV0IHJvdGF0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHRzID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgY29uc3QgcmV0aXJlZCA9ICdiMnhrTFhObFkzSmxkQzFpZVhSbGN5MW9aWEpsTFhCaFpHUnBibWM9JztcbiAgICAvLyBXaGF0IFJhaWxob29rIHNlbmRzIHRocm91Z2ggdGhlIGdyYWNlIHdpbmRvdzogb25lIHNpZ25hdHVyZSBwZXIgdmFsaWQgc2VjcmV0LlxuICAgIGNvbnN0IGhlYWRlciA9IGB2MSwke3NpZ24odHMpfSB2MSwke3NpZ24odHMsIHJldGlyZWQpfWA7XG5cbiAgICBleHBlY3QodmVyaWZ5U3RhbmRhcmRXZWJob29rKHBheWxvYWQsIGhlYWRlcnModHMsIGhlYWRlciksIHNoYXJlZFNlY3JldCkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHZlcmlmeVN0YW5kYXJkV2ViaG9vayhwYXlsb2FkLCBoZWFkZXJzKHRzLCBoZWFkZXIpLCBgd2hzZWNfJHtyZXRpcmVkfWApKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHJlcGxheWVkIHJlcXVlc3QgZXZlbiB0aG91Z2ggaXRzIHNpZ25hdHVyZSBpcyBzdGlsbCB2YWxpZCcsICgpID0+IHtcbiAgICAvLyBBIHNpZ25hdHVyZSBvdmVyIGEgZml4ZWQgYm9keSBuZXZlciBleHBpcmVzIGJ5IGl0c2VsZiwgc28gd2l0aG91dCB0aGUgdGltZXN0YW1wIGNoZWNrXG4gICAgLy8gYSBjYXB0dXJlZCByZXF1ZXN0IHN0YXlzIHJlcGxheWFibGUgZm9yIGFzIGxvbmcgYXMgdGhlIHNlY3JldCBsaXZlcy5cbiAgICBjb25zdCBvbGQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSAtIDM2MDA7XG4gICAgZXhwZWN0KCgpID0+IHZlcmlmeVN0YW5kYXJkV2ViaG9vayhwYXlsb2FkLCBoZWFkZXJzKG9sZCwgYHYxLCR7c2lnbihvbGQpfWApLCBzaGFyZWRTZWNyZXQpKVxuICAgICAgLnRvVGhyb3coUmFpbGhvb2tFcnJvcik7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgc2lnbmF0dXJlIGxpZnRlZCBmcm9tIGEgZGlmZmVyZW50IG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgdHMgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBjb25zdCBmb3JBbm90aGVyTWVzc2FnZSA9IGNyeXB0b1xuICAgICAgLmNyZWF0ZUhtYWMoJ3NoYTI1NicsIEJ1ZmZlci5mcm9tKHNlY3JldEI2NCwgJ2Jhc2U2NCcpKVxuICAgICAgLnVwZGF0ZShgbXNnX3NvbWV0aGluZ2Vsc2UuJHt0c30uJHtwYXlsb2FkfWApXG4gICAgICAuZGlnZXN0KCdiYXNlNjQnKTtcblxuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgdmVyaWZ5U3RhbmRhcmRXZWJob29rKHBheWxvYWQsIGhlYWRlcnModHMsIGB2MSwke2ZvckFub3RoZXJNZXNzYWdlfWApLCBzaGFyZWRTZWNyZXQpXG4gICAgKS50b1Rocm93KFJhaWxob29rRXJyb3IpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIHRhbXBlcmVkIGJvZHknLCAoKSA9PiB7XG4gICAgY29uc3QgdHMgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHZlcmlmeVN0YW5kYXJkV2ViaG9vaygne1widGVzdFwiOiAxfScsIGhlYWRlcnModHMsIGB2MSwke3NpZ24odHMpfWApLCBzaGFyZWRTZWNyZXQpXG4gICAgKS50b1Rocm93KFJhaWxob29rRXJyb3IpO1xuICB9KTtcblxuICBpdCgncmVwb3J0cyBtaXNzaW5nIGhlYWRlcnMgcmF0aGVyIHRoYW4gdHJlYXRpbmcgdGhlbSBhcyB1bnNpZ25lZCcsICgpID0+IHtcbiAgICBjb25zdCB0cyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIGV4cGVjdCgoKSA9PiB2ZXJpZnlTdGFuZGFyZFdlYmhvb2socGF5bG9hZCwgeyAnd2ViaG9vay1pZCc6IGlkIH0sIHNoYXJlZFNlY3JldCkpXG4gICAgICAudG9UaHJvdyhSYWlsaG9va0Vycm9yKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHZlcmlmeVN0YW5kYXJkV2ViaG9vayhwYXlsb2FkLCB7IC4uLmhlYWRlcnModHMsIGB2MSwke3NpZ24odHMpfWApLCAnd2ViaG9vay1pZCc6IHVuZGVmaW5lZCB9LCBzaGFyZWRTZWNyZXQpXG4gICAgKS50b1Rocm93KFJhaWxob29rRXJyb3IpO1xuICB9KTtcblxuICBpdCgnaWdub3JlcyBzaWduYXR1cmUgZW50cmllcyBvZiBhbiB1bmtub3duIHZlcnNpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgdHMgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBleHBlY3QoKCkgPT4gdmVyaWZ5U3RhbmRhcmRXZWJob29rKHBheWxvYWQsIGhlYWRlcnModHMsIGB2Miwke3NpZ24odHMpfWApLCBzaGFyZWRTZWNyZXQpKVxuICAgICAgLnRvVGhyb3coUmFpbGhvb2tFcnJvcik7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};