@stigg/node-server-sdk 3.35.0 → 3.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +1 -1
- package/dist/client.js +4 -5
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.d.ts +2 -2
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.js +5 -7
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.utils.d.ts +2 -3
- package/dist/services/cache/RedisSingleExecutionService/RedisSingleExecution.utils.js +1 -1
- package/dist/services/cache/cacheService.d.ts +2 -1
- package/dist/services/cache/inMemoryCacheService.d.ts +2 -1
- package/dist/services/cache/inMemoryCacheService.js +6 -1
- package/dist/services/cache/redisCacheService.d.ts +10 -7
- package/dist/services/cache/redisCacheService.js +151 -114
- package/dist/services/entitlementsService.d.ts +8 -15
- package/dist/services/entitlementsService.js +29 -19
- package/dist/services/entitlementsService.utils.d.ts +9 -6
- package/dist/services/entitlementsService.utils.js +1 -1
- package/dist/services/inMemoryEntitlementsService.d.ts +1 -2
- package/dist/services/inMemoryEntitlementsService.js +2 -27
- package/dist/services/redisEntitlementsService.d.ts +1 -9
- package/dist/services/redisEntitlementsService.js +6 -65
- package/package.json +1 -1
|
@@ -6,12 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.RedisCacheService = void 0;
|
|
7
7
|
const ioredis_1 = __importDefault(require("ioredis"));
|
|
8
8
|
const lodash_1 = require("lodash");
|
|
9
|
-
const sdk_1 = require("@stigg/api-client-js/src/generated/sdk");
|
|
10
9
|
const redlock_1 = __importDefault(require("redlock"));
|
|
11
10
|
const cacheKeysHelpers_1 = require("../../utils/cacheKeysHelpers");
|
|
12
11
|
const RedisSingleExecutionService_1 = require("./RedisSingleExecutionService");
|
|
13
12
|
const entitlementsService_utils_1 = require("../entitlementsService.utils");
|
|
14
13
|
const redisCacheService_constants_1 = require("./redisCacheService.constants");
|
|
14
|
+
const isMetered_1 = require("../../utils/isMetered");
|
|
15
15
|
class RedisCacheService {
|
|
16
16
|
constructor(options, loggerService) {
|
|
17
17
|
this.loggerService = loggerService;
|
|
@@ -28,75 +28,73 @@ class RedisCacheService {
|
|
|
28
28
|
this.distributedRefetchEntitlementsService = new RedisSingleExecutionService_1.RedisSingleExecutionService(redisCacheService_constants_1.REFETCH_OPERATION_NAME, this.environmentPrefix, notificationTimeoutMs, this.redisClient, this.redlock, this.loggerService);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
-
async updateFeatureUsage(
|
|
32
|
-
const
|
|
33
|
-
|
|
31
|
+
async updateFeatureUsage(params) {
|
|
32
|
+
const item = this.getFeatureUsageItemToUpdate(params);
|
|
33
|
+
await this.updateCacheItems([item]);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
getFeatureUsageItemToUpdate({ featureId, currentUsage, customerId, nextResetDate, resourceId, timestamp, }) {
|
|
37
|
+
const value = {
|
|
34
38
|
currentUsage,
|
|
35
39
|
nextResetDate,
|
|
36
40
|
};
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
return {
|
|
42
|
+
messageTimestamp: timestamp,
|
|
43
|
+
key: (0, cacheKeysHelpers_1.buildUsageKey)(this.environmentPrefix, customerId, featureId, resourceId),
|
|
44
|
+
value,
|
|
45
|
+
};
|
|
39
46
|
}
|
|
40
47
|
async setCustomer(customerId, customerEntitlements, resourceId, entitlementsTimestamp, featureIdToUsageTimestamp) {
|
|
41
48
|
const lockKey = (0, cacheKeysHelpers_1.buildLockKey)(this.environmentPrefix, customerId, resourceId);
|
|
42
|
-
const entitlementsDbKey = (0, cacheKeysHelpers_1.buildCustomerKey)(this.environmentPrefix, customerId, resourceId);
|
|
43
|
-
const customerEntitlementsAsObject = Object.fromEntries(customerEntitlements);
|
|
44
49
|
await this.redlock.using([lockKey], redisCacheService_constants_1.LOCK_DURATION, async () => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
try {
|
|
56
|
-
const { calculatedEntitlement: { feature }, featureUsage: { currentUsage, nextResetDate }, } = entitlement;
|
|
57
|
-
if ((0, lodash_1.isEmpty)(feature === null || feature === void 0 ? void 0 : feature.id)) {
|
|
58
|
-
throw new Error(`Customer key (${entitlementsDbKey}) has an entitlement without feature data`);
|
|
59
|
-
}
|
|
60
|
-
const featureId = feature.id;
|
|
61
|
-
const featureUsageTimestamp = featureIdToUsageTimestamp.get(featureId);
|
|
62
|
-
if (featureUsageTimestamp) {
|
|
63
|
-
return this.updateFeatureUsage({
|
|
64
|
-
featureId,
|
|
65
|
-
customerId,
|
|
66
|
-
timestamp: new Date(featureUsageTimestamp),
|
|
67
|
-
currentUsage,
|
|
68
|
-
nextResetDate: nextResetDate,
|
|
69
|
-
resourceId,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
this.loggerService.error(`Usage timestamp for feature ${featureId} is missing`, {
|
|
74
|
-
customerId,
|
|
75
|
-
resourceId,
|
|
76
|
-
featureId,
|
|
77
|
-
});
|
|
78
|
-
return Promise.resolve();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
this.loggerService.error(`Failed to update feature usage after fetching entitlements via network`, {
|
|
83
|
-
error: err,
|
|
84
|
-
customerId,
|
|
85
|
-
resourceId,
|
|
86
|
-
timestamp: entitlementsTimestamp,
|
|
87
|
-
featureId: (_a = entitlement.calculatedEntitlement.feature) === null || _a === void 0 ? void 0 : _a.id,
|
|
88
|
-
});
|
|
89
|
-
throw err;
|
|
90
|
-
}
|
|
50
|
+
const entitlementsItem = {
|
|
51
|
+
messageTimestamp: new Date(entitlementsTimestamp),
|
|
52
|
+
key: (0, cacheKeysHelpers_1.buildCustomerKey)(this.environmentPrefix, customerId, resourceId),
|
|
53
|
+
value: Object.fromEntries(customerEntitlements),
|
|
54
|
+
};
|
|
55
|
+
const featureUsagesItems = this.extractFeatureUsagesToUpdate({
|
|
56
|
+
customerId,
|
|
57
|
+
resourceId,
|
|
58
|
+
customerEntitlements,
|
|
59
|
+
featureIdToUsageTimestamp,
|
|
91
60
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
updateUsagesResult
|
|
95
|
-
.filter((result) => result.status === 'rejected')
|
|
96
|
-
.forEach((result) => this.loggerService.error(`Failed to update feature usage result: ${result.reason}`));
|
|
61
|
+
``;
|
|
62
|
+
await this.updateCacheItems([entitlementsItem, ...featureUsagesItems]);
|
|
97
63
|
});
|
|
98
64
|
}
|
|
99
|
-
|
|
65
|
+
extractFeatureUsagesToUpdate({ customerId, resourceId, customerEntitlements, featureIdToUsageTimestamp, }) {
|
|
66
|
+
return (0, lodash_1.compact)(new Array(...customerEntitlements.values())
|
|
67
|
+
.filter(({ calculatedEntitlement }) => (0, isMetered_1.isMetered)(calculatedEntitlement.feature))
|
|
68
|
+
.map((entitlement) => {
|
|
69
|
+
const { calculatedEntitlement: { feature }, featureUsage: { currentUsage, nextResetDate }, } = entitlement;
|
|
70
|
+
if ((0, lodash_1.isEmpty)(feature === null || feature === void 0 ? void 0 : feature.id)) {
|
|
71
|
+
this.loggerService.error(`entitlement without feature id`, {
|
|
72
|
+
customerId,
|
|
73
|
+
resourceId,
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const featureId = feature.id;
|
|
78
|
+
const featureUsageTimestamp = featureIdToUsageTimestamp.get(featureId);
|
|
79
|
+
if (!featureUsageTimestamp) {
|
|
80
|
+
this.loggerService.error(`Usage timestamp for feature is missing`, {
|
|
81
|
+
customerId,
|
|
82
|
+
resourceId,
|
|
83
|
+
featureId,
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
return this.getFeatureUsageItemToUpdate({
|
|
88
|
+
customerId,
|
|
89
|
+
resourceId,
|
|
90
|
+
featureId,
|
|
91
|
+
currentUsage,
|
|
92
|
+
nextResetDate,
|
|
93
|
+
timestamp: new Date(featureUsageTimestamp),
|
|
94
|
+
});
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
async getCustomerEntitlementsWithoutUsage(customerId, resourceId) {
|
|
100
98
|
const customerKey = (0, cacheKeysHelpers_1.buildCustomerKey)(this.environmentPrefix, customerId, resourceId);
|
|
101
99
|
const keysToFetch = [customerKey];
|
|
102
100
|
if (resourceId) {
|
|
@@ -140,48 +138,42 @@ class RedisCacheService {
|
|
|
140
138
|
});
|
|
141
139
|
return true;
|
|
142
140
|
}
|
|
143
|
-
async
|
|
144
|
-
const response = await this.
|
|
141
|
+
async getCustomerEntitlements(customerId, resourceId) {
|
|
142
|
+
const response = await this.getCustomerEntitlementsWithoutUsage(customerId, resourceId);
|
|
145
143
|
if (response.cacheMiss) {
|
|
146
144
|
return response;
|
|
147
145
|
}
|
|
148
146
|
const { entitlements } = response;
|
|
149
147
|
const meteredFeatureIds = Array.from(entitlements.values())
|
|
150
|
-
.filter((
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const missingFeatureIds = (0, lodash_1.difference)(meteredFeatureIds, foundFeatureIds);
|
|
159
|
-
if (!(0, lodash_1.isEmpty)(missingFeatureIds)) {
|
|
160
|
-
this.loggerService.error(`Failed to find metered features usage - considering it as cache miss`, {
|
|
161
|
-
customerId,
|
|
162
|
-
resourceId,
|
|
163
|
-
missingFeatureIds,
|
|
164
|
-
});
|
|
165
|
-
return entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss();
|
|
166
|
-
}
|
|
167
|
-
featuresUsageByFeatureKey.forEach((usageValue, featureKey) => {
|
|
168
|
-
const cachedEntitlement = entitlements.get(featureKey);
|
|
169
|
-
if (cachedEntitlement) {
|
|
170
|
-
const { calculatedEntitlement, featureUsage } = cachedEntitlement;
|
|
171
|
-
entitlements.set(featureKey, { calculatedEntitlement, featureUsage: Object.assign(Object.assign({}, featureUsage), usageValue) });
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
this.loggerService.log(`Found usage for a feature the customer is not entitled to.`, {
|
|
148
|
+
.filter(({ calculatedEntitlement }) => (0, isMetered_1.isMetered)(calculatedEntitlement.feature))
|
|
149
|
+
.map(({ calculatedEntitlement }) => calculatedEntitlement.feature.id);
|
|
150
|
+
if (!(0, lodash_1.isEmpty)(meteredFeatureIds)) {
|
|
151
|
+
const featuresUsageByFeatureKey = await this.getFeaturesUsage(this.environmentPrefix, customerId, resourceId, meteredFeatureIds);
|
|
152
|
+
const foundFeatureIds = Array.from(featuresUsageByFeatureKey.keys());
|
|
153
|
+
const missingFeatureIds = (0, lodash_1.difference)(meteredFeatureIds, foundFeatureIds);
|
|
154
|
+
if (!(0, lodash_1.isEmpty)(missingFeatureIds)) {
|
|
155
|
+
this.loggerService.error(`Failed to find metered features usage - considering it as cache miss`, {
|
|
175
156
|
customerId,
|
|
176
|
-
|
|
157
|
+
resourceId,
|
|
158
|
+
missingFeatureIds,
|
|
177
159
|
});
|
|
160
|
+
return entitlementsService_utils_1.entitlementsResponseMapper.cacheMiss();
|
|
178
161
|
}
|
|
179
|
-
|
|
162
|
+
featuresUsageByFeatureKey.forEach((usageValue, featureKey) => {
|
|
163
|
+
const cachedEntitlement = entitlements.get(featureKey);
|
|
164
|
+
if (cachedEntitlement) {
|
|
165
|
+
entitlements.set(featureKey, this.mergeEntitlementWithUsage(cachedEntitlement, usageValue));
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
this.loggerService.log(`Found usage for a feature the customer is not entitled to.`, {
|
|
169
|
+
customerId,
|
|
170
|
+
featureKey,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
180
175
|
return entitlementsService_utils_1.entitlementsResponseMapper.cacheHit(entitlements);
|
|
181
176
|
}
|
|
182
|
-
async getFeatureUsage(customerId, featureId, resourceId) {
|
|
183
|
-
return this.redisClient.get((0, cacheKeysHelpers_1.buildUsageKey)(this.environmentPrefix, customerId, featureId, resourceId));
|
|
184
|
-
}
|
|
185
177
|
async getFeaturesUsage(environmentPrefix, customerId, resourceId, meteredFeatureIds) {
|
|
186
178
|
const keysToFetch = meteredFeatureIds.map((featureId) => (0, cacheKeysHelpers_1.buildUsageKey)(environmentPrefix, customerId, featureId, resourceId));
|
|
187
179
|
const usageValues = await this.redisClient.mget(keysToFetch);
|
|
@@ -200,35 +192,52 @@ class RedisCacheService {
|
|
|
200
192
|
clearCache() {
|
|
201
193
|
return;
|
|
202
194
|
}
|
|
203
|
-
async
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
messageTimestamp.getTime() === entitlementsService_utils_1.DATE_IN_FAR_PAST.getTime() ||
|
|
207
|
-
latestTimestamp.getTime() <= messageTimestamp.getTime()) {
|
|
208
|
-
const writeableValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
209
|
-
await this.redisClient
|
|
210
|
-
.multi()
|
|
211
|
-
.set(key, writeableValue, 'EX', this.ttl)
|
|
212
|
-
.set(`${key}#${redisCacheService_constants_1.TIMESTAMP_SUFFIX}`, messageTimestamp.getTime(), 'EX', this.ttl)
|
|
213
|
-
.exec();
|
|
195
|
+
async updateCacheItems(items) {
|
|
196
|
+
if ((0, lodash_1.isEmpty)(items)) {
|
|
197
|
+
return;
|
|
214
198
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
199
|
+
const latestTimestampByKey = await this.getKeysLatestTimestamp(items.map((item) => item.key));
|
|
200
|
+
const itemsToUpdate = [];
|
|
201
|
+
items.forEach(({ messageTimestamp, key, value }) => {
|
|
202
|
+
const latestTimestamp = latestTimestampByKey.get(key);
|
|
203
|
+
if (!latestTimestamp ||
|
|
204
|
+
messageTimestamp.getTime() === entitlementsService_utils_1.DATE_IN_FAR_PAST.getTime() ||
|
|
205
|
+
latestTimestamp.getTime() <= messageTimestamp.getTime()) {
|
|
206
|
+
const writeableValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
207
|
+
itemsToUpdate.push({ key, value: writeableValue });
|
|
208
|
+
itemsToUpdate.push({ key: `${key}#${redisCacheService_constants_1.TIMESTAMP_SUFFIX}`, value: messageTimestamp.getTime() });
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
this.loggerService.log('Cache data timestamp is after message timestamp, skipping key update', {
|
|
212
|
+
messageTimestamp,
|
|
213
|
+
latestTimestamp,
|
|
214
|
+
key,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
if ((0, lodash_1.isEmpty)(itemsToUpdate)) {
|
|
219
|
+
return;
|
|
221
220
|
}
|
|
221
|
+
const batch = this.redisClient.multi();
|
|
222
|
+
itemsToUpdate.forEach(({ key, value }) => {
|
|
223
|
+
batch.set(key, value, 'EX', this.ttl);
|
|
224
|
+
});
|
|
225
|
+
await batch.exec();
|
|
222
226
|
}
|
|
223
|
-
async
|
|
224
|
-
const
|
|
225
|
-
|
|
227
|
+
async getKeysLatestTimestamp(keys) {
|
|
228
|
+
const timestampKeys = keys.map((key) => `${key}#${redisCacheService_constants_1.TIMESTAMP_SUFFIX}`);
|
|
229
|
+
const value = await this.redisClient.mget(timestampKeys);
|
|
230
|
+
const result = new Map();
|
|
231
|
+
keys.forEach((key, index) => {
|
|
232
|
+
result.set(key, this.parseTimestamp(value[index]));
|
|
233
|
+
});
|
|
234
|
+
return result;
|
|
226
235
|
}
|
|
227
236
|
parseTimestamp(value) {
|
|
228
237
|
if ((0, lodash_1.isNil)(value)) {
|
|
229
238
|
return undefined;
|
|
230
239
|
}
|
|
231
|
-
const number = parseInt(value, 10);
|
|
240
|
+
const number = (0, lodash_1.parseInt)(value, 10);
|
|
232
241
|
if (Number.isNaN(number)) {
|
|
233
242
|
return undefined;
|
|
234
243
|
}
|
|
@@ -239,6 +248,34 @@ class RedisCacheService {
|
|
|
239
248
|
await this.redlock.quit();
|
|
240
249
|
await ((_a = this.distributedRefetchEntitlementsService) === null || _a === void 0 ? void 0 : _a.cleanup());
|
|
241
250
|
}
|
|
251
|
+
async getCustomerEntitlement(featureId, customerId, resourceId) {
|
|
252
|
+
const { entitlements, customerExists, cacheMiss, globalCustomerMissing } = await this.getCustomerEntitlementsWithoutUsage(customerId, resourceId);
|
|
253
|
+
const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(featureId)) || null : null;
|
|
254
|
+
const result = { cacheMiss, customerExists, entitlement, globalCustomerMissing };
|
|
255
|
+
if (!entitlement || !(0, isMetered_1.isMetered)(entitlement === null || entitlement === void 0 ? void 0 : entitlement.calculatedEntitlement.feature)) {
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
const featuresUsageByFeatureKey = await this.getFeaturesUsage(this.environmentPrefix, customerId, resourceId, [
|
|
259
|
+
featureId,
|
|
260
|
+
]);
|
|
261
|
+
const cachedFeatureUsage = featuresUsageByFeatureKey.get(featureId);
|
|
262
|
+
if ((0, lodash_1.isNil)(cachedFeatureUsage)) {
|
|
263
|
+
this.loggerService.error('Failed to find metered feature usage - considering it as cache miss', {
|
|
264
|
+
customerId,
|
|
265
|
+
resourceId,
|
|
266
|
+
featureId,
|
|
267
|
+
});
|
|
268
|
+
return { cacheMiss: true, customerExists: false, entitlement: null, globalCustomerMissing: false };
|
|
269
|
+
}
|
|
270
|
+
return Object.assign(Object.assign({}, result), { entitlement: this.mergeEntitlementWithUsage(entitlement, cachedFeatureUsage) });
|
|
271
|
+
}
|
|
272
|
+
mergeEntitlementWithUsage(entitlement, cachedUsage) {
|
|
273
|
+
const { calculatedEntitlement, featureUsage } = entitlement;
|
|
274
|
+
return {
|
|
275
|
+
calculatedEntitlement,
|
|
276
|
+
featureUsage: Object.assign(Object.assign({}, featureUsage), cachedUsage),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
242
279
|
}
|
|
243
280
|
exports.RedisCacheService = RedisCacheService;
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsc0RBQTRCO0FBQzVCLG1DQUFvRDtBQUNwRCxnRUFBbUU7QUFFbkUsc0RBQThCO0FBRTlCLG1FQUE2RjtBQUM3RiwrRUFBNEU7QUFDNUUsNEVBQWtIO0FBQ2xILCtFQU11QztBQUV2QyxNQUFhLGlCQUFpQjtJQVE1QixZQUFZLE9BQTBCLEVBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ25GLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEdBQUcsOENBQWdCLEVBQUUsK0JBQStCLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXBHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxpQkFBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJ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
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXNDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY2FjaGUvcmVkaXNDYWNoZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsc0RBQTRCO0FBQzVCLG1DQUF1RTtBQUV2RSxzREFBOEI7QUFFOUIsbUVBQTZGO0FBQzdGLCtFQUE0RTtBQUM1RSw0RUFLc0M7QUFDdEMsK0VBTXVDO0FBQ3ZDLHFEQUFrRDtBQWFsRCxNQUFhLGlCQUFpQjtJQVE1QixZQUFZLE9BQTBCLEVBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ25GLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEdBQUcsOENBQWdCLEVBQUUsK0JBQStCLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXBHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxpQkFBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO1FBRXhGLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxRQUFRLEVBQUU7WUFDN0MsTUFBTSxFQUFFLHFCQUFxQixHQUFHLDZEQUErQixFQUFFLEdBQUcsK0JBQStCLENBQUM7WUFDcEcsSUFBSSxDQUFDLHFDQUFxQyxHQUFHLElBQUkseURBQTJCLENBQzFFLG9EQUFzQixFQUN0QixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLHFCQUFxQixFQUNyQixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxhQUFhLENBQ25CLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBaUM7UUFDeEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxFQUNsQyxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixhQUFhLEVBQ2IsVUFBVSxFQUNWLFNBQVMsR0FDaUI7UUFDMUIsTUFBTSxLQUFLLEdBQXVCO1lBQ2hDLFlBQVk7WUFDWixhQUFhO1NBQ2QsQ0FBQztRQUNGLE9BQU87WUFDTCxnQkFBZ0IsRUFBRSxTQUFTO1lBQzNCLEdBQUcsRUFBRSxJQUFBLGdDQUFhLEVBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDO1lBQzdFLEtBQUs7U0FDTixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQ2YsVUFBa0IsRUFDbEIsb0JBQW9ELEVBQ3BELFVBQThCLEVBQzlCLHFCQUE2QixFQUM3Qix5QkFBOEM7UUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBQSwrQkFBWSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDN0UsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLDJDQUFhLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDNUQsTUFBTSxnQkFBZ0IsR0FBaUI7Z0JBQ3JDLGdCQUFnQixFQUFFLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDO2dCQUNqRCxHQUFHLEVBQUUsSUFBQSxtQ0FBZ0IsRUFBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztnQkFDckUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUM7YUFDaEQsQ0FBQztZQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDO2dCQUMzRCxVQUFVO2dCQUNWLFVBQVU7Z0JBQ1Ysb0JBQW9CO2dCQUNwQix5QkFBeUI7YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxFQUNuQyxVQUFVLEVBQ1YsVUFBVSxFQUNWLG9CQUFvQixFQUNwQix5QkFBeUIsR0FNMUI7UUFDQyxPQUFPLElBQUEsZ0JBQU8sRUFDWixJQUFJLEtBQUssQ0FBQyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ3hDLE1BQU0sQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBQSxxQkFBUyxFQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9FLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ25CLE1BQU0sRUFDSixxQkFBcUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUNsQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEdBQzlDLEdBQUcsV0FBVyxDQUFDO1lBQ2hCLElBQUksSUFBQSxnQkFBTyxFQUFDLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxFQUFFLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUU7b0JBQ3pELFVBQVU7b0JBQ1YsVUFBVTtpQkFDWCxDQUFDLENBQUM7Z0JBQ0gsT0FBTzthQUNSO1lBQ0QsTUFBTSxTQUFTLEdBQUcsT0FBUSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV2RSxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFO29CQUNqRSxVQUFVO29CQUNWLFVBQVU7b0JBQ1YsU0FBUztpQkFDVixDQUFDLENBQUM7Z0JBQ0gsT0FBTzthQUNSO1lBRUQsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUM7Z0JBQ3RDLFVBQVU7Z0JBQ1YsVUFBVTtnQkFDVixTQUFTO2dCQUNULFlBQVk7Z0JBQ1osYUFBYTtnQkFDYixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7YUFDM0MsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsbUNBQW1DLENBQ3ZDLFVBQWtCLEVBQ2xCLFVBQThCO1FBRTlCLE1BQU0sV0FBVyxHQUFHLElBQUEsbUNBQWdCLEVBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyRixNQUFNLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWxDLElBQUksVUFBVSxFQUFFO1lBQ2QsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLG1DQUFnQixFQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUYsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsSUFBSSw4Q0FBZ0IsRUFBRSxDQUFDLENBQUM7WUFDdkQsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLGlCQUFpQixJQUFJLDhDQUFnQixFQUFFLENBQUMsQ0FBQztTQUM5RDtRQUVELE1BQU0sQ0FBQyxlQUFlLEVBQUUsMEJBQTBCLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUNqSCxXQUFXLENBQ1osQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUNoQixDQUFDLElBQUEsY0FBSyxFQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBQSxnQkFBTyxFQUFDLGVBQWUsQ0FBQztZQUNsRCxDQUFDLENBQUMsSUFBSSxHQUFHLENBQTRCLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDWCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5RSxNQUFNLDJCQUEyQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUMxRixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FDL0QsVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLDJCQUEyQixDQUM1QixDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksSUFBSSxxQkFBcUIsRUFBRTtZQUMxQyxPQUFPLHNEQUEwQixDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ3BFO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsb0RBQW9ELEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMzRyxPQUFPLHNEQUEwQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLGdGQUFnRjtJQUN4RSw4QkFBOEIsQ0FDcEMsVUFBa0IsRUFDbEIsVUFBOEIsRUFDOUIsWUFBbUQsRUFDbkQscUJBQXVDLEVBQ3ZDLDJCQUE2QztRQUU3QyxJQUFJLElBQUEsY0FBSyxFQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLCtFQUErRTtZQUMvRSxrRUFBa0U7WUFDbEUsT0FBTyxDQUFDLDJCQUEyQixDQUFDO1NBQ3JDO1FBRUQsTUFBTSx1Q0FBdUMsR0FDM0MscUJBQXFCLElBQUksMkJBQTJCLElBQUkscUJBQXFCLElBQUksMkJBQTJCLENBQUM7UUFDL0csSUFBSSx1Q0FBdUMsRUFBRTtZQUMzQyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsZ0RBQWdELEVBQUU7WUFDdkUsVUFBVTtZQUNWLFVBQVU7WUFDVixxQkFBcUI7WUFDckIsMkJBQTJCO1NBQzVCLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxVQUFrQixFQUFFLFVBQThCO1FBQzlFLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RixJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUU7WUFDdEIsT0FBTyxRQUFRLENBQUM7U0FDakI7UUFFRCxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBRWxDLE1BQU0saUJBQWlCLEdBQWtCLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ3ZFLE1BQU0sQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBQSxxQkFBUyxFQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9FLEdBQUcsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsT0FBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxJQUFBLGdCQUFPLEVBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUMvQixNQUFNLHlCQUF5QixHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUMzRCxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLFVBQVUsRUFDVixVQUFVLEVBQ1YsaUJBQWlCLENBQ2xCLENBQUM7WUFFRixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckUsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLG1CQUFVLEVBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFFekUsSUFBSSxDQUFDLElBQUEsZ0JBQU8sRUFBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxzRUFBc0UsRUFBRTtvQkFDL0YsVUFBVTtvQkFDVixVQUFVO29CQUNWLGlCQUFpQjtpQkFDbEIsQ0FBQyxDQUFDO2dCQUNILE9BQU8sc0RBQTBCLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDL0M7WUFFRCx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUU7Z0JBQzNELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxpQkFBaUIsRUFBRTtvQkFDckIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQzdGO3FCQUFNO29CQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLDREQUE0RCxFQUFFO3dCQUNuRixVQUFVO3dCQUNWLFVBQVU7cUJBQ1gsQ0FBQyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sc0RBQTBCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQzVCLGlCQUF5QixFQUN6QixVQUFrQixFQUNsQixVQUE4QixFQUM5QixpQkFBZ0M7UUFFaEMsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDdEQsSUFBQSxnQ0FBYSxFQUFDLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQ3BFLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdELE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFFdEUsb0ZBQW9GO1FBQ3BGLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM3QyxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3QyxJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRTtnQkFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsNkNBQTZDLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ2pGLE9BQU87YUFDUjtZQUVELHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTztJQUNULENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBcUI7UUFDbEQsSUFBSSxJQUFBLGdCQUFPLEVBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RixNQUFNLGFBQWEsR0FBbUQsRUFBRSxDQUFDO1FBRXpFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2pELE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0RCxJQUNFLENBQUMsZUFBZTtnQkFDaEIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssNENBQWdCLENBQUMsT0FBTyxFQUFFO2dCQUN6RCxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBQ3ZEO2dCQUNBLE1BQU0sY0FBYyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqRixhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLDhDQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQzthQUM5RjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxzRUFBc0UsRUFBRTtvQkFDN0YsZ0JBQWdCO29CQUNoQixlQUFlO29CQUNmLEdBQUc7aUJBQ0osQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBQSxnQkFBTyxFQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQzFCLE9BQU87U0FDUjtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDdkMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQWM7UUFDakQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksOENBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQW9CO1FBQ3pDLElBQUksSUFBQSxjQUFLLEVBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEIsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGlCQUFRLEVBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN4QixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPOztRQUNYLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUEsTUFBQSxJQUFJLENBQUMscUNBQXFDLDBDQUFFLE9BQU8sRUFBRSxDQUFBLENBQUM7SUFDOUQsQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0IsQ0FDMUIsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsVUFBOEI7UUFFOUIsTUFBTSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLEdBQ3RFLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RSxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxZQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdFLE1BQU0sTUFBTSxHQUFHLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztRQUVqRixJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBQSxxQkFBUyxFQUFDLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMxRSxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBRUQsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRTtZQUM1RyxTQUFTO1NBQ1YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEUsSUFBSSxJQUFBLGNBQUssRUFBQyxrQkFBa0IsQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLHFFQUFxRSxFQUFFO2dCQUM5RixVQUFVO2dCQUNWLFVBQVU7Z0JBQ1YsU0FBUzthQUNWLENBQUMsQ0FBQztZQUNILE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUNwRztRQUVELHVDQUNLLE1BQU0sS0FDVCxXQUFXLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxJQUM1RTtJQUNKLENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsV0FBOEIsRUFDOUIsV0FBK0I7UUFFL0IsTUFBTSxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUM1RCxPQUFPO1lBQ0wscUJBQXFCO1lBQ3JCLFlBQVksa0NBQ1AsWUFBWSxHQUNaLFdBQVcsQ0FDZjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsWkQsOENBa1pDIn0=
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import EntitlementsApi from '../api/entitlements/entitlementsApi';
|
|
2
2
|
import { LoggerService } from './loggerService';
|
|
3
3
|
import { ApolloClient, FetchResult, NormalizedCacheObject } from '@apollo/client/core';
|
|
4
|
-
import { BooleanEntitlement, BooleanEntitlementOptions, CreateUsageMeasurement,
|
|
4
|
+
import { BooleanEntitlement, BooleanEntitlementOptions, CreateUsageMeasurement, MeteredEntitlement, MeteredEntitlementOptions, NumericEntitlement, NumericEntitlementOptions, ReportEvent } from '../models';
|
|
5
5
|
import { ModelMapper } from '../utils/ModelMapper';
|
|
6
|
-
import CachedEntitlement from './cache/cachedEntitlement';
|
|
7
6
|
import { CacheService } from './cache/cacheService';
|
|
8
7
|
import { EdgeApiClient } from './EdgeApiClient';
|
|
9
8
|
import { EntitlementCheckResult, EntitlementFragment, ReportEventMutation, ReportUsageBulkInput, ReportUsageBulkMutation, ReportUsageFragment, ReportUsageMutation } from '@stigg/api-client-js/src/generated/sdk';
|
|
10
9
|
import CacheMapper from '../utils/CacheMapper';
|
|
11
|
-
import {
|
|
10
|
+
import { EntitlementsResponse, EntitlementsResponseCacheHit, RefetchEntitlementsAfterCacheMissParams, RefetchEntitlementsParams, RefetchEntityEntitlementsAfterCacheMissParams } from './entitlementsService.utils';
|
|
12
11
|
export declare abstract class EntitlementsService {
|
|
13
12
|
protected readonly loggerService: LoggerService;
|
|
14
13
|
protected readonly cacheService: CacheService;
|
|
@@ -22,32 +21,26 @@ export declare abstract class EntitlementsService {
|
|
|
22
21
|
getNumericEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: NumericEntitlement, resourceId?: string, options?: NumericEntitlementOptions): Promise<NumericEntitlement>;
|
|
23
22
|
getMeteredEntitlement(customerRefId: string, featureRefId: string, fallbackEntitlement: MeteredEntitlement, resourceId?: string, options?: MeteredEntitlementOptions): Promise<MeteredEntitlement>;
|
|
24
23
|
private getCustomerAndEntitlementFromCacheOrRefetch;
|
|
25
|
-
|
|
24
|
+
getCustomerEntitlements(customerRefId: string, resourceId: string | undefined): Promise<import("../models").Entitlement[]>;
|
|
26
25
|
abstract clearCache(): void | Promise<void>;
|
|
27
26
|
abstract init(): void | Promise<void>;
|
|
28
27
|
abstract cleanup(): void | Promise<void>;
|
|
29
28
|
reportUsage(input: CreateUsageMeasurement): Promise<FetchResult<ReportUsageMutation>>;
|
|
30
29
|
reportUsageBulk(input: ReportUsageBulkInput): Promise<FetchResult<ReportUsageBulkMutation>>;
|
|
31
30
|
reportEvent(input: ReportEvent[]): Promise<FetchResult<ReportEventMutation>>;
|
|
32
|
-
protected
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
entitlement: CachedEntitlement | null;
|
|
36
|
-
globalCustomerMissing: boolean;
|
|
37
|
-
}>;
|
|
38
|
-
protected refetchEntitlementsAfterCacheMiss<T>(params: RefetchEntitlementsAfterCacheMissParams<T>): Promise<T>;
|
|
39
|
-
protected abstract refetchEntityEntitlementsAfterCacheMiss<T>(params: RefetchEntityEntitlementsAfterCacheMissParams<T>): Promise<T>;
|
|
40
|
-
refetchEntitlements({ customerId, resourceId, skipEdge, triggeredBy, }: RefetchEntitlementsParams): Promise<EntitlementsMap>;
|
|
31
|
+
protected refetchEntitlementsAfterCacheMiss(params: RefetchEntitlementsAfterCacheMissParams): Promise<EntitlementsResponse>;
|
|
32
|
+
protected abstract refetchEntityEntitlementsAfterCacheMiss(params: RefetchEntityEntitlementsAfterCacheMissParams): Promise<EntitlementsResponse>;
|
|
33
|
+
refetchEntitlements({ customerId, resourceId, skipEdge, triggeredBy, }: RefetchEntitlementsParams): Promise<EntitlementsResponseCacheHit>;
|
|
41
34
|
setEntitlementsIfExists(options: {
|
|
42
35
|
entitlements?: EntitlementFragment[] | null;
|
|
43
36
|
customerId: string;
|
|
44
37
|
resourceId: string | undefined;
|
|
45
|
-
}): Promise<Map<string,
|
|
38
|
+
}): Promise<Map<string, import("./cache/cachedEntitlement").default> | null>;
|
|
46
39
|
setEntitlements(params: {
|
|
47
40
|
entitlements: EntitlementFragment[];
|
|
48
41
|
customerId: string;
|
|
49
42
|
resourceId: string | undefined;
|
|
50
|
-
}): Promise<Map<string,
|
|
43
|
+
}): Promise<Map<string, import("./cache/cachedEntitlement").default>>;
|
|
51
44
|
private getEntitlementsUpdatedAtTimestamp;
|
|
52
45
|
protected tryTrackEntitlementCheck(shouldTrack: boolean, featureRefId: string, customerRefId: string, resourceRefId: string | undefined, result: EntitlementCheckResult, requestedUsage?: number): void;
|
|
53
46
|
updateFeatureUsage({ featureId, customerId, resourceId, currentUsage, nextResetDate, timestamp, }: ReportUsageFragment): Promise<void>;
|
|
@@ -115,24 +115,40 @@ class EntitlementsService {
|
|
|
115
115
|
return this.modelMapper.mapMeteredEntitlement(entitlement, decision, requestUsage);
|
|
116
116
|
}
|
|
117
117
|
async getCustomerAndEntitlementFromCacheOrRefetch(featureRefId, customerRefId, resourceId, triggeredBy) {
|
|
118
|
-
|
|
119
|
-
const result = await
|
|
118
|
+
var _a;
|
|
119
|
+
const result = await this.cacheService.getCustomerEntitlement(featureRefId, customerRefId, resourceId);
|
|
120
120
|
let { entitlement, customerExists } = result;
|
|
121
121
|
if (result.cacheMiss || !this.isInitialized) {
|
|
122
|
-
|
|
122
|
+
const postMissResult = await this.refetchEntitlementsAfterCacheMiss({
|
|
123
123
|
customerId: customerRefId,
|
|
124
124
|
resourceId,
|
|
125
125
|
refetchGlobalCustomer: result.globalCustomerMissing,
|
|
126
126
|
triggeredBy,
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
customerExists: (0, entitlementsService_utils_1.doesCustomerExist)(entitlements),
|
|
131
|
-
}),
|
|
132
|
-
}));
|
|
127
|
+
});
|
|
128
|
+
entitlement = ((_a = postMissResult.entitlements) === null || _a === void 0 ? void 0 : _a.get(featureRefId)) || null;
|
|
129
|
+
customerExists = postMissResult.customerExists;
|
|
133
130
|
}
|
|
134
131
|
return { entitlement, customerExists };
|
|
135
132
|
}
|
|
133
|
+
async getCustomerEntitlements(customerRefId, resourceId) {
|
|
134
|
+
const result = await this.cacheService.getCustomerEntitlements(customerRefId, resourceId);
|
|
135
|
+
let { entitlements, customerExists } = result;
|
|
136
|
+
if (result.cacheMiss || !this.isInitialized) {
|
|
137
|
+
({ entitlements, customerExists } = await this.refetchEntitlementsAfterCacheMiss({
|
|
138
|
+
customerId: customerRefId,
|
|
139
|
+
resourceId,
|
|
140
|
+
refetchGlobalCustomer: result.globalCustomerMissing,
|
|
141
|
+
triggeredBy: 'getCustomerEntitlements',
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
if (!entitlements) {
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
return Array.from(entitlements.values()).map((value) => {
|
|
148
|
+
const decision = entitlementDecisionService_1.EntitlementDecisionService.decideEntitlementPolicy(customerExists, value);
|
|
149
|
+
return this.modelMapper.mapEntitlement(value, decision);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
136
152
|
async reportUsage(input) {
|
|
137
153
|
const result = await this.entitlementsApi.reportUsage(input);
|
|
138
154
|
if (result.data) {
|
|
@@ -152,11 +168,6 @@ class EntitlementsService {
|
|
|
152
168
|
reportEvent(input) {
|
|
153
169
|
return this.entitlementsApi.reportEvent(input);
|
|
154
170
|
}
|
|
155
|
-
async tryGetCacheCustomerAndEntitlement(featureRefId, customerRefId, resourceId) {
|
|
156
|
-
const { entitlements, customerExists, cacheMiss, globalCustomerMissing } = await this.cacheService.getCustomerEntitlements(customerRefId, resourceId);
|
|
157
|
-
const entitlement = !cacheMiss ? (entitlements === null || entitlements === void 0 ? void 0 : entitlements.get(featureRefId)) || null : null;
|
|
158
|
-
return { cacheMiss, customerExists, entitlement, globalCustomerMissing };
|
|
159
|
-
}
|
|
160
171
|
async refetchEntitlementsAfterCacheMiss(params) {
|
|
161
172
|
const { customerId, resourceId, triggeredBy, refetchGlobalCustomer } = params;
|
|
162
173
|
const refetchPromise = this.refetchEntityEntitlementsAfterCacheMiss(params);
|
|
@@ -164,8 +175,6 @@ class EntitlementsService {
|
|
|
164
175
|
return refetchPromise;
|
|
165
176
|
}
|
|
166
177
|
const globalCustomerRefetchPromise = this.refetchEntityEntitlementsAfterCacheMiss({
|
|
167
|
-
loadFromCache: lodash_1.noop,
|
|
168
|
-
transformApiResult: lodash_1.noop,
|
|
169
178
|
customerId,
|
|
170
179
|
resourceId: undefined,
|
|
171
180
|
triggeredBy,
|
|
@@ -181,11 +190,12 @@ class EntitlementsService {
|
|
|
181
190
|
triggeredBy,
|
|
182
191
|
});
|
|
183
192
|
const entitlementsResult = await this.entitlementsApi.getEntitlements(customerId, resourceId, skipEdge);
|
|
184
|
-
|
|
193
|
+
const entitlements = await this.setEntitlements({
|
|
185
194
|
entitlements: entitlementsResult.data.entitlements,
|
|
186
195
|
customerId,
|
|
187
196
|
resourceId,
|
|
188
197
|
});
|
|
198
|
+
return entitlementsService_utils_1.entitlementsResponseMapper.cacheHit(entitlements);
|
|
189
199
|
}
|
|
190
200
|
async setEntitlementsIfExists(options) {
|
|
191
201
|
const { entitlements } = options, rest = __rest(options, ["entitlements"]);
|
|
@@ -244,7 +254,7 @@ class EntitlementsService {
|
|
|
244
254
|
if ((0, lodash_1.isNil)(currentUsage)) {
|
|
245
255
|
return;
|
|
246
256
|
}
|
|
247
|
-
const response = await this.cacheService.
|
|
257
|
+
const response = await this.cacheService.getCustomerEntitlement(featureId, customerId, resourceId || undefined);
|
|
248
258
|
if (response.cacheMiss) {
|
|
249
259
|
return;
|
|
250
260
|
}
|
|
@@ -259,4 +269,4 @@ class EntitlementsService {
|
|
|
259
269
|
}
|
|
260
270
|
}
|
|
261
271
|
exports.EntitlementsService = EntitlementsService;
|
|
262
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGxlbWVudHNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUZBQXNGO0FBQ3RGLDBGQUFrRTtBQUdsRSxzQ0FZbUI7QUFDbkIsc0RBQW1EO0FBQ25ELDZFQUEwRTtBQUcxRSxtQ0FBOEM7QUFFOUMsa0RBQWlEO0FBVWpELHVFQUErQztBQUMvQywyRUFRcUM7QUFFckMsTUFBc0IsbUJBQW1CO0lBUXZDLFlBQ0UsTUFBMkMsRUFDeEIsYUFBNEIsRUFDL0Msb0JBQXlELEVBQ3pELGFBQW1DLEVBQ2hCLFlBQTBCO1FBSDFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBUHJDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBUzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkseUJBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLG1FQUFnQyxDQUMxRSxJQUFJLHlCQUFlLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUN2RSxJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FDekIsYUFBcUIsRUFDckIsWUFBb0IsRUFDcEIsbUJBQXVDLEVBQ3ZDLFVBQW1CLEVBQ25CLE9BQW1DOztRQUVuQyxNQUFNLFdBQVcsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLEtBQUksS0FB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
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGxlbWVudHNTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUZBQXNGO0FBQ3RGLDBGQUFrRTtBQUdsRSxzQ0FXbUI7QUFDbkIsc0RBQW1EO0FBQ25ELDZFQUEwRTtBQUUxRSxtQ0FBd0M7QUFFeEMsa0RBQWlEO0FBVWpELHVFQUErQztBQUMvQywyRUFTcUM7QUFFckMsTUFBc0IsbUJBQW1CO0lBUXZDLFlBQ0UsTUFBMkMsRUFDeEIsYUFBNEIsRUFDL0Msb0JBQXlELEVBQ3pELGFBQW1DLEVBQ2hCLFlBQTBCO1FBSDFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBUHJDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBUzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkseUJBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLG1FQUFnQyxDQUMxRSxJQUFJLHlCQUFlLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUN2RSxJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FDekIsYUFBcUIsRUFDckIsWUFBb0IsRUFDcEIsbUJBQXVDLEVBQ3ZDLFVBQW1CLEVBQ25CLE9BQW1DOztRQUVuQyxNQUFNLFdBQVcsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLEtBQUksS0FBSyxDQUFDO1FBQ2xELE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsMkNBQTJDLENBQzVGLFlBQVksRUFDWixhQUFhLEVBQ2IsVUFBVSxFQUNWLHVCQUF1QixDQUN4QixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsdURBQTBCLENBQUMsdUJBQXVCLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRWpHLElBQ0UsQ0FBQSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUscUJBQXFCLENBQUMsT0FBTztZQUMxQyxDQUFBLE1BQUEsV0FBVyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sMENBQUUsV0FBVyxNQUFLLG9CQUFXLENBQUMsT0FBTyxFQUM5RTtZQUNBLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQ0FBbUMsQ0FDcEYsbUJBQW1CLEVBQ25CLFFBQVEsQ0FDVCxDQUFDO1lBQ0YsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBQy9HLE9BQU8sbUJBQW1CLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxFQUFFO2dCQUNqRSxhQUFhO2dCQUNiLFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO2FBQ2hELENBQUMsQ0FBQztZQUVILE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFFdkcsdUNBQVksUUFBUSxLQUFFLFVBQVUsRUFBRSxLQUFLLElBQUc7U0FDM0M7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUV2RyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQ3pCLGFBQXFCLEVBQ3JCLFlBQW9CLEVBQ3BCLG1CQUF1QyxFQUN2QyxVQUFtQixFQUNuQixPQUFtQzs7UUFFbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVyxLQUFJLEtBQUssQ0FBQztRQUNsRCxNQUFNLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLDJDQUEyQyxDQUM1RixZQUFZLEVBQ1osYUFBYSxFQUNiLFVBQVUsRUFDVix1QkFBdUIsQ0FDeEIsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLHVEQUEwQixDQUFDLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVqRyxJQUNFLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLHFCQUFxQixDQUFDLE9BQU87WUFDMUMsQ0FBQSxNQUFBLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLDBDQUFFLFdBQVcsTUFBSyxvQkFBVyxDQUFDLE1BQU0sRUFDN0U7WUFDQSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsbUNBQW1DLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDOUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZHLE9BQU8sbUJBQW1CLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxFQUFFO2dCQUNqRSxhQUFhO2dCQUNiLFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO2FBQ2hELENBQUMsQ0FBQztZQUVILE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFFdkcsdUNBQVksUUFBUSxLQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssSUFBRztTQUMvRDtRQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRXZHLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FDekIsYUFBcUIsRUFDckIsWUFBb0IsRUFDcEIsbUJBQXVDLEVBQ3ZDLFVBQW1CLEVBQ25CLE9BQW1DOztRQUVuQyxNQUFNLFdBQVcsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLEtBQUksS0FBSyxDQUFDO1FBQ2xELE1BQU0sWUFBWSxHQUFHLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxjQUFjLENBQUM7UUFDN0MsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQywyQ0FBMkMsQ0FDNUYsWUFBWSxFQUNaLGFBQWEsRUFDYixVQUFVLEVBQ1YsdUJBQXVCLENBQ3hCLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyx1REFBMEIsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRS9HLElBQ0UsQ0FBQSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUscUJBQXFCLENBQUMsT0FBTztZQUMxQyxDQUFBLE1BQUEsV0FBVyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sMENBQUUsU0FBUyxNQUFLLGtCQUFTLENBQUMsV0FBVztZQUM5RSxDQUFBLE1BQUEsV0FBVyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sMENBQUUsU0FBUyxNQUFLLGtCQUFTLENBQUMsV0FBVyxFQUM5RTtZQUNBLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQ0FBbUMsQ0FDNUUsbUJBQW1CLEVBQ25CLFFBQVEsRUFDUixZQUFZLENBQ2IsQ0FBQztZQUNGLElBQUksQ0FBQyx3QkFBd0IsQ0FDM0IsV0FBVyxFQUNYLFlBQVksRUFDWixhQUFhLEVBQ2IsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixZQUFZLENBQ2IsQ0FBQztZQUNGLE9BQU8sbUJBQW1CLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxFQUFFO2dCQUNqRSxhQUFhO2dCQUNiLFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO2FBQ2hELENBQUMsQ0FBQztZQUVILE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ25HLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUV2Ryx1Q0FDSyxRQUFRLEtBQ1gsWUFBWSxFQUFFLENBQUMsRUFDZixVQUFVLEVBQUUsS0FBSyxFQUNqQixXQUFXLEVBQUUsS0FBSyxFQUNsQixZQUFZLEVBQUUsS0FBSyxFQUNuQixjQUFjLEVBQUUsWUFBWSxJQUFJLENBQUMsSUFDakM7U0FDSDtRQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyx3QkFBd0IsQ0FDM0IsV0FBVyxFQUNYLFlBQVksRUFDWixhQUFhLEVBQ2IsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixZQUFZLENBQ2IsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFTyxLQUFLLENBQUMsMkNBQTJDLENBQ3ZELFlBQW9CLEVBQ3BCLGFBQXFCLEVBQ3JCLFVBQThCLEVBQzlCLFdBQXNDOztRQUV0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN2RyxJQUFJLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUU3QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzNDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlDQUFpQyxDQUFDO2dCQUNsRSxVQUFVLEVBQUUsYUFBYTtnQkFDekIsVUFBVTtnQkFDVixxQkFBcUIsRUFBRSxNQUFNLENBQUMscUJBQXFCO2dCQUNuRCxXQUFXO2FBQ1osQ0FBQyxDQUFDO1lBRUgsV0FBVyxHQUFHLENBQUEsTUFBQSxjQUFjLENBQUMsWUFBWSwwQ0FBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUksSUFBSSxDQUFDO1lBQ3JFLGNBQWMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDO1NBQ2hEO1FBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLGFBQXFCLEVBQUUsVUFBOEI7UUFDakYsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRixJQUFJLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUU5QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzNDLENBQUMsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUM7Z0JBQy9FLFVBQVUsRUFBRSxhQUFhO2dCQUN6QixVQUFVO2dCQUNWLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxxQkFBcUI7Z0JBQ25ELFdBQVcsRUFBRSx5QkFBeUI7YUFDdkMsQ0FBQyxDQUFDLENBQUM7U0FDTDtRQUVELElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyRCxNQUFNLFFBQVEsR0FBRyx1REFBMEIsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBTUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUE2QjtRQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdELElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUNmLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDeEQ7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUEyQjtRQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpFLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUNmLEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3JELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzVDO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQW9CO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVTLEtBQUssQ0FBQyxpQ0FBaUMsQ0FDL0MsTUFBK0M7UUFFL0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRTlFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RSxJQUFJLElBQUEsY0FBSyxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDL0MsT0FBTyxjQUFjLENBQUM7U0FDdkI7UUFFRCxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQztZQUNoRixVQUFVO1lBQ1YsVUFBVSxFQUFFLFNBQVM7WUFDckIsV0FBVztTQUNaLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO1FBQzNGLE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFNRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFDeEIsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBQ1IsV0FBVyxHQUNlO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFO1lBQ2pELFVBQVU7WUFDVixVQUFVO1lBQ1YsUUFBUTtZQUNSLFdBQVc7U0FDWixDQUFDLENBQUM7UUFFSCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDOUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZO1lBQ2xELFVBQVU7WUFDVixVQUFVO1NBQ1gsQ0FBQyxDQUFDO1FBRUgsT0FBTyxzREFBMEIsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxPQUk3QjtRQUNDLE1BQU0sRUFBRSxZQUFZLEtBQWMsT0FBTyxFQUFoQixJQUFJLFVBQUssT0FBTyxFQUFuQyxnQkFBeUIsQ0FBVSxDQUFDO1FBQzFDLElBQUksSUFBQSxjQUFLLEVBQUMsWUFBWSxDQUFDLEVBQUU7WUFDdkIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxpQkFDekIsWUFBWSxJQUNULElBQUksRUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFJckI7UUFDQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDeEQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEYsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FDdkMsWUFBWTthQUNULE1BQU0sQ0FDTCxDQUFDLFdBQWdCLEVBQUUsRUFBRTs7WUFDbkIsT0FBQSxDQUFBLE1BQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLE9BQU8sMENBQUUsU0FBUztnQkFDL0IsQ0FBQSxNQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxPQUFPLDBDQUFFLFNBQVMsTUFBSyxrQkFBUyxDQUFDLElBQUk7aUJBQ2xELFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxPQUFPLENBQUMsS0FBSyxDQUFBO2dCQUMxQixXQUFXLENBQUMsY0FBYztnQkFDMUIsSUFBQSx1QkFBVyxFQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtTQUFBLENBQzFDO2FBQ0EsR0FBRyxDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFLFdBQUMsT0FBQSxDQUFDLENBQUEsTUFBQSxXQUFXLENBQUMsT0FBTywwQ0FBRSxLQUFLLEtBQUksRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFlLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUNsSCxDQUFDO1FBRUYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhGLGtDQUFrQztRQUNsQyxJQUFJO1lBQ0YsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FDakMsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsOEJBQThCLENBQUMsT0FBTyxFQUFFLEVBQ3hDLHlCQUF5QixDQUMxQixDQUFDO1NBQ0g7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLDZEQUE2RCxFQUFFLEdBQVksQ0FBQyxDQUFDO1NBQ3ZHO1FBRUQsT0FBTyxrQkFBa0IsQ0FBQztJQUM1QixDQUFDO0lBRU8saUNBQWlDLENBQUMsRUFDeEMsWUFBWSxFQUNaLFVBQVUsRUFDVixVQUFVLEdBS1g7UUFDQyxJQUFJLElBQUEsZ0JBQU8sRUFBQyxZQUFZLENBQUMsRUFBRTtZQUN6QixxREFBcUQ7WUFDckQsT0FBTyw0Q0FBZ0IsQ0FBQztTQUN6QjtRQUVELE1BQU0scUJBQXFCLEdBQUcsWUFBWTthQUN2QyxHQUFHLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2FBQ3ZELElBQUksQ0FBQyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxJQUFBLHVCQUFXLEVBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQywrREFBK0QsRUFBRTtnQkFDeEYsVUFBVTtnQkFDVixVQUFVO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1NBQ25CO1FBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFUyx3QkFBd0IsQ0FDaEMsV0FBb0IsRUFDcEIsWUFBb0IsRUFDcEIsYUFBcUIsRUFDckIsYUFBaUMsRUFDakMsTUFBOEIsRUFDOUIsY0FBdUI7UUFFdkIsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsZ0NBQWdDLENBQUMsK0JBQStCLENBQ25FLFlBQVksRUFDWixhQUFhLEVBQ2IsYUFBYSxFQUNiLE1BQU0sRUFDTixjQUFjLENBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLGFBQWEsRUFDYixTQUFTLEdBQ1c7UUFDcEIsSUFBSSxJQUFBLGNBQUssRUFBQyxZQUFZLENBQUMsRUFBRTtZQUN2QixPQUFPO1NBQ1I7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLElBQUksU0FBUyxDQUFDLENBQUM7UUFDaEgsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUVELE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztZQUN6QyxTQUFTO1lBQ1QsVUFBVTtZQUNWLFVBQVUsRUFBRSxVQUFVLElBQUksU0FBUztZQUNuQyxZQUFZO1lBQ1osU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM5QixhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUM3RSxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE3YkQsa0RBNmJDIn0=
|