@uql/core 0.4.89 → 0.4.92
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/README.md +35 -35
- package/package.json +4 -4
- package/dialect/abstractSqlDialect-spec.d.ts +0 -49
- package/dialect/abstractSqlDialect-spec.js +0 -765
- package/dialect/mysqlDialect.spec.d.ts +0 -6
- package/dialect/mysqlDialect.spec.js +0 -33
- package/dialect/postgresDialect.spec.d.ts +0 -1
- package/dialect/postgresDialect.spec.js +0 -139
- package/dialect/sqliteDialect.spec.d.ts +0 -1
- package/dialect/sqliteDialect.spec.js +0 -12
- package/entity/decorator/definition.spec.d.ts +0 -1
- package/entity/decorator/definition.spec.js +0 -725
- package/entity/decorator/relation.spec.d.ts +0 -1
- package/entity/decorator/relation.spec.js +0 -55
- package/options.spec.d.ts +0 -1
- package/options.spec.js +0 -27
- package/querier/abstractQuerier-it.d.ts +0 -41
- package/querier/abstractQuerier-it.js +0 -410
- package/querier/abstractSqlQuerier-it.d.ts +0 -9
- package/querier/abstractSqlQuerier-it.js +0 -19
- package/querier/abstractSqlQuerier-spec.d.ts +0 -53
- package/querier/abstractSqlQuerier-spec.js +0 -607
- package/querier/decorator/injectQuerier.spec.d.ts +0 -1
- package/querier/decorator/injectQuerier.spec.js +0 -108
- package/querier/decorator/transactional.spec.d.ts +0 -1
- package/querier/decorator/transactional.spec.js +0 -239
- package/repository/genericRepository.spec.d.ts +0 -1
- package/repository/genericRepository.spec.js +0 -86
- package/test/entityMock.d.ts +0 -180
- package/test/entityMock.js +0 -451
- package/test/index.d.ts +0 -3
- package/test/index.js +0 -7
- package/test/it.util.d.ts +0 -4
- package/test/it.util.js +0 -60
- package/test/spec.util.d.ts +0 -13
- package/test/spec.util.js +0 -54
- package/util/dialect.util.spec.d.ts +0 -1
- package/util/dialect.util.spec.js +0 -23
- package/util/object.util.spec.d.ts +0 -1
- package/util/object.util.spec.js +0 -26
- package/util/sql.util.spec.d.ts +0 -1
- package/util/sql.util.spec.js +0 -164
- package/util/string.util.spec.d.ts +0 -1
- package/util/string.util.spec.js +0 -26
|
@@ -1,765 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AbstractSqlDialectSpec = void 0;
|
|
4
|
-
const test_1 = require("@uql/core/test");
|
|
5
|
-
const util_1 = require("@uql/core/util");
|
|
6
|
-
class AbstractSqlDialectSpec {
|
|
7
|
-
constructor(dialect) {
|
|
8
|
-
this.dialect = dialect;
|
|
9
|
-
}
|
|
10
|
-
shouldBeValidEscapeCharacter() {
|
|
11
|
-
expect(this.dialect.escapeIdChar).toBe('`');
|
|
12
|
-
}
|
|
13
|
-
shouldBeginTransaction() {
|
|
14
|
-
expect(this.dialect.beginTransactionCommand).toBe('BEGIN TRANSACTION');
|
|
15
|
-
}
|
|
16
|
-
shouldInsertMany() {
|
|
17
|
-
expect(this.dialect.insert(test_1.User, [
|
|
18
|
-
{
|
|
19
|
-
name: 'Some name 1',
|
|
20
|
-
email: 'someemail1@example.com',
|
|
21
|
-
createdAt: 123,
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: 'Some name 2',
|
|
25
|
-
email: 'someemail2@example.com',
|
|
26
|
-
createdAt: 456,
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
name: 'Some name 3',
|
|
30
|
-
email: 'someemail3@example.com',
|
|
31
|
-
createdAt: 789,
|
|
32
|
-
},
|
|
33
|
-
])).toBe('INSERT INTO `User` (`name`, `email`, `createdAt`) VALUES' +
|
|
34
|
-
" ('Some name 1', 'someemail1@example.com', 123)" +
|
|
35
|
-
", ('Some name 2', 'someemail2@example.com', 456)" +
|
|
36
|
-
", ('Some name 3', 'someemail3@example.com', 789)");
|
|
37
|
-
}
|
|
38
|
-
shouldInsertOne() {
|
|
39
|
-
expect(this.dialect.insert(test_1.User, {
|
|
40
|
-
name: 'Some Name',
|
|
41
|
-
email: 'someemail@example.com',
|
|
42
|
-
createdAt: 123,
|
|
43
|
-
})).toBe("INSERT INTO `User` (`name`, `email`, `createdAt`) VALUES ('Some Name', 'someemail@example.com', 123)");
|
|
44
|
-
expect(this.dialect.insert(test_1.InventoryAdjustment, {
|
|
45
|
-
date: new Date(2021, 11, 31, 23, 59, 59, 999),
|
|
46
|
-
createdAt: 123,
|
|
47
|
-
})).toBe("INSERT INTO `InventoryAdjustment` (`date`, `createdAt`) VALUES ('2021-12-31 23:59:59.999', 123)");
|
|
48
|
-
}
|
|
49
|
-
shouldInsertWithOnInsertId() {
|
|
50
|
-
expect(this.dialect.insert(test_1.TaxCategory, {
|
|
51
|
-
name: 'Some Name',
|
|
52
|
-
createdAt: 123,
|
|
53
|
-
})).toMatch(/^INSERT INTO `TaxCategory` \(`name`, `createdAt`, `pk`\) VALUES \('Some Name', 123, '.+'\)$/);
|
|
54
|
-
}
|
|
55
|
-
shouldInsertManyWithSpecifiedIdsAndOnInsertIdAsDefault() {
|
|
56
|
-
expect(this.dialect.insert(test_1.TaxCategory, [
|
|
57
|
-
{
|
|
58
|
-
name: 'Some Name A',
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
pk: '50',
|
|
62
|
-
name: 'Some Name B',
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
name: 'Some Name C',
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
pk: '70',
|
|
69
|
-
name: 'Some Name D',
|
|
70
|
-
},
|
|
71
|
-
])).toMatch(/^INSERT INTO `TaxCategory` \(`name`, `createdAt`, `pk`\) VALUES \('Some Name A', \d+, '.+'\), \('Some Name B', \d+, '50'\), \('Some Name C', \d+, '.+'\), \('Some Name D', \d+, '70'\)$/);
|
|
72
|
-
}
|
|
73
|
-
shouldUpdate() {
|
|
74
|
-
expect(this.dialect.update(test_1.User, { $filter: { name: 'some', creatorId: 123 } }, {
|
|
75
|
-
name: 'Some Text',
|
|
76
|
-
updatedAt: 321,
|
|
77
|
-
})).toBe("UPDATE `User` SET `name` = 'Some Text', `updatedAt` = 321 WHERE `name` = 'some' AND `creatorId` = 123");
|
|
78
|
-
}
|
|
79
|
-
shouldFind() {
|
|
80
|
-
expect(this.dialect.find(test_1.User, {
|
|
81
|
-
$project: ['id'],
|
|
82
|
-
$filter: { id: 123, name: 'abc' },
|
|
83
|
-
})).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
|
|
84
|
-
expect(this.dialect.find(test_1.Profile, {
|
|
85
|
-
$project: ['id', 'picture', 'companyId'],
|
|
86
|
-
$filter: { id: 123, picture: 'abc' },
|
|
87
|
-
})).toBe("SELECT `pk` `id`, `image` `picture`, `companyId` FROM `user_profile` WHERE `pk` = 123 AND `image` = 'abc'");
|
|
88
|
-
expect(this.dialect.find(test_1.MeasureUnit, {
|
|
89
|
-
$project: ['id'],
|
|
90
|
-
$filter: { id: 123, name: 'abc' },
|
|
91
|
-
})).toBe("SELECT `id` FROM `MeasureUnit` WHERE `id` = 123 AND `name` = 'abc' AND `deletedAt` IS NULL");
|
|
92
|
-
}
|
|
93
|
-
shouldBeSecure() {
|
|
94
|
-
expect(this.dialect.find(test_1.User, {
|
|
95
|
-
$project: ['id', 'something'],
|
|
96
|
-
$filter: {
|
|
97
|
-
id: 1,
|
|
98
|
-
something: 1,
|
|
99
|
-
},
|
|
100
|
-
$sort: {
|
|
101
|
-
id: 1,
|
|
102
|
-
something: 1,
|
|
103
|
-
},
|
|
104
|
-
$group: ['id', 'something'],
|
|
105
|
-
})).toBe('SELECT `id` FROM `User` WHERE `id` = 1 AND `something` = 1 GROUP BY `id`, `something` ORDER BY `id`, `something`');
|
|
106
|
-
expect(this.dialect.insert(test_1.User, {
|
|
107
|
-
name: 'Some Name',
|
|
108
|
-
something: 'anything',
|
|
109
|
-
createdAt: 1,
|
|
110
|
-
})).toBe("INSERT INTO `User` (`name`, `createdAt`) VALUES ('Some Name', 1)");
|
|
111
|
-
expect(this.dialect.update(test_1.User, {
|
|
112
|
-
$filter: { something: 'anything' },
|
|
113
|
-
}, {
|
|
114
|
-
name: 'Some Name',
|
|
115
|
-
something: 'anything',
|
|
116
|
-
updatedAt: 1,
|
|
117
|
-
})).toBe("UPDATE `User` SET `name` = 'Some Name', `updatedAt` = 1 WHERE `something` = 'anything'");
|
|
118
|
-
expect(this.dialect.delete(test_1.User, {
|
|
119
|
-
$filter: { something: 'anything' },
|
|
120
|
-
})).toBe("DELETE FROM `User` WHERE `something` = 'anything'");
|
|
121
|
-
}
|
|
122
|
-
shouldFind$and() {
|
|
123
|
-
const sql = "SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'";
|
|
124
|
-
expect(this.dialect.find(test_1.User, {
|
|
125
|
-
$project: ['id'],
|
|
126
|
-
$filter: { $and: [{ id: 123, name: 'abc' }] },
|
|
127
|
-
})).toBe(sql);
|
|
128
|
-
expect(this.dialect.find(test_1.User, {
|
|
129
|
-
$project: { id: 1 },
|
|
130
|
-
$filter: { $and: [{ id: 123 }], name: 'abc' },
|
|
131
|
-
})).toBe(sql);
|
|
132
|
-
}
|
|
133
|
-
shouldFind$or() {
|
|
134
|
-
expect(this.dialect.find(test_1.User, {
|
|
135
|
-
$project: ['id'],
|
|
136
|
-
$filter: { $or: [{ id: 123 }, { name: 'abc' }] },
|
|
137
|
-
})).toBe("SELECT `id` FROM `User` WHERE `id` = 123 OR `name` = 'abc'");
|
|
138
|
-
expect(this.dialect.find(test_1.User, {
|
|
139
|
-
$project: ['id'],
|
|
140
|
-
$filter: { $or: [{ id: 123 }] },
|
|
141
|
-
})).toBe('SELECT `id` FROM `User` WHERE `id` = 123');
|
|
142
|
-
expect(this.dialect.find(test_1.User, {
|
|
143
|
-
$project: { id: 1 },
|
|
144
|
-
$filter: { $or: [{ id: 123, name: 'abc' }] },
|
|
145
|
-
})).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
|
|
146
|
-
expect(this.dialect.find(test_1.User, {
|
|
147
|
-
$project: ['id'],
|
|
148
|
-
$filter: { $or: [{ id: 123 }], name: 'abc' },
|
|
149
|
-
})).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
|
|
150
|
-
}
|
|
151
|
-
shouldFind$not() {
|
|
152
|
-
expect(this.dialect.find(test_1.User, {
|
|
153
|
-
$project: ['id'],
|
|
154
|
-
$filter: { $not: [{ name: 'Some' }] },
|
|
155
|
-
})).toBe("SELECT `id` FROM `User` WHERE NOT `name` = 'Some'");
|
|
156
|
-
expect(this.dialect.find(test_1.Company, {
|
|
157
|
-
$project: ['id'],
|
|
158
|
-
$filter: { id: { $not: 123 } },
|
|
159
|
-
})).toBe('SELECT `id` FROM `Company` WHERE NOT `id` = 123');
|
|
160
|
-
expect(this.dialect.find(test_1.Company, {
|
|
161
|
-
$project: ['id'],
|
|
162
|
-
$filter: { id: { $not: [123, 456] } },
|
|
163
|
-
})).toBe('SELECT `id` FROM `Company` WHERE NOT `id` IN (123, 456)');
|
|
164
|
-
expect(this.dialect.find(test_1.Company, {
|
|
165
|
-
$project: ['id'],
|
|
166
|
-
$filter: { id: 123, name: { $not: { $startsWith: 'a' } } },
|
|
167
|
-
})).toBe("SELECT `id` FROM `Company` WHERE `id` = 123 AND NOT `name` LIKE 'a%'");
|
|
168
|
-
expect(this.dialect.find(test_1.Company, {
|
|
169
|
-
$project: ['id'],
|
|
170
|
-
$filter: { name: { $not: { $startsWith: 'a', $endsWith: 'z' } } },
|
|
171
|
-
})).toBe("SELECT `id` FROM `Company` WHERE NOT (`name` LIKE 'a%' AND `name` LIKE '%z')");
|
|
172
|
-
expect(this.dialect.find(test_1.User, {
|
|
173
|
-
$project: { id: true },
|
|
174
|
-
$filter: { $not: [{ name: { $like: 'Some', $ne: 'Something' } }] },
|
|
175
|
-
})).toBe("SELECT `id` FROM `User` WHERE NOT (`name` LIKE 'Some' AND `name` <> 'Something')");
|
|
176
|
-
expect(this.dialect.find(test_1.User, {
|
|
177
|
-
$project: { id: true },
|
|
178
|
-
$filter: { $not: [{ name: 'abc' }, { creatorId: 1 }] },
|
|
179
|
-
})).toBe("SELECT `id` FROM `User` WHERE NOT (`name` = 'abc' AND `creatorId` = 1)");
|
|
180
|
-
expect(this.dialect.find(test_1.Tax, {
|
|
181
|
-
$project: ['id'],
|
|
182
|
-
$filter: { companyId: 1, name: { $not: { $startsWith: 'a' } } },
|
|
183
|
-
})).toBe("SELECT `id` FROM `Tax` WHERE `companyId` = 1 AND NOT `name` LIKE 'a%'");
|
|
184
|
-
}
|
|
185
|
-
shouldFind$nor() {
|
|
186
|
-
expect(this.dialect.find(test_1.User, {
|
|
187
|
-
$project: ['id'],
|
|
188
|
-
$filter: { $nor: [{ name: 'Some' }] },
|
|
189
|
-
})).toBe("SELECT `id` FROM `User` WHERE NOT `name` = 'Some'");
|
|
190
|
-
expect(this.dialect.find(test_1.User, {
|
|
191
|
-
$project: { id: true },
|
|
192
|
-
$filter: { $nor: [{ name: { $like: 'Some', $ne: 'Something' } }] },
|
|
193
|
-
})).toBe("SELECT `id` FROM `User` WHERE NOT (`name` LIKE 'Some' AND `name` <> 'Something')");
|
|
194
|
-
expect(this.dialect.find(test_1.User, {
|
|
195
|
-
$project: { id: true },
|
|
196
|
-
$filter: { $nor: [{ name: 'abc' }, { creatorId: 1 }] },
|
|
197
|
-
})).toBe("SELECT `id` FROM `User` WHERE NOT (`name` = 'abc' OR `creatorId` = 1)");
|
|
198
|
-
}
|
|
199
|
-
shouldFind$orAnd$and() {
|
|
200
|
-
expect(this.dialect.find(test_1.User, {
|
|
201
|
-
$project: ['id'],
|
|
202
|
-
$filter: { creatorId: 1, $or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }], id: 1 },
|
|
203
|
-
})).toBe("SELECT `id` FROM `User` WHERE `creatorId` = 1 AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com') AND `id` = 1");
|
|
204
|
-
expect(this.dialect.find(test_1.User, {
|
|
205
|
-
$project: ['id'],
|
|
206
|
-
$filter: {
|
|
207
|
-
creatorId: 1,
|
|
208
|
-
$or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }],
|
|
209
|
-
id: 1,
|
|
210
|
-
email: 'e',
|
|
211
|
-
},
|
|
212
|
-
})).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 1' +
|
|
213
|
-
" AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com') AND `id` = 1 AND `email` = 'e'");
|
|
214
|
-
expect(this.dialect.find(test_1.User, {
|
|
215
|
-
$project: ['id'],
|
|
216
|
-
$filter: {
|
|
217
|
-
creatorId: 1,
|
|
218
|
-
$or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }],
|
|
219
|
-
id: 1,
|
|
220
|
-
email: 'e',
|
|
221
|
-
},
|
|
222
|
-
$sort: { name: 1, createdAt: -1 },
|
|
223
|
-
$skip: 50,
|
|
224
|
-
$limit: 10,
|
|
225
|
-
})).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 1' +
|
|
226
|
-
" AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com')" +
|
|
227
|
-
" AND `id` = 1 AND `email` = 'e'" +
|
|
228
|
-
' ORDER BY `name`, `createdAt` DESC LIMIT 10 OFFSET 50');
|
|
229
|
-
expect(this.dialect.find(test_1.User, {
|
|
230
|
-
$project: ['id'],
|
|
231
|
-
$filter: {
|
|
232
|
-
$or: [
|
|
233
|
-
{
|
|
234
|
-
creatorId: 1,
|
|
235
|
-
id: 1,
|
|
236
|
-
email: 'e',
|
|
237
|
-
},
|
|
238
|
-
{ name: ['a', 'b', 'c'], email: 'abc@example.com' },
|
|
239
|
-
],
|
|
240
|
-
},
|
|
241
|
-
$sort: [
|
|
242
|
-
{ field: 'name', sort: 'asc' },
|
|
243
|
-
{ field: 'createdAt', sort: 'desc' },
|
|
244
|
-
],
|
|
245
|
-
$skip: 50,
|
|
246
|
-
$limit: 10,
|
|
247
|
-
})).toBe("SELECT `id` FROM `User` WHERE (`creatorId` = 1 AND `id` = 1 AND `email` = 'e')" +
|
|
248
|
-
" OR (`name` IN ('a', 'b', 'c') AND `email` = 'abc@example.com')" +
|
|
249
|
-
' ORDER BY `name`, `createdAt` DESC LIMIT 10 OFFSET 50');
|
|
250
|
-
}
|
|
251
|
-
shouldFindSingle$filter() {
|
|
252
|
-
expect(this.dialect.find(test_1.User, {
|
|
253
|
-
$project: ['id'],
|
|
254
|
-
$filter: { name: 'some' },
|
|
255
|
-
$limit: 3,
|
|
256
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' LIMIT 3");
|
|
257
|
-
}
|
|
258
|
-
shouldFindMultipleComparisonOperators() {
|
|
259
|
-
expect(this.dialect.find(test_1.User, {
|
|
260
|
-
$project: ['id'],
|
|
261
|
-
$filter: { $or: [{ name: { $eq: 'other', $ne: 'other unwanted' } }, { companyId: 1 }] },
|
|
262
|
-
})).toBe("SELECT `id` FROM `User` WHERE (`name` = 'other' AND `name` <> 'other unwanted') OR `companyId` = 1");
|
|
263
|
-
expect(this.dialect.find(test_1.User, {
|
|
264
|
-
$project: ['id'],
|
|
265
|
-
$filter: { createdAt: { $gte: 123, $lte: 999 } },
|
|
266
|
-
$limit: 10,
|
|
267
|
-
})).toBe('SELECT `id` FROM `User` WHERE (`createdAt` >= 123 AND `createdAt` <= 999) LIMIT 10');
|
|
268
|
-
expect(this.dialect.find(test_1.User, {
|
|
269
|
-
$project: ['id'],
|
|
270
|
-
$filter: { createdAt: { $gt: 123, $lt: 999 } },
|
|
271
|
-
$limit: 10,
|
|
272
|
-
})).toBe('SELECT `id` FROM `User` WHERE (`createdAt` > 123 AND `createdAt` < 999) LIMIT 10');
|
|
273
|
-
}
|
|
274
|
-
shouldFind$ne() {
|
|
275
|
-
expect(this.dialect.find(test_1.User, {
|
|
276
|
-
$project: ['id'],
|
|
277
|
-
$filter: { name: 'some', companyId: { $ne: 5 } },
|
|
278
|
-
$limit: 20,
|
|
279
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` <> 5 LIMIT 20");
|
|
280
|
-
}
|
|
281
|
-
shouldFindIsNull() {
|
|
282
|
-
expect(this.dialect.find(test_1.User, {
|
|
283
|
-
$project: ['id'],
|
|
284
|
-
$filter: { creatorId: 123, companyId: null },
|
|
285
|
-
$limit: 5,
|
|
286
|
-
})).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 123 AND `companyId` IS NULL LIMIT 5');
|
|
287
|
-
expect(this.dialect.find(test_1.User, {
|
|
288
|
-
$project: { id: true },
|
|
289
|
-
$filter: { creatorId: 123, companyId: { $ne: null } },
|
|
290
|
-
$limit: 5,
|
|
291
|
-
})).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 123 AND `companyId` IS NOT NULL LIMIT 5');
|
|
292
|
-
}
|
|
293
|
-
shouldFind$in() {
|
|
294
|
-
const sql = "SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` IN (1, 2, 3) LIMIT 10";
|
|
295
|
-
expect(this.dialect.find(test_1.User, {
|
|
296
|
-
$project: ['id'],
|
|
297
|
-
$filter: { name: 'some', companyId: [1, 2, 3] },
|
|
298
|
-
$limit: 10,
|
|
299
|
-
})).toBe(sql);
|
|
300
|
-
expect(this.dialect.find(test_1.User, {
|
|
301
|
-
$project: ['id'],
|
|
302
|
-
$filter: { name: 'some', companyId: { $in: [1, 2, 3] } },
|
|
303
|
-
$limit: 10,
|
|
304
|
-
})).toBe(sql);
|
|
305
|
-
}
|
|
306
|
-
shouldFind$nin() {
|
|
307
|
-
expect(this.dialect.find(test_1.User, {
|
|
308
|
-
$project: ['id'],
|
|
309
|
-
$filter: { name: 'some', companyId: { $nin: [1, 2, 3] } },
|
|
310
|
-
$limit: 10,
|
|
311
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` NOT IN (1, 2, 3) LIMIT 10");
|
|
312
|
-
}
|
|
313
|
-
shouldFind$projectFields() {
|
|
314
|
-
expect(this.dialect.find(test_1.User, { $project: { id: true, company: true } })).toBe('SELECT `User`.`id`, `company`.`id` `company.id`, `company`.`companyId` `company.companyId`, `company`.`creatorId` `company.creatorId`' +
|
|
315
|
-
', `company`.`createdAt` `company.createdAt`, `company`.`updatedAt` `company.updatedAt`' +
|
|
316
|
-
', `company`.`name` `company.name`, `company`.`description` `company.description`' +
|
|
317
|
-
' FROM `User` LEFT JOIN `Company` `company` ON `company`.`id` = `User`.`companyId`');
|
|
318
|
-
}
|
|
319
|
-
shouldFind$projectOneToOne() {
|
|
320
|
-
expect(this.dialect.find(test_1.User, {
|
|
321
|
-
$project: { id: true, name: true, profile: ['id', 'picture'] },
|
|
322
|
-
})).toBe('SELECT `User`.`id`, `User`.`name`, `profile`.`pk` `profile.id`, `profile`.`image` `profile.picture` FROM `User`' +
|
|
323
|
-
' LEFT JOIN `user_profile` `profile` ON `profile`.`creatorId` = `User`.`id`');
|
|
324
|
-
expect(this.dialect.find(test_1.User, { $project: { profile: true } })).toBe('SELECT `User`.`id`, `profile`.`companyId` `profile.companyId`' +
|
|
325
|
-
', `profile`.`creatorId` `profile.creatorId`, `profile`.`createdAt` `profile.createdAt`' +
|
|
326
|
-
', `profile`.`updatedAt` `profile.updatedAt`' +
|
|
327
|
-
', `profile`.`pk` `profile.id`, `profile`.`image` `profile.picture`' +
|
|
328
|
-
' FROM `User` LEFT JOIN `user_profile` `profile` ON `profile`.`creatorId` = `User`.`id`');
|
|
329
|
-
}
|
|
330
|
-
shouldFind$projectManyToOne() {
|
|
331
|
-
expect(this.dialect.find(test_1.Item, {
|
|
332
|
-
$project: {
|
|
333
|
-
id: true,
|
|
334
|
-
name: true,
|
|
335
|
-
code: true,
|
|
336
|
-
tax: { $project: ['id', 'name'], $required: true },
|
|
337
|
-
measureUnit: { $project: ['id', 'name', 'categoryId'] },
|
|
338
|
-
},
|
|
339
|
-
$limit: 100,
|
|
340
|
-
})).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
|
|
341
|
-
', `tax`.`id` `tax.id`, `tax`.`name` `tax.name`' +
|
|
342
|
-
', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
|
|
343
|
-
' FROM `Item`' +
|
|
344
|
-
' INNER JOIN `Tax` `tax` ON `tax`.`id` = `Item`.`taxId`' +
|
|
345
|
-
' LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
|
|
346
|
-
' LIMIT 100');
|
|
347
|
-
}
|
|
348
|
-
shouldFind$projectWithAllFieldsAndSpecificFieldsAndFilter() {
|
|
349
|
-
expect(this.dialect.find(test_1.Item, {
|
|
350
|
-
$project: {
|
|
351
|
-
id: true,
|
|
352
|
-
name: true,
|
|
353
|
-
measureUnit: { $project: ['id', 'name'], $filter: { name: { $ne: 'unidad' } }, $required: true },
|
|
354
|
-
tax: ['id', 'name'],
|
|
355
|
-
},
|
|
356
|
-
$filter: { salePrice: { $gte: 1000 }, name: { $istartsWith: 'A' } },
|
|
357
|
-
$sort: { tax: { name: 1 }, measureUnit: { name: 1 }, createdAt: -1 },
|
|
358
|
-
$limit: 100,
|
|
359
|
-
})).toBe('SELECT `Item`.`id`, `Item`.`name`' +
|
|
360
|
-
', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`' +
|
|
361
|
-
', `tax`.`id` `tax.id`, `tax`.`name` `tax.name`' +
|
|
362
|
-
' FROM `Item`' +
|
|
363
|
-
" INNER JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId` AND `measureUnit`.`name` <> 'unidad' AND `measureUnit`.`deletedAt` IS NULL" +
|
|
364
|
-
' LEFT JOIN `Tax` `tax` ON `tax`.`id` = `Item`.`taxId`' +
|
|
365
|
-
" WHERE `Item`.`salePrice` >= 1000 AND LOWER(`Item`.`name`) LIKE 'a%'" +
|
|
366
|
-
' ORDER BY `tax`.`name`, `measureUnit`.`name`, `Item`.`createdAt` DESC LIMIT 100');
|
|
367
|
-
}
|
|
368
|
-
shouldVirtualField() {
|
|
369
|
-
expect(this.dialect.find(test_1.Item, {
|
|
370
|
-
$project: {
|
|
371
|
-
id: 1,
|
|
372
|
-
},
|
|
373
|
-
$filter: {
|
|
374
|
-
tagsCount: { $gte: 10 },
|
|
375
|
-
},
|
|
376
|
-
})).toBe('SELECT `id` FROM `Item` WHERE (SELECT COUNT(*) `count` FROM `ItemTag` WHERE `ItemTag`.`itemId` = `id`) >= 10');
|
|
377
|
-
expect(this.dialect.find(test_1.Item, {
|
|
378
|
-
$project: {
|
|
379
|
-
id: 1,
|
|
380
|
-
name: 1,
|
|
381
|
-
code: 1,
|
|
382
|
-
tagsCount: 1,
|
|
383
|
-
measureUnit: {
|
|
384
|
-
$project: { id: 1, name: 1, categoryId: 1, category: ['name'] },
|
|
385
|
-
},
|
|
386
|
-
},
|
|
387
|
-
$limit: 100,
|
|
388
|
-
})).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
|
|
389
|
-
', (SELECT COUNT(*) `count` FROM `ItemTag` WHERE `ItemTag`.`itemId` = `Item`.`id`) `tagsCount`' +
|
|
390
|
-
', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
|
|
391
|
-
', `measureUnit.category`.`id` `measureUnit.category.id`, `measureUnit.category`.`name` `measureUnit.category.name`' +
|
|
392
|
-
' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
|
|
393
|
-
' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
|
|
394
|
-
' LIMIT 100');
|
|
395
|
-
}
|
|
396
|
-
shouldFind$projectDeep() {
|
|
397
|
-
expect(this.dialect.find(test_1.Item, {
|
|
398
|
-
$project: {
|
|
399
|
-
id: 1,
|
|
400
|
-
name: 1,
|
|
401
|
-
code: 1,
|
|
402
|
-
measureUnit: {
|
|
403
|
-
$project: { id: 1, name: 1, categoryId: 1, category: ['name'] },
|
|
404
|
-
},
|
|
405
|
-
},
|
|
406
|
-
$limit: 100,
|
|
407
|
-
})).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
|
|
408
|
-
', `measureUnit`.`id` `measureUnit.id`' +
|
|
409
|
-
', `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
|
|
410
|
-
', `measureUnit.category`.`id` `measureUnit.category.id`, `measureUnit.category`.`name` `measureUnit.category.name`' +
|
|
411
|
-
' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
|
|
412
|
-
' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
|
|
413
|
-
' LIMIT 100');
|
|
414
|
-
expect(this.dialect.find(test_1.Item, {
|
|
415
|
-
$project: {
|
|
416
|
-
id: true,
|
|
417
|
-
name: true,
|
|
418
|
-
code: true,
|
|
419
|
-
measureUnit: {
|
|
420
|
-
$project: { id: true, name: true, category: { $project: { id: true, name: true } } },
|
|
421
|
-
},
|
|
422
|
-
},
|
|
423
|
-
$limit: 100,
|
|
424
|
-
})).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`, `measureUnit`.`id` `measureUnit.id`' +
|
|
425
|
-
', `measureUnit`.`name` `measureUnit.name`, `measureUnit.category`.`id` `measureUnit.category.id`' +
|
|
426
|
-
', `measureUnit.category`.`name` `measureUnit.category.name`' +
|
|
427
|
-
' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
|
|
428
|
-
' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
|
|
429
|
-
' LIMIT 100');
|
|
430
|
-
expect(this.dialect.find(test_1.ItemAdjustment, {
|
|
431
|
-
$project: {
|
|
432
|
-
id: true,
|
|
433
|
-
buyPrice: true,
|
|
434
|
-
number: true,
|
|
435
|
-
item: {
|
|
436
|
-
$project: {
|
|
437
|
-
id: true,
|
|
438
|
-
name: true,
|
|
439
|
-
measureUnit: {
|
|
440
|
-
$project: { id: true, name: true, category: ['id', 'name'] },
|
|
441
|
-
},
|
|
442
|
-
},
|
|
443
|
-
$required: true,
|
|
444
|
-
},
|
|
445
|
-
},
|
|
446
|
-
$limit: 100,
|
|
447
|
-
})).toBe('SELECT `ItemAdjustment`.`id`, `ItemAdjustment`.`buyPrice`, `ItemAdjustment`.`number`' +
|
|
448
|
-
', `item`.`id` `item.id`, `item`.`name` `item.name`' +
|
|
449
|
-
', `item.measureUnit`.`id` `item.measureUnit.id`, `item.measureUnit`.`name` `item.measureUnit.name`' +
|
|
450
|
-
', `item.measureUnit.category`.`id` `item.measureUnit.category.id`, `item.measureUnit.category`.`name` `item.measureUnit.category.name`' +
|
|
451
|
-
' FROM `ItemAdjustment`' +
|
|
452
|
-
' INNER JOIN `Item` `item` ON `item`.`id` = `ItemAdjustment`.`itemId`' +
|
|
453
|
-
' LEFT JOIN `MeasureUnit` `item.measureUnit` ON `item.measureUnit`.`id` = `item`.`measureUnitId`' +
|
|
454
|
-
' LEFT JOIN `MeasureUnitCategory` `item.measureUnit.category` ON `item.measureUnit.category`.`id` = `item.measureUnit`.`categoryId`' +
|
|
455
|
-
' LIMIT 100');
|
|
456
|
-
}
|
|
457
|
-
shouldFind$group() {
|
|
458
|
-
expect(this.dialect.find(test_1.User, {
|
|
459
|
-
$group: ['companyId'],
|
|
460
|
-
})).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `name`, `email`, `password` FROM `User` GROUP BY `companyId`');
|
|
461
|
-
expect(this.dialect.find(test_1.User, {
|
|
462
|
-
$project: ['companyId', (0, util_1.raw)('COUNT(*)', 'count')],
|
|
463
|
-
$group: ['companyId'],
|
|
464
|
-
$having: {
|
|
465
|
-
count: {
|
|
466
|
-
$gte: 10,
|
|
467
|
-
},
|
|
468
|
-
},
|
|
469
|
-
})).toBe('SELECT `companyId`, COUNT(*) `count` FROM `User` GROUP BY `companyId` HAVING `count` >= 10');
|
|
470
|
-
expect(this.dialect.find(test_1.User, {
|
|
471
|
-
$project: ['id', 'name'],
|
|
472
|
-
$filter: { companyId: 1 },
|
|
473
|
-
$group: ['companyId'],
|
|
474
|
-
$skip: 50,
|
|
475
|
-
$limit: 100,
|
|
476
|
-
$sort: { name: 'desc' },
|
|
477
|
-
})).toBe('SELECT `id`, `name` FROM `User` WHERE `companyId` = 1 GROUP BY `companyId` ORDER BY `name` DESC LIMIT 100 OFFSET 50');
|
|
478
|
-
}
|
|
479
|
-
shouldFind$limit() {
|
|
480
|
-
expect(this.dialect.find(test_1.User, {
|
|
481
|
-
$project: ['id'],
|
|
482
|
-
$filter: 9,
|
|
483
|
-
$limit: 1,
|
|
484
|
-
})).toBe('SELECT `id` FROM `User` WHERE `id` = 9 LIMIT 1');
|
|
485
|
-
expect(this.dialect.find(test_1.User, {
|
|
486
|
-
$project: { id: 1, name: 1, creatorId: 1 },
|
|
487
|
-
$filter: 9,
|
|
488
|
-
$limit: 1,
|
|
489
|
-
})).toBe('SELECT `id`, `name`, `creatorId` FROM `User` WHERE `id` = 9 LIMIT 1');
|
|
490
|
-
expect(this.dialect.find(test_1.User, {
|
|
491
|
-
$project: ['id'],
|
|
492
|
-
$filter: { name: 'something', creatorId: 123 },
|
|
493
|
-
$limit: 1,
|
|
494
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` = 'something' AND `creatorId` = 123 LIMIT 1");
|
|
495
|
-
expect(this.dialect.find(test_1.User, {
|
|
496
|
-
$project: ['id', 'name', 'creatorId'],
|
|
497
|
-
$limit: 25,
|
|
498
|
-
})).toBe('SELECT `id`, `name`, `creatorId` FROM `User` LIMIT 25');
|
|
499
|
-
}
|
|
500
|
-
shouldFind$skip() {
|
|
501
|
-
expect(this.dialect.find(test_1.User, {
|
|
502
|
-
$project: { id: 1, name: 1, creatorId: 1 },
|
|
503
|
-
$skip: 30,
|
|
504
|
-
})).toBe('SELECT `id`, `name`, `creatorId` FROM `User` OFFSET 30');
|
|
505
|
-
}
|
|
506
|
-
shouldFind$project() {
|
|
507
|
-
expect(this.dialect.find(test_1.User, {
|
|
508
|
-
$project: { password: false },
|
|
509
|
-
})).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `name`, `email` FROM `User`');
|
|
510
|
-
expect(this.dialect.find(test_1.User, {
|
|
511
|
-
$project: { name: 0, password: 0 },
|
|
512
|
-
})).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `email` FROM `User`');
|
|
513
|
-
expect(this.dialect.find(test_1.User, {
|
|
514
|
-
$project: { id: 1, name: 1, password: 0 },
|
|
515
|
-
})).toBe('SELECT `id`, `name` FROM `User`');
|
|
516
|
-
expect(this.dialect.find(test_1.User, {
|
|
517
|
-
$project: { id: 1, name: 0, password: 0 },
|
|
518
|
-
})).toBe('SELECT `id` FROM `User`');
|
|
519
|
-
expect(this.dialect.find(test_1.User, {
|
|
520
|
-
$project: [(0, util_1.raw)('*'), (0, util_1.raw)('LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt', 'hotness')],
|
|
521
|
-
$filter: { name: 'something' },
|
|
522
|
-
})).toBe("SELECT *, LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt `hotness` FROM `User` WHERE `name` = 'something'");
|
|
523
|
-
}
|
|
524
|
-
shouldDelete() {
|
|
525
|
-
expect(this.dialect.delete(test_1.User, { $filter: 123 })).toBe('DELETE FROM `User` WHERE `id` = 123');
|
|
526
|
-
expect(() => this.dialect.delete(test_1.User, { $filter: 123 }, { softDelete: true })).toThrow("'User' has not enabled 'softDelete'");
|
|
527
|
-
expect(this.dialect.delete(test_1.User, { $filter: 123 }, { softDelete: false })).toBe('DELETE FROM `User` WHERE `id` = 123');
|
|
528
|
-
expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 })).toMatch(/^UPDATE `MeasureUnit` SET `deletedAt` = \d+ WHERE `id` = 123 AND `deletedAt` IS NULL$/);
|
|
529
|
-
expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 }, { softDelete: true })).toMatch(/^UPDATE `MeasureUnit` SET `deletedAt` = \d+ WHERE `id` = 123 AND `deletedAt` IS NULL$/);
|
|
530
|
-
expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 }, { softDelete: false })).toBe('DELETE FROM `MeasureUnit` WHERE `id` = 123');
|
|
531
|
-
}
|
|
532
|
-
shouldFind$projectRaw() {
|
|
533
|
-
expect(this.dialect.find(test_1.Item, {
|
|
534
|
-
$project: {
|
|
535
|
-
companyId: true,
|
|
536
|
-
total: (0, util_1.raw)(({ escapedPrefix, dialect }) => `SUM(${escapedPrefix}${dialect.escapeId('salePrice')})`),
|
|
537
|
-
},
|
|
538
|
-
$group: ['companyId'],
|
|
539
|
-
})).toBe('SELECT `companyId`, SUM(`salePrice`) `total` FROM `Item` GROUP BY `companyId`');
|
|
540
|
-
expect(this.dialect.find(test_1.ItemAdjustment, {
|
|
541
|
-
$project: {
|
|
542
|
-
item: {
|
|
543
|
-
$project: {
|
|
544
|
-
companyId: true,
|
|
545
|
-
total: (0, util_1.raw)(({ escapedPrefix, dialect }) => `SUM(${escapedPrefix}${dialect.escapeId('salePrice')})`),
|
|
546
|
-
},
|
|
547
|
-
$required: true,
|
|
548
|
-
},
|
|
549
|
-
},
|
|
550
|
-
$group: ['companyId'],
|
|
551
|
-
})).toBe('SELECT `ItemAdjustment`.`id`, `item`.`id` `item.id`, `item`.`companyId` `item.companyId`, SUM(`item`.`salePrice`) `item.total`' +
|
|
552
|
-
' FROM `ItemAdjustment` INNER JOIN `Item` `item` ON `item`.`id` = `ItemAdjustment`.`itemId` GROUP BY `companyId`');
|
|
553
|
-
expect(this.dialect.find(test_1.User, {
|
|
554
|
-
$project: ['companyId', (0, util_1.raw)('COUNT(*)', 'count')],
|
|
555
|
-
$group: ['companyId'],
|
|
556
|
-
$having: {
|
|
557
|
-
count: {
|
|
558
|
-
$gte: 10,
|
|
559
|
-
},
|
|
560
|
-
},
|
|
561
|
-
})).toBe('SELECT `companyId`, COUNT(*) `count` FROM `User` GROUP BY `companyId` HAVING `count` >= 10');
|
|
562
|
-
expect(this.dialect.find(test_1.User, {
|
|
563
|
-
$project: [(0, util_1.raw)(() => 'createdAt', 'hotness')],
|
|
564
|
-
$filter: { name: 'something' },
|
|
565
|
-
})).toBe("SELECT createdAt `hotness` FROM `User` WHERE `name` = 'something'");
|
|
566
|
-
expect(this.dialect.find(test_1.User, {
|
|
567
|
-
$project: [(0, util_1.raw)('*'), (0, util_1.raw)('LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt', 'hotness')],
|
|
568
|
-
$filter: { name: 'something' },
|
|
569
|
-
})).toBe("SELECT *, LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt `hotness` FROM `User` WHERE `name` = 'something'");
|
|
570
|
-
}
|
|
571
|
-
shouldFind$filterRaw() {
|
|
572
|
-
expect(this.dialect.find(test_1.Item, {
|
|
573
|
-
$project: ['id'],
|
|
574
|
-
$filter: { $and: [{ companyId: 1 }, (0, util_1.raw)('SUM(salePrice) > 500')] },
|
|
575
|
-
$group: ['creatorId'],
|
|
576
|
-
})).toBe('SELECT `id` FROM `Item` WHERE `companyId` = 1 AND SUM(salePrice) > 500 GROUP BY `creatorId`');
|
|
577
|
-
expect(this.dialect.find(test_1.Item, {
|
|
578
|
-
$project: ['id'],
|
|
579
|
-
$filter: { $or: [{ companyId: 1 }, 5, (0, util_1.raw)('SUM(salePrice) > 500')] },
|
|
580
|
-
})).toBe('SELECT `id` FROM `Item` WHERE `companyId` = 1 OR `id` = 5 OR SUM(salePrice) > 500');
|
|
581
|
-
expect(this.dialect.find(test_1.Item, {
|
|
582
|
-
$project: ['id'],
|
|
583
|
-
$filter: { $and: [(0, util_1.raw)('SUM(`salePrice`) > 500')] },
|
|
584
|
-
$group: ['companyId'],
|
|
585
|
-
})).toBe('SELECT `id` FROM `Item` WHERE SUM(`salePrice`) > 500 GROUP BY `companyId`');
|
|
586
|
-
expect(this.dialect.find(test_1.Item, {
|
|
587
|
-
$project: ['id'],
|
|
588
|
-
$filter: { $or: [1, (0, util_1.raw)('SUM(salePrice) > 500')] },
|
|
589
|
-
})).toBe('SELECT `id` FROM `Item` WHERE `id` = 1 OR SUM(salePrice) > 500');
|
|
590
|
-
expect(this.dialect.find(test_1.Item, {
|
|
591
|
-
$project: ['id'],
|
|
592
|
-
$filter: { $or: [(0, util_1.raw)('SUM(salePrice) > 500'), 1, { companyId: 1 }] },
|
|
593
|
-
})).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 OR `id` = 1 OR `companyId` = 1');
|
|
594
|
-
expect(this.dialect.find(test_1.Item, {
|
|
595
|
-
$project: ['id'],
|
|
596
|
-
$filter: { $and: [(0, util_1.raw)('SUM(salePrice) > 500')] },
|
|
597
|
-
$group: ['creatorId'],
|
|
598
|
-
})).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 GROUP BY `creatorId`');
|
|
599
|
-
expect(this.dialect.find(test_1.Item, {
|
|
600
|
-
$project: ['id'],
|
|
601
|
-
$filter: (0, util_1.raw)('SUM(salePrice) > 500'),
|
|
602
|
-
$group: ['creatorId'],
|
|
603
|
-
})).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 GROUP BY `creatorId`');
|
|
604
|
-
expect(this.dialect.find(test_1.Item, {
|
|
605
|
-
$project: ['id'],
|
|
606
|
-
$filter: { $or: [[1, 2], { code: 'abc' }] },
|
|
607
|
-
$group: ['creatorId'],
|
|
608
|
-
})).toBe("SELECT `id` FROM `Item` WHERE `id` IN (1, 2) OR `code` = 'abc' GROUP BY `creatorId`");
|
|
609
|
-
}
|
|
610
|
-
shouldFind$startsWith() {
|
|
611
|
-
expect(this.dialect.find(test_1.User, {
|
|
612
|
-
$project: ['id'],
|
|
613
|
-
$filter: { name: { $startsWith: 'Some' } },
|
|
614
|
-
$sort: [
|
|
615
|
-
{ field: 'name', sort: 'asc' },
|
|
616
|
-
{ field: 'createdAt', sort: 'desc' },
|
|
617
|
-
],
|
|
618
|
-
$skip: 0,
|
|
619
|
-
$limit: 50,
|
|
620
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` LIKE 'Some%' ORDER BY `name`, `createdAt` DESC LIMIT 50 OFFSET 0");
|
|
621
|
-
expect(this.dialect.find(test_1.User, {
|
|
622
|
-
$project: { id: true },
|
|
623
|
-
$filter: { name: { $startsWith: 'Some', $ne: 'Something' } },
|
|
624
|
-
$sort: { name: 1, id: -1 },
|
|
625
|
-
$skip: 0,
|
|
626
|
-
$limit: 50,
|
|
627
|
-
})).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE 'Some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
628
|
-
}
|
|
629
|
-
shouldFind$istartsWith() {
|
|
630
|
-
expect(this.dialect.find(test_1.User, {
|
|
631
|
-
$project: ['id'],
|
|
632
|
-
$filter: { name: { $istartsWith: 'Some' } },
|
|
633
|
-
$sort: { name: 1, id: -1 },
|
|
634
|
-
$skip: 0,
|
|
635
|
-
$limit: 50,
|
|
636
|
-
})).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE 'some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
637
|
-
expect(this.dialect.find(test_1.User, {
|
|
638
|
-
$project: { id: true },
|
|
639
|
-
$filter: { name: { $istartsWith: 'Some', $ne: 'Something' } },
|
|
640
|
-
$sort: { name: 1, id: -1 },
|
|
641
|
-
$skip: 0,
|
|
642
|
-
$limit: 50,
|
|
643
|
-
})).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE 'some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
644
|
-
}
|
|
645
|
-
shouldFind$endsWith() {
|
|
646
|
-
expect(this.dialect.find(test_1.User, {
|
|
647
|
-
$project: ['id'],
|
|
648
|
-
$filter: { name: { $endsWith: 'Some' } },
|
|
649
|
-
$sort: { name: 1, id: -1 },
|
|
650
|
-
$skip: 0,
|
|
651
|
-
$limit: 50,
|
|
652
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` LIKE '%Some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
653
|
-
expect(this.dialect.find(test_1.User, {
|
|
654
|
-
$project: ['id'],
|
|
655
|
-
$filter: { name: { $endsWith: 'Some', $ne: 'Something' } },
|
|
656
|
-
$sort: { name: 1, id: -1 },
|
|
657
|
-
$skip: 0,
|
|
658
|
-
$limit: 50,
|
|
659
|
-
})).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE '%Some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
660
|
-
}
|
|
661
|
-
shouldFind$iendsWith() {
|
|
662
|
-
expect(this.dialect.find(test_1.User, {
|
|
663
|
-
$project: ['id'],
|
|
664
|
-
$filter: { name: { $iendsWith: 'Some' } },
|
|
665
|
-
$sort: { name: 1, id: -1 },
|
|
666
|
-
$skip: 0,
|
|
667
|
-
$limit: 50,
|
|
668
|
-
})).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE '%some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
669
|
-
expect(this.dialect.find(test_1.User, {
|
|
670
|
-
$project: ['id'],
|
|
671
|
-
$filter: { name: { $iendsWith: 'Some', $ne: 'Something' } },
|
|
672
|
-
$sort: { name: 1, id: -1 },
|
|
673
|
-
$skip: 0,
|
|
674
|
-
$limit: 50,
|
|
675
|
-
})).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE '%some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
676
|
-
}
|
|
677
|
-
shouldFind$includes() {
|
|
678
|
-
expect(this.dialect.find(test_1.User, {
|
|
679
|
-
$project: ['id'],
|
|
680
|
-
$filter: { name: { $includes: 'Some' } },
|
|
681
|
-
$sort: { name: 1, id: -1 },
|
|
682
|
-
$skip: 0,
|
|
683
|
-
$limit: 50,
|
|
684
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` LIKE '%Some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
685
|
-
expect(this.dialect.find(test_1.User, {
|
|
686
|
-
$project: ['id'],
|
|
687
|
-
$filter: { name: { $includes: 'Some', $ne: 'Something' } },
|
|
688
|
-
$sort: { name: 1, id: -1 },
|
|
689
|
-
$skip: 0,
|
|
690
|
-
$limit: 50,
|
|
691
|
-
})).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE '%Some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
692
|
-
}
|
|
693
|
-
shouldFind$iincludes() {
|
|
694
|
-
expect(this.dialect.find(test_1.User, {
|
|
695
|
-
$project: ['id'],
|
|
696
|
-
$filter: { name: { $iincludes: 'Some' } },
|
|
697
|
-
$sort: { name: 1, id: -1 },
|
|
698
|
-
$skip: 0,
|
|
699
|
-
$limit: 50,
|
|
700
|
-
})).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE '%some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
701
|
-
expect(this.dialect.find(test_1.User, {
|
|
702
|
-
$project: ['id'],
|
|
703
|
-
$filter: { name: { $iincludes: 'Some', $ne: 'Something' } },
|
|
704
|
-
$sort: { name: 1, id: -1 },
|
|
705
|
-
$skip: 0,
|
|
706
|
-
$limit: 50,
|
|
707
|
-
})).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE '%some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
708
|
-
}
|
|
709
|
-
shouldFind$like() {
|
|
710
|
-
expect(this.dialect.find(test_1.User, {
|
|
711
|
-
$project: ['id'],
|
|
712
|
-
$filter: { name: { $like: 'Some' } },
|
|
713
|
-
$sort: { name: 1, id: -1 },
|
|
714
|
-
$skip: 0,
|
|
715
|
-
$limit: 50,
|
|
716
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` LIKE 'Some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
717
|
-
expect(this.dialect.find(test_1.User, {
|
|
718
|
-
$project: { id: true },
|
|
719
|
-
$filter: { name: { $like: 'Some', $ne: 'Something' } },
|
|
720
|
-
$sort: { name: 1, id: -1 },
|
|
721
|
-
$skip: 0,
|
|
722
|
-
$limit: 50,
|
|
723
|
-
})).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE 'Some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
724
|
-
}
|
|
725
|
-
shouldFind$ilike() {
|
|
726
|
-
expect(this.dialect.find(test_1.User, {
|
|
727
|
-
$project: ['id'],
|
|
728
|
-
$filter: { name: { $ilike: 'Some' } },
|
|
729
|
-
$sort: { name: 1, id: -1 },
|
|
730
|
-
$skip: 0,
|
|
731
|
-
$limit: 50,
|
|
732
|
-
})).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE 'some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
733
|
-
expect(this.dialect.find(test_1.User, {
|
|
734
|
-
$project: { id: true },
|
|
735
|
-
$filter: { name: { $ilike: 'Some', $ne: 'Something' } },
|
|
736
|
-
$sort: { name: 1, id: -1 },
|
|
737
|
-
$skip: 0,
|
|
738
|
-
$limit: 50,
|
|
739
|
-
})).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE 'some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
|
|
740
|
-
}
|
|
741
|
-
shouldFind$regex() {
|
|
742
|
-
expect(this.dialect.find(test_1.User, {
|
|
743
|
-
$project: ['id'],
|
|
744
|
-
$filter: { name: { $regex: '^some' } },
|
|
745
|
-
})).toBe("SELECT `id` FROM `User` WHERE `name` REGEXP '^some'");
|
|
746
|
-
}
|
|
747
|
-
shouldFind$text() {
|
|
748
|
-
expect(this.dialect.find(test_1.Item, {
|
|
749
|
-
$project: { id: true },
|
|
750
|
-
$filter: { $text: { $fields: ['name', 'description'], $value: 'some text' }, companyId: 1 },
|
|
751
|
-
$limit: 30,
|
|
752
|
-
})).toBe("SELECT `id` FROM `Item` WHERE `Item` MATCH {`name` `description`} : 'some text' AND `companyId` = 1 LIMIT 30");
|
|
753
|
-
expect(this.dialect.find(test_1.User, {
|
|
754
|
-
$project: { id: 1 },
|
|
755
|
-
$filter: {
|
|
756
|
-
$text: { $fields: ['name'], $value: 'something' },
|
|
757
|
-
name: { $ne: 'other unwanted' },
|
|
758
|
-
companyId: 1,
|
|
759
|
-
},
|
|
760
|
-
$limit: 10,
|
|
761
|
-
})).toBe("SELECT `id` FROM `User` WHERE `User` MATCH {`name`} : 'something' AND `name` <> 'other unwanted' AND `companyId` = 1 LIMIT 10");
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
exports.AbstractSqlDialectSpec = AbstractSqlDialectSpec;
|
|
765
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RTcWxEaWFsZWN0LXNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9hYnN0cmFjdFNxbERpYWxlY3Qtc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBd0k7QUFHeEkseUNBQXFDO0FBR3JDLE1BQXNCLHNCQUFzQjtJQUMxQyxZQUFxQixPQUEyQjtRQUEzQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtJQUFHLENBQUM7SUFFcEQsNEJBQTRCO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sQ0FDSixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFJLEVBQUU7WUFDeEI7Z0JBQ0UsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLEtBQUssRUFBRSx3QkFBd0I7Z0JBQy9CLFNBQVMsRUFBRSxHQUFHO2FBQ2Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsS0FBSyxFQUFFLHdCQUF3QjtnQkFDL0IsU0FBUyxFQUFFLEdBQUc7YUFDZjtZQUNEO2dCQUNFLElBQUksRUFBRSxhQUFhO2dCQUNuQixLQUFLLEVBQUUsd0JBQXdCO2dCQUMvQixTQUFTLEVBQUUsR0FBRzthQUNmO1NBQ0YsQ0FBQyxDQUNILENBQUMsSUFBSSxDQUNKLDBEQUEwRDtZQUN4RCxpREFBaUQ7WUFDakQsa0RBQWtEO1lBQ2xELGtEQUFrRCxDQUNyRCxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLENBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENB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dCB7IFNwZWMsIFVzZXIsIEl0ZW0sIEl0ZW1BZGp1c3RtZW50LCBUYXhDYXRlZ29yeSwgUHJvZmlsZSwgSW52ZW50b3J5QWRqdXN0bWVudCwgTWVhc3VyZVVuaXQsIENvbXBhbnksIFRheCB9IGZyb20gJ0B1cWwvY29yZS90ZXN0JztcblxuaW1wb3J0IHsgRmllbGRLZXksIFF1ZXJ5RmlsdGVyIH0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuaW1wb3J0IHsgcmF3IH0gZnJvbSAnQHVxbC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxEaWFsZWN0IH0gZnJvbSAnLi9hYnN0cmFjdFNxbERpYWxlY3QnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTcWxEaWFsZWN0U3BlYyBpbXBsZW1lbnRzIFNwZWMge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBkaWFsZWN0OiBBYnN0cmFjdFNxbERpYWxlY3QpIHt9XG5cbiAgc2hvdWxkQmVWYWxpZEVzY2FwZUNoYXJhY3RlcigpIHtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmVzY2FwZUlkQ2hhcikudG9CZSgnYCcpO1xuICB9XG5cbiAgc2hvdWxkQmVnaW5UcmFuc2FjdGlvbigpIHtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmJlZ2luVHJhbnNhY3Rpb25Db21tYW5kKS50b0JlKCdCRUdJTiBUUkFOU0FDVElPTicpO1xuICB9XG5cbiAgc2hvdWxkSW5zZXJ0TWFueSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFVzZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMScsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwxQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMicsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwyQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDQ1NixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMycsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwzQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDc4OSxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS50b0JlKFxuICAgICAgJ0lOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgZW1haWxgLCBgY3JlYXRlZEF0YCkgVkFMVUVTJyArXG4gICAgICAgIFwiICgnU29tZSBuYW1lIDEnLCAnc29tZWVtYWlsMUBleGFtcGxlLmNvbScsIDEyMylcIiArXG4gICAgICAgIFwiLCAoJ1NvbWUgbmFtZSAyJywgJ3NvbWVlbWFpbDJAZXhhbXBsZS5jb20nLCA0NTYpXCIgK1xuICAgICAgICBcIiwgKCdTb21lIG5hbWUgMycsICdzb21lZW1haWwzQGV4YW1wbGUuY29tJywgNzg5KVwiXG4gICAgKTtcbiAgfVxuXG4gIHNob3VsZEluc2VydE9uZSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFVzZXIsIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZScsXG4gICAgICAgIGVtYWlsOiAnc29tZWVtYWlsQGV4YW1wbGUuY29tJyxcbiAgICAgICAgY3JlYXRlZEF0OiAxMjMsXG4gICAgICB9KVxuICAgICkudG9CZShcIklOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgZW1haWxgLCBgY3JlYXRlZEF0YCkgVkFMVUVTICgnU29tZSBOYW1lJywgJ3NvbWVlbWFpbEBleGFtcGxlLmNvbScsIDEyMylcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KEludmVudG9yeUFkanVzdG1lbnQsIHtcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoMjAyMSwgMTEsIDMxLCAyMywgNTksIDU5LCA5OTkpLFxuICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiSU5TRVJUIElOVE8gYEludmVudG9yeUFkanVzdG1lbnRgIChgZGF0ZWAsIGBjcmVhdGVkQXRgKSBWQUxVRVMgKCcyMDIxLTEyLTMxIDIzOjU5OjU5Ljk5OScsIDEyMylcIik7XG4gIH1cblxuICBzaG91bGRJbnNlcnRXaXRoT25JbnNlcnRJZCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFRheENhdGVnb3J5LCB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgIH0pXG4gICAgKS50b01hdGNoKC9eSU5TRVJUIElOVE8gYFRheENhdGVnb3J5YCBcXChgbmFtZWAsIGBjcmVhdGVkQXRgLCBgcGtgXFwpIFZBTFVFUyBcXCgnU29tZSBOYW1lJywgMTIzLCAnLisnXFwpJC8pO1xuICB9XG5cbiAgc2hvdWxkSW5zZXJ0TWFueVdpdGhTcGVjaWZpZWRJZHNBbmRPbkluc2VydElkQXNEZWZhdWx0KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5pbnNlcnQoVGF4Q2F0ZWdvcnksIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwazogJzUwJyxcbiAgICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEInLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBDJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBrOiAnNzAnLFxuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUgRCcsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgICkudG9NYXRjaChcbiAgICAgIC9eSU5TRVJUIElOVE8gYFRheENhdGVnb3J5YCBcXChgbmFtZWAsIGBjcmVhdGVkQXRgLCBgcGtgXFwpIFZBTFVFUyBcXCgnU29tZSBOYW1lIEEnLCBcXGQrLCAnLisnXFwpLCBcXCgnU29tZSBOYW1lIEInLCBcXGQrLCAnNTAnXFwpLCBcXCgnU29tZSBOYW1lIEMnLCBcXGQrLCAnLisnXFwpLCBcXCgnU29tZSBOYW1lIEQnLCBcXGQrLCAnNzAnXFwpJC9cbiAgICApO1xuICB9XG5cbiAgc2hvdWxkVXBkYXRlKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC51cGRhdGUoXG4gICAgICAgIFVzZXIsXG4gICAgICAgIHsgJGZpbHRlcjogeyBuYW1lOiAnc29tZScsIGNyZWF0b3JJZDogMTIzIH0gfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIFRleHQnLFxuICAgICAgICAgIHVwZGF0ZWRBdDogMzIxLFxuICAgICAgICB9XG4gICAgICApXG4gICAgKS50b0JlKFwiVVBEQVRFIGBVc2VyYCBTRVQgYG5hbWVgID0gJ1NvbWUgVGV4dCcsIGB1cGRhdGVkQXRgID0gMzIxIFdIRVJFIGBuYW1lYCA9ICdzb21lJyBBTkQgYGNyZWF0b3JJZGAgPSAxMjNcIik7XG4gIH1cblxuICBzaG91bGRGaW5kKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBuYW1lOiAnYWJjJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzIEFORCBgbmFtZWAgPSAnYWJjJ1wiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFByb2ZpbGUsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnLCAncGljdHVyZScsICdjb21wYW55SWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBwaWN0dXJlOiAnYWJjJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYHBrYCBgaWRgLCBgaW1hZ2VgIGBwaWN0dXJlYCwgYGNvbXBhbnlJZGAgRlJPTSBgdXNlcl9wcm9maWxlYCBXSEVSRSBgcGtgID0gMTIzIEFORCBgaW1hZ2VgID0gJ2FiYydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChNZWFzdXJlVW5pdCwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGlkOiAxMjMsIG5hbWU6ICdhYmMnIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYE1lYXN1cmVVbml0YCBXSEVSRSBgaWRgID0gMTIzIEFORCBgbmFtZWAgPSAnYWJjJyBBTkQgYGRlbGV0ZWRBdGAgSVMgTlVMTFwiKTtcbiAgfVxuXG4gIHNob3VsZEJlU2VjdXJlKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnLCAnc29tZXRoaW5nJyBhcyBGaWVsZEtleTxVc2VyPl0sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICBzb21ldGhpbmc6IDEsXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICAkc29ydDoge1xuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIHNvbWV0aGluZzogMSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICRncm91cDogWydpZCcsICdzb21ldGhpbmcnIGFzIGFueV0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDEgQU5EIGBzb21ldGhpbmdgID0gMSBHUk9VUCBCWSBgaWRgLCBgc29tZXRoaW5nYCBPUkRFUiBCWSBgaWRgLCBgc29tZXRoaW5nYCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0Lmluc2VydChVc2VyLCB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICBzb21ldGhpbmc6ICdhbnl0aGluZycsXG4gICAgICAgIGNyZWF0ZWRBdDogMSxcbiAgICAgIH0gYXMgYW55KVxuICAgICkudG9CZShcIklOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgY3JlYXRlZEF0YCkgVkFMVUVTICgnU29tZSBOYW1lJywgMSlcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QudXBkYXRlKFxuICAgICAgICBVc2VyLFxuICAgICAgICB7XG4gICAgICAgICAgJGZpbHRlcjogeyBzb21ldGhpbmc6ICdhbnl0aGluZycgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICAgIHNvbWV0aGluZzogJ2FueXRoaW5nJyxcbiAgICAgICAgICB1cGRhdGVkQXQ6IDEsXG4gICAgICAgIH0gYXMgYW55XG4gICAgICApXG4gICAgKS50b0JlKFwiVVBEQVRFIGBVc2VyYCBTRVQgYG5hbWVgID0gJ1NvbWUgTmFtZScsIGB1cGRhdGVkQXRgID0gMSBXSEVSRSBgc29tZXRoaW5nYCA9ICdhbnl0aGluZydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZGVsZXRlKFVzZXIsIHtcbiAgICAgICAgJGZpbHRlcjogeyBzb21ldGhpbmc6ICdhbnl0aGluZycgfSBhcyBhbnksXG4gICAgICB9KVxuICAgICkudG9CZShcIkRFTEVURSBGUk9NIGBVc2VyYCBXSEVSRSBgc29tZXRoaW5nYCA9ICdhbnl0aGluZydcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGFuZCgpIHtcbiAgICBjb25zdCBzcWwgPSBcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBuYW1lYCA9ICdhYmMnXCI7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3sgaWQ6IDEyMywgbmFtZTogJ2FiYycgfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHNxbCk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiAxIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3sgaWQ6IDEyMyB9XSwgbmFtZTogJ2FiYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHNxbCk7XG4gIH1cblxuICBzaG91bGRGaW5kJG9yKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IGlkOiAxMjMgfSwgeyBuYW1lOiAnYWJjJyB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzIE9SIGBuYW1lYCA9ICdhYmMnXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRvcjogW3sgaWQ6IDEyMyB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEgfSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IGlkOiAxMjMsIG5hbWU6ICdhYmMnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBuYW1lYCA9ICdhYmMnXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRvcjogW3sgaWQ6IDEyMyB9XSwgbmFtZTogJ2FiYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDEyMyBBTkQgYG5hbWVgID0gJ2FiYydcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJG5vdCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vdDogW3sgbmFtZTogJ1NvbWUnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCBgbmFtZWAgPSAnU29tZSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChDb21wYW55LCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgaWQ6IHsgJG5vdDogMTIzIH0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBDb21wYW55YCBXSEVSRSBOT1QgYGlkYCA9IDEyMycpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoQ29tcGFueSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGlkOiB7ICRub3Q6IFsxMjMsIDQ1Nl0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYENvbXBhbnlgIFdIRVJFIE5PVCBgaWRgIElOICgxMjMsIDQ1NiknKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKENvbXBhbnksIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBuYW1lOiB7ICRub3Q6IHsgJHN0YXJ0c1dpdGg6ICdhJyB9IH0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgQ29tcGFueWAgV0hFUkUgYGlkYCA9IDEyMyBBTkQgTk9UIGBuYW1lYCBMSUtFICdhJSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChDb21wYW55LCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkbm90OiB7ICRzdGFydHNXaXRoOiAnYScsICRlbmRzV2l0aDogJ3onIH0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBDb21wYW55YCBXSEVSRSBOT1QgKGBuYW1lYCBMSUtFICdhJScgQU5EIGBuYW1lYCBMSUtFICcleicpXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7ICRub3Q6IFt7IG5hbWU6IHsgJGxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCAoYG5hbWVgIExJS0UgJ1NvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7ICRub3Q6IFt7IG5hbWU6ICdhYmMnIH0sIHsgY3JlYXRvcklkOiAxIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCAoYG5hbWVgID0gJ2FiYycgQU5EIGBjcmVhdG9ySWRgID0gMSlcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChUYXgsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjb21wYW55SWQ6IDEsIG5hbWU6IHsgJG5vdDogeyAkc3RhcnRzV2l0aDogJ2EnIH0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBUYXhgIFdIRVJFIGBjb21wYW55SWRgID0gMSBBTkQgTk9UIGBuYW1lYCBMSUtFICdhJSdcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJG5vcigpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogJ1NvbWUnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCBgbmFtZWAgPSAnU29tZSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogeyAkbGlrZTogJ1NvbWUnLCAkbmU6ICdTb21ldGhpbmcnIH0gfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgTk9UIChgbmFtZWAgTElLRSAnU29tZScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJylcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogJ2FiYycgfSwgeyBjcmVhdG9ySWQ6IDEgfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgTk9UIChgbmFtZWAgPSAnYWJjJyBPUiBgY3JlYXRvcklkYCA9IDEpXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRvckFuZCRhbmQoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGNyZWF0b3JJZDogMSwgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sIGlkOiAxIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMSBBTkQgKGBuYW1lYCBJTiAoJ2EnLCAnYicsICdjJykgT1IgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKSBBTkQgYGlkYCA9IDFcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBjcmVhdG9ySWQ6IDEsXG4gICAgICAgICAgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMScgK1xuICAgICAgICBcIiBBTkQgKGBuYW1lYCBJTiAoJ2EnLCAnYicsICdjJykgT1IgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKSBBTkQgYGlkYCA9IDEgQU5EIGBlbWFpbGAgPSAnZSdcIlxuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBjcmVhdG9ySWQ6IDEsXG4gICAgICAgICAgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgY3JlYXRlZEF0OiAtMSB9LFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgY3JlYXRvcklkYCA9IDEnICtcbiAgICAgICAgXCIgQU5EIChgbmFtZWAgSU4gKCdhJywgJ2InLCAnYycpIE9SIGBlbWFpbGAgPSAnYWJjQGV4YW1wbGUuY29tJylcIiArXG4gICAgICAgIFwiIEFORCBgaWRgID0gMSBBTkQgYGVtYWlsYCA9ICdlJ1wiICtcbiAgICAgICAgJyBPUkRFUiBCWSBgbmFtZWAsIGBjcmVhdGVkQXRgIERFU0MgTElNSVQgMTAgT0ZGU0VUIDUwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY3JlYXRvcklkOiAxLFxuICAgICAgICAgICAgICBpZDogMSxcbiAgICAgICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFsnYScsICdiJywgJ2MnXSwgZW1haWw6ICdhYmNAZXhhbXBsZS5jb20nIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgJHNvcnQ6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnbmFtZScsIHNvcnQ6ICdhc2MnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIHNvcnQ6ICdkZXNjJyB9LFxuICAgICAgICBdLFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgIFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBjcmVhdG9ySWRgID0gMSBBTkQgYGlkYCA9IDEgQU5EIGBlbWFpbGAgPSAnZScpXCIgK1xuICAgICAgICBcIiBPUiAoYG5hbWVgIElOICgnYScsICdiJywgJ2MnKSBBTkQgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKVwiICtcbiAgICAgICAgJyBPUkRFUiBCWSBgbmFtZWAsIGBjcmVhdGVkQXRgIERFU0MgTElNSVQgMTAgT0ZGU0VUIDUwJ1xuICAgICk7XG4gIH1cblxuICBzaG91bGRGaW5kU2luZ2xlJGZpbHRlcigpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnIH0sXG4gICAgICAgICRsaW1pdDogMyxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIExJTUlUIDNcIik7XG4gIH1cblxuICBzaG91bGRGaW5kTXVsdGlwbGVDb21wYXJpc29uT3BlcmF0b3JzKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IG5hbWU6IHsgJGVxOiAnb3RoZXInLCAkbmU6ICdvdGhlciB1bndhbnRlZCcgfSB9LCB7IGNvbXBhbnlJZDogMSB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoYG5hbWVgID0gJ290aGVyJyBBTkQgYG5hbWVgIDw+ICdvdGhlciB1bndhbnRlZCcpIE9SIGBjb21wYW55SWRgID0gMVwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjcmVhdGVkQXQ6IHsgJGd0ZTogMTIzLCAkbHRlOiA5OTkgfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChgY3JlYXRlZEF0YCA+PSAxMjMgQU5EIGBjcmVhdGVkQXRgIDw9IDk5OSkgTElNSVQgMTAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjcmVhdGVkQXQ6IHsgJGd0OiAxMjMsICRsdDogOTk5IH0gfSxcbiAgICAgICAgJGxpbWl0OiAxMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoYGNyZWF0ZWRBdGAgPiAxMjMgQU5EIGBjcmVhdGVkQXRgIDwgOTk5KSBMSU1JVCAxMCcpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRuZSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IHsgJG5lOiA1IH0gfSxcbiAgICAgICAgJGxpbWl0OiAyMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIEFORCBgY29tcGFueUlkYCA8PiA1IExJTUlUIDIwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZElzTnVsbCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgY3JlYXRvcklkOiAxMjMsIGNvbXBhbnlJZDogbnVsbCB9LFxuICAgICAgICAkbGltaXQ6IDUsXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGNyZWF0b3JJZGAgPSAxMjMgQU5EIGBjb21wYW55SWRgIElTIE5VTEwgTElNSVQgNScpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IGNyZWF0b3JJZDogMTIzLCBjb21wYW55SWQ6IHsgJG5lOiBudWxsIH0gfSxcbiAgICAgICAgJGxpbWl0OiA1LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMTIzIEFORCBgY29tcGFueUlkYCBJUyBOT1QgTlVMTCBMSU1JVCA1Jyk7XG4gIH1cblxuICBzaG91bGRGaW5kJGluKCkge1xuICAgIGNvbnN0IHNxbCA9IFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIEFORCBgY29tcGFueUlkYCBJTiAoMSwgMiwgMykgTElNSVQgMTBcIjtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IFsxLCAyLCAzXSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoc3FsKTtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IHsgJGluOiBbMSwgMiwgM10gfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoc3FsKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkbmluKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiAnc29tZScsIGNvbXBhbnlJZDogeyAkbmluOiBbMSwgMiwgM10gfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgbmFtZWAgPSAnc29tZScgQU5EIGBjb21wYW55SWRgIE5PVCBJTiAoMSwgMiwgMykgTElNSVQgMTBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHByb2plY3RGaWVsZHMoKSB7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHsgJHByb2plY3Q6IHsgaWQ6IHRydWUsIGNvbXBhbnk6IHRydWUgfSB9KSkudG9CZShcbiAgICAgICdTRUxFQ1QgYFVzZXJgLmBpZGAsIGBjb21wYW55YC5gaWRgIGBjb21wYW55LmlkYCwgYGNvbXBhbnlgLmBjb21wYW55SWRgIGBjb21wYW55LmNvbXBhbnlJZGAsIGBjb21wYW55YC5gY3JlYXRvcklkYCBgY29tcGFueS5jcmVhdG9ySWRgJyArXG4gICAgICAgICcsIGBjb21wYW55YC5gY3JlYXRlZEF0YCBgY29tcGFueS5jcmVhdGVkQXRgLCBgY29tcGFueWAuYHVwZGF0ZWRBdGAgYGNvbXBhbnkudXBkYXRlZEF0YCcgK1xuICAgICAgICAnLCBgY29tcGFueWAuYG5hbWVgIGBjb21wYW55Lm5hbWVgLCBgY29tcGFueWAuYGRlc2NyaXB0aW9uYCBgY29tcGFueS5kZXNjcmlwdGlvbmAnICtcbiAgICAgICAgJyBGUk9NIGBVc2VyYCBMRUZUIEpPSU4gYENvbXBhbnlgIGBjb21wYW55YCBPTiBgY29tcGFueWAuYGlkYCA9IGBVc2VyYC5gY29tcGFueUlkYCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0T25lVG9PbmUoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgcHJvZmlsZTogWydpZCcsICdwaWN0dXJlJ10gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgVXNlcmAuYGlkYCwgYFVzZXJgLmBuYW1lYCwgYHByb2ZpbGVgLmBwa2AgYHByb2ZpbGUuaWRgLCBgcHJvZmlsZWAuYGltYWdlYCBgcHJvZmlsZS5waWN0dXJlYCBGUk9NIGBVc2VyYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgdXNlcl9wcm9maWxlYCBgcHJvZmlsZWAgT04gYHByb2ZpbGVgLmBjcmVhdG9ySWRgID0gYFVzZXJgLmBpZGAnXG4gICAgKTtcblxuICAgIGV4cGVjdCh0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7ICRwcm9qZWN0OiB7IHByb2ZpbGU6IHRydWUgfSB9KSkudG9CZShcbiAgICAgICdTRUxFQ1QgYFVzZXJgLmBpZGAsIGBwcm9maWxlYC5gY29tcGFueUlkYCBgcHJvZmlsZS5jb21wYW55SWRgJyArXG4gICAgICAgICcsIGBwcm9maWxlYC5gY3JlYXRvcklkYCBgcHJvZmlsZS5jcmVhdG9ySWRgLCBgcHJvZmlsZWAuYGNyZWF0ZWRBdGAgYHByb2ZpbGUuY3JlYXRlZEF0YCcgK1xuICAgICAgICAnLCBgcHJvZmlsZWAuYHVwZGF0ZWRBdGAgYHByb2ZpbGUudXBkYXRlZEF0YCcgK1xuICAgICAgICAnLCBgcHJvZmlsZWAuYHBrYCBgcHJvZmlsZS5pZGAsIGBwcm9maWxlYC5gaW1hZ2VgIGBwcm9maWxlLnBpY3R1cmVgJyArXG4gICAgICAgICcgRlJPTSBgVXNlcmAgTEVGVCBKT0lOIGB1c2VyX3Byb2ZpbGVgIGBwcm9maWxlYCBPTiBgcHJvZmlsZWAuYGNyZWF0b3JJZGAgPSBgVXNlcmAuYGlkYCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0TWFueVRvT25lKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgICAgdGF4OiB7ICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSwgJHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHsgJHByb2plY3Q6IFsnaWQnLCAnbmFtZScsICdjYXRlZ29yeUlkJ10gfSxcbiAgICAgICAgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAsIGBJdGVtYC5gY29kZWAnICtcbiAgICAgICAgJywgYHRheGAuYGlkYCBgdGF4LmlkYCwgYHRheGAuYG5hbWVgIGB0YXgubmFtZWAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0YC5gaWRgIGBtZWFzdXJlVW5pdC5pZGAsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCwgYG1lYXN1cmVVbml0YC5gY2F0ZWdvcnlJZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAnICtcbiAgICAgICAgJyBJTk5FUiBKT0lOIGBUYXhgIGB0YXhgIE9OIGB0YXhgLmBpZGAgPSBgSXRlbWAuYHRheElkYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgTWVhc3VyZVVuaXRgIGBtZWFzdXJlVW5pdGAgT04gYG1lYXN1cmVVbml0YC5gaWRgID0gYEl0ZW1gLmBtZWFzdXJlVW5pdElkYCcgK1xuICAgICAgICAnIExJTUlUIDEwMCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0V2l0aEFsbEZpZWxkc0FuZFNwZWNpZmljRmllbGRzQW5kRmlsdGVyKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lYXN1cmVVbml0OiB7ICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSwgJGZpbHRlcjogeyBuYW1lOiB7ICRuZTogJ3VuaWRhZCcgfSB9LCAkcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB0YXg6IFsnaWQnLCAnbmFtZSddLFxuICAgICAgICB9LFxuICAgICAgICAkZmlsdGVyOiB7IHNhbGVQcmljZTogeyAkZ3RlOiAxMDAwIH0sIG5hbWU6IHsgJGlzdGFydHNXaXRoOiAnQScgfSB9LFxuICAgICAgICAkc29ydDogeyB0YXg6IHsgbmFtZTogMSB9LCBtZWFzdXJlVW5pdDogeyBuYW1lOiAxIH0sIGNyZWF0ZWRBdDogLTEgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0YC5gaWRgIGBtZWFzdXJlVW5pdC5pZGAsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCcgK1xuICAgICAgICAnLCBgdGF4YC5gaWRgIGB0YXguaWRgLCBgdGF4YC5gbmFtZWAgYHRheC5uYW1lYCcgK1xuICAgICAgICAnIEZST00gYEl0ZW1gJyArXG4gICAgICAgIFwiIElOTkVSIEpPSU4gYE1lYXN1cmVVbml0YCBgbWVhc3VyZVVuaXRgIE9OIGBtZWFzdXJlVW5pdGAuYGlkYCA9IGBJdGVtYC5gbWVhc3VyZVVuaXRJZGAgQU5EIGBtZWFzdXJlVW5pdGAuYG5hbWVgIDw+ICd1bmlkYWQnIEFORCBgbWVhc3VyZVVuaXRgLmBkZWxldGVkQXRgIElTIE5VTExcIiArXG4gICAgICAgICcgTEVGVCBKT0lOIGBUYXhgIGB0YXhgIE9OIGB0YXhgLmBpZGAgPSBgSXRlbWAuYHRheElkYCcgK1xuICAgICAgICBcIiBXSEVSRSBgSXRlbWAuYHNhbGVQcmljZWAgPj0gMTAwMCBBTkQgTE9XRVIoYEl0ZW1gLmBuYW1lYCkgTElLRSAnYSUnXCIgK1xuICAgICAgICAnIE9SREVSIEJZIGB0YXhgLmBuYW1lYCwgYG1lYXN1cmVVbml0YC5gbmFtZWAsIGBJdGVtYC5gY3JlYXRlZEF0YCBERVNDIExJTUlUIDEwMCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkVmlydHVhbEZpZWxkKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgJGZpbHRlcjoge1xuICAgICAgICAgIHRhZ3NDb3VudDogeyAkZ3RlOiAxMCB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIChTRUxFQ1QgQ09VTlQoKikgYGNvdW50YCBGUk9NIGBJdGVtVGFnYCBXSEVSRSBgSXRlbVRhZ2AuYGl0ZW1JZGAgPSBgaWRgKSA+PSAxMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIG5hbWU6IDEsXG4gICAgICAgICAgY29kZTogMSxcbiAgICAgICAgICB0YWdzQ291bnQ6IDEsXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBjYXRlZ29yeUlkOiAxLCBjYXRlZ29yeTogWyduYW1lJ10gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAkbGltaXQ6IDEwMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbWAuYGlkYCwgYEl0ZW1gLmBuYW1lYCwgYEl0ZW1gLmBjb2RlYCcgK1xuICAgICAgICAnLCAoU0VMRUNUIENPVU5UKCopIGBjb3VudGAgRlJPTSBgSXRlbVRhZ2AgV0hFUkUgYEl0ZW1UYWdgLmBpdGVtSWRgID0gYEl0ZW1gLmBpZGApIGB0YWdzQ291bnRgJyArXG4gICAgICAgICcsIGBtZWFzdXJlVW5pdGAuYGlkYCBgbWVhc3VyZVVuaXQuaWRgLCBgbWVhc3VyZVVuaXRgLmBuYW1lYCBgbWVhc3VyZVVuaXQubmFtZWAsIGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeUlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5LmlkYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG4gIH1cblxuICBzaG91bGRGaW5kJHByb2plY3REZWVwKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICBuYW1lOiAxLFxuICAgICAgICAgIGNvZGU6IDEsXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBjYXRlZ29yeUlkOiAxLCBjYXRlZ29yeTogWyduYW1lJ10gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAkbGltaXQ6IDEwMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbWAuYGlkYCwgYEl0ZW1gLmBuYW1lYCwgYEl0ZW1gLmBjb2RlYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXRgLmBpZGAgYG1lYXN1cmVVbml0LmlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXRgLmBuYW1lYCBgbWVhc3VyZVVuaXQubmFtZWAsIGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeUlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5LmlkYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiB7XG4gICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgICAgbmFtZTogdHJ1ZSxcbiAgICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICAgIG1lYXN1cmVVbml0OiB7XG4gICAgICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgY2F0ZWdvcnk6IHsgJHByb2plY3Q6IHsgaWQ6IHRydWUsIG5hbWU6IHRydWUgfSB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAsIGBJdGVtYC5gY29kZWAsIGBtZWFzdXJlVW5pdGAuYGlkYCBgbWVhc3VyZVVuaXQuaWRgJyArXG4gICAgICAgICcsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gaWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeS5pZGAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtQWRqdXN0bWVudCwge1xuICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgIGJ1eVByaWNlOiB0cnVlLFxuICAgICAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgY2F0ZWdvcnk6IFsnaWQnLCAnbmFtZSddIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICRsaW1pdDogMTAwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXG4gICAgICAnU0VMRUNUIGBJdGVtQWRqdXN0bWVudGAuYGlkYCwgYEl0ZW1BZGp1c3RtZW50YC5gYnV5UHJpY2VgLCBgSXRlbUFkanVzdG1lbnRgLmBudW1iZXJgJyArXG4gICAgICAgICcsIGBpdGVtYC5gaWRgIGBpdGVtLmlkYCwgYGl0ZW1gLmBuYW1lYCBgaXRlbS5uYW1lYCcgK1xuICAgICAgICAnLCBgaXRlbS5tZWFzdXJlVW5pdGAuYGlkYCBgaXRlbS5tZWFzdXJlVW5pdC5pZGAsIGBpdGVtLm1lYXN1cmVVbml0YC5gbmFtZWAgYGl0ZW0ubWVhc3VyZVVuaXQubmFtZWAnICtcbiAgICAgICAgJywgYGl0ZW0ubWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYGl0ZW0ubWVhc3VyZVVuaXQuY2F0ZWdvcnkuaWRgLCBgaXRlbS5tZWFzdXJlVW5pdC5jYXRlZ29yeWAuYG5hbWVgIGBpdGVtLm1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbUFkanVzdG1lbnRgJyArXG4gICAgICAgICcgSU5ORVIgSk9JTiBgSXRlbWAgYGl0ZW1gIE9OIGBpdGVtYC5gaWRgID0gYEl0ZW1BZGp1c3RtZW50YC5gaXRlbUlkYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgTWVhc3VyZVVuaXRgIGBpdGVtLm1lYXN1cmVVbml0YCBPTiBgaXRlbS5tZWFzdXJlVW5pdGAuYGlkYCA9IGBpdGVtYC5gbWVhc3VyZVVuaXRJZGAnICtcbiAgICAgICAgJyBMRUZUIEpPSU4gYE1lYXN1cmVVbml0Q2F0ZWdvcnlgIGBpdGVtLm1lYXN1cmVVbml0LmNhdGVnb3J5YCBPTiBgaXRlbS5tZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBpdGVtLm1lYXN1cmVVbml0YC5gY2F0ZWdvcnlJZGAnICtcbiAgICAgICAgJyBMSU1JVCAxMDAnXG4gICAgKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkZ3JvdXAoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkZ3JvdXA6IFsnY29tcGFueUlkJ10sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBjb21wYW55SWRgLCBgY3JlYXRvcklkYCwgYGNyZWF0ZWRBdGAsIGB1cGRhdGVkQXRgLCBgbmFtZWAsIGBlbWFpbGAsIGBwYXNzd29yZGAgRlJPTSBgVXNlcmAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnY29tcGFueUlkJywgcmF3KCdDT1VOVCgqKScsICdjb3VudCcpXSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgICAkaGF2aW5nOiB7XG4gICAgICAgICAgY291bnQ6IHtcbiAgICAgICAgICAgICRndGU6IDEwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgUXVlcnlGaWx0ZXI8VXNlcj4sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBjb21wYW55SWRgLCBDT1VOVCgqKSBgY291bnRgIEZST00gYFVzZXJgIEdST1VQIEJZIGBjb21wYW55SWRgIEhBVklORyBgY291bnRgID49IDEwJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjb21wYW55SWQ6IDEgfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAwLFxuICAgICAgICAkc29ydDogeyBuYW1lOiAnZGVzYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCwgYG5hbWVgIEZST00gYFVzZXJgIFdIRVJFIGBjb21wYW55SWRgID0gMSBHUk9VUCBCWSBgY29tcGFueUlkYCBPUkRFUiBCWSBgbmFtZWAgREVTQyBMSU1JVCAxMDAgT0ZGU0VUIDUwJyk7XG4gIH1cblxuICBzaG91bGRGaW5kJGxpbWl0KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogOSxcbiAgICAgICAgJGxpbWl0OiAxLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSA5IExJTUlUIDEnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEsIG5hbWU6IDEsIGNyZWF0b3JJZDogMSB9LFxuICAgICAgICAkZmlsdGVyOiA5LFxuICAgICAgICAkbGltaXQ6IDEsXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBuYW1lYCwgYGNyZWF0b3JJZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDkgTElNSVQgMScpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6ICdzb21ldGhpbmcnLCBjcmVhdG9ySWQ6IDEyMyB9LFxuICAgICAgICAkbGltaXQ6IDEsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCA9ICdzb21ldGhpbmcnIEFORCBgY3JlYXRvcklkYCA9IDEyMyBMSU1JVCAxXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCcsICduYW1lJywgJ2NyZWF0b3JJZCddLFxuICAgICAgICAkbGltaXQ6IDI1LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgbmFtZWAsIGBjcmVhdG9ySWRgIEZST00gYFVzZXJgIExJTUlUIDI1Jyk7XG4gIH1cblxuICBzaG91bGRGaW5kJHNraXAoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogMSwgbmFtZTogMSwgY3JlYXRvcklkOiAxIH0sXG4gICAgICAgICRza2lwOiAzMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCwgYG5hbWVgLCBgY3JlYXRvcklkYCBGUk9NIGBVc2VyYCBPRkZTRVQgMzAnKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkcHJvamVjdCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IHBhc3N3b3JkOiBmYWxzZSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgY29tcGFueUlkYCwgYGNyZWF0b3JJZGAsIGBjcmVhdGVkQXRgLCBgdXBkYXRlZEF0YCwgYG5hbWVgLCBgZW1haWxgIEZST00gYFVzZXJgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IG5hbWU6IDAsIHBhc3N3b3JkOiAwIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBjb21wYW55SWRgLCBgY3JlYXRvcklkYCwgYGNyZWF0ZWRBdGAsIGB1cGRhdGVkQXRgLCBgZW1haWxgIEZST00gYFVzZXJgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBwYXNzd29yZDogMCB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgbmFtZWAgRlJPTSBgVXNlcmAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEsIG5hbWU6IDAsIHBhc3N3b3JkOiAwIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFtyYXcoJyonKSwgcmF3KCdMT0cxMChudW1iZXJPZlZvdGVzICsgMSkgKiAyODcwMTQuNTg3Mzk4MjY4MSArIGNyZWF0ZWRBdCcsICdob3RuZXNzJyldLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6ICdzb21ldGhpbmcnIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCAqLCBMT0cxMChudW1iZXJPZlZvdGVzICsgMSkgKiAyODcwMTQuNTg3Mzk4MjY4MSArIGNyZWF0ZWRBdCBgaG90bmVzc2AgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWV0aGluZydcIik7XG4gIH1cblxuICBzaG91bGREZWxldGUoKSB7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSkpLnRvQmUoJ0RFTEVURSBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzJyk7XG4gICAgZXhwZWN0KCgpID0+IHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiB0cnVlIH0pKS50b1Rocm93KFwiJ1VzZXInIGhhcyBub3QgZW5hYmxlZCAnc29mdERlbGV0ZSdcIik7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiBmYWxzZSB9KSkudG9CZSgnREVMRVRFIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMnKTtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmRlbGV0ZShNZWFzdXJlVW5pdCwgeyAkZmlsdGVyOiAxMjMgfSkpLnRvTWF0Y2goXG4gICAgICAvXlVQREFURSBgTWVhc3VyZVVuaXRgIFNFVCBgZGVsZXRlZEF0YCA9IFxcZCsgV0hFUkUgYGlkYCA9IDEyMyBBTkQgYGRlbGV0ZWRBdGAgSVMgTlVMTCQvXG4gICAgKTtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmRlbGV0ZShNZWFzdXJlVW5pdCwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiB0cnVlIH0pKS50b01hdGNoKFxuICAgICAgL15VUERBVEUgYE1lYXN1cmVVbml0YCBTRVQgYGRlbGV0ZWRBdGAgPSBcXGQrIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBkZWxldGVkQXRgIElTIE5VTEwkL1xuICAgICk7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoTWVhc3VyZVVuaXQsIHsgJGZpbHRlcjogMTIzIH0sIHsgc29mdERlbGV0ZTogZmFsc2UgfSkpLnRvQmUoJ0RFTEVURSBGUk9NIGBNZWFzdXJlVW5pdGAgV0hFUkUgYGlkYCA9IDEyMycpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0UmF3KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBjb21wYW55SWQ6IHRydWUsXG4gICAgICAgICAgdG90YWw6IHJhdygoeyBlc2NhcGVkUHJlZml4LCBkaWFsZWN0IH0pID0+IGBTVU0oJHtlc2NhcGVkUHJlZml4fSR7ZGlhbGVjdC5lc2NhcGVJZCgnc2FsZVByaWNlJyl9KWApLFxuICAgICAgICB9LFxuICAgICAgICAkZ3JvdXA6IFsnY29tcGFueUlkJ10sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBjb21wYW55SWRgLCBTVU0oYHNhbGVQcmljZWApIGB0b3RhbGAgRlJPTSBgSXRlbWAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW1BZGp1c3RtZW50LCB7XG4gICAgICAgICRwcm9qZWN0OiB7XG4gICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICAgICAgY29tcGFueUlkOiB0cnVlLFxuICAgICAgICAgICAgICB0b3RhbDogcmF3KCh7IGVzY2FwZWRQcmVmaXgsIGRpYWxlY3QgfSkgPT4gYFNVTSgke2VzY2FwZWRQcmVmaXh9JHtkaWFsZWN0LmVzY2FwZUlkKCdzYWxlUHJpY2UnKX0pYCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICRncm91cDogWydjb21wYW55SWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbUFkanVzdG1lbnRgLmBpZGAsIGBpdGVtYC5gaWRgIGBpdGVtLmlkYCwgYGl0ZW1gLmBjb21wYW55SWRgIGBpdGVtLmNvbXBhbnlJZGAsIFNVTShgaXRlbWAuYHNhbGVQcmljZWApIGBpdGVtLnRvdGFsYCcgK1xuICAgICAgICAnIEZST00gYEl0ZW1BZGp1c3RtZW50YCBJTk5FUiBKT0lOIGBJdGVtYCBgaXRlbWAgT04gYGl0ZW1gLmBpZGAgPSBgSXRlbUFkanVzdG1lbnRgLmBpdGVtSWRgIEdST1VQIEJZIGBjb21wYW55SWRgJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2NvbXBhbnlJZCcsIHJhdygnQ09VTlQoKiknLCAnY291bnQnKV0sXG4gICAgICAgICRncm91cDogWydjb21wYW55SWQnXSxcbiAgICAgICAgJGhhdmluZzoge1xuICAgICAgICAgIGNvdW50OiB7XG4gICAgICAgICAgICAkZ3RlOiAxMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIFF1ZXJ5RmlsdGVyPFVzZXI+LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgY29tcGFueUlkYCwgQ09VTlQoKikgYGNvdW50YCBGUk9NIGBVc2VyYCBHUk9VUCBCWSBgY29tcGFueUlkYCBIQVZJTkcgYGNvdW50YCA+PSAxMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogW3JhdygoKSA9PiAnY3JlYXRlZEF0JywgJ2hvdG5lc3MnKV0sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWV0aGluZycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGNyZWF0ZWRBdCBgaG90bmVzc2AgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWV0aGluZydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbcmF3KCcqJyksIHJhdygnTE9HMTAobnVtYmVyT2ZWb3RlcyArIDEpICogMjg3MDE0LjU4NzM5ODI2ODEgKyBjcmVhdGVkQXQnLCAnaG90bmVzcycpXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiAnc29tZXRoaW5nJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgKiwgTE9HMTAobnVtYmVyT2ZWb3RlcyArIDEpICogMjg3MDE0LjU4NzM5ODI2ODEgKyBjcmVhdGVkQXQgYGhvdG5lc3NgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCA9ICdzb21ldGhpbmcnXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRmaWx0ZXJSYXcoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRhbmQ6IFt7IGNvbXBhbnlJZDogMSB9LCByYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyldIH0sXG4gICAgICAgICRncm91cDogWydjcmVhdG9ySWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBJdGVtYCBXSEVSRSBgY29tcGFueUlkYCA9IDEgQU5EIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG9yOiBbeyBjb21wYW55SWQ6IDEgfSwgNSwgcmF3KCdTVU0oc2FsZVByaWNlKSA+IDUwMCcpXSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIGBjb21wYW55SWRgID0gMSBPUiBgaWRgID0gNSBPUiBTVU0oc2FsZVByaWNlKSA+IDUwMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRhbmQ6IFtyYXcoJ1NVTShgc2FsZVByaWNlYCkgPiA1MDAnKV0gfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShgc2FsZVByaWNlYCkgPiA1MDAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFsxLCByYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyldIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgYGlkYCA9IDEgT1IgU1VNKHNhbGVQcmljZSkgPiA1MDAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFtyYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyksIDEsIHsgY29tcGFueUlkOiAxIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgU1VNKHNhbGVQcmljZSkgPiA1MDAgT1IgYGlkYCA9IDEgT1IgYGNvbXBhbnlJZGAgPSAxJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3JhdygnU1VNKHNhbGVQcmljZSkgPiA1MDAnKV0gfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NyZWF0b3JJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHJhdygnU1VNKHNhbGVQcmljZSkgPiA1MDAnKSxcbiAgICAgICAgJGdyb3VwOiBbJ2NyZWF0b3JJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG9yOiBbWzEsIDJdLCB7IGNvZGU6ICdhYmMnIH1dIH0sXG4gICAgICAgICRncm91cDogWydjcmVhdG9ySWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgYGlkYCBJTiAoMSwgMikgT1IgYGNvZGVgID0gJ2FiYycgR1JPVVAgQlkgYGNyZWF0b3JJZGBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHN0YXJ0c1dpdGgoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJHN0YXJ0c1dpdGg6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiBbXG4gICAgICAgICAgeyBmaWVsZDogJ25hbWUnLCBzb3J0OiAnYXNjJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdjcmVhdGVkQXQnLCBzb3J0OiAnZGVzYycgfSxcbiAgICAgICAgXSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCBMSUtFICdTb21lJScgT1JERVIgQlkgYG5hbWVgLCBgY3JlYXRlZEF0YCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJHN0YXJ0c1dpdGg6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICdTb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGlzdGFydHNXaXRoKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpc3RhcnRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJ3NvbWUlJyBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IHRydWUgfSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpc3RhcnRzV2l0aDogJ1NvbWUnLCAkbmU6ICdTb21ldGhpbmcnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoTE9XRVIoYG5hbWVgKSBMSUtFICdzb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGVuZHNXaXRoKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRlbmRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgbmFtZWAgTElLRSAnJVNvbWUnIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGVuZHNXaXRoOiAnU29tZScsICRuZTogJ1NvbWV0aGluZycgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChgbmFtZWAgTElLRSAnJVNvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpZW5kc1dpdGgoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGllbmRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJyBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpZW5kc1dpdGg6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKExPV0VSKGBuYW1lYCkgTElLRSAnJXNvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpbmNsdWRlcygpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaW5jbHVkZXM6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgIExJS0UgJyVTb21lJScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaW5jbHVkZXM6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICclU29tZSUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpaW5jbHVkZXMoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGlpbmNsdWRlczogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaWluY2x1ZGVzOiAnU29tZScsICRuZTogJ1NvbWV0aGluZycgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGxpa2UoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGxpa2U6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgIExJS0UgJ1NvbWUnIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICdTb21lJyBBTkQgYG5hbWVgIDw+ICdTb21ldGhpbmcnKSBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkaWxpa2UoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGlsaWtlOiAnU29tZScgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIExPV0VSKGBuYW1lYCkgTElLRSAnc29tZScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaWxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKExPV0VSKGBuYW1lYCkgTElLRSAnc29tZScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHJlZ2V4KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRyZWdleDogJ15zb21lJyB9IH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCBSRUdFWFAgJ15zb21lJ1wiKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkdGV4dCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJHRleHQ6IHsgJGZpZWxkczogWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ10sICR2YWx1ZTogJ3NvbWUgdGV4dCcgfSwgY29tcGFueUlkOiAxIH0sXG4gICAgICAgICRsaW1pdDogMzAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIGBJdGVtYCBNQVRDSCB7YG5hbWVgIGBkZXNjcmlwdGlvbmB9IDogJ3NvbWUgdGV4dCcgQU5EIGBjb21wYW55SWRgID0gMSBMSU1JVCAzMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEgfSxcbiAgICAgICAgJGZpbHRlcjoge1xuICAgICAgICAgICR0ZXh0OiB7ICRmaWVsZHM6IFsnbmFtZSddLCAkdmFsdWU6ICdzb21ldGhpbmcnIH0sXG4gICAgICAgICAgbmFtZTogeyAkbmU6ICdvdGhlciB1bndhbnRlZCcgfSxcbiAgICAgICAgICBjb21wYW55SWQ6IDEsXG4gICAgICAgIH0sXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBVc2VyYCBNQVRDSCB7YG5hbWVgfSA6ICdzb21ldGhpbmcnIEFORCBgbmFtZWAgPD4gJ290aGVyIHVud2FudGVkJyBBTkQgYGNvbXBhbnlJZGAgPSAxIExJTUlUIDEwXCIpO1xuICB9XG59XG4iXX0=
|