keez-invoicing 1.1.5
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.
- package/LICENSE +28 -0
- package/README.md +366 -0
- package/dist/coverage/lcov-report/block-navigation.js +71 -0
- package/dist/coverage/lcov-report/prettify.js +478 -0
- package/dist/coverage/lcov-report/sorter.js +177 -0
- package/dist/eslint.config.js +56 -0
- package/dist/jest.config.cjs +13 -0
- package/dist/jest.config.js +13 -0
- package/dist/src/api/__tests__/index.test.js +52 -0
- package/dist/src/api/authorise.js +48 -0
- package/dist/src/api/invoices/cancel.js +33 -0
- package/dist/src/api/invoices/create.js +97 -0
- package/dist/src/api/invoices/delete.js +33 -0
- package/dist/src/api/invoices/downloadPdf.js +31 -0
- package/dist/src/api/invoices/getAll.js +84 -0
- package/dist/src/api/invoices/sendMail.js +59 -0
- package/dist/src/api/invoices/submitEfactura.js +34 -0
- package/dist/src/api/invoices/update.js +61 -0
- package/dist/src/api/invoices/validate.js +39 -0
- package/dist/src/api/invoices/view.js +93 -0
- package/dist/src/api/items/create.js +42 -0
- package/dist/src/api/items/getAll.js +74 -0
- package/dist/src/api/items/getById.js +46 -0
- package/dist/src/api/items/index.js +14 -0
- package/dist/src/api/items/patch.js +49 -0
- package/dist/src/api/items/update.js +41 -0
- package/dist/src/config/constants.js +23 -0
- package/dist/src/config/constructorParam.js +3 -0
- package/dist/src/config/measureUnit.js +22 -0
- package/dist/src/config/paymentType.js +17 -0
- package/dist/src/config/paymentType.js.js +16 -0
- package/dist/src/dto/allInvoicesResponse.js +3 -0
- package/dist/src/dto/authResponse.js +3 -0
- package/dist/src/dto/common/index.js +3 -0
- package/dist/src/dto/common/paginationParams.js +3 -0
- package/dist/src/dto/createInvoiceRequest.js +3 -0
- package/dist/src/dto/invoiceResponse.js +3 -0
- package/dist/src/dto/invoices/index.js +3 -0
- package/dist/src/dto/invoices/invoiceFilterParams.js +3 -0
- package/dist/src/dto/invoices/invoiceRequestV2.js +3 -0
- package/dist/src/dto/invoices/sendInvoiceParams.js +3 -0
- package/dist/src/dto/items/allItemsResponse.js +3 -0
- package/dist/src/dto/items/index.js +3 -0
- package/dist/src/dto/items/itemRequest.js +3 -0
- package/dist/src/dto/items/itemResponse.js +3 -0
- package/dist/src/errors/KeezError.js +27 -0
- package/dist/src/helpers/logger.js +15 -0
- package/dist/src/index.js +15 -0
- package/dist/src/keezApi.js +283 -0
- package/dist/tests/additional-coverage.test.js +351 -0
- package/dist/tests/edge-cases.test.js +353 -0
- package/dist/tests/error-handling.test.js +224 -0
- package/dist/tests/filter-params.test.js +267 -0
- package/dist/tests/index.test.js +493 -0
- package/dist/tests/invoices-extended.test.js +168 -0
- package/dist/tests/items.test.js +142 -0
- package/dist/types/coverage/lcov-report/block-navigation.d.ts +1 -0
- package/dist/types/coverage/lcov-report/prettify.d.ts +0 -0
- package/dist/types/coverage/lcov-report/sorter.d.ts +1 -0
- package/dist/types/eslint.config.d.ts +2 -0
- package/dist/types/jest.config.d.cts +9 -0
- package/dist/types/jest.config.d.ts +9 -0
- package/dist/types/src/api/__tests__/index.test.d.ts +1 -0
- package/dist/types/src/api/authorise.d.ts +18 -0
- package/dist/types/src/api/invoices/cancel.d.ts +9 -0
- package/dist/types/src/api/invoices/create.d.ts +22 -0
- package/dist/types/src/api/invoices/delete.d.ts +9 -0
- package/dist/types/src/api/invoices/downloadPdf.d.ts +8 -0
- package/dist/types/src/api/invoices/getAll.d.ts +22 -0
- package/dist/types/src/api/invoices/sendMail.d.ts +24 -0
- package/dist/types/src/api/invoices/submitEfactura.d.ts +9 -0
- package/dist/types/src/api/invoices/update.d.ts +11 -0
- package/dist/types/src/api/invoices/validate.d.ts +21 -0
- package/dist/types/src/api/invoices/view.d.ts +22 -0
- package/dist/types/src/api/items/create.d.ts +10 -0
- package/dist/types/src/api/items/getAll.d.ts +10 -0
- package/dist/types/src/api/items/getById.d.ts +10 -0
- package/dist/types/src/api/items/index.d.ts +5 -0
- package/dist/types/src/api/items/patch.d.ts +11 -0
- package/dist/types/src/api/items/update.d.ts +11 -0
- package/dist/types/src/config/constants.d.ts +13 -0
- package/dist/types/src/config/constructorParam.d.ts +6 -0
- package/dist/types/src/config/measureUnit.d.ts +17 -0
- package/dist/types/src/config/paymentType.d.ts +12 -0
- package/dist/types/src/config/paymentType.js.d.ts +11 -0
- package/dist/types/src/dto/allInvoicesResponse.d.ts +21 -0
- package/dist/types/src/dto/authResponse.d.ts +7 -0
- package/dist/types/src/dto/common/index.d.ts +1 -0
- package/dist/types/src/dto/common/paginationParams.d.ts +4 -0
- package/dist/types/src/dto/createInvoiceRequest.d.ts +34 -0
- package/dist/types/src/dto/invoiceResponse.d.ts +48 -0
- package/dist/types/src/dto/invoices/index.d.ts +3 -0
- package/dist/types/src/dto/invoices/invoiceFilterParams.d.ts +8 -0
- package/dist/types/src/dto/invoices/invoiceRequestV2.d.ts +23 -0
- package/dist/types/src/dto/invoices/sendInvoiceParams.d.ts +5 -0
- package/dist/types/src/dto/items/allItemsResponse.d.ts +13 -0
- package/dist/types/src/dto/items/index.d.ts +3 -0
- package/dist/types/src/dto/items/itemRequest.d.ts +34 -0
- package/dist/types/src/dto/items/itemResponse.d.ts +15 -0
- package/dist/types/src/errors/KeezError.d.ts +11 -0
- package/dist/types/src/helpers/logger.d.ts +2 -0
- package/dist/types/src/index.d.ts +11 -0
- package/dist/types/src/keezApi.d.ts +114 -0
- package/dist/types/tests/additional-coverage.test.d.ts +1 -0
- package/dist/types/tests/edge-cases.test.d.ts +1 -0
- package/dist/types/tests/error-handling.test.d.ts +1 -0
- package/dist/types/tests/filter-params.test.d.ts +1 -0
- package/dist/types/tests/index.test.d.ts +1 -0
- package/dist/types/tests/invoices-extended.test.d.ts +1 -0
- package/dist/types/tests/items.test.d.ts +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const nock = require("nock");
|
|
4
|
+
const keezApi_1 = require("../src/keezApi");
|
|
5
|
+
const measureUnit_1 = require("../src/config/measureUnit");
|
|
6
|
+
const paymentType_1 = require("../src/config/paymentType");
|
|
7
|
+
describe('Edge Cases and Response Variations Tests', () => {
|
|
8
|
+
let keezApi;
|
|
9
|
+
const baseDomain = 'https://staging.keez.ro';
|
|
10
|
+
const clientEid = 'test-client-eid';
|
|
11
|
+
beforeAll(() => {
|
|
12
|
+
keezApi = new keezApi_1.KeezApi({
|
|
13
|
+
application_id: 'test-app-id',
|
|
14
|
+
client_eid: clientEid,
|
|
15
|
+
secret: 'test-secret',
|
|
16
|
+
live: false,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
nock(baseDomain)
|
|
21
|
+
.post('/idp/connect/token')
|
|
22
|
+
.reply(200, {
|
|
23
|
+
access_token: 'test-token',
|
|
24
|
+
expires_in: 3600,
|
|
25
|
+
token_type: 'Bearer',
|
|
26
|
+
scope: 'public-api',
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
nock.cleanAll();
|
|
31
|
+
});
|
|
32
|
+
describe('submitInvoiceToEfactura Response Variations', () => {
|
|
33
|
+
it('should return externalId when uploadIndex is not present', async () => {
|
|
34
|
+
nock(baseDomain)
|
|
35
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
|
|
36
|
+
.reply(200, { externalId: 'ext-123' });
|
|
37
|
+
const result = await keezApi.submitInvoiceToEfactura('inv-123');
|
|
38
|
+
expect(result).toBe('ext-123');
|
|
39
|
+
});
|
|
40
|
+
it('should return SUBMITTED when neither uploadIndex nor externalId is present', async () => {
|
|
41
|
+
nock(baseDomain)
|
|
42
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
|
|
43
|
+
.reply(200, {});
|
|
44
|
+
const result = await keezApi.submitInvoiceToEfactura('inv-123');
|
|
45
|
+
expect(result).toBe('SUBMITTED');
|
|
46
|
+
});
|
|
47
|
+
it('should prefer uploadIndex over externalId', async () => {
|
|
48
|
+
nock(baseDomain)
|
|
49
|
+
.post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
|
|
50
|
+
.reply(200, { uploadIndex: 'upload-123', externalId: 'ext-123' });
|
|
51
|
+
const result = await keezApi.submitInvoiceToEfactura('inv-123');
|
|
52
|
+
expect(result).toBe('upload-123');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('Create Item with Optional Fields', () => {
|
|
56
|
+
it('should create item with all optional fields', async () => {
|
|
57
|
+
nock(baseDomain)
|
|
58
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
59
|
+
.reply(201, { externalId: 'new-item-id' });
|
|
60
|
+
const result = await keezApi.createItem({
|
|
61
|
+
itemName: 'Full Item',
|
|
62
|
+
itemCode: 'FI001',
|
|
63
|
+
itemDescription: 'Detailed description',
|
|
64
|
+
measureUnitId: measureUnit_1.MeasureUnit.PIECE,
|
|
65
|
+
unitPrice: 100,
|
|
66
|
+
vatPercent: 19,
|
|
67
|
+
vatCategoryCode: 'S',
|
|
68
|
+
vatExemptionReason: 'N/A',
|
|
69
|
+
isActive: true,
|
|
70
|
+
});
|
|
71
|
+
expect(result).toBe('new-item-id');
|
|
72
|
+
});
|
|
73
|
+
it('should create item with isActive explicitly set to false', async () => {
|
|
74
|
+
nock(baseDomain)
|
|
75
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
76
|
+
.reply(201, { externalId: 'inactive-item-id' });
|
|
77
|
+
const result = await keezApi.createItem({
|
|
78
|
+
itemName: 'Inactive Item',
|
|
79
|
+
measureUnitId: measureUnit_1.MeasureUnit.PIECE,
|
|
80
|
+
unitPrice: 50,
|
|
81
|
+
vatPercent: 19,
|
|
82
|
+
isActive: false,
|
|
83
|
+
});
|
|
84
|
+
expect(result).toBe('inactive-item-id');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('Update Invoice with Optional Fields', () => {
|
|
88
|
+
it('should update invoice with vatOnCollection', async () => {
|
|
89
|
+
nock(baseDomain)
|
|
90
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
91
|
+
.reply(200);
|
|
92
|
+
await expect(keezApi.updateInvoice('inv-123', {
|
|
93
|
+
series: 'INV',
|
|
94
|
+
documentDate: 20230101,
|
|
95
|
+
dueDate: 20230115,
|
|
96
|
+
currencyCode: 'RON',
|
|
97
|
+
paymentType: paymentType_1.PaymentType.BANK_TRANSFER,
|
|
98
|
+
vatOnCollection: true,
|
|
99
|
+
partner: {
|
|
100
|
+
isLegalPerson: false,
|
|
101
|
+
partnerName: 'Test Partner',
|
|
102
|
+
identificationNumber: '123456',
|
|
103
|
+
countryCode: 'RO',
|
|
104
|
+
countryName: 'Romania',
|
|
105
|
+
countyCode: 'B',
|
|
106
|
+
countyName: 'Bucuresti',
|
|
107
|
+
cityName: 'Bucuresti',
|
|
108
|
+
addressDetails: 'Test Address',
|
|
109
|
+
},
|
|
110
|
+
items: [
|
|
111
|
+
{
|
|
112
|
+
itemExternalId: 'item-1',
|
|
113
|
+
measureUnitId: 1,
|
|
114
|
+
quantity: 1,
|
|
115
|
+
unitPrice: 100,
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
})).resolves.toBeUndefined();
|
|
119
|
+
});
|
|
120
|
+
it('should update invoice with exchangeRate and notes', async () => {
|
|
121
|
+
nock(baseDomain)
|
|
122
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
123
|
+
.reply(200);
|
|
124
|
+
await expect(keezApi.updateInvoice('inv-123', {
|
|
125
|
+
series: 'INV',
|
|
126
|
+
documentDate: 20230101,
|
|
127
|
+
dueDate: 20230115,
|
|
128
|
+
currencyCode: 'EUR',
|
|
129
|
+
paymentType: paymentType_1.PaymentType.CARD_ONLINE,
|
|
130
|
+
exchangeRate: 4.95,
|
|
131
|
+
notes: 'Payment received',
|
|
132
|
+
partner: {
|
|
133
|
+
isLegalPerson: true,
|
|
134
|
+
partnerName: 'Company Ltd',
|
|
135
|
+
identificationNumber: 'RO12345678',
|
|
136
|
+
countryCode: 'RO',
|
|
137
|
+
countryName: 'Romania',
|
|
138
|
+
countyCode: 'CJ',
|
|
139
|
+
countyName: 'Cluj',
|
|
140
|
+
cityName: 'Cluj-Napoca',
|
|
141
|
+
addressDetails: 'Main Street 1',
|
|
142
|
+
},
|
|
143
|
+
items: [
|
|
144
|
+
{
|
|
145
|
+
itemExternalId: 'item-1',
|
|
146
|
+
measureUnitId: 1,
|
|
147
|
+
quantity: 5,
|
|
148
|
+
unitPrice: 200,
|
|
149
|
+
vatPercent: 19,
|
|
150
|
+
discountPercent: 10,
|
|
151
|
+
description: 'Custom description',
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
})).resolves.toBeUndefined();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe('Update Item with All Fields', () => {
|
|
158
|
+
it('should update item with all optional fields', async () => {
|
|
159
|
+
nock(baseDomain)
|
|
160
|
+
.put(`/api/v1.0/public-api/${clientEid}/items/item-123`)
|
|
161
|
+
.reply(200);
|
|
162
|
+
await expect(keezApi.updateItem('item-123', {
|
|
163
|
+
itemName: 'Updated Full Item',
|
|
164
|
+
itemCode: 'UFI001',
|
|
165
|
+
itemDescription: 'Updated detailed description',
|
|
166
|
+
measureUnitId: measureUnit_1.MeasureUnit.KILOGRAM,
|
|
167
|
+
unitPrice: 250,
|
|
168
|
+
vatPercent: 9,
|
|
169
|
+
vatCategoryCode: 'R',
|
|
170
|
+
vatExemptionReason: 'Reduced rate',
|
|
171
|
+
isActive: true,
|
|
172
|
+
})).resolves.toBeUndefined();
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('KeezApi Live Mode', () => {
|
|
176
|
+
it('should use live domain when setLive is called with true', async () => {
|
|
177
|
+
const liveApi = new keezApi_1.KeezApi({
|
|
178
|
+
application_id: 'test-app-id',
|
|
179
|
+
client_eid: clientEid,
|
|
180
|
+
secret: 'test-secret',
|
|
181
|
+
live: false,
|
|
182
|
+
});
|
|
183
|
+
expect(liveApi.getBaseDomain()).toBe('https://staging.keez.ro');
|
|
184
|
+
liveApi.setLive(true);
|
|
185
|
+
expect(liveApi.getBaseDomain()).toBe('https://app.keez.ro');
|
|
186
|
+
liveApi.setLive(false);
|
|
187
|
+
expect(liveApi.getBaseDomain()).toBe('https://staging.keez.ro');
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe('Token Refresh on Multiple Calls', () => {
|
|
191
|
+
it('should reuse token for consecutive calls when still valid', async () => {
|
|
192
|
+
const mockItems = {
|
|
193
|
+
first: 0,
|
|
194
|
+
last: 0,
|
|
195
|
+
recordsCount: 0,
|
|
196
|
+
data: [],
|
|
197
|
+
};
|
|
198
|
+
// First call generates token
|
|
199
|
+
nock(baseDomain).get(`/api/v1.0/public-api/${clientEid}/items`).reply(200, mockItems);
|
|
200
|
+
await keezApi.getAllItems();
|
|
201
|
+
// Second call should reuse token (no new token request)
|
|
202
|
+
nock(baseDomain).get(`/api/v1.0/public-api/${clientEid}/items`).reply(200, mockItems);
|
|
203
|
+
await keezApi.getAllItems();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe('Invoice with Various Payment Types', () => {
|
|
207
|
+
const baseInvoice = {
|
|
208
|
+
series: 'INV',
|
|
209
|
+
documentDate: 20230101,
|
|
210
|
+
dueDate: 20230115,
|
|
211
|
+
currencyCode: 'RON',
|
|
212
|
+
partner: {
|
|
213
|
+
isLegalPerson: false,
|
|
214
|
+
partnerName: 'Test Partner',
|
|
215
|
+
identificationNumber: '123456',
|
|
216
|
+
countryCode: 'RO',
|
|
217
|
+
countryName: 'Romania',
|
|
218
|
+
countyCode: 'B',
|
|
219
|
+
countyName: 'Bucuresti',
|
|
220
|
+
cityName: 'Bucuresti',
|
|
221
|
+
addressDetails: 'Test Address',
|
|
222
|
+
},
|
|
223
|
+
items: [
|
|
224
|
+
{
|
|
225
|
+
itemExternalId: 'item-1',
|
|
226
|
+
measureUnitId: 1,
|
|
227
|
+
quantity: 1,
|
|
228
|
+
unitPrice: 100,
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
};
|
|
232
|
+
it('should update invoice with CASH payment type', async () => {
|
|
233
|
+
nock(baseDomain)
|
|
234
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
235
|
+
.reply(200);
|
|
236
|
+
await expect(keezApi.updateInvoice('inv-123', {
|
|
237
|
+
...baseInvoice,
|
|
238
|
+
paymentType: paymentType_1.PaymentType.CASH,
|
|
239
|
+
})).resolves.toBeUndefined();
|
|
240
|
+
});
|
|
241
|
+
it('should update invoice with CARD payment type', async () => {
|
|
242
|
+
nock(baseDomain)
|
|
243
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
244
|
+
.reply(200);
|
|
245
|
+
await expect(keezApi.updateInvoice('inv-123', {
|
|
246
|
+
...baseInvoice,
|
|
247
|
+
paymentType: paymentType_1.PaymentType.CARD,
|
|
248
|
+
})).resolves.toBeUndefined();
|
|
249
|
+
});
|
|
250
|
+
it('should update invoice with MEAL_VOUCHER payment type', async () => {
|
|
251
|
+
nock(baseDomain)
|
|
252
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
253
|
+
.reply(200);
|
|
254
|
+
await expect(keezApi.updateInvoice('inv-123', {
|
|
255
|
+
...baseInvoice,
|
|
256
|
+
paymentType: paymentType_1.PaymentType.MEAL_VOUCHER,
|
|
257
|
+
})).resolves.toBeUndefined();
|
|
258
|
+
});
|
|
259
|
+
it('should update invoice with CASH_ON_DELIVERY payment type', async () => {
|
|
260
|
+
nock(baseDomain)
|
|
261
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
262
|
+
.reply(200);
|
|
263
|
+
await expect(keezApi.updateInvoice('inv-123', {
|
|
264
|
+
...baseInvoice,
|
|
265
|
+
paymentType: paymentType_1.PaymentType.CASH_ON_DELIVERY,
|
|
266
|
+
})).resolves.toBeUndefined();
|
|
267
|
+
});
|
|
268
|
+
it('should update invoice with HOLIDAY_VOUCHER_CARD payment type', async () => {
|
|
269
|
+
nock(baseDomain)
|
|
270
|
+
.put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
|
|
271
|
+
.reply(200);
|
|
272
|
+
await expect(keezApi.updateInvoice('inv-123', {
|
|
273
|
+
...baseInvoice,
|
|
274
|
+
paymentType: paymentType_1.PaymentType.HOLIDAY_VOUCHER_CARD,
|
|
275
|
+
})).resolves.toBeUndefined();
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
describe('Item with Various Measure Units', () => {
|
|
279
|
+
it('should create item with KILOGRAM measure unit', async () => {
|
|
280
|
+
nock(baseDomain)
|
|
281
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
282
|
+
.reply(201, { externalId: 'kg-item-id' });
|
|
283
|
+
const result = await keezApi.createItem({
|
|
284
|
+
itemName: 'Bulk Item',
|
|
285
|
+
measureUnitId: measureUnit_1.MeasureUnit.KILOGRAM,
|
|
286
|
+
unitPrice: 25,
|
|
287
|
+
vatPercent: 19,
|
|
288
|
+
});
|
|
289
|
+
expect(result).toBe('kg-item-id');
|
|
290
|
+
});
|
|
291
|
+
it('should create item with LITER measure unit', async () => {
|
|
292
|
+
nock(baseDomain)
|
|
293
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
294
|
+
.reply(201, { externalId: 'liter-item-id' });
|
|
295
|
+
const result = await keezApi.createItem({
|
|
296
|
+
itemName: 'Liquid Item',
|
|
297
|
+
measureUnitId: measureUnit_1.MeasureUnit.LITER,
|
|
298
|
+
unitPrice: 10,
|
|
299
|
+
vatPercent: 9,
|
|
300
|
+
});
|
|
301
|
+
expect(result).toBe('liter-item-id');
|
|
302
|
+
});
|
|
303
|
+
it('should create item with METER measure unit', async () => {
|
|
304
|
+
nock(baseDomain)
|
|
305
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
306
|
+
.reply(201, { externalId: 'meter-item-id' });
|
|
307
|
+
const result = await keezApi.createItem({
|
|
308
|
+
itemName: 'Cable Item',
|
|
309
|
+
measureUnitId: measureUnit_1.MeasureUnit.METER,
|
|
310
|
+
unitPrice: 5,
|
|
311
|
+
vatPercent: 19,
|
|
312
|
+
});
|
|
313
|
+
expect(result).toBe('meter-item-id');
|
|
314
|
+
});
|
|
315
|
+
it('should create item with SQUARE_METER measure unit', async () => {
|
|
316
|
+
nock(baseDomain)
|
|
317
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
318
|
+
.reply(201, { externalId: 'sqm-item-id' });
|
|
319
|
+
const result = await keezApi.createItem({
|
|
320
|
+
itemName: 'Floor Item',
|
|
321
|
+
measureUnitId: measureUnit_1.MeasureUnit.SQUARE_METER,
|
|
322
|
+
unitPrice: 50,
|
|
323
|
+
vatPercent: 19,
|
|
324
|
+
});
|
|
325
|
+
expect(result).toBe('sqm-item-id');
|
|
326
|
+
});
|
|
327
|
+
it('should create item with HOUR measure unit', async () => {
|
|
328
|
+
nock(baseDomain)
|
|
329
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
330
|
+
.reply(201, { externalId: 'hour-item-id' });
|
|
331
|
+
const result = await keezApi.createItem({
|
|
332
|
+
itemName: 'Service Item',
|
|
333
|
+
measureUnitId: measureUnit_1.MeasureUnit.HOUR,
|
|
334
|
+
unitPrice: 100,
|
|
335
|
+
vatPercent: 19,
|
|
336
|
+
});
|
|
337
|
+
expect(result).toBe('hour-item-id');
|
|
338
|
+
});
|
|
339
|
+
it('should create item with DAY measure unit', async () => {
|
|
340
|
+
nock(baseDomain)
|
|
341
|
+
.post(`/api/v1.0/public-api/${clientEid}/items`)
|
|
342
|
+
.reply(201, { externalId: 'day-item-id' });
|
|
343
|
+
const result = await keezApi.createItem({
|
|
344
|
+
itemName: 'Rental Item',
|
|
345
|
+
measureUnitId: measureUnit_1.MeasureUnit.DAY,
|
|
346
|
+
unitPrice: 500,
|
|
347
|
+
vatPercent: 19,
|
|
348
|
+
});
|
|
349
|
+
expect(result).toBe('day-item-id');
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1jYXNlcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdHMvZWRnZS1jYXNlcy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThCO0FBQzlCLHVDQUFvQztBQUNwQyxzREFBbUQ7QUFDbkQsc0RBQW1EO0FBRW5ELFFBQVEsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7SUFDdEQsSUFBSSxPQUFnQixDQUFDO0lBQ3JCLE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBRXBDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1lBQ2xCLGNBQWMsRUFBRSxhQUFhO1lBQzdCLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLElBQUksRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNYLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzthQUMxQixLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ1IsWUFBWSxFQUFFLFlBQVk7WUFDMUIsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLFFBQVE7WUFDcEIsS0FBSyxFQUFFLFlBQVk7U0FDdEIsQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ1gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtRQUN6RCxFQUFFLENBQUMsMERBQTBELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEUsSUFBSSxDQUFDLFVBQVUsQ0FBQztpQkFDWCxJQUFJLENBQUMs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QUM7WUFFaEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUNwQyxRQUFRLEVBQUUsY0FBYztnQkFDeEIsYUFBYSxFQUFFLHlCQUFXLENBQUMsSUFBSTtnQkFDL0IsU0FBUyxFQUFFLEdBQUc7Z0JBQ2QsVUFBVSxFQUFFLEVBQUU7YUFDakIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNYLElBQUksQ0FBQyx3QkFBd0IsU0FBUyxRQUFRLENBQUM7aUJBQy9DLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUUvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ3BDLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixhQUFhLEVBQUUseUJBQVcsQ0FBQyxHQUFHO2dCQUM5QixTQUFTLEVBQUUsR0FBRztnQkFDZCxVQUFVLEVBQUUsRUFBRTthQUNqQixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgS2VlekFwaSB9IGZyb20gJ0Ava2VlekFwaSc7XG5pbXBvcnQgeyBNZWFzdXJlVW5pdCB9IGZyb20gJ0AvY29uZmlnL21lYXN1cmVVbml0JztcbmltcG9ydCB7IFBheW1lbnRUeXBlIH0gZnJvbSAnQC9jb25maWcvcGF5bWVudFR5cGUnO1xuXG5kZXNjcmliZSgnRWRnZSBDYXNlcyBhbmQgUmVzcG9uc2UgVmFyaWF0aW9ucyBUZXN0cycsICgpID0+IHtcbiAgICBsZXQga2VlekFwaTogS2VlekFwaTtcbiAgICBjb25zdCBiYXNlRG9tYWluID0gJ2h0dHBzOi8vc3RhZ2luZy5rZWV6LnJvJztcbiAgICBjb25zdCBjbGllbnRFaWQgPSAndGVzdC1jbGllbnQtZWlkJztcblxuICAgIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgICAgIGtlZXpBcGkgPSBuZXcgS2VlekFwaSh7XG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgIGNsaWVudF9laWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgIHNlY3JldDogJ3Rlc3Qtc2VjcmV0JyxcbiAgICAgICAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAucG9zdCgnL2lkcC9jb25uZWN0L3Rva2VuJylcbiAgICAgICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICBleHBpcmVzX2luOiAzNjAwLFxuICAgICAgICAgICAgICAgIHRva2VuX3R5cGU6ICdCZWFyZXInLFxuICAgICAgICAgICAgICAgIHNjb3BlOiAncHVibGljLWFwaScsXG4gICAgICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzdWJtaXRJbnZvaWNlVG9FZmFjdHVyYSBSZXNwb25zZSBWYXJpYXRpb25zJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBleHRlcm5hbElkIHdoZW4gdXBsb2FkSW5kZXggaXMgbm90IHByZXNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9lZmFjdHVyYS9zdWJtaXR0ZWRgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIHsgZXh0ZXJuYWxJZDogJ2V4dC0xMjMnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLnN1Ym1pdEludm9pY2VUb0VmYWN0dXJhKCdpbnYtMTIzJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdleHQtMTIzJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFNVQk1JVFRFRCB3aGVuIG5laXRoZXIgdXBsb2FkSW5kZXggbm9yIGV4dGVybmFsSWQgaXMgcHJlc2VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2VmYWN0dXJhL3N1Ym1pdHRlZGApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLnN1Ym1pdEludm9pY2VUb0VmYWN0dXJhKCdpbnYtMTIzJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdTVUJNSVRURUQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBwcmVmZXIgdXBsb2FkSW5kZXggb3ZlciBleHRlcm5hbElkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wb3N0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvZWZhY3R1cmEvc3VibWl0dGVkYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwLCB7IHVwbG9hZEluZGV4OiAndXBsb2FkLTEyMycsIGV4dGVybmFsSWQ6ICdleHQtMTIzJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5zdWJtaXRJbnZvaWNlVG9FZmFjdHVyYSgnaW52LTEyMycpO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgndXBsb2FkLTEyMycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdDcmVhdGUgSXRlbSB3aXRoIE9wdGlvbmFsIEZpZWxkcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgaXRlbSB3aXRoIGFsbCBvcHRpb25hbCBmaWVsZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnbmV3LWl0ZW0taWQnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnRnVsbCBJdGVtJyxcbiAgICAgICAgICAgICAgICBpdGVtQ29kZTogJ0ZJMDAxJyxcbiAgICAgICAgICAgICAgICBpdGVtRGVzY3JpcHRpb246ICdEZXRhaWxlZCBkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxMDAsXG4gICAgICAgICAgICAgICAgdmF0UGVyY2VudDogMTksXG4gICAgICAgICAgICAgICAgdmF0Q2F0ZWdvcnlDb2RlOiAnUycsXG4gICAgICAgICAgICAgICAgdmF0RXhlbXB0aW9uUmVhc29uOiAnTi9BJyxcbiAgICAgICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCduZXctaXRlbS1pZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpdGVtIHdpdGggaXNBY3RpdmUgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnaW5hY3RpdmUtaXRlbS1pZCcgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdJbmFjdGl2ZSBJdGVtJyxcbiAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5QSUVDRSxcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDUwLFxuICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdpbmFjdGl2ZS1pdGVtLWlkJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZSBJbnZvaWNlIHdpdGggT3B0aW9uYWwgRmllbGRzJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZSBpbnZvaWNlIHdpdGggdmF0T25Db2xsZWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wdXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9pbnYtMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSW52b2ljZSgnaW52LTEyMycsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWVzOiAnSU5WJyxcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnREYXRlOiAyMDIzMDEwMSxcbiAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZTogMjAyMzAxMTUsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogJ1JPTicsXG4gICAgICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlOiBQYXltZW50VHlwZS5CQU5LX1RSQU5TRkVSLFxuICAgICAgICAgICAgICAgICAgICB2YXRPbkNvbGxlY3Rpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRuZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVnYWxQZXJzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lck5hbWU6ICdUZXN0IFBhcnRuZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmljYXRpb25OdW1iZXI6ICcxMjM0NTYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6ICdSTycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5TmFtZTogJ1JvbWFuaWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5Q29kZTogJ0InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5TmFtZTogJ0J1Y3VyZXN0aScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXR5TmFtZTogJ0J1Y3VyZXN0aScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzRGV0YWlsczogJ1Rlc3QgQWRkcmVzcycsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUV4dGVybmFsSWQ6ICdpdGVtLTEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUgaW52b2ljZSB3aXRoIGV4Y2hhbmdlUmF0ZSBhbmQgbm90ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAga2VlekFwaS51cGRhdGVJbnZvaWNlKCdpbnYtMTIzJywge1xuICAgICAgICAgICAgICAgICAgICBzZXJpZXM6ICdJTlYnLFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudERhdGU6IDIwMjMwMTAxLFxuICAgICAgICAgICAgICAgICAgICBkdWVEYXRlOiAyMDIzMDExNSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnRVVSJyxcbiAgICAgICAgICAgICAgICAgICAgcGF5bWVudFR5cGU6IFBheW1lbnRUeXBlLkNBUkRfT05MSU5FLFxuICAgICAgICAgICAgICAgICAgICBleGNoYW5nZVJhdGU6IDQuOTUsXG4gICAgICAgICAgICAgICAgICAgIG5vdGVzOiAnUGF5bWVudCByZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRuZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVnYWxQZXJzb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ0NvbXBhbnkgTHRkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpY2F0aW9uTnVtYmVyOiAnUk8xMjM0NTY3OCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogJ1JPJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lOiAnUm9tYW5pYScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHlDb2RlOiAnQ0onLFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5TmFtZTogJ0NsdWonLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2l0eU5hbWU6ICdDbHVqLU5hcG9jYScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzRGV0YWlsczogJ01haW4gU3RyZWV0IDEnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1FeHRlcm5hbElkOiAnaXRlbS0xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiA1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRQcmljZTogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50UGVyY2VudDogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDdXN0b20gZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1VwZGF0ZSBJdGVtIHdpdGggQWxsIEZpZWxkcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUgaXRlbSB3aXRoIGFsbCBvcHRpb25hbCBmaWVsZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zL2l0ZW0tMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSXRlbSgnaXRlbS0xMjMnLCB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVXBkYXRlZCBGdWxsIEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICBpdGVtQ29kZTogJ1VGSTAwMScsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1EZXNjcmlwdGlvbjogJ1VwZGF0ZWQgZGV0YWlsZWQgZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5LSUxPR1JBTSxcbiAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAyNTAsXG4gICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDksXG4gICAgICAgICAgICAgICAgICAgIHZhdENhdGVnb3J5Q29kZTogJ1InLFxuICAgICAgICAgICAgICAgICAgICB2YXRFeGVtcHRpb25SZWFzb246ICdSZWR1Y2VkIHJhdGUnLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0tlZXpBcGkgTGl2ZSBNb2RlJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHVzZSBsaXZlIGRvbWFpbiB3aGVuIHNldExpdmUgaXMgY2FsbGVkIHdpdGggdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpdmVBcGkgPSBuZXcgS2VlekFwaSh7XG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgY2xpZW50X2VpZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgIHNlY3JldDogJ3Rlc3Qtc2VjcmV0JyxcbiAgICAgICAgICAgICAgICBsaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QobGl2ZUFwaS5nZXRCYXNlRG9tYWluKCkpLnRvQmUoJ2h0dHBzOi8vc3RhZ2luZy5rZWV6LnJvJyk7XG5cbiAgICAgICAgICAgIGxpdmVBcGkuc2V0TGl2ZSh0cnVlKTtcbiAgICAgICAgICAgIGV4cGVjdChsaXZlQXBpLmdldEJhc2VEb21haW4oKSkudG9CZSgnaHR0cHM6Ly9hcHAua2Vlei5ybycpO1xuXG4gICAgICAgICAgICBsaXZlQXBpLnNldExpdmUoZmFsc2UpO1xuICAgICAgICAgICAgZXhwZWN0KGxpdmVBcGkuZ2V0QmFzZURvbWFpbigpKS50b0JlKCdodHRwczovL3N0YWdpbmcua2Vlei5ybycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdUb2tlbiBSZWZyZXNoIG9uIE11bHRpcGxlIENhbGxzJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHJldXNlIHRva2VuIGZvciBjb25zZWN1dGl2ZSBjYWxscyB3aGVuIHN0aWxsIHZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9ja0l0ZW1zID0ge1xuICAgICAgICAgICAgICAgIGZpcnN0OiAwLFxuICAgICAgICAgICAgICAgIGxhc3Q6IDAsXG4gICAgICAgICAgICAgICAgcmVjb3Jkc0NvdW50OiAwLFxuICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gRmlyc3QgY2FsbCBnZW5lcmF0ZXMgdG9rZW5cbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbikuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKS5yZXBseSgyMDAsIG1vY2tJdGVtcyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGtlZXpBcGkuZ2V0QWxsSXRlbXMoKTtcblxuICAgICAgICAgICAgLy8gU2Vjb25kIGNhbGwgc2hvdWxkIHJldXNlIHRva2VuIChubyBuZXcgdG9rZW4gcmVxdWVzdClcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbikuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKS5yZXBseSgyMDAsIG1vY2tJdGVtcyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGtlZXpBcGkuZ2V0QWxsSXRlbXMoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnSW52b2ljZSB3aXRoIFZhcmlvdXMgUGF5bWVudCBUeXBlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZUludm9pY2UgPSB7XG4gICAgICAgICAgICBzZXJpZXM6ICdJTlYnLFxuICAgICAgICAgICAgZG9jdW1lbnREYXRlOiAyMDIzMDEwMSxcbiAgICAgICAgICAgIGR1ZURhdGU6IDIwMjMwMTE1LFxuICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnUk9OJyxcbiAgICAgICAgICAgIHBhcnRuZXI6IHtcbiAgICAgICAgICAgICAgICBpc0xlZ2FsUGVyc29uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgaWRlbnRpZmljYXRpb25OdW1iZXI6ICcxMjM0NTYnLFxuICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlOiAnUk8nLFxuICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lOiAnUm9tYW5pYScsXG4gICAgICAgICAgICAgICAgY291bnR5Q29kZTogJ0InLFxuICAgICAgICAgICAgICAgIGNvdW50eU5hbWU6ICdCdWN1cmVzdGknLFxuICAgICAgICAgICAgICAgIGNpdHlOYW1lOiAnQnVjdXJlc3RpJyxcbiAgICAgICAgICAgICAgICBhZGRyZXNzRGV0YWlsczogJ1Rlc3QgQWRkcmVzcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1FeHRlcm5hbElkOiAnaXRlbS0xJyxcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogMSxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgIHVuaXRQcmljZTogMTAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGludm9pY2Ugd2l0aCBDQVNIIHBheW1lbnQgdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucHV0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvaW52LTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBrZWV6QXBpLnVwZGF0ZUludm9pY2UoJ2ludi0xMjMnLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmJhc2VJbnZvaWNlLFxuICAgICAgICAgICAgICAgICAgICBwYXltZW50VHlwZTogUGF5bWVudFR5cGUuQ0FTSCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGludm9pY2Ugd2l0aCBDQVJEIHBheW1lbnQgdHlwZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucHV0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXMvaW52LTEyM2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBrZWV6QXBpLnVwZGF0ZUludm9pY2UoJ2ludi0xMjMnLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmJhc2VJbnZvaWNlLFxuICAgICAgICAgICAgICAgICAgICBwYXltZW50VHlwZTogUGF5bWVudFR5cGUuQ0FSRCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGludm9pY2Ugd2l0aCBNRUFMX1ZPVUNIRVIgcGF5bWVudCB0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wdXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9pbnYtMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSW52b2ljZSgnaW52LTEyMycsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYmFzZUludm9pY2UsXG4gICAgICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlOiBQYXltZW50VHlwZS5NRUFMX1ZPVUNIRVIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVzb2x2ZXMudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZSBpbnZvaWNlIHdpdGggQ0FTSF9PTl9ERUxJVkVSWSBwYXltZW50IHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDApO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAga2VlekFwaS51cGRhdGVJbnZvaWNlKCdpbnYtMTIzJywge1xuICAgICAgICAgICAgICAgICAgICAuLi5iYXNlSW52b2ljZSxcbiAgICAgICAgICAgICAgICAgICAgcGF5bWVudFR5cGU6IFBheW1lbnRUeXBlLkNBU0hfT05fREVMSVZFUlksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVzb2x2ZXMudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZSBpbnZvaWNlIHdpdGggSE9MSURBWV9WT1VDSEVSX0NBUkQgcGF5bWVudCB0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wdXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9pbnYtMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGtlZXpBcGkudXBkYXRlSW52b2ljZSgnaW52LTEyMycsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYmFzZUludm9pY2UsXG4gICAgICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlOiBQYXltZW50VHlwZS5IT0xJREFZX1ZPVUNIRVJfQ0FSRCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZXNvbHZlcy50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0l0ZW0gd2l0aCBWYXJpb3VzIE1lYXN1cmUgVW5pdHMnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgY3JlYXRlIGl0ZW0gd2l0aCBLSUxPR1JBTSBtZWFzdXJlIHVuaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAna2ctaXRlbS1pZCcgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdCdWxrIEl0ZW0nLFxuICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LktJTE9HUkFNLFxuICAgICAgICAgICAgICAgIHVuaXRQcmljZTogMjUsXG4gICAgICAgICAgICAgICAgdmF0UGVyY2VudDogMTksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgna2ctaXRlbS1pZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpdGVtIHdpdGggTElURVIgbWVhc3VyZSB1bml0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wb3N0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDEsIHsgZXh0ZXJuYWxJZDogJ2xpdGVyLWl0ZW0taWQnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnTGlxdWlkIEl0ZW0nLFxuICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LkxJVEVSLFxuICAgICAgICAgICAgICAgIHVuaXRQcmljZTogMTAsXG4gICAgICAgICAgICAgICAgdmF0UGVyY2VudDogOSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdsaXRlci1pdGVtLWlkJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgY3JlYXRlIGl0ZW0gd2l0aCBNRVRFUiBtZWFzdXJlIHVuaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnbWV0ZXItaXRlbS1pZCcgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdDYWJsZSBJdGVtJyxcbiAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5NRVRFUixcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDUsXG4gICAgICAgICAgICAgICAgdmF0UGVyY2VudDogMTksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnbWV0ZXItaXRlbS1pZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpdGVtIHdpdGggU1FVQVJFX01FVEVSIG1lYXN1cmUgdW5pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zYClcbiAgICAgICAgICAgICAgICAucmVwbHkoMjAxLCB7IGV4dGVybmFsSWQ6ICdzcW0taXRlbS1pZCcgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtlZXpBcGkuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdGbG9vciBJdGVtJyxcbiAgICAgICAgICAgICAgICBtZWFzdXJlVW5pdElkOiBNZWFzdXJlVW5pdC5TUVVBUkVfTUVURVIsXG4gICAgICAgICAgICAgICAgdW5pdFByaWNlOiA1MCxcbiAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdzcW0taXRlbS1pZCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBpdGVtIHdpdGggSE9VUiBtZWFzdXJlIHVuaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnaG91ci1pdGVtLWlkJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5jcmVhdGVJdGVtKHtcbiAgICAgICAgICAgICAgICBpdGVtTmFtZTogJ1NlcnZpY2UgSXRlbScsXG4gICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuSE9VUixcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdob3VyLWl0ZW0taWQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgaXRlbSB3aXRoIERBWSBtZWFzdXJlIHVuaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMSwgeyBleHRlcm5hbElkOiAnZGF5LWl0ZW0taWQnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZWV6QXBpLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnUmVudGFsIEl0ZW0nLFxuICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LkRBWSxcbiAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDUwMCxcbiAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKCdkYXktaXRlbS1pZCcpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn0pO1xuIl19
|