@infrab4a/connect-angular 5.0.0-beta.78 → 5.0.0-beta.9
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/angular-connect.module.d.ts +8 -14
- package/angular-firestore.module.d.ts +2 -1
- package/angular-hasura-graphql.module.d.ts +1 -1
- package/consts/firebase-const.d.ts +0 -1
- package/consts/index.d.ts +0 -1
- package/esm2020/angular-connect.module.mjs +115 -0
- package/esm2020/angular-elastic-search.module.mjs +34 -0
- package/esm2020/angular-firebase-auth.module.mjs +115 -0
- package/esm2020/angular-firestore.module.mjs +502 -0
- package/esm2020/angular-hasura-graphql.module.mjs +265 -0
- package/{esm2022 → esm2020}/consts/firebase-const.mjs +1 -2
- package/{esm2022 → esm2020}/consts/index.mjs +1 -2
- package/esm2020/persistence/cookie-data-persistence.mjs +23 -0
- package/{esm2022 → esm2020}/services/auth.service.mjs +6 -6
- package/esm2020/services/cart.service.mjs +281 -0
- package/esm2020/services/catalog/adapters/new-category-structure.adapter.mjs +41 -0
- package/{esm2022 → esm2020}/services/catalog/adapters/old-category-structure.adapter.mjs +6 -6
- package/esm2020/services/catalog/catalog.service.mjs +185 -0
- package/{esm2022 → esm2020}/services/catalog/category.service.mjs +6 -6
- package/{esm2022 → esm2020}/services/catalog/models/category-with-tree.model.mjs +1 -1
- package/esm2020/services/catalog/wishlist.service.mjs +115 -0
- package/{esm2022 → esm2020}/services/checkout-subscription.service.mjs +6 -6
- package/{esm2022 → esm2020}/services/checkout.service.mjs +6 -6
- package/esm2020/services/coupon.service.mjs +235 -0
- package/{esm2022 → esm2020}/services/home-shop.service.mjs +9 -9
- package/{esm2022 → esm2020}/services/order.service.mjs +6 -6
- package/{esm2022 → esm2020}/services/shipping.service.mjs +6 -6
- package/fesm2015/infrab4a-connect-angular.mjs +2408 -0
- package/fesm2015/infrab4a-connect-angular.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/infrab4a-connect-angular.mjs +670 -1186
- package/fesm2020/infrab4a-connect-angular.mjs.map +1 -0
- package/package.json +15 -9
- package/services/cart.service.d.ts +0 -1
- package/services/catalog/catalog.service.d.ts +4 -11
- package/services/catalog/wishlist.service.d.ts +4 -16
- package/services/checkout.service.d.ts +1 -4
- package/services/coupon.service.d.ts +2 -6
- package/angular-vertex-search.module.d.ts +0 -9
- package/consts/vertex-config.const.d.ts +0 -1
- package/esm2022/angular-connect.module.mjs +0 -189
- package/esm2022/angular-elastic-search.module.mjs +0 -34
- package/esm2022/angular-firebase-auth.module.mjs +0 -141
- package/esm2022/angular-firestore.module.mjs +0 -527
- package/esm2022/angular-hasura-graphql.module.mjs +0 -331
- package/esm2022/angular-vertex-search.module.mjs +0 -34
- package/esm2022/consts/vertex-config.const.mjs +0 -2
- package/esm2022/persistence/cookie-data-persistence.mjs +0 -22
- package/esm2022/services/cart.service.mjs +0 -293
- package/esm2022/services/catalog/adapters/new-category-structure.adapter.mjs +0 -43
- package/esm2022/services/catalog/catalog.service.mjs +0 -295
- package/esm2022/services/catalog/wishlist.service.mjs +0 -235
- package/esm2022/services/coupon.service.mjs +0 -284
- package/fesm2022/infrab4a-connect-angular.mjs.map +0 -1
- /package/{esm2022 → esm2020}/consts/backend-url.const.mjs +0 -0
- /package/{esm2022 → esm2020}/consts/category-structure.mjs +0 -0
- /package/{esm2022 → esm2020}/consts/default-shop.const.mjs +0 -0
- /package/{esm2022 → esm2020}/consts/es-config.const.mjs +0 -0
- /package/{esm2022 → esm2020}/consts/hasura-options.const.mjs +0 -0
- /package/{esm2022 → esm2020}/consts/persistence.const.mjs +0 -0
- /package/{esm2022 → esm2020}/consts/storage-base-url.const.mjs +0 -0
- /package/{esm2022 → esm2020}/helpers/index.mjs +0 -0
- /package/{esm2022 → esm2020}/helpers/mobile-operation-system-checker.helper.mjs +0 -0
- /package/{esm2022 → esm2020}/index.mjs +0 -0
- /package/{esm2022 → esm2020}/infrab4a-connect-angular.mjs +0 -0
- /package/{esm2022 → esm2020}/persistence/data-persistence.mjs +0 -0
- /package/{esm2022 → esm2020}/persistence/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/catalog/adapters/category-structure.adapter.mjs +0 -0
- /package/{esm2022 → esm2020}/services/catalog/adapters/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/catalog/enums/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/catalog/enums/product-sorts.enum.mjs +0 -0
- /package/{esm2022 → esm2020}/services/catalog/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/catalog/models/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/catalog/types/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/catalog/types/product-sort.type.mjs +0 -0
- /package/{esm2022 → esm2020}/services/helpers/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/helpers/util.helper.mjs +0 -0
- /package/{esm2022 → esm2020}/services/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/types/index.mjs +0 -0
- /package/{esm2022 → esm2020}/services/types/required-checkout-data.type.mjs +0 -0
- /package/{esm2022 → esm2020}/services/types/required-checkout-subscription-data.type.mjs +0 -0
- /package/{esm2022 → esm2020}/services/types/shipping-methods.type.mjs +0 -0
- /package/{esm2022 → esm2020}/types/firebase-app-config.type.mjs +0 -0
- /package/{esm2022 → esm2020}/types/index.mjs +0 -0
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { PersonTypes, Shops, Wishlist, WishlistLogType, } from '@infrab4a/connect';
|
|
3
|
-
import { DEFAULT_SHOP } from '../../consts';
|
|
4
|
-
import { NewCategoryStructureAdapter } from './adapters';
|
|
5
|
-
import { CatalogService } from './catalog.service';
|
|
6
|
-
import { CategoryService } from './category.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@infrab4a/connect";
|
|
9
|
-
export class WishlistService {
|
|
10
|
-
constructor(wishlistRepository, shop, productRepository, categoryFilterRepository, categoryRepository, productStockNotificationRepository, productSearch, logRepository) {
|
|
11
|
-
this.wishlistRepository = wishlistRepository;
|
|
12
|
-
this.shop = shop;
|
|
13
|
-
this.productRepository = productRepository;
|
|
14
|
-
this.productSearch = productSearch;
|
|
15
|
-
this.logRepository = logRepository;
|
|
16
|
-
const categoryStructureAdapter = new NewCategoryStructureAdapter(wishlistRepository);
|
|
17
|
-
this.catalogService = new CatalogService(productRepository, productStockNotificationRepository, categoryRepository, categoryStructureAdapter, shop, productSearch);
|
|
18
|
-
this.categoryService = new CategoryService(productRepository, categoryRepository, categoryFilterRepository, categoryStructureAdapter, shop);
|
|
19
|
-
}
|
|
20
|
-
getCatalogService() {
|
|
21
|
-
return this.catalogService;
|
|
22
|
-
}
|
|
23
|
-
getCategoryService() {
|
|
24
|
-
return this.categoryService;
|
|
25
|
-
}
|
|
26
|
-
async create({ personId, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
|
|
27
|
-
const data = {
|
|
28
|
-
slug: '',
|
|
29
|
-
name: title,
|
|
30
|
-
description,
|
|
31
|
-
metadatas: [
|
|
32
|
-
{
|
|
33
|
-
shop: this.shop,
|
|
34
|
-
title: `${userFullName} - ${title}`,
|
|
35
|
-
description: `${userFullName} - ${description}`,
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
shop: this.shop,
|
|
39
|
-
shops: [this.shop],
|
|
40
|
-
personId,
|
|
41
|
-
personName: userFullName,
|
|
42
|
-
personPhoto: userPhoto,
|
|
43
|
-
brandCategory: false,
|
|
44
|
-
published,
|
|
45
|
-
theme,
|
|
46
|
-
bannerUrl,
|
|
47
|
-
personType: personType ?? PersonTypes.NONE,
|
|
48
|
-
personIsSubscriber: personIsSubscriber ?? false,
|
|
49
|
-
};
|
|
50
|
-
const hasWishlist = await this.wishlistRepository
|
|
51
|
-
.find({
|
|
52
|
-
filters: {
|
|
53
|
-
personId,
|
|
54
|
-
},
|
|
55
|
-
options: {
|
|
56
|
-
enableCount: false,
|
|
57
|
-
},
|
|
58
|
-
orderBy: {
|
|
59
|
-
id: 'asc',
|
|
60
|
-
},
|
|
61
|
-
})
|
|
62
|
-
.then((res) => res.data);
|
|
63
|
-
await this.createWishlistLog(WishlistLogType.CREATE, data);
|
|
64
|
-
if (hasWishlist.length)
|
|
65
|
-
return hasWishlist.at(0);
|
|
66
|
-
const newWishlist = await this.wishlistRepository.create(data);
|
|
67
|
-
await this.wishlistRepository.update({ id: newWishlist.id, slug: newWishlist.id });
|
|
68
|
-
return Wishlist.toInstance({ ...newWishlist.toPlain(), slug: newWishlist.id });
|
|
69
|
-
}
|
|
70
|
-
async update({ id, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
|
|
71
|
-
const data = {
|
|
72
|
-
id,
|
|
73
|
-
name: title,
|
|
74
|
-
description,
|
|
75
|
-
published,
|
|
76
|
-
metadatas: [
|
|
77
|
-
{
|
|
78
|
-
shop: this.shop,
|
|
79
|
-
title: `${userFullName} - ${title}`,
|
|
80
|
-
description: `${userFullName} - ${description}`,
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
|
-
personName: userFullName,
|
|
84
|
-
personPhoto: userPhoto,
|
|
85
|
-
theme,
|
|
86
|
-
bannerUrl,
|
|
87
|
-
personType: personType ?? PersonTypes.NONE,
|
|
88
|
-
personIsSubscriber: personIsSubscriber ?? false,
|
|
89
|
-
};
|
|
90
|
-
await this.createWishlistLog(WishlistLogType.UPDATE, data);
|
|
91
|
-
return this.wishlistRepository.update(data);
|
|
92
|
-
}
|
|
93
|
-
async delete(wishlistId) {
|
|
94
|
-
const wishlist = await this.findById(wishlistId);
|
|
95
|
-
await this.createWishlistLog(WishlistLogType.DELETE, wishlist);
|
|
96
|
-
return this.wishlistRepository.delete({ id: wishlistId });
|
|
97
|
-
}
|
|
98
|
-
getWishlistBySlug(slug) {
|
|
99
|
-
const [id] = slug.split('-');
|
|
100
|
-
if (+id)
|
|
101
|
-
return this.wishlistRepository.get({ id });
|
|
102
|
-
return this.wishlistRepository.getWishlistBySlug(slug);
|
|
103
|
-
}
|
|
104
|
-
getWishlistsByPerson(personId) {
|
|
105
|
-
return this.wishlistRepository.getWishlistByPerson(personId);
|
|
106
|
-
}
|
|
107
|
-
async addProduct(wishlistId, productId) {
|
|
108
|
-
const wishlist = await this.wishlistRepository.get({ id: wishlistId });
|
|
109
|
-
const hasProduct = wishlist.products.some((p) => p == productId);
|
|
110
|
-
const wishlistData = await this.findById(wishlistId);
|
|
111
|
-
const productData = await this.findProductById(productId);
|
|
112
|
-
await this.createWishlistLog(WishlistLogType.ADD_PRODUCT, wishlistData, productData);
|
|
113
|
-
if (!hasProduct) {
|
|
114
|
-
wishlist.products = [...wishlist.products, productId];
|
|
115
|
-
await this.wishlistRepository.addProduct(wishlistId, productId);
|
|
116
|
-
}
|
|
117
|
-
return wishlist;
|
|
118
|
-
}
|
|
119
|
-
async removeProduct(wishlistId, productId) {
|
|
120
|
-
const wishlist = await this.wishlistRepository.get({ id: wishlistId });
|
|
121
|
-
const productIndex = wishlist.products.findIndex((p) => p == productId);
|
|
122
|
-
if (productIndex != -1) {
|
|
123
|
-
wishlist.products.splice(productIndex, 1);
|
|
124
|
-
const wishlistData = await this.findById(wishlistId);
|
|
125
|
-
const productData = await this.findProductById(productId);
|
|
126
|
-
await this.createWishlistLog(WishlistLogType.REMOVE_PRODUCT, wishlistData, productData);
|
|
127
|
-
await this.wishlistRepository.removeProduct(wishlistId, productId);
|
|
128
|
-
}
|
|
129
|
-
return wishlist;
|
|
130
|
-
}
|
|
131
|
-
async findById(id) {
|
|
132
|
-
return this.wishlistRepository
|
|
133
|
-
.find({
|
|
134
|
-
fields: ['id', 'name', 'description', 'personId', 'personIsSubscriber', 'personType', 'personName'],
|
|
135
|
-
filters: {
|
|
136
|
-
id,
|
|
137
|
-
},
|
|
138
|
-
})
|
|
139
|
-
.then((res) => res.data.at(0));
|
|
140
|
-
}
|
|
141
|
-
async findProductById(id) {
|
|
142
|
-
return this.productRepository
|
|
143
|
-
.find({
|
|
144
|
-
fields: ['id', 'sku', 'EAN', 'name', 'brand'],
|
|
145
|
-
filters: {
|
|
146
|
-
id,
|
|
147
|
-
},
|
|
148
|
-
})
|
|
149
|
-
.then((res) => res.data.at(0));
|
|
150
|
-
}
|
|
151
|
-
async createWishlistLog(type, wishlist, product) {
|
|
152
|
-
switch (type) {
|
|
153
|
-
case WishlistLogType.CREATE:
|
|
154
|
-
case WishlistLogType.UPDATE:
|
|
155
|
-
case WishlistLogType.DELETE:
|
|
156
|
-
await this.logRepository.create({
|
|
157
|
-
collection: 'wishlist',
|
|
158
|
-
date: new Date(),
|
|
159
|
-
operation: WishlistLogType.CREATE ? 'CREATE' : WishlistLogType.UPDATE ? 'UPDATE' : 'DELETE',
|
|
160
|
-
documentId: wishlist.id,
|
|
161
|
-
document: {
|
|
162
|
-
id: wishlist.id,
|
|
163
|
-
shop: this.shop,
|
|
164
|
-
name: wishlist.name,
|
|
165
|
-
description: wishlist.description,
|
|
166
|
-
published: wishlist.published,
|
|
167
|
-
type: type,
|
|
168
|
-
personType: wishlist.personType,
|
|
169
|
-
personId: wishlist.personId,
|
|
170
|
-
personName: wishlist.personName,
|
|
171
|
-
personIsSubscriber: wishlist.personIsSubscriber,
|
|
172
|
-
},
|
|
173
|
-
});
|
|
174
|
-
break;
|
|
175
|
-
case WishlistLogType.ADD_PRODUCT:
|
|
176
|
-
case WishlistLogType.REMOVE_PRODUCT:
|
|
177
|
-
await this.logRepository.create({
|
|
178
|
-
collection: 'wishlist',
|
|
179
|
-
date: new Date(),
|
|
180
|
-
operation: 'UPDATE',
|
|
181
|
-
documentId: wishlist.id,
|
|
182
|
-
document: {
|
|
183
|
-
id: wishlist.id,
|
|
184
|
-
shop: this.shop,
|
|
185
|
-
name: wishlist.name,
|
|
186
|
-
description: wishlist.description,
|
|
187
|
-
published: wishlist.published,
|
|
188
|
-
type: type,
|
|
189
|
-
personType: wishlist.personType,
|
|
190
|
-
personId: wishlist.personId,
|
|
191
|
-
personName: wishlist.personName,
|
|
192
|
-
personIsSubscriber: wishlist.personIsSubscriber,
|
|
193
|
-
productId: product.id,
|
|
194
|
-
productEAN: product.EAN,
|
|
195
|
-
productSKU: product.sku,
|
|
196
|
-
productName: product.name,
|
|
197
|
-
productBrand: product.brand,
|
|
198
|
-
},
|
|
199
|
-
});
|
|
200
|
-
break;
|
|
201
|
-
default:
|
|
202
|
-
break;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WishlistService, deps: [{ token: 'WishlistRepository' }, { token: DEFAULT_SHOP }, { token: 'ProductRepository' }, { token: 'CategoryFilterRepository' }, { token: 'CategoryRepository' }, { token: 'ProductStockNotificationRepository' }, { token: 'ProductSearch' }, { token: 'LogRepository' }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
206
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WishlistService }); }
|
|
207
|
-
}
|
|
208
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WishlistService, decorators: [{
|
|
209
|
-
type: Injectable
|
|
210
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
211
|
-
type: Inject,
|
|
212
|
-
args: ['WishlistRepository']
|
|
213
|
-
}] }, { type: i1.Shops, decorators: [{
|
|
214
|
-
type: Inject,
|
|
215
|
-
args: [DEFAULT_SHOP]
|
|
216
|
-
}] }, { type: undefined, decorators: [{
|
|
217
|
-
type: Inject,
|
|
218
|
-
args: ['ProductRepository']
|
|
219
|
-
}] }, { type: undefined, decorators: [{
|
|
220
|
-
type: Inject,
|
|
221
|
-
args: ['CategoryFilterRepository']
|
|
222
|
-
}] }, { type: undefined, decorators: [{
|
|
223
|
-
type: Inject,
|
|
224
|
-
args: ['CategoryRepository']
|
|
225
|
-
}] }, { type: undefined, decorators: [{
|
|
226
|
-
type: Inject,
|
|
227
|
-
args: ['ProductStockNotificationRepository']
|
|
228
|
-
}] }, { type: undefined, decorators: [{
|
|
229
|
-
type: Inject,
|
|
230
|
-
args: ['ProductSearch']
|
|
231
|
-
}] }, { type: undefined, decorators: [{
|
|
232
|
-
type: Inject,
|
|
233
|
-
args: ['LogRepository']
|
|
234
|
-
}] }] });
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lzaGxpc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvY2F0YWxvZy93aXNobGlzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFLTCxXQUFXLEVBS1gsS0FBSyxFQUNMLFFBQVEsRUFDUixlQUFlLEdBRWhCLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTs7O0FBR3BELE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ2lELGtCQUFzQyxFQUM5QyxJQUFXLEVBQ2QsaUJBQW9DLEVBQ3BDLHdCQUFrRCxFQUN4RCxrQkFBc0MsRUFFcEUsa0NBQXNFLEVBQzVCLGFBQWlDLEVBQ2pDLGFBQTRCO1FBUnZCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDOUMsU0FBSSxHQUFKLElBQUksQ0FBTztRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFLOUIsa0JBQWEsR0FBYixhQUFhLENBQW9CO1FBQ2pDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRXRFLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBRXBGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQ3RDLGlCQUFpQixFQUNqQixrQ0FBa0MsRUFDbEMsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixJQUFJLEVB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QWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBTU4sTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLFlBQVk7OzBCQUNuQixNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsMEJBQTBCOzswQkFDakMsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLG9DQUFvQzs7MEJBRTNDLE1BQU07MkJBQUMsZUFBZTs7MEJBQ3RCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBDYXRlZ29yeUZpbHRlclJlcG9zaXRvcnksXG4gIENhdGVnb3J5UmVwb3NpdG9yeSxcbiAgTG9nUmVwb3NpdG9yeSxcbiAgUGVyc29uVHlwZSxcbiAgUGVyc29uVHlwZXMsXG4gIFByb2R1Y3QsXG4gIFByb2R1Y3RSZXBvc2l0b3J5LFxuICBQcm9kdWN0U2VhcmNoSW5kZXgsXG4gIFByb2R1Y3RTdG9ja05vdGlmaWNhdGlvblJlcG9zaXRvcnksXG4gIFNob3BzLFxuICBXaXNobGlzdCxcbiAgV2lzaGxpc3RMb2dUeXBlLFxuICBXaXNobGlzdFJlcG9zaXRvcnksXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xuaW1wb3J0IHsgREVGQVVMVF9TSE9QIH0gZnJvbSAnLi4vLi4vY29uc3RzJ1xuaW1wb3J0IHsgTmV3Q2F0ZWdvcnlTdHJ1Y3R1cmVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVycydcbmltcG9ydCB7IENhdGFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9jYXRhbG9nLnNlcnZpY2UnXG5pbXBvcnQgeyBDYXRlZ29yeVNlcnZpY2UgfSBmcm9tICcuL2NhdGVnb3J5LnNlcnZpY2UnXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXaXNobGlzdFNlcnZpY2Uge1xuICBwcml2YXRlIGNhdGFsb2dTZXJ2aWNlOiBDYXRhbG9nU2VydmljZVxuICBwcml2YXRlIGNhdGVnb3J5U2VydmljZTogQ2F0ZWdvcnlTZXJ2aWNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnV2lzaGxpc3RSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSB3aXNobGlzdFJlcG9zaXRvcnk6IFdpc2hsaXN0UmVwb3NpdG9yeSxcbiAgICBASW5qZWN0KERFRkFVTFRfU0hPUCkgcHJpdmF0ZSByZWFkb25seSBzaG9wOiBTaG9wcyxcbiAgICBASW5qZWN0KCdQcm9kdWN0UmVwb3NpdG9yeScpIHB1YmxpYyBwcm9kdWN0UmVwb3NpdG9yeTogUHJvZHVjdFJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlGaWx0ZXJSZXBvc2l0b3J5JykgY2F0ZWdvcnlGaWx0ZXJSZXBvc2l0b3J5OiBDYXRlZ29yeUZpbHRlclJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlSZXBvc2l0b3J5JykgY2F0ZWdvcnlSZXBvc2l0b3J5OiBDYXRlZ29yeVJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnUHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeScpXG4gICAgcHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeTogUHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeSxcbiAgICBASW5qZWN0KCdQcm9kdWN0U2VhcmNoJykgcHJpdmF0ZSByZWFkb25seSBwcm9kdWN0U2VhcmNoOiBQcm9kdWN0U2VhcmNoSW5kZXgsXG4gICAgQEluamVjdCgnTG9nUmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgbG9nUmVwb3NpdG9yeTogTG9nUmVwb3NpdG9yeSxcbiAgKSB7XG4gICAgY29uc3QgY2F0ZWdvcnlTdHJ1Y3R1cmVBZGFwdGVyID0gbmV3IE5ld0NhdGVnb3J5U3RydWN0dXJlQWRhcHRlcih3aXNobGlzdFJlcG9zaXRvcnkpXG5cbiAgICB0aGlzLmNhdGFsb2dTZXJ2aWNlID0gbmV3IENhdGFsb2dTZXJ2aWNlPFdpc2hsaXN0PihcbiAgICAgIHByb2R1Y3RSZXBvc2l0b3J5LFxuICAgICAgcHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5UmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5U3RydWN0dXJlQWRhcHRlcixcbiAgICAgIHNob3AsXG4gICAgICBwcm9kdWN0U2VhcmNoLFxuICAgIClcbiAgICB0aGlzLmNhdGVnb3J5U2VydmljZSA9IG5ldyBDYXRlZ29yeVNlcnZpY2UoXG4gICAgICBwcm9kdWN0UmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5UmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5RmlsdGVyUmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5U3RydWN0dXJlQWRhcHRlcixcbiAgICAgIHNob3AsXG4gICAgKVxuICB9XG5cbiAgZ2V0Q2F0YWxvZ1NlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2VcbiAgfVxuXG4gIGdldENhdGVnb3J5U2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRlZ29yeVNlcnZpY2VcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZSh7XG4gICAgcGVyc29uSWQsXG4gICAgdGl0bGUsXG4gICAgZGVzY3JpcHRpb24sXG4gICAgcHVibGlzaGVkLFxuICAgIHVzZXJGdWxsTmFtZSxcbiAgICB1c2VyUGhvdG8sXG4gICAgdGhlbWUsXG4gICAgYmFubmVyVXJsLFxuICAgIHBlcnNvblR5cGUsXG4gICAgcGVyc29uSXNTdWJzY3JpYmVyLFxuICB9OiB7XG4gICAgcGVyc29uSWQ6IHN0cmluZ1xuICAgIHRpdGxlOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgcHVibGlzaGVkOiBib29sZWFuXG4gICAgdXNlckZ1bGxOYW1lOiBzdHJpbmdcbiAgICB1c2VyUGhvdG8/OiBzdHJpbmdcbiAgICB0aGVtZT86IHN0cmluZ1xuICAgIGJhbm5lclVybD86IHN0cmluZ1xuICAgIHBlcnNvblR5cGU/OiBQZXJzb25UeXBlXG4gICAgcGVyc29uSXNTdWJzY3JpYmVyPzogYm9vbGVhblxuICB9KTogUHJvbWlzZTxXaXNobGlzdD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBzbHVnOiAnJyxcbiAgICAgIG5hbWU6IHRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBtZXRhZGF0YXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNob3A6IHRoaXMuc2hvcCxcbiAgICAgICAgICB0aXRsZTogYCR7dXNlckZ1bGxOYW1lfSAtICR7dGl0bGV9YCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7dXNlckZ1bGxOYW1lfSAtICR7ZGVzY3JpcHRpb259YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBzaG9wOiB0aGlzLnNob3AsXG4gICAgICBzaG9wczogW3RoaXMuc2hvcF0sXG4gICAgICBwZXJzb25JZCxcbiAgICAgIHBlcnNvbk5hbWU6IHVzZXJGdWxsTmFtZSxcbiAgICAgIHBlcnNvblBob3RvOiB1c2VyUGhvdG8sXG4gICAgICBicmFuZENhdGVnb3J5OiBmYWxzZSxcbiAgICAgIHB1Ymxpc2hlZCxcbiAgICAgIHRoZW1lLFxuICAgICAgYmFubmVyVXJsLFxuICAgICAgcGVyc29uVHlwZTogcGVyc29uVHlwZSA/PyBQZXJzb25UeXBlcy5OT05FLFxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiBwZXJzb25Jc1N1YnNjcmliZXIgPz8gZmFsc2UsXG4gICAgfVxuXG4gICAgY29uc3QgaGFzV2lzaGxpc3QgPSBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeVxuICAgICAgLmZpbmQoe1xuICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgcGVyc29uSWQsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbmFibGVDb3VudDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGVyQnk6IHtcbiAgICAgICAgICBpZDogJ2FzYycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEpXG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5DUkVBVEUsIGRhdGEgYXMgV2lzaGxpc3QpXG5cbiAgICBpZiAoaGFzV2lzaGxpc3QubGVuZ3RoKSByZXR1cm4gaGFzV2lzaGxpc3QuYXQoMClcblxuICAgIGNvbnN0IG5ld1dpc2hsaXN0ID0gYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuY3JlYXRlKGRhdGEpXG4gICAgYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkudXBkYXRlKHsgaWQ6IG5ld1dpc2hsaXN0LmlkLCBzbHVnOiBuZXdXaXNobGlzdC5pZCB9KVxuXG4gICAgcmV0dXJuIFdpc2hsaXN0LnRvSW5zdGFuY2UoeyAuLi5uZXdXaXNobGlzdC50b1BsYWluKCksIHNsdWc6IG5ld1dpc2hsaXN0LmlkIH0pXG4gIH1cblxuICBhc3luYyB1cGRhdGUoe1xuICAgIGlkLFxuICAgIHRpdGxlLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIHB1Ymxpc2hlZCxcbiAgICB1c2VyRnVsbE5hbWUsXG4gICAgdXNlclBob3RvLFxuICAgIHRoZW1lLFxuICAgIGJhbm5lclVybCxcbiAgICBwZXJzb25UeXBlLFxuICAgIHBlcnNvbklzU3Vic2NyaWJlcixcbiAgfToge1xuICAgIGlkOiBzdHJpbmdcbiAgICB0aXRsZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHB1Ymxpc2hlZDogYm9vbGVhblxuICAgIHVzZXJGdWxsTmFtZTogc3RyaW5nXG4gICAgdXNlclBob3RvPzogc3RyaW5nXG4gICAgdGhlbWU/OiBzdHJpbmdcbiAgICBiYW5uZXJVcmw/OiBzdHJpbmdcbiAgICBwZXJzb25UeXBlPzogUGVyc29uVHlwZVxuICAgIHBlcnNvbklzU3Vic2NyaWJlcj86IGJvb2xlYW5cbiAgfSk6IFByb21pc2U8V2lzaGxpc3Q+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiB0aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgcHVibGlzaGVkLFxuICAgICAgbWV0YWRhdGFzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzaG9wOiB0aGlzLnNob3AsXG4gICAgICAgICAgdGl0bGU6IGAke3VzZXJGdWxsTmFtZX0gLSAke3RpdGxlfWAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke3VzZXJGdWxsTmFtZX0gLSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcGVyc29uTmFtZTogdXNlckZ1bGxOYW1lLFxuICAgICAgcGVyc29uUGhvdG86IHVzZXJQaG90byxcbiAgICAgIHRoZW1lLFxuICAgICAgYmFubmVyVXJsLFxuICAgICAgcGVyc29uVHlwZTogcGVyc29uVHlwZSA/PyBQZXJzb25UeXBlcy5OT05FLFxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiBwZXJzb25Jc1N1YnNjcmliZXIgPz8gZmFsc2UsXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuVVBEQVRFLCBkYXRhIGFzIFdpc2hsaXN0KVxuXG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LnVwZGF0ZShkYXRhKVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKHdpc2hsaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdpc2hsaXN0ID0gYXdhaXQgdGhpcy5maW5kQnlJZCh3aXNobGlzdElkKVxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2lzaGxpc3RMb2coV2lzaGxpc3RMb2dUeXBlLkRFTEVURSwgd2lzaGxpc3QpXG5cbiAgICByZXR1cm4gdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuZGVsZXRlKHsgaWQ6IHdpc2hsaXN0SWQgfSlcbiAgfVxuXG4gIGdldFdpc2hsaXN0QnlTbHVnKHNsdWc6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3Q+IHtcbiAgICBjb25zdCBbaWRdID0gc2x1Zy5zcGxpdCgnLScpXG5cbiAgICBpZiAoK2lkKSByZXR1cm4gdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuZ2V0KHsgaWQgfSlcblxuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXRXaXNobGlzdEJ5U2x1ZyhzbHVnKVxuICB9XG5cbiAgZ2V0V2lzaGxpc3RzQnlQZXJzb24ocGVyc29uSWQ6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3RbXT4ge1xuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXRXaXNobGlzdEJ5UGVyc29uKHBlcnNvbklkKVxuICB9XG5cbiAgYXN5bmMgYWRkUHJvZHVjdCh3aXNobGlzdElkOiBzdHJpbmcsIHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxXaXNobGlzdD4ge1xuICAgIGNvbnN0IHdpc2hsaXN0ID0gYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuZ2V0KHsgaWQ6IHdpc2hsaXN0SWQgfSlcbiAgICBjb25zdCBoYXNQcm9kdWN0ID0gd2lzaGxpc3QucHJvZHVjdHMuc29tZSgocCkgPT4gcCA9PSBwcm9kdWN0SWQpXG5cbiAgICBjb25zdCB3aXNobGlzdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRCeUlkKHdpc2hsaXN0SWQpXG4gICAgY29uc3QgcHJvZHVjdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRQcm9kdWN0QnlJZChwcm9kdWN0SWQpXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuQUREX1BST0RVQ1QsIHdpc2hsaXN0RGF0YSwgcHJvZHVjdERhdGEpXG5cbiAgICBpZiAoIWhhc1Byb2R1Y3QpIHtcbiAgICAgIHdpc2hsaXN0LnByb2R1Y3RzID0gWy4uLndpc2hsaXN0LnByb2R1Y3RzLCBwcm9kdWN0SWRdXG4gICAgICBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5hZGRQcm9kdWN0KHdpc2hsaXN0SWQsIHByb2R1Y3RJZClcbiAgICB9XG5cbiAgICByZXR1cm4gd2lzaGxpc3RcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVByb2R1Y3Qod2lzaGxpc3RJZDogc3RyaW5nLCBwcm9kdWN0SWQ6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3Q+IHtcbiAgICBjb25zdCB3aXNobGlzdCA9IGF3YWl0IHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmdldCh7IGlkOiB3aXNobGlzdElkIH0pXG4gICAgY29uc3QgcHJvZHVjdEluZGV4ID0gd2lzaGxpc3QucHJvZHVjdHMuZmluZEluZGV4KChwKSA9PiBwID09IHByb2R1Y3RJZClcblxuICAgIGlmIChwcm9kdWN0SW5kZXggIT0gLTEpIHtcbiAgICAgIHdpc2hsaXN0LnByb2R1Y3RzLnNwbGljZShwcm9kdWN0SW5kZXgsIDEpXG4gICAgICBjb25zdCB3aXNobGlzdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRCeUlkKHdpc2hsaXN0SWQpXG4gICAgICBjb25zdCBwcm9kdWN0RGF0YSA9IGF3YWl0IHRoaXMuZmluZFByb2R1Y3RCeUlkKHByb2R1Y3RJZClcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlV2lzaGxpc3RMb2coV2lzaGxpc3RMb2dUeXBlLlJFTU9WRV9QUk9EVUNULCB3aXNobGlzdERhdGEsIHByb2R1Y3REYXRhKVxuICAgICAgYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkucmVtb3ZlUHJvZHVjdCh3aXNobGlzdElkLCBwcm9kdWN0SWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpc2hsaXN0XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpZWxkczogWydpZCcsICduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ3BlcnNvbklkJywgJ3BlcnNvbklzU3Vic2NyaWJlcicsICdwZXJzb25UeXBlJywgJ3BlcnNvbk5hbWUnXSxcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5kYXRhLmF0KDApKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUHJvZHVjdEJ5SWQoaWQ6IHN0cmluZyk6IFByb21pc2U8UHJvZHVjdD4ge1xuICAgIHJldHVybiB0aGlzLnByb2R1Y3RSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpZWxkczogWydpZCcsICdza3UnLCAnRUFOJywgJ25hbWUnLCAnYnJhbmQnXSxcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5kYXRhLmF0KDApKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVXaXNobGlzdExvZyh0eXBlOiBXaXNobGlzdExvZ1R5cGUsIHdpc2hsaXN0OiBXaXNobGlzdCwgcHJvZHVjdD86IFByb2R1Y3QpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkNSRUFURTpcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLlVQREFURTpcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkRFTEVURTpcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dSZXBvc2l0b3J5LmNyZWF0ZSh7XG4gICAgICAgICAgY29sbGVjdGlvbjogJ3dpc2hsaXN0JyxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogV2lzaGxpc3RMb2dUeXBlLkNSRUFURSA/ICdDUkVBVEUnIDogV2lzaGxpc3RMb2dUeXBlLlVQREFURSA/ICdVUERBVEUnIDogJ0RFTEVURScsXG4gICAgICAgICAgZG9jdW1lbnRJZDogd2lzaGxpc3QuaWQsXG4gICAgICAgICAgZG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIGlkOiB3aXNobGlzdC5pZCxcbiAgICAgICAgICAgIHNob3A6IHRoaXMuc2hvcCxcbiAgICAgICAgICAgIG5hbWU6IHdpc2hsaXN0Lm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogd2lzaGxpc3QuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwdWJsaXNoZWQ6IHdpc2hsaXN0LnB1Ymxpc2hlZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBwZXJzb25UeXBlOiB3aXNobGlzdC5wZXJzb25UeXBlLFxuICAgICAgICAgICAgcGVyc29uSWQ6IHdpc2hsaXN0LnBlcnNvbklkLFxuICAgICAgICAgICAgcGVyc29uTmFtZTogd2lzaGxpc3QucGVyc29uTmFtZSxcbiAgICAgICAgICAgIHBlcnNvbklzU3Vic2NyaWJlcjogd2lzaGxpc3QucGVyc29uSXNTdWJzY3JpYmVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkFERF9QUk9EVUNUOlxuICAgICAgY2FzZSBXaXNobGlzdExvZ1R5cGUuUkVNT1ZFX1BST0RVQ1Q6XG4gICAgICAgIGF3YWl0IHRoaXMubG9nUmVwb3NpdG9yeS5jcmVhdGUoe1xuICAgICAgICAgIGNvbGxlY3Rpb246ICd3aXNobGlzdCcsXG4gICAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBvcGVyYXRpb246ICdVUERBVEUnLFxuICAgICAgICAgIGRvY3VtZW50SWQ6IHdpc2hsaXN0LmlkLFxuICAgICAgICAgIGRvY3VtZW50OiB7XG4gICAgICAgICAgICBpZDogd2lzaGxpc3QuaWQsXG4gICAgICAgICAgICBzaG9wOiB0aGlzLnNob3AsXG4gICAgICAgICAgICBuYW1lOiB3aXNobGlzdC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHdpc2hsaXN0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHVibGlzaGVkOiB3aXNobGlzdC5wdWJsaXNoZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgcGVyc29uVHlwZTogd2lzaGxpc3QucGVyc29uVHlwZSxcbiAgICAgICAgICAgIHBlcnNvbklkOiB3aXNobGlzdC5wZXJzb25JZCxcbiAgICAgICAgICAgIHBlcnNvbk5hbWU6IHdpc2hsaXN0LnBlcnNvbk5hbWUsXG4gICAgICAgICAgICBwZXJzb25Jc1N1YnNjcmliZXI6IHdpc2hsaXN0LnBlcnNvbklzU3Vic2NyaWJlcixcbiAgICAgICAgICAgIHByb2R1Y3RJZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICAgIHByb2R1Y3RFQU46IHByb2R1Y3QuRUFOLFxuICAgICAgICAgICAgcHJvZHVjdFNLVTogcHJvZHVjdC5za3UsXG4gICAgICAgICAgICBwcm9kdWN0TmFtZTogcHJvZHVjdC5uYW1lLFxuICAgICAgICAgICAgcHJvZHVjdEJyYW5kOiBwcm9kdWN0LmJyYW5kLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { CheckoutTypes, CouponTypes, Exclusivities, OrderStatus, Shops, Where, } from '@infrab4a/connect';
|
|
3
|
-
import { from, of } from 'rxjs';
|
|
4
|
-
import { concatMap, map } from 'rxjs/operators';
|
|
5
|
-
import { DEFAULT_SHOP } from '../consts';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@infrab4a/connect";
|
|
8
|
-
export class CouponService {
|
|
9
|
-
constructor(couponRepository, defaultShop, orderRepository, categoryRepository) {
|
|
10
|
-
this.couponRepository = couponRepository;
|
|
11
|
-
this.defaultShop = defaultShop;
|
|
12
|
-
this.orderRepository = orderRepository;
|
|
13
|
-
this.categoryRepository = categoryRepository;
|
|
14
|
-
this.emailIsFromCollaborator = (userEmail) => !!userEmail?.match(/@b4a.com.br/g);
|
|
15
|
-
}
|
|
16
|
-
checkCoupon(nickname, checkoutType, checkout, plan) {
|
|
17
|
-
return from(this.couponRepository
|
|
18
|
-
.find({
|
|
19
|
-
filters: {
|
|
20
|
-
nickname: { operator: Where.EQUALS, value: nickname },
|
|
21
|
-
active: { operator: Where.EQUALS, value: true },
|
|
22
|
-
},
|
|
23
|
-
})
|
|
24
|
-
.then((result) => result.data[0])).pipe(concatMap((coupon) => this.couponValidation(coupon, checkoutType)), concatMap((couponValid) => this.couponRulesValidation(couponValid, checkoutType, checkout, plan)), map((couponValidated) => couponValidated));
|
|
25
|
-
}
|
|
26
|
-
async couponValidation(coupon, checkoutType) {
|
|
27
|
-
if (!coupon)
|
|
28
|
-
throw 'Cupom inválido.';
|
|
29
|
-
if (coupon?.beginAt && coupon?.beginAt.getTime() > new Date().getTime())
|
|
30
|
-
throw 'Cupom inválido.';
|
|
31
|
-
if (coupon?.expiresIn && coupon?.expiresIn.getTime() < new Date().getTime())
|
|
32
|
-
throw 'Cupom expirado.';
|
|
33
|
-
const isInShop = coupon.shopAvailability === Shops.ALL || coupon.shopAvailability === this.defaultShop;
|
|
34
|
-
if (!isInShop)
|
|
35
|
-
throw 'Cupom inválido para loja.';
|
|
36
|
-
const isCheckoutType = coupon.checkoutType === CheckoutTypes.ALL || coupon.checkoutType === checkoutType;
|
|
37
|
-
if (!isCheckoutType)
|
|
38
|
-
throw 'Cupom inválido. Erro de checkout.';
|
|
39
|
-
return coupon;
|
|
40
|
-
}
|
|
41
|
-
async couponRulesValidation(coupon, checkoutType, checkout, plan) {
|
|
42
|
-
if (checkoutType == CheckoutTypes.SUBSCRIPTION) {
|
|
43
|
-
if (coupon.plan && coupon.plan.toUpperCase() !== plan.toUpperCase())
|
|
44
|
-
throw 'Cupom inválido para sua assinatura.';
|
|
45
|
-
return coupon;
|
|
46
|
-
}
|
|
47
|
-
const validUser = this.coupomUserValidation(coupon, checkout?.user);
|
|
48
|
-
if (!validUser)
|
|
49
|
-
throw 'Usuário não elegível.';
|
|
50
|
-
const couponUseLimits = this.getCouponUseLimits(coupon, checkoutType, checkout.user);
|
|
51
|
-
if (couponUseLimits.firstOrder) {
|
|
52
|
-
const ordersUser = await this.getOrdersFromUser(checkout.user.email.toLocaleLowerCase());
|
|
53
|
-
if (couponUseLimits.firstOrder && ordersUser.length >= 1)
|
|
54
|
-
throw 'Limite de uso atingido';
|
|
55
|
-
}
|
|
56
|
-
if (!couponUseLimits.unlimited || couponUseLimits.limitedPerUser) {
|
|
57
|
-
const ordersCoupon = await this.getOrdersWithCoupon(coupon);
|
|
58
|
-
if (!couponUseLimits.unlimited && couponUseLimits.total && ordersCoupon.length >= couponUseLimits.total)
|
|
59
|
-
throw 'Limite de uso atingido.';
|
|
60
|
-
if (couponUseLimits.limitedPerUser) {
|
|
61
|
-
const ordersWithUser = this.countOrdersWithUser(ordersCoupon, checkout.user.email);
|
|
62
|
-
if (ordersWithUser > 0)
|
|
63
|
-
throw 'Limite de uso por usuário atingido.';
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
const hasProductCategories = await this.hasProductCategories(coupon, checkout);
|
|
67
|
-
if (!hasProductCategories)
|
|
68
|
-
throw 'Seu carrinho não possui produtos elegíveis para desconto.';
|
|
69
|
-
const hasMinSubTotal = await this.hasMinSubTotal(coupon, checkout);
|
|
70
|
-
if (!hasMinSubTotal) {
|
|
71
|
-
if (coupon.productsCategories?.length) {
|
|
72
|
-
throw `Valor mínimo de ${Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(coupon.minSubTotalValue)} não atingido na(s) categoria(s) elegíveis para o desconto.`;
|
|
73
|
-
}
|
|
74
|
-
throw `Valor mínimo de ${Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(coupon.minSubTotalValue)} não atingido.`;
|
|
75
|
-
}
|
|
76
|
-
return coupon;
|
|
77
|
-
}
|
|
78
|
-
calcDiscountSubscription(coupon, checkout) {
|
|
79
|
-
let discount = 0;
|
|
80
|
-
if (coupon.discount.subscription.type == CouponTypes.ABSOLUTE)
|
|
81
|
-
discount = coupon.discount.subscription.value;
|
|
82
|
-
else
|
|
83
|
-
discount = checkout.subscriptionPlan.recurrencePrice * (coupon.discount.subscription.value / 100);
|
|
84
|
-
return of(discount);
|
|
85
|
-
}
|
|
86
|
-
async calcDiscountShopping(coupon, checkout) {
|
|
87
|
-
let discountInfo = null;
|
|
88
|
-
if (checkout.user.isSubscriber && coupon.discount.subscriber.value) {
|
|
89
|
-
discountInfo = await this.calcDiscountByType(coupon.discount.subscriber.type, coupon.discount.subscriber.value, coupon.productsCategories, checkout);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
discountInfo = await this.calcDiscountByType(coupon.discount.non_subscriber.type, coupon.discount.non_subscriber.value, coupon.productsCategories, checkout);
|
|
93
|
-
}
|
|
94
|
-
return { discount: discountInfo.discount, lineItems: discountInfo.lineItems };
|
|
95
|
-
}
|
|
96
|
-
async calcDiscountByType(type, value, categories, checkout) {
|
|
97
|
-
let discount = 0;
|
|
98
|
-
if (type == CouponTypes.SHIPPING) {
|
|
99
|
-
const subTotal = checkout.shipping.ShippingPrice;
|
|
100
|
-
const discount = +(subTotal * ((value > 100 ? 100 : value) / 100)).toFixed(2);
|
|
101
|
-
return { discount, lineItems: checkout.lineItems };
|
|
102
|
-
}
|
|
103
|
-
const lineItensElegibleForDiscount = await this.getLineItensEligebleForDiscount(categories, checkout);
|
|
104
|
-
const subTotal = this.calcCheckoutSubtotal(lineItensElegibleForDiscount, checkout.user);
|
|
105
|
-
if (type == CouponTypes.ABSOLUTE) {
|
|
106
|
-
discount = value > subTotal ? subTotal : value;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
discount = +(subTotal * ((value > 100 ? 100 : value) / 100)).toFixed(2);
|
|
110
|
-
}
|
|
111
|
-
const lineItems = this.calcLineItenDiscount(type, lineItensElegibleForDiscount, value, subTotal);
|
|
112
|
-
return { discount, lineItems };
|
|
113
|
-
}
|
|
114
|
-
async hasMinSubTotal(coupon, checkout) {
|
|
115
|
-
if (!coupon.minSubTotalValue)
|
|
116
|
-
return true;
|
|
117
|
-
const lineItensDiscount = await this.getLineItensEligebleForDiscount(coupon.productsCategories, checkout);
|
|
118
|
-
const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user);
|
|
119
|
-
if (coupon.minSubTotalValue <= subTotal)
|
|
120
|
-
return true;
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
async hasProductCategories(coupon, checkout) {
|
|
124
|
-
if (!coupon.productsCategories || !coupon.productsCategories?.length) {
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
const couponCategories = await this.getCouponCategoriesId(coupon.productsCategories);
|
|
128
|
-
const hasCategories = checkout.lineItems?.filter((item) => {
|
|
129
|
-
if (item.isGift)
|
|
130
|
-
return false;
|
|
131
|
-
if (!item.categories || !item.categories?.length)
|
|
132
|
-
return true;
|
|
133
|
-
return item.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
134
|
-
});
|
|
135
|
-
return hasCategories.length ? true : false;
|
|
136
|
-
}
|
|
137
|
-
coupomUserValidation(coupon, user) {
|
|
138
|
-
if (!user || coupon.exclusivityType.includes(Exclusivities.ALL_USERS))
|
|
139
|
-
return true;
|
|
140
|
-
let userTypes = [];
|
|
141
|
-
if (coupon.exclusivityType.includes(Exclusivities.COLLABORATORS) &&
|
|
142
|
-
this.emailIsFromCollaborator(user.email.toLocaleLowerCase()))
|
|
143
|
-
userTypes.push(Exclusivities.COLLABORATORS);
|
|
144
|
-
if (coupon.exclusivityType.includes(Exclusivities.SPECIFIC_USER) &&
|
|
145
|
-
coupon.userExclusiveEmail.includes(user.email.toLocaleLowerCase()))
|
|
146
|
-
userTypes.push(Exclusivities.SPECIFIC_USER);
|
|
147
|
-
if (coupon.exclusivityType.includes(Exclusivities.ACTIVE_SUBSCRIBER) &&
|
|
148
|
-
user.isSubscriber &&
|
|
149
|
-
user.subscriptionPlan != '')
|
|
150
|
-
userTypes.push(Exclusivities.ACTIVE_SUBSCRIBER);
|
|
151
|
-
if (user.isSubscriber &&
|
|
152
|
-
user.subscriptionPlan == '' &&
|
|
153
|
-
coupon.exclusivityType.includes(Exclusivities.INACTIVE_SUBSCRIBER))
|
|
154
|
-
userTypes.push(Exclusivities.INACTIVE_SUBSCRIBER);
|
|
155
|
-
if (coupon.exclusivityType.includes(Exclusivities.NON_SUBSCRIBER) && !user.isSubscriber)
|
|
156
|
-
userTypes.push(Exclusivities.NON_SUBSCRIBER);
|
|
157
|
-
return coupon.exclusivityType.some((r) => userTypes.includes(r));
|
|
158
|
-
}
|
|
159
|
-
async getCouponCategoriesId(productsCategories) {
|
|
160
|
-
const couponCategories = [];
|
|
161
|
-
for (let index = 0; index < productsCategories.length; index++) {
|
|
162
|
-
const category = await this.categoryRepository.get({
|
|
163
|
-
id: productsCategories[index],
|
|
164
|
-
});
|
|
165
|
-
if (category) {
|
|
166
|
-
const children = await this.categoryRepository.getChildren(parseInt(productsCategories[index]));
|
|
167
|
-
couponCategories.push(category.id, ...children.map((c) => c.id.toString()));
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
return [...new Set(couponCategories)];
|
|
171
|
-
}
|
|
172
|
-
async getLineItensEligebleForDiscount(productsCategories, checkout) {
|
|
173
|
-
let lineItensDiscount = [];
|
|
174
|
-
const couponCategories = await this.getCouponCategoriesId(productsCategories);
|
|
175
|
-
if (productsCategories && productsCategories.length) {
|
|
176
|
-
lineItensDiscount = checkout.lineItems?.filter((item) => {
|
|
177
|
-
if (item.isGift)
|
|
178
|
-
return false;
|
|
179
|
-
if (item.categories?.length) {
|
|
180
|
-
return item.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
181
|
-
}
|
|
182
|
-
return true;
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
lineItensDiscount = checkout.lineItems.filter((item) => !item.isGift);
|
|
187
|
-
}
|
|
188
|
-
return lineItensDiscount;
|
|
189
|
-
}
|
|
190
|
-
calcCheckoutSubtotal(lineItens, user) {
|
|
191
|
-
return (lineItens
|
|
192
|
-
?.filter((item) => !item.isGift)
|
|
193
|
-
.reduce((acc, curr) => user?.isSubscriber && curr.price.subscriberPrice
|
|
194
|
-
? acc + curr.price?.subscriberPrice * curr.quantity
|
|
195
|
-
: acc + curr.pricePaid * curr.quantity, 0) || 0);
|
|
196
|
-
}
|
|
197
|
-
async getOrdersWithCoupon(coupon) {
|
|
198
|
-
return await this.orderRepository
|
|
199
|
-
.find({
|
|
200
|
-
filters: {
|
|
201
|
-
coupon: { id: coupon.id },
|
|
202
|
-
status: { operator: Where.NOTEQUALS, value: OrderStatus.CANCELADO },
|
|
203
|
-
},
|
|
204
|
-
})
|
|
205
|
-
.then((result) => result.data);
|
|
206
|
-
}
|
|
207
|
-
async getOrdersFromUser(email) {
|
|
208
|
-
return await this.orderRepository
|
|
209
|
-
.find({
|
|
210
|
-
filters: {
|
|
211
|
-
user: { email: { operator: Where.EQUALS, value: email } },
|
|
212
|
-
status: { operator: Where.NOTEQUALS, value: OrderStatus.CANCELADO },
|
|
213
|
-
},
|
|
214
|
-
})
|
|
215
|
-
.then((result) => result.data);
|
|
216
|
-
}
|
|
217
|
-
countOrdersWithUser(orders, email) {
|
|
218
|
-
return orders.filter((o) => o.user.email == email).length;
|
|
219
|
-
}
|
|
220
|
-
getCouponUseLimits(coupon, checkoutType, user) {
|
|
221
|
-
let couponUseLimits;
|
|
222
|
-
if (checkoutType == CheckoutTypes.ECOMMERCE || checkoutType == CheckoutTypes.ALL) {
|
|
223
|
-
if (coupon.exclusivityType.length === 1 &&
|
|
224
|
-
(coupon.exclusivityType.at(0) === Exclusivities.SPECIFIC_USER ||
|
|
225
|
-
coupon.exclusivityType.at(0) === Exclusivities.COLLABORATORS))
|
|
226
|
-
couponUseLimits = coupon.useLimits.non_subscriber;
|
|
227
|
-
else
|
|
228
|
-
couponUseLimits = user && user.isSubscriber ? coupon.useLimits.subscriber : coupon.useLimits.non_subscriber;
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
couponUseLimits = coupon.useLimits.subscription;
|
|
232
|
-
}
|
|
233
|
-
return couponUseLimits;
|
|
234
|
-
}
|
|
235
|
-
calcLineItenDiscount(type, lineItems, couponDiscount, subTotal) {
|
|
236
|
-
let lineItemsDiscount = [];
|
|
237
|
-
if (type === CouponTypes.ABSOLUTE) {
|
|
238
|
-
const couponDiscountMax = couponDiscount > subTotal ? subTotal : couponDiscount;
|
|
239
|
-
lineItemsDiscount = lineItems.map((item) => {
|
|
240
|
-
if (item.isGift)
|
|
241
|
-
return item;
|
|
242
|
-
const totalItemPercentage = item.pricePaid / subTotal;
|
|
243
|
-
const discountItem = couponDiscountMax * totalItemPercentage;
|
|
244
|
-
return {
|
|
245
|
-
...item,
|
|
246
|
-
discount: Number(discountItem.toFixed(2)),
|
|
247
|
-
};
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
lineItemsDiscount = lineItems.map((item) => {
|
|
252
|
-
if (item.isGift)
|
|
253
|
-
return item;
|
|
254
|
-
const discountItem = item.pricePaid * (couponDiscount / 100);
|
|
255
|
-
return {
|
|
256
|
-
...item,
|
|
257
|
-
discount: Number(discountItem.toFixed(2)),
|
|
258
|
-
};
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
return lineItemsDiscount;
|
|
262
|
-
}
|
|
263
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponService, deps: [{ token: 'CouponRepository' }, { token: DEFAULT_SHOP }, { token: 'OrderRepository' }, { token: 'CategoryRepository' }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
264
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponService, providedIn: 'root' }); }
|
|
265
|
-
}
|
|
266
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponService, decorators: [{
|
|
267
|
-
type: Injectable,
|
|
268
|
-
args: [{
|
|
269
|
-
providedIn: 'root',
|
|
270
|
-
}]
|
|
271
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
272
|
-
type: Inject,
|
|
273
|
-
args: ['CouponRepository']
|
|
274
|
-
}] }, { type: i1.Shops, decorators: [{
|
|
275
|
-
type: Inject,
|
|
276
|
-
args: [DEFAULT_SHOP]
|
|
277
|
-
}] }, { type: undefined, decorators: [{
|
|
278
|
-
type: Inject,
|
|
279
|
-
args: ['OrderRepository']
|
|
280
|
-
}] }, { type: undefined, decorators: [{
|
|
281
|
-
type: Inject,
|
|
282
|
-
args: ['CategoryRepository']
|
|
283
|
-
}] }] });
|
|
284
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFLTCxhQUFhLEVBR2IsV0FBVyxFQUNYLGFBQWEsRUFJYixXQUFXLEVBQ1gsS0FBSyxFQUVMLEtBQUssR0FDTixNQUFNLG1CQUFtQixDQUFBO0FBQzFCLE9BQU8sRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTs7O0FBS3hDLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQytDLGdCQUFrQyxFQUN4QyxXQUFrQixFQUNiLGVBQWdDLEVBQzdCLGtCQUFzQztRQUh4QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFPO1FBQ2Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQzdCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFxUC9FLDRCQUF1QixHQUFHLENBQUMsU0FBaUIsRUFBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7SUFwUGpHLENBQUM7SUFFSixXQUFXLENBQ1QsUUFBZ0IsRUFDaEIsWUFBMkIsRUFDM0IsUUFBMkIsRUFDM0IsSUFBWTtRQUVaLE9BQU8sSUFBSSxDQUNULElBQUksQ0FBQyxnQkFBZ0I7YUFDbEIsSUFBSSxDQUFDO1lBQ0osT0FBTyxFQUFFO2dCQUNQLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFB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QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzlCLENBQUE7WUFDZixDQUFDLENBQUMsQ0FBQTtTQUNIO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQTtJQUMxQixDQUFDOzhHQTlXVSxhQUFhLGtCQUVkLGtCQUFrQixhQUNsQixZQUFZLGFBQ1osaUJBQWlCLGFBQ2pCLG9CQUFvQjtrSEFMbkIsYUFBYSxjQUZaLE1BQU07OzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFHSSxNQUFNOzJCQUFDLGtCQUFrQjs7MEJBQ3pCLE1BQU07MkJBQUMsWUFBWTs7MEJBQ25CLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHtcbiAgQ2F0ZWdvcnksXG4gIENhdGVnb3J5UmVwb3NpdG9yeSxcbiAgQ2hlY2tvdXQsXG4gIENoZWNrb3V0U3Vic2NyaXB0aW9uLFxuICBDaGVja291dFR5cGVzLFxuICBDb3Vwb24sXG4gIENvdXBvblJlcG9zaXRvcnksXG4gIENvdXBvblR5cGVzLFxuICBFeGNsdXNpdml0aWVzLFxuICBMaW5lSXRlbSxcbiAgT3JkZXIsXG4gIE9yZGVyUmVwb3NpdG9yeSxcbiAgT3JkZXJTdGF0dXMsXG4gIFNob3BzLFxuICBVc2VyLFxuICBXaGVyZSxcbn0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBjb25jYXRNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgREVGQVVMVF9TSE9QIH0gZnJvbSAnLi4vY29uc3RzJ1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ291cG9uU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ0NvdXBvblJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IGNvdXBvblJlcG9zaXRvcnk6IENvdXBvblJlcG9zaXRvcnksXG4gICAgQEluamVjdChERUZBVUxUX1NIT1ApIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNob3A6IFNob3BzLFxuICAgIEBJbmplY3QoJ09yZGVyUmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgb3JkZXJSZXBvc2l0b3J5OiBPcmRlclJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBjYXRlZ29yeVJlcG9zaXRvcnk6IENhdGVnb3J5UmVwb3NpdG9yeSxcbiAgKSB7fVxuXG4gIGNoZWNrQ291cG9uKFxuICAgIG5pY2tuYW1lOiBzdHJpbmcsXG4gICAgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLFxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcbiAgICBwbGFuOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8Q291cG9uPiB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLmNvdXBvblJlcG9zaXRvcnlcbiAgICAgICAgLmZpbmQoe1xuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIG5pY2tuYW1lOiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiBuaWNrbmFtZSB9LFxuICAgICAgICAgICAgYWN0aXZlOiB7IG9wZXJhdG9yOiBXaGVyZS5FUVVBTFMsIHZhbHVlOiB0cnVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGFbMF0pLFxuICAgICkucGlwZShcbiAgICAgIGNvbmNhdE1hcCgoY291cG9uKSA9PiB0aGlzLmNvdXBvblZhbGlkYXRpb24oY291cG9uLCBjaGVja291dFR5cGUpKSxcbiAgICAgIGNvbmNhdE1hcCgoY291cG9uVmFsaWQ6IENvdXBvbikgPT4gdGhpcy5jb3Vwb25SdWxlc1ZhbGlkYXRpb24oY291cG9uVmFsaWQsIGNoZWNrb3V0VHlwZSwgY2hlY2tvdXQsIHBsYW4pKSxcbiAgICAgIG1hcCgoY291cG9uVmFsaWRhdGVkOiBDb3Vwb24pID0+IGNvdXBvblZhbGlkYXRlZCBhcyBDb3Vwb24pLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY291cG9uVmFsaWRhdGlvbihjb3Vwb246IENvdXBvbiwgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzKSB7XG4gICAgaWYgKCFjb3Vwb24pIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uJ1xuXG4gICAgaWYgKGNvdXBvbj8uYmVnaW5BdCAmJiBjb3Vwb24/LmJlZ2luQXQuZ2V0VGltZSgpID4gbmV3IERhdGUoKS5nZXRUaW1lKCkpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uJ1xuXG4gICAgaWYgKGNvdXBvbj8uZXhwaXJlc0luICYmIGNvdXBvbj8uZXhwaXJlc0luLmdldFRpbWUoKSA8IG5ldyBEYXRlKCkuZ2V0VGltZSgpKSB0aHJvdyAnQ3Vwb20gZXhwaXJhZG8uJ1xuXG4gICAgY29uc3QgaXNJblNob3AgPSBjb3Vwb24uc2hvcEF2YWlsYWJpbGl0eSA9PT0gU2hvcHMuQUxMIHx8IGNvdXBvbi5zaG9wQXZhaWxhYmlsaXR5ID09PSB0aGlzLmRlZmF1bHRTaG9wXG5cbiAgICBpZiAoIWlzSW5TaG9wKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvIHBhcmEgbG9qYS4nXG5cbiAgICBjb25zdCBpc0NoZWNrb3V0VHlwZSA9IGNvdXBvbi5jaGVja291dFR5cGUgPT09IENoZWNrb3V0VHlwZXMuQUxMIHx8IGNvdXBvbi5jaGVja291dFR5cGUgPT09IGNoZWNrb3V0VHlwZVxuXG4gICAgaWYgKCFpc0NoZWNrb3V0VHlwZSkgdGhyb3cgJ0N1cG9tIGludsOhbGlkby4gRXJybyBkZSBjaGVja291dC4nXG5cbiAgICByZXR1cm4gY291cG9uXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvdXBvblJ1bGVzVmFsaWRhdGlvbihcbiAgICBjb3Vwb246IENvdXBvbixcbiAgICBjaGVja291dFR5cGU6IENoZWNrb3V0VHlwZXMsXG4gICAgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+LFxuICAgIHBsYW46IHN0cmluZyxcbiAgKSB7XG4gICAgaWYgKGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLlNVQlNDUklQVElPTikge1xuICAgICAgaWYgKGNvdXBvbi5wbGFuICYmIGNvdXBvbi5wbGFuLnRvVXBwZXJDYXNlKCkgIT09IHBsYW4udG9VcHBlckNhc2UoKSkgdGhyb3cgJ0N1cG9tIGludsOhbGlkbyBwYXJhIHN1YSBhc3NpbmF0dXJhLidcblxuICAgICAgcmV0dXJuIGNvdXBvblxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkVXNlciA9IHRoaXMuY291cG9tVXNlclZhbGlkYXRpb24oY291cG9uLCBjaGVja291dD8udXNlcilcblxuICAgIGlmICghdmFsaWRVc2VyKSB0aHJvdyAnVXN1w6FyaW8gbsOjbyBlbGVnw612ZWwuJ1xuXG4gICAgY29uc3QgY291cG9uVXNlTGltaXRzID0gdGhpcy5nZXRDb3Vwb25Vc2VMaW1pdHMoY291cG9uLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LnVzZXIpXG5cbiAgICBpZiAoY291cG9uVXNlTGltaXRzLmZpcnN0T3JkZXIpIHtcbiAgICAgIGNvbnN0IG9yZGVyc1VzZXIgPSBhd2FpdCB0aGlzLmdldE9yZGVyc0Zyb21Vc2VyKGNoZWNrb3V0LnVzZXIuZW1haWwudG9Mb2NhbGVMb3dlckNhc2UoKSlcbiAgICAgIGlmIChjb3Vwb25Vc2VMaW1pdHMuZmlyc3RPcmRlciAmJiBvcmRlcnNVc2VyLmxlbmd0aCA+PSAxKSB0aHJvdyAnTGltaXRlIGRlIHVzbyBhdGluZ2lkbydcbiAgICB9XG5cbiAgICBpZiAoIWNvdXBvblVzZUxpbWl0cy51bmxpbWl0ZWQgfHwgY291cG9uVXNlTGltaXRzLmxpbWl0ZWRQZXJVc2VyKSB7XG4gICAgICBjb25zdCBvcmRlcnNDb3Vwb24gPSBhd2FpdCB0aGlzLmdldE9yZGVyc1dpdGhDb3Vwb24oY291cG9uKVxuXG4gICAgICBpZiAoIWNvdXBvblVzZUxpbWl0cy51bmxpbWl0ZWQgJiYgY291cG9uVXNlTGltaXRzLnRvdGFsICYmIG9yZGVyc0NvdXBvbi5sZW5ndGggPj0gY291cG9uVXNlTGltaXRzLnRvdGFsKVxuICAgICAgICB0aHJvdyAnTGltaXRlIGRlIHVzbyBhdGluZ2lkby4nXG5cbiAgICAgIGlmIChjb3Vwb25Vc2VMaW1pdHMubGltaXRlZFBlclVzZXIpIHtcbiAgICAgICAgY29uc3Qgb3JkZXJzV2l0aFVzZXIgPSB0aGlzLmNvdW50T3JkZXJzV2l0aFVzZXIob3JkZXJzQ291cG9uLCBjaGVja291dC51c2VyLmVtYWlsKVxuXG4gICAgICAgIGlmIChvcmRlcnNXaXRoVXNlciA+IDApIHRocm93ICdMaW1pdGUgZGUgdXNvIHBvciB1c3XDoXJpbyBhdGluZ2lkby4nXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzUHJvZHVjdENhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLmhhc1Byb2R1Y3RDYXRlZ29yaWVzKGNvdXBvbiwgY2hlY2tvdXQpXG5cbiAgICBpZiAoIWhhc1Byb2R1Y3RDYXRlZ29yaWVzKSB0aHJvdyAnU2V1IGNhcnJpbmhvIG7Do28gcG9zc3VpIHByb2R1dG9zIGVsZWfDrXZlaXMgcGFyYSBkZXNjb250by4nXG5cbiAgICBjb25zdCBoYXNNaW5TdWJUb3RhbCA9IGF3YWl0IHRoaXMuaGFzTWluU3ViVG90YWwoY291cG9uLCBjaGVja291dClcblxuICAgIGlmICghaGFzTWluU3ViVG90YWwpIHtcbiAgICAgIGlmIChjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgYFZhbG9yIG3DrW5pbW8gZGUgJHtJbnRsLk51bWJlckZvcm1hdCgncHQtQlInLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogJ0JSTCcgfSkuZm9ybWF0KFxuICAgICAgICAgIGNvdXBvbi5taW5TdWJUb3RhbFZhbHVlLFxuICAgICAgICApfSBuw6NvIGF0aW5naWRvIG5hKHMpIGNhdGVnb3JpYShzKSBlbGVnw612ZWlzIHBhcmEgbyBkZXNjb250by5gXG4gICAgICB9XG5cbiAgICAgIHRocm93IGBWYWxvciBtw61uaW1vIGRlICR7SW50bC5OdW1iZXJGb3JtYXQoJ3B0LUJSJywgeyBzdHlsZTogJ2N1cnJlbmN5JywgY3VycmVuY3k6ICdCUkwnIH0pLmZvcm1hdChcbiAgICAgICAgY291cG9uLm1pblN1YlRvdGFsVmFsdWUsXG4gICAgICApfSBuw6NvIGF0aW5naWRvLmBcbiAgICB9XG5cbiAgICByZXR1cm4gY291cG9uXG4gIH1cblxuICBwdWJsaWMgY2FsY0Rpc2NvdW50U3Vic2NyaXB0aW9uKGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dFN1YnNjcmlwdGlvbj4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIGxldCBkaXNjb3VudCA9IDBcblxuICAgIGlmIChjb3Vwb24uZGlzY291bnQuc3Vic2NyaXB0aW9uLnR5cGUgPT0gQ291cG9uVHlwZXMuQUJTT0xVVEUpIGRpc2NvdW50ID0gY291cG9uLmRpc2NvdW50LnN1YnNjcmlwdGlvbi52YWx1ZVxuICAgIGVsc2UgZGlzY291bnQgPSBjaGVja291dC5zdWJzY3JpcHRpb25QbGFuLnJlY3VycmVuY2VQcmljZSAqIChjb3Vwb24uZGlzY291bnQuc3Vic2NyaXB0aW9uLnZhbHVlIC8gMTAwKVxuXG4gICAgcmV0dXJuIG9mKGRpc2NvdW50KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNhbGNEaXNjb3VudFNob3BwaW5nKFxuICAgIGNvdXBvbjogQ291cG9uLFxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcbiAgKTogUHJvbWlzZTx7IGRpc2NvdW50OiBudW1iZXI7IGxpbmVJdGVtczogTGluZUl0ZW1bXSB9PiB7XG4gICAgbGV0IGRpc2NvdW50SW5mbzogeyBkaXNjb3VudDogbnVtYmVyOyBsaW5lSXRlbXM6IExpbmVJdGVtW10gfSA9IG51bGxcblxuICAgIGlmIChjaGVja291dC51c2VyLmlzU3Vic2NyaWJlciAmJiBjb3Vwb24uZGlzY291bnQuc3Vic2NyaWJlci52YWx1ZSkge1xuICAgICAgZGlzY291bnRJbmZvID0gYXdhaXQgdGhpcy5jYWxjRGlzY291bnRCeVR5cGUoXG4gICAgICAgIGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpYmVyLnR5cGUsXG4gICAgICAgIGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpYmVyLnZhbHVlLFxuICAgICAgICBjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzLFxuICAgICAgICBjaGVja291dCxcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzY291bnRJbmZvID0gYXdhaXQgdGhpcy5jYWxjRGlzY291bnRCeVR5cGUoXG4gICAgICAgIGNvdXBvbi5kaXNjb3VudC5ub25fc3Vic2NyaWJlci50eXBlLFxuICAgICAgICBjb3Vwb24uZGlzY291bnQubm9uX3N1YnNjcmliZXIudmFsdWUsXG4gICAgICAgIGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMsXG4gICAgICAgIGNoZWNrb3V0LFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiB7IGRpc2NvdW50OiBkaXNjb3VudEluZm8uZGlzY291bnQsIGxpbmVJdGVtczogZGlzY291bnRJbmZvLmxpbmVJdGVtcyB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGNEaXNjb3VudEJ5VHlwZShcbiAgICB0eXBlOiBDb3Vwb25UeXBlcyxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGNhdGVnb3JpZXM6IHN0cmluZ1tdLFxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcbiAgKTogUHJvbWlzZTx7IGRpc2NvdW50OiBudW1iZXI7IGxpbmVJdGVtczogTGluZUl0ZW1bXSB9PiB7XG4gICAgbGV0IGRpc2NvdW50ID0gMFxuXG4gICAgaWYgKHR5cGUgPT0gQ291cG9uVHlwZXMuU0hJUFBJTkcpIHtcbiAgICAgIGNvbnN0IHN1YlRvdGFsID0gY2hlY2tvdXQuc2hpcHBpbmcuU2hpcHBpbmdQcmljZVxuICAgICAgY29uc3QgZGlzY291bnQgPSArKHN1YlRvdGFsICogKCh2YWx1ZSA+IDEwMCA/IDEwMCA6IHZhbHVlKSAvIDEwMCkpLnRvRml4ZWQoMilcblxuICAgICAgcmV0dXJuIHsgZGlzY291bnQsIGxpbmVJdGVtczogY2hlY2tvdXQubGluZUl0ZW1zIH1cbiAgICB9XG5cbiAgICBjb25zdCBsaW5lSXRlbnNFbGVnaWJsZUZvckRpc2NvdW50ID0gYXdhaXQgdGhpcy5nZXRMaW5lSXRlbnNFbGlnZWJsZUZvckRpc2NvdW50KGNhdGVnb3JpZXMsIGNoZWNrb3V0KVxuICAgIGNvbnN0IHN1YlRvdGFsID0gdGhpcy5jYWxjQ2hlY2tvdXRTdWJ0b3RhbChsaW5lSXRlbnNFbGVnaWJsZUZvckRpc2NvdW50LCBjaGVja291dC51c2VyKVxuXG4gICAgaWYgKHR5cGUgPT0gQ291cG9uVHlwZXMuQUJTT0xVVEUpIHtcbiAgICAgIGRpc2NvdW50ID0gdmFsdWUgPiBzdWJUb3RhbCA/IHN1YlRvdGFsIDogdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzY291bnQgPSArKHN1YlRvdGFsICogKCh2YWx1ZSA+IDEwMCA/IDEwMCA6IHZhbHVlKSAvIDEwMCkpLnRvRml4ZWQoMilcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lSXRlbXMgPSB0aGlzLmNhbGNMaW5lSXRlbkRpc2NvdW50KHR5cGUsIGxpbmVJdGVuc0VsZWdpYmxlRm9yRGlzY291bnQsIHZhbHVlLCBzdWJUb3RhbClcblxuICAgIHJldHVybiB7IGRpc2NvdW50LCBsaW5lSXRlbXMgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYXNNaW5TdWJUb3RhbChjb3Vwb246IENvdXBvbiwgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFjb3Vwb24ubWluU3ViVG90YWxWYWx1ZSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IGxpbmVJdGVuc0Rpc2NvdW50ID0gYXdhaXQgdGhpcy5nZXRMaW5lSXRlbnNFbGlnZWJsZUZvckRpc2NvdW50KGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMsIGNoZWNrb3V0KVxuICAgIGNvbnN0IHN1YlRvdGFsID0gdGhpcy5jYWxjQ2hlY2tvdXRTdWJ0b3RhbChsaW5lSXRlbnNEaXNjb3VudCwgY2hlY2tvdXQudXNlcilcblxuICAgIGlmIChjb3Vwb24ubWluU3ViVG90YWxWYWx1ZSA8PSBzdWJUb3RhbCkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYXNQcm9kdWN0Q2F0ZWdvcmllcyhjb3Vwb246IENvdXBvbiwgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzIHx8ICFjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllcyA9IGF3YWl0IHRoaXMuZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMpXG4gICAgY29uc3QgaGFzQ2F0ZWdvcmllcyA9IGNoZWNrb3V0LmxpbmVJdGVtcz8uZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5pc0dpZnQpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKCFpdGVtLmNhdGVnb3JpZXMgfHwgIWl0ZW0uY2F0ZWdvcmllcz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZVxuXG4gICAgICByZXR1cm4gaXRlbS5jYXRlZ29yaWVzLnNvbWUoKGMpID0+IGNvdXBvbkNhdGVnb3JpZXMuc29tZSgoY2F0KSA9PiBjYXQgPT0gYykpXG4gICAgfSlcblxuICAgIHJldHVybiBoYXNDYXRlZ29yaWVzLmxlbmd0aCA/IHRydWUgOiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBjb3Vwb21Vc2VyVmFsaWRhdGlvbihjb3Vwb246IENvdXBvbiwgdXNlcjogVXNlcikge1xuICAgIGlmICghdXNlciB8fCBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuQUxMX1VTRVJTKSkgcmV0dXJuIHRydWVcblxuICAgIGxldCB1c2VyVHlwZXM6IEV4Y2x1c2l2aXRpZXNbXSA9IFtdXG5cbiAgICBpZiAoXG4gICAgICBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuQ09MTEFCT1JBVE9SUykgJiZcbiAgICAgIHRoaXMuZW1haWxJc0Zyb21Db2xsYWJvcmF0b3IodXNlci5lbWFpbC50b0xvY2FsZUxvd2VyQ2FzZSgpKVxuICAgIClcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuQ09MTEFCT1JBVE9SUylcblxuICAgIGlmIChcbiAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5TUEVDSUZJQ19VU0VSKSAmJlxuICAgICAgY291cG9uLnVzZXJFeGNsdXNpdmVFbWFpbC5pbmNsdWRlcyh1c2VyLmVtYWlsLnRvTG9jYWxlTG93ZXJDYXNlKCkpXG4gICAgKVxuICAgICAgdXNlclR5cGVzLnB1c2goRXhjbHVzaXZpdGllcy5TUEVDSUZJQ19VU0VSKVxuXG4gICAgaWYgKFxuICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLkFDVElWRV9TVUJTQ1JJQkVSKSAmJlxuICAgICAgdXNlci5pc1N1YnNjcmliZXIgJiZcbiAgICAgIHVzZXIuc3Vic2NyaXB0aW9uUGxhbiAhPSAnJ1xuICAgIClcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuQUNUSVZFX1NVQlNDUklCRVIpXG5cbiAgICBpZiAoXG4gICAgICB1c2VyLmlzU3Vic2NyaWJlciAmJlxuICAgICAgdXNlci5zdWJzY3JpcHRpb25QbGFuID09ICcnICYmXG4gICAgICBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuSU5BQ1RJVkVfU1VCU0NSSUJFUilcbiAgICApXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLklOQUNUSVZFX1NVQlNDUklCRVIpXG5cbiAgICBpZiAoY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLk5PTl9TVUJTQ1JJQkVSKSAmJiAhdXNlci5pc1N1YnNjcmliZXIpXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLk5PTl9TVUJTQ1JJQkVSKVxuXG4gICAgcmV0dXJuIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuc29tZSgocikgPT4gdXNlclR5cGVzLmluY2x1ZGVzKHIpKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDb3Vwb25DYXRlZ29yaWVzSWQocHJvZHVjdHNDYXRlZ29yaWVzOiBzdHJpbmdbXSk6IFByb21pc2U8QXJyYXk8U3RyaW5nPj4ge1xuICAgIGNvbnN0IGNvdXBvbkNhdGVnb3JpZXM6IEFycmF5PFN0cmluZz4gPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByb2R1Y3RzQ2F0ZWdvcmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5OiBDYXRlZ29yeSAmIHsgZmlyZXN0b3JlSWQ/OiBzdHJpbmcgfSA9IGF3YWl0IHRoaXMuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldCh7XG4gICAgICAgIGlkOiBwcm9kdWN0c0NhdGVnb3JpZXNbaW5kZXhdLFxuICAgICAgfSlcblxuICAgICAgaWYgKGNhdGVnb3J5KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgdGhpcy5jYXRlZ29yeVJlcG9zaXRvcnkuZ2V0Q2hpbGRyZW4ocGFyc2VJbnQocHJvZHVjdHNDYXRlZ29yaWVzW2luZGV4XSkpXG5cbiAgICAgICAgY291cG9uQ2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5LmlkLCAuLi5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQudG9TdHJpbmcoKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KGNvdXBvbkNhdGVnb3JpZXMpXVxuICB9XG5cbiAgcHJpdmF0ZSBlbWFpbElzRnJvbUNvbGxhYm9yYXRvciA9ICh1c2VyRW1haWw6IHN0cmluZyk6IGJvb2xlYW4gPT4gISF1c2VyRW1haWw/Lm1hdGNoKC9AYjRhLmNvbS5ici9nKVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0TGluZUl0ZW5zRWxpZ2VibGVGb3JEaXNjb3VudChcbiAgICBwcm9kdWN0c0NhdGVnb3JpZXM6IHN0cmluZ1tdLFxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcbiAgKTogUHJvbWlzZTxMaW5lSXRlbVtdPiB7XG4gICAgbGV0IGxpbmVJdGVuc0Rpc2NvdW50ID0gW11cbiAgICBjb25zdCBjb3Vwb25DYXRlZ29yaWVzID0gYXdhaXQgdGhpcy5nZXRDb3Vwb25DYXRlZ29yaWVzSWQocHJvZHVjdHNDYXRlZ29yaWVzKVxuXG4gICAgaWYgKHByb2R1Y3RzQ2F0ZWdvcmllcyAmJiBwcm9kdWN0c0NhdGVnb3JpZXMubGVuZ3RoKSB7XG4gICAgICBsaW5lSXRlbnNEaXNjb3VudCA9IGNoZWNrb3V0LmxpbmVJdGVtcz8uZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmlzR2lmdCkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChpdGVtLmNhdGVnb3JpZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBpdGVtLmNhdGVnb3JpZXMuc29tZSgoYykgPT4gY291cG9uQ2F0ZWdvcmllcy5zb21lKChjYXQpID0+IGNhdCA9PSBjKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lSXRlbnNEaXNjb3VudCA9IGNoZWNrb3V0LmxpbmVJdGVtcy5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzR2lmdClcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZUl0ZW5zRGlzY291bnRcbiAgfVxuXG4gIHByaXZhdGUgY2FsY0NoZWNrb3V0U3VidG90YWwobGluZUl0ZW5zOiBMaW5lSXRlbVtdLCB1c2VyOiBVc2VyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKFxuICAgICAgbGluZUl0ZW5zXG4gICAgICAgID8uZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc0dpZnQpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgY3VycikgPT5cbiAgICAgICAgICAgIHVzZXI/LmlzU3Vic2NyaWJlciAmJiBjdXJyLnByaWNlLnN1YnNjcmliZXJQcmljZVxuICAgICAgICAgICAgICA/IGFjYyArIGN1cnIucHJpY2U/LnN1YnNjcmliZXJQcmljZSAqIGN1cnIucXVhbnRpdHlcbiAgICAgICAgICAgICAgOiBhY2MgKyBjdXJyLnByaWNlUGFpZCAqIGN1cnIucXVhbnRpdHksXG4gICAgICAgICAgMCxcbiAgICAgICAgKSB8fCAwXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPcmRlcnNXaXRoQ291cG9uKGNvdXBvbjogQ291cG9uKTogUHJvbWlzZTxPcmRlcltdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMub3JkZXJSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICBjb3Vwb246IHsgaWQ6IGNvdXBvbi5pZCB9LFxuICAgICAgICAgIHN0YXR1czogeyBvcGVyYXRvcjogV2hlcmUuTk9URVFVQUxTLCB2YWx1ZTogT3JkZXJTdGF0dXMuQ0FOQ0VMQURPIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGEpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9yZGVyc0Zyb21Vc2VyKGVtYWlsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5vcmRlclJlcG9zaXRvcnlcbiAgICAgIC5maW5kKHtcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIHVzZXI6IHsgZW1haWw6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IGVtYWlsIH0gfSxcbiAgICAgICAgICBzdGF0dXM6IHsgb3BlcmF0b3I6IFdoZXJlLk5PVEVRVUFMUywgdmFsdWU6IE9yZGVyU3RhdHVzLkNBTkNFTEFETyB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhKVxuICB9XG5cbiAgcHJpdmF0ZSBjb3VudE9yZGVyc1dpdGhVc2VyKG9yZGVyczogT3JkZXJbXSwgZW1haWw6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIG9yZGVycy5maWx0ZXIoKG8pID0+IG8udXNlci5lbWFpbCA9PSBlbWFpbCkubGVuZ3RoXG4gIH1cblxuICBwcml2YXRlIGdldENvdXBvblVzZUxpbWl0cyhjb3Vwb246IENvdXBvbiwgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLCB1c2VyOiBVc2VyKSB7XG4gICAgbGV0IGNvdXBvblVzZUxpbWl0czogeyB1bmxpbWl0ZWQ/OiBib29sZWFuOyB0b3RhbD86IG51bWJlcjsgbGltaXRlZFBlclVzZXI/OiBib29sZWFuOyBmaXJzdE9yZGVyPzogYm9vbGVhbiB9XG4gICAgaWYgKGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLkVDT01NRVJDRSB8fCBjaGVja291dFR5cGUgPT0gQ2hlY2tvdXRUeXBlcy5BTEwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuYXQoMCkgPT09IEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUiB8fFxuICAgICAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuYXQoMCkgPT09IEV4Y2x1c2l2aXRpZXMuQ09MTEFCT1JBVE9SUylcbiAgICAgIClcbiAgICAgICAgY291cG9uVXNlTGltaXRzID0gY291cG9uLnVzZUxpbWl0cy5ub25fc3Vic2NyaWJlclxuICAgICAgZWxzZSBjb3Vwb25Vc2VMaW1pdHMgPSB1c2VyICYmIHVzZXIuaXNTdWJzY3JpYmVyID8gY291cG9uLnVzZUxpbWl0cy5zdWJzY3JpYmVyIDogY291cG9uLnVzZUxpbWl0cy5ub25fc3Vic2NyaWJlclxuICAgIH0gZWxzZSB7XG4gICAgICBjb3Vwb25Vc2VMaW1pdHMgPSBjb3Vwb24udXNlTGltaXRzLnN1YnNjcmlwdGlvblxuICAgIH1cblxuICAgIHJldHVybiBjb3Vwb25Vc2VMaW1pdHNcbiAgfVxuXG4gIHByaXZhdGUgY2FsY0xpbmVJdGVuRGlzY291bnQoXG4gICAgdHlwZTogQ291cG9uVHlwZXMsXG4gICAgbGluZUl0ZW1zOiBMaW5lSXRlbVtdLFxuICAgIGNvdXBvbkRpc2NvdW50OiBudW1iZXIsXG4gICAgc3ViVG90YWw6IG51bWJlcixcbiAgKTogTGluZUl0ZW1bXSB7XG4gICAgbGV0IGxpbmVJdGVtc0Rpc2NvdW50OiBMaW5lSXRlbVtdID0gW11cbiAgICBpZiAodHlwZSA9PT0gQ291cG9uVHlwZXMuQUJTT0xVVEUpIHtcbiAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50TWF4ID0gY291cG9uRGlzY291bnQgPiBzdWJUb3RhbCA/IHN1YlRvdGFsIDogY291cG9uRGlzY291bnRcbiAgICAgIGxpbmVJdGVtc0Rpc2NvdW50ID0gbGluZUl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5pc0dpZnQpIHJldHVybiBpdGVtXG5cbiAgICAgICAgY29uc3QgdG90YWxJdGVtUGVyY2VudGFnZSA9IGl0ZW0ucHJpY2VQYWlkIC8gc3ViVG90YWxcbiAgICAgICAgY29uc3QgZGlzY291bnRJdGVtID0gY291cG9uRGlzY291bnRNYXggKiB0b3RhbEl0ZW1QZXJjZW50YWdlXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGRpc2NvdW50OiBOdW1iZXIoZGlzY291bnRJdGVtLnRvRml4ZWQoMikpLFxuICAgICAgICB9IGFzIExpbmVJdGVtXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lSXRlbXNEaXNjb3VudCA9IGxpbmVJdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaXNHaWZ0KSByZXR1cm4gaXRlbVxuXG4gICAgICAgIGNvbnN0IGRpc2NvdW50SXRlbSA9IGl0ZW0ucHJpY2VQYWlkICogKGNvdXBvbkRpc2NvdW50IC8gMTAwKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBkaXNjb3VudDogTnVtYmVyKGRpc2NvdW50SXRlbS50b0ZpeGVkKDIpKSxcbiAgICAgICAgfSBhcyBMaW5lSXRlbVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZUl0ZW1zRGlzY291bnRcbiAgfVxufVxuIl19
|