@infrab4a/connect-angular 6.0.0-alpha.0 → 6.0.0-beta.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/angular-connect.module.d.ts +36 -0
- package/angular-elastic-search.module.d.ts +9 -0
- package/angular-firebase-auth.module.d.ts +11 -0
- package/angular-firestore.module.d.ts +17 -0
- package/angular-hasura-graphql.module.d.ts +14 -0
- package/angular-vertex-search.module.d.ts +9 -0
- package/consts/backend-url.const.d.ts +1 -0
- package/consts/category-structure.d.ts +1 -0
- package/consts/default-shop.const.d.ts +1 -0
- package/consts/es-config.const.d.ts +1 -0
- package/consts/firebase-const.d.ts +4 -0
- package/consts/hasura-options.const.d.ts +1 -0
- package/consts/index.d.ts +8 -0
- package/consts/persistence.const.d.ts +1 -0
- package/consts/storage-base-url.const.d.ts +1 -0
- package/consts/vertex-config.const.d.ts +1 -0
- package/esm2022/angular-connect.module.mjs +291 -0
- package/esm2022/angular-elastic-search.module.mjs +34 -0
- package/esm2022/angular-firebase-auth.module.mjs +141 -0
- package/esm2022/angular-firestore.module.mjs +541 -0
- package/esm2022/angular-hasura-graphql.module.mjs +333 -0
- package/esm2022/angular-vertex-search.module.mjs +34 -0
- package/esm2022/consts/backend-url.const.mjs +2 -0
- package/esm2022/consts/category-structure.mjs +2 -0
- package/esm2022/consts/default-shop.const.mjs +2 -0
- package/esm2022/consts/es-config.const.mjs +2 -0
- package/esm2022/consts/firebase-const.mjs +5 -0
- package/esm2022/consts/hasura-options.const.mjs +2 -0
- package/esm2022/consts/index.mjs +9 -0
- package/esm2022/consts/persistence.const.mjs +2 -0
- package/esm2022/consts/storage-base-url.const.mjs +2 -0
- package/esm2022/consts/vertex-config.const.mjs +2 -0
- package/esm2022/helpers/index.mjs +2 -0
- package/esm2022/helpers/mobile-operation-system-checker.helper.mjs +7 -0
- package/esm2022/index.mjs +7 -0
- package/esm2022/infrab4a-connect-angular.mjs +5 -0
- package/esm2022/interfaces/catalog-strategies.interface.mjs +2 -0
- package/esm2022/interfaces/category-facades.interface.mjs +2 -0
- package/esm2022/interfaces/index.mjs +3 -0
- package/esm2022/persistence/cookie-data-persistence.mjs +22 -0
- package/esm2022/persistence/data-persistence.mjs +2 -0
- package/esm2022/persistence/index.mjs +3 -0
- package/esm2022/services/auth.service.mjs +37 -0
- package/esm2022/services/cart/cart-services.facade.mjs +21 -0
- package/esm2022/services/cart/index.mjs +2 -0
- package/esm2022/services/cart.service.mjs +73 -0
- package/esm2022/services/catalog/adapters/category-structure.adapter.mjs +2 -0
- package/esm2022/services/catalog/adapters/index.mjs +4 -0
- package/esm2022/services/catalog/adapters/new-category-structure.adapter.mjs +43 -0
- package/esm2022/services/catalog/adapters/old-category-structure.adapter.mjs +23 -0
- package/esm2022/services/catalog/catalog.service.mjs +111 -0
- package/esm2022/services/catalog/category.service.mjs +39 -0
- package/esm2022/services/catalog/context/catalog-search.context.mjs +40 -0
- package/esm2022/services/catalog/enums/index.mjs +2 -0
- package/esm2022/services/catalog/enums/product-sorts.enum.mjs +11 -0
- package/esm2022/services/catalog/facades/catalog-service.facade.mjs +32 -0
- package/esm2022/services/catalog/facades/catalog-strategies.facade.mjs +17 -0
- package/esm2022/services/catalog/facades/category-repository.facade.mjs +20 -0
- package/esm2022/services/catalog/facades/category-service.facade.mjs +30 -0
- package/esm2022/services/catalog/facades/index.mjs +6 -0
- package/esm2022/services/catalog/facades/product-catalog.facade.mjs +21 -0
- package/esm2022/services/catalog/helpers/brand-manager.helper.mjs +57 -0
- package/esm2022/services/catalog/helpers/catalog-filter.helper.mjs +44 -0
- package/esm2022/services/catalog/helpers/catalog-sort.helper.mjs +52 -0
- package/esm2022/services/catalog/helpers/index.mjs +5 -0
- package/esm2022/services/catalog/helpers/product-fields.helper.mjs +39 -0
- package/esm2022/services/catalog/index.mjs +8 -0
- package/esm2022/services/catalog/models/category-with-tree.model.mjs +10 -0
- package/esm2022/services/catalog/models/index.mjs +2 -0
- package/esm2022/services/catalog/services/catalog-helpers.service.mjs +33 -0
- package/esm2022/services/catalog/services/catalog-operations.facade.mjs +26 -0
- package/esm2022/services/catalog/services/catalog-repository.service.mjs +25 -0
- package/esm2022/services/catalog/services/index.mjs +5 -0
- package/esm2022/services/catalog/services/product-management.facade.mjs +25 -0
- package/esm2022/services/catalog/strategies/category-search.strategy.mjs +133 -0
- package/esm2022/services/catalog/strategies/index.mjs +4 -0
- package/esm2022/services/catalog/strategies/profile-search.strategy.mjs +42 -0
- package/esm2022/services/catalog/strategies/term-search.strategy.mjs +123 -0
- package/esm2022/services/catalog/strategies/types/strategy-params.type.mjs +2 -0
- package/esm2022/services/catalog/types/fetch-products-options.type.mjs +2 -0
- package/esm2022/services/catalog/types/fetch-products-params.type.mjs +2 -0
- package/esm2022/services/catalog/types/fetch-products-response.type.mjs +2 -0
- package/esm2022/services/catalog/types/index.mjs +6 -0
- package/esm2022/services/catalog/types/method-params.type.mjs +2 -0
- package/esm2022/services/catalog/types/product-sort.type.mjs +2 -0
- package/esm2022/services/catalog/wishlist.service.mjs +254 -0
- package/esm2022/services/checkout/checkout-dependencies.facade.mjs +20 -0
- package/esm2022/services/checkout/checkout-repositories.facade.mjs +20 -0
- package/esm2022/services/checkout/index.mjs +3 -0
- package/esm2022/services/checkout-subscription.service.mjs +55 -0
- package/esm2022/services/checkout.service.mjs +106 -0
- package/esm2022/services/coupon/coupon-repositories.facade.mjs +24 -0
- package/esm2022/services/coupon/index.mjs +2 -0
- package/esm2022/services/coupon/types/coupon-params.type.mjs +2 -0
- package/esm2022/services/coupon.service.mjs +248 -0
- package/esm2022/services/helpers/index.mjs +2 -0
- package/esm2022/services/helpers/util.helper.mjs +18 -0
- package/esm2022/services/home-shop/home-shop-repositories.facade.mjs +24 -0
- package/esm2022/services/home-shop/index.mjs +2 -0
- package/esm2022/services/home-shop.service.mjs +119 -0
- package/esm2022/services/index.mjs +11 -0
- package/esm2022/services/order-product-review.service.mjs +81 -0
- package/esm2022/services/order.service.mjs +30 -0
- package/esm2022/services/shared/configuration.facade.mjs +29 -0
- package/esm2022/services/shared/index.mjs +2 -0
- package/esm2022/services/types/index.mjs +5 -0
- package/esm2022/services/types/pending-product-review.type.mjs +2 -0
- package/esm2022/services/types/product-review-create.type.mjs +2 -0
- package/esm2022/services/types/required-checkout-data.type.mjs +2 -0
- package/esm2022/services/types/required-checkout-subscription-data.type.mjs +2 -0
- package/esm2022/types/firebase-app-config.type.mjs +2 -0
- package/esm2022/types/index.mjs +2 -0
- package/fesm2022/infrab4a-connect-angular.mjs +3352 -0
- package/fesm2022/infrab4a-connect-angular.mjs.map +1 -0
- package/helpers/index.d.ts +1 -0
- package/helpers/mobile-operation-system-checker.helper.d.ts +3 -0
- package/index.d.ts +6 -0
- package/interfaces/catalog-strategies.interface.d.ts +31 -0
- package/interfaces/category-facades.interface.d.ts +6 -0
- package/interfaces/index.d.ts +2 -0
- package/package.json +23 -9
- package/persistence/cookie-data-persistence.d.ts +10 -0
- package/persistence/data-persistence.d.ts +6 -0
- package/persistence/index.d.ts +2 -0
- package/services/auth.service.d.ts +18 -0
- package/services/cart/cart-services.facade.d.ts +12 -0
- package/services/cart/index.d.ts +1 -0
- package/services/cart.service.d.ts +26 -0
- package/services/catalog/adapters/category-structure.adapter.d.ts +4 -0
- package/services/catalog/adapters/index.d.ts +3 -0
- package/services/catalog/adapters/new-category-structure.adapter.d.ts +12 -0
- package/services/catalog/adapters/old-category-structure.adapter.d.ts +10 -0
- package/services/catalog/catalog.service.d.ts +24 -0
- package/services/catalog/category.service.d.ts +22 -0
- package/services/catalog/context/catalog-search.context.d.ts +14 -0
- package/services/catalog/enums/index.d.ts +1 -0
- package/services/catalog/enums/product-sorts.enum.d.ts +9 -0
- package/services/catalog/facades/catalog-service.facade.d.ts +15 -0
- package/services/catalog/facades/catalog-strategies.facade.d.ts +10 -0
- package/services/catalog/facades/category-repository.facade.d.ts +9 -0
- package/services/catalog/facades/category-service.facade.d.ts +15 -0
- package/{src/services/catalog/facades/index.ts → services/catalog/facades/index.d.ts} +5 -5
- package/services/catalog/facades/product-catalog.facade.d.ts +10 -0
- package/services/catalog/helpers/brand-manager.helper.d.ts +14 -0
- package/services/catalog/helpers/catalog-filter.helper.d.ts +8 -0
- package/services/catalog/helpers/catalog-sort.helper.d.ts +7 -0
- package/services/catalog/helpers/index.d.ts +4 -0
- package/services/catalog/helpers/product-fields.helper.d.ts +7 -0
- package/services/catalog/index.d.ts +7 -0
- package/services/catalog/models/category-with-tree.model.d.ts +4 -0
- package/services/catalog/models/index.d.ts +1 -0
- package/services/catalog/services/catalog-helpers.service.d.ts +17 -0
- package/services/catalog/services/catalog-operations.facade.d.ts +13 -0
- package/services/catalog/services/catalog-repository.service.d.ts +12 -0
- package/{src/services/catalog/services/index.ts → services/catalog/services/index.d.ts} +4 -4
- package/services/catalog/services/product-management.facade.d.ts +12 -0
- package/services/catalog/strategies/category-search.strategy.d.ts +19 -0
- package/services/catalog/strategies/index.d.ts +3 -0
- package/services/catalog/strategies/profile-search.strategy.d.ts +14 -0
- package/services/catalog/strategies/term-search.strategy.d.ts +20 -0
- package/services/catalog/strategies/types/strategy-params.type.d.ts +58 -0
- package/services/catalog/types/fetch-products-options.type.d.ts +8 -0
- package/services/catalog/types/fetch-products-params.type.d.ts +25 -0
- package/services/catalog/types/fetch-products-response.type.d.ts +19 -0
- package/services/catalog/types/index.d.ts +5 -0
- package/services/catalog/types/method-params.type.d.ts +17 -0
- package/services/catalog/types/product-sort.type.d.ts +2 -0
- package/services/catalog/wishlist.service.d.ts +59 -0
- package/services/checkout/checkout-dependencies.facade.d.ts +10 -0
- package/services/checkout/checkout-repositories.facade.d.ts +9 -0
- package/{src/services/checkout/index.ts → services/checkout/index.d.ts} +2 -2
- package/services/checkout-subscription.service.d.ts +19 -0
- package/services/checkout.service.d.ts +30 -0
- package/services/coupon/coupon-repositories.facade.d.ts +10 -0
- package/{src/services/coupon/index.ts → services/coupon/index.d.ts} +1 -1
- package/services/coupon/types/coupon-params.type.d.ts +13 -0
- package/services/coupon.service.d.ts +36 -0
- package/services/helpers/index.d.ts +1 -0
- package/services/helpers/util.helper.d.ts +3 -0
- package/services/home-shop/home-shop-repositories.facade.d.ts +10 -0
- package/{src/services/home-shop/index.ts → services/home-shop/index.d.ts} +1 -1
- package/services/home-shop.service.d.ts +26 -0
- package/services/index.d.ts +10 -0
- package/services/order-product-review.service.d.ts +13 -0
- package/services/order.service.d.ts +13 -0
- package/services/shared/configuration.facade.d.ts +12 -0
- package/services/shared/index.d.ts +1 -0
- package/services/types/index.d.ts +4 -0
- package/services/types/pending-product-review.type.d.ts +10 -0
- package/services/types/product-review-create.type.d.ts +14 -0
- package/services/types/required-checkout-data.type.d.ts +2 -0
- package/services/types/required-checkout-subscription-data.type.d.ts +2 -0
- package/types/firebase-app-config.type.d.ts +1 -0
- package/types/index.d.ts +1 -0
- package/eslint.config.js +0 -18
- package/index.ts +0 -1
- package/karma.conf.js +0 -32
- package/ng-package.json +0 -8
- package/project.json +0 -37
- package/src/angular-connect.module.ts +0 -256
- package/src/angular-elastic-search.module.ts +0 -23
- package/src/angular-firebase-auth.module.ts +0 -101
- package/src/angular-firestore.module.ts +0 -371
- package/src/angular-hasura-graphql.module.ts +0 -219
- package/src/angular-vertex-search.module.ts +0 -23
- package/src/consts/backend-url.const.ts +0 -1
- package/src/consts/category-structure.ts +0 -1
- package/src/consts/default-shop.const.ts +0 -1
- package/src/consts/es-config.const.ts +0 -1
- package/src/consts/firebase-const.ts +0 -5
- package/src/consts/hasura-options.const.ts +0 -1
- package/src/consts/index.ts +0 -8
- package/src/consts/persistence.const.ts +0 -1
- package/src/consts/storage-base-url.const.ts +0 -1
- package/src/consts/vertex-config.const.ts +0 -1
- package/src/helpers/index.ts +0 -1
- package/src/helpers/mobile-operation-system-checker.helper.ts +0 -10
- package/src/index.ts +0 -6
- package/src/interfaces/catalog-strategies.interface.ts +0 -36
- package/src/interfaces/category-facades.interface.ts +0 -7
- package/src/interfaces/index.ts +0 -2
- package/src/persistence/cookie-data-persistence.ts +0 -21
- package/src/persistence/data-persistence.ts +0 -7
- package/src/persistence/index.ts +0 -2
- package/src/services/auth.service.ts +0 -39
- package/src/services/cart/cart-services.facade.ts +0 -14
- package/src/services/cart/index.ts +0 -1
- package/src/services/cart.service.ts +0 -124
- package/src/services/catalog/adapters/category-structure.adapter.ts +0 -5
- package/src/services/catalog/adapters/index.ts +0 -3
- package/src/services/catalog/adapters/new-category-structure.adapter.ts +0 -42
- package/src/services/catalog/adapters/old-category-structure.adapter.ts +0 -17
- package/src/services/catalog/catalog.service.ts +0 -153
- package/src/services/catalog/category.service.ts +0 -52
- package/src/services/catalog/context/catalog-search.context.ts +0 -61
- package/src/services/catalog/enums/index.ts +0 -1
- package/src/services/catalog/enums/product-sorts.enum.ts +0 -9
- package/src/services/catalog/facades/catalog-service.facade.ts +0 -32
- package/src/services/catalog/facades/catalog-strategies.facade.ts +0 -12
- package/src/services/catalog/facades/category-repository.facade.ts +0 -10
- package/src/services/catalog/facades/category-service.facade.ts +0 -25
- package/src/services/catalog/facades/product-catalog.facade.ts +0 -13
- package/src/services/catalog/helpers/brand-manager.helper.ts +0 -63
- package/src/services/catalog/helpers/catalog-filter.helper.ts +0 -50
- package/src/services/catalog/helpers/catalog-sort.helper.ts +0 -54
- package/src/services/catalog/helpers/index.ts +0 -4
- package/src/services/catalog/helpers/product-fields.helper.ts +0 -35
- package/src/services/catalog/index.ts +0 -7
- package/src/services/catalog/models/category-with-tree.model.ts +0 -7
- package/src/services/catalog/models/index.ts +0 -1
- package/src/services/catalog/services/catalog-helpers.service.ts +0 -35
- package/src/services/catalog/services/catalog-operations.facade.ts +0 -24
- package/src/services/catalog/services/catalog-repository.service.ts +0 -20
- package/src/services/catalog/services/product-management.facade.ts +0 -20
- package/src/services/catalog/strategies/category-search.strategy.ts +0 -172
- package/src/services/catalog/strategies/index.ts +0 -3
- package/src/services/catalog/strategies/profile-search.strategy.ts +0 -51
- package/src/services/catalog/strategies/term-search.strategy.ts +0 -178
- package/src/services/catalog/strategies/types/strategy-params.type.ts +0 -58
- package/src/services/catalog/types/fetch-products-options.type.ts +0 -10
- package/src/services/catalog/types/fetch-products-params.type.ts +0 -27
- package/src/services/catalog/types/fetch-products-response.type.ts +0 -11
- package/src/services/catalog/types/index.ts +0 -5
- package/src/services/catalog/types/method-params.type.ts +0 -21
- package/src/services/catalog/types/product-sort.type.ts +0 -3
- package/src/services/catalog/wishlist.service.ts +0 -368
- package/src/services/checkout/checkout-dependencies.facade.ts +0 -13
- package/src/services/checkout/checkout-repositories.facade.ts +0 -10
- package/src/services/checkout-subscription.service.ts +0 -76
- package/src/services/checkout.service.ts +0 -196
- package/src/services/coupon/coupon-repositories.facade.ts +0 -11
- package/src/services/coupon/types/coupon-params.type.ts +0 -15
- package/src/services/coupon.service.ts +0 -347
- package/src/services/errors/group-invalid-coupon.error.ts +0 -9
- package/src/services/errors/index.ts +0 -2
- package/src/services/errors/invalid-coupon.error.ts +0 -7
- package/src/services/helpers/index.ts +0 -1
- package/src/services/helpers/util.helper.ts +0 -17
- package/src/services/home-shop/home-shop-repositories.facade.ts +0 -11
- package/src/services/home-shop.service.ts +0 -196
- package/src/services/index.ts +0 -9
- package/src/services/order.service.ts +0 -23
- package/src/services/shared/configuration.facade.ts +0 -21
- package/src/services/shared/index.ts +0 -1
- package/src/services/types/index.ts +0 -2
- package/src/services/types/required-checkout-data.type.ts +0 -3
- package/src/services/types/required-checkout-subscription-data.type.ts +0 -3
- package/src/types/firebase-app-config.type.ts +0 -1
- package/src/types/index.ts +0 -1
- package/tsconfig.json +0 -17
- package/tsconfig.lib.json +0 -13
- package/tsconfig.lib.prod.json +0 -13
- package/tsconfig.spec.json +0 -17
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { CheckoutSubscription, CheckoutTypes, isNil, pick, } from '@infrab4a/connect';
|
|
3
|
+
import { concatMap } from 'rxjs/operators';
|
|
4
|
+
import { PERSISTENCE_PROVIDER } from '../consts';
|
|
5
|
+
import { CouponService } from './coupon.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./coupon.service";
|
|
8
|
+
export class CheckoutSubscriptionService {
|
|
9
|
+
constructor(checkoutSubscriptionRepository, dataPersistence, couponService) {
|
|
10
|
+
this.checkoutSubscriptionRepository = checkoutSubscriptionRepository;
|
|
11
|
+
this.dataPersistence = dataPersistence;
|
|
12
|
+
this.couponService = couponService;
|
|
13
|
+
}
|
|
14
|
+
getCheckoutSubscription(checkoutData) {
|
|
15
|
+
return this.dataPersistence
|
|
16
|
+
.get('checkoutSubscriptionId')
|
|
17
|
+
.pipe(concatMap((id) => !isNil(id) ? this.checkoutSubscriptionRepository.get({ id }) : this.createCheckoutSubscription(checkoutData)));
|
|
18
|
+
}
|
|
19
|
+
clearCheckoutSubscriptionFromSession() {
|
|
20
|
+
return this.dataPersistence.remove('checkoutSubscriptionId');
|
|
21
|
+
}
|
|
22
|
+
checkCoupon(nickname, _userEmail) {
|
|
23
|
+
return this.getCheckoutSubscription().pipe(concatMap((checkout) => this.couponService
|
|
24
|
+
.checkCoupon({
|
|
25
|
+
nickname,
|
|
26
|
+
checkoutType: CheckoutTypes.SUBSCRIPTION,
|
|
27
|
+
checkout,
|
|
28
|
+
plan: checkout.subscriptionPlan.name,
|
|
29
|
+
})
|
|
30
|
+
.pipe()));
|
|
31
|
+
}
|
|
32
|
+
calcDiscountSubscription(coupon) {
|
|
33
|
+
return this.getCheckoutSubscription().pipe(concatMap((checkout) => this.couponService.calcDiscountSubscription(coupon, checkout).pipe()));
|
|
34
|
+
}
|
|
35
|
+
async createCheckoutSubscription(checkoutData) {
|
|
36
|
+
const checkout = await this.checkoutSubscriptionRepository.create({
|
|
37
|
+
createdAt: new Date(),
|
|
38
|
+
...CheckoutSubscription.toInstance(pick(checkoutData, ['user', 'shop'])).toPlain(),
|
|
39
|
+
});
|
|
40
|
+
await this.dataPersistence.set('checkoutSubscriptionId', checkout.id).toPromise();
|
|
41
|
+
return checkout;
|
|
42
|
+
}
|
|
43
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CheckoutSubscriptionService, deps: [{ token: 'CheckoutSubscriptionRepository' }, { token: PERSISTENCE_PROVIDER }, { token: i1.CouponService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CheckoutSubscriptionService }); }
|
|
45
|
+
}
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CheckoutSubscriptionService, decorators: [{
|
|
47
|
+
type: Injectable
|
|
48
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
49
|
+
type: Inject,
|
|
50
|
+
args: ['CheckoutSubscriptionRepository']
|
|
51
|
+
}] }, { type: undefined, decorators: [{
|
|
52
|
+
type: Inject,
|
|
53
|
+
args: [PERSISTENCE_PROVIDER]
|
|
54
|
+
}] }, { type: i1.CouponService }] });
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQtc3Vic2NyaXB0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NoZWNrb3V0LXN1YnNjcmlwdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFDTCxvQkFBb0IsRUFFcEIsYUFBYSxFQUViLEtBQUssRUFDTCxJQUFJLEdBQ0wsTUFBTSxtQkFBbUIsQ0FBQTtBQUUxQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sV0FBVyxDQUFBO0FBSWhELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTs7O0FBR2hELE1BQU0sT0FBTywyQkFBMkI7SUFDdEMsWUFFbUIsOEJBQThELEVBQ2hDLGVBQWdDLEVBQzlELGFBQTRCO1FBRjVCLG1DQUE4QixHQUE5Qiw4QkFBOEIsQ0FBZ0M7UUFDaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQzlELGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBQzVDLENBQUM7SUFFSix1QkFBdUIsQ0FBQyxZQUErQztRQUNyRSxPQUFPLElBQUksQ0FBQyxlQUFlO2FBQ3hCLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQzthQUM3QixJQUFJLENBQ0gsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDZixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLENBQUMsQ0FDN0csQ0FDRixDQUFBO0lBQ0wsQ0FBQztJQUVELG9DQUFvQztRQUNsQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBSSxDQUN4QyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUNyQixJQUFJLENBQUMsYUFBYTthQUNmLFdBQVcsQ0FBQztZQUNYLFFBQVE7WUFDUixZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVk7WUFDeEMsUUFBUTtZQUNSLElBQUksRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSTtTQUNyQyxDQUFDO2FBQ0QsSUFBSSxFQUFFLENBQ1YsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELHdCQUF3QixDQUFDLE1BQWM7UUFDckMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxJQUFJLENBQ3hDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDOUYsQ0FBQTtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQ3RDLFlBQStDO1FBRS9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQztZQUNoRSxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDckIsR0FBRyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO1NBQ25GLENBQUMsQ0FBQTtRQUVGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRWpGLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7OEdBdERVLDJCQUEyQixrQkFFNUIsZ0NBQWdDLGFBRWhDLG9CQUFvQjtrSEFKbkIsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUR2QyxVQUFVOzswQkFHTixNQUFNOzJCQUFDLGdDQUFnQzs7MEJBRXZDLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtcclxuICBDaGVja291dFN1YnNjcmlwdGlvbixcclxuICBDaGVja291dFN1YnNjcmlwdGlvblJlcG9zaXRvcnksXHJcbiAgQ2hlY2tvdXRUeXBlcyxcclxuICBDb3Vwb24sXHJcbiAgaXNOaWwsXHJcbiAgcGljayxcclxufSBmcm9tICdAaW5mcmFiNGEvY29ubmVjdCdcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IGNvbmNhdE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5cclxuXHJcbmltcG9ydCB7IFBFUlNJU1RFTkNFX1BST1ZJREVSIH0gZnJvbSAnLi4vY29uc3RzJ1xyXG5pbXBvcnQgeyBEYXRhUGVyc2lzdGVuY2UgfSBmcm9tICcuLi9wZXJzaXN0ZW5jZSdcclxuXHJcbmltcG9ydCB7IFJlcXVpcmVkQ2hlY2tvdXRTdWJzY3JpcHRpb25EYXRhIH0gZnJvbSAnLi90eXBlcydcclxuaW1wb3J0IHsgQ291cG9uU2VydmljZSB9IGZyb20gJy4vY291cG9uLnNlcnZpY2UnXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDaGVja291dFN1YnNjcmlwdGlvblNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnQ2hlY2tvdXRTdWJzY3JpcHRpb25SZXBvc2l0b3J5JylcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hlY2tvdXRTdWJzY3JpcHRpb25SZXBvc2l0b3J5OiBDaGVja291dFN1YnNjcmlwdGlvblJlcG9zaXRvcnksXHJcbiAgICBASW5qZWN0KFBFUlNJU1RFTkNFX1BST1ZJREVSKSBwcml2YXRlIHJlYWRvbmx5IGRhdGFQZXJzaXN0ZW5jZTogRGF0YVBlcnNpc3RlbmNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb3Vwb25TZXJ2aWNlOiBDb3Vwb25TZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgZ2V0Q2hlY2tvdXRTdWJzY3JpcHRpb24oY2hlY2tvdXREYXRhPzogUmVxdWlyZWRDaGVja291dFN1YnNjcmlwdGlvbkRhdGEpOiBPYnNlcnZhYmxlPENoZWNrb3V0U3Vic2NyaXB0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhUGVyc2lzdGVuY2VcclxuICAgICAgLmdldCgnY2hlY2tvdXRTdWJzY3JpcHRpb25JZCcpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGNvbmNhdE1hcCgoaWQpID0+XHJcbiAgICAgICAgICAhaXNOaWwoaWQpID8gdGhpcy5jaGVja291dFN1YnNjcmlwdGlvblJlcG9zaXRvcnkuZ2V0KHsgaWQgfSkgOiB0aGlzLmNyZWF0ZUNoZWNrb3V0U3Vic2NyaXB0aW9uKGNoZWNrb3V0RGF0YSksXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gIH1cclxuXHJcbiAgY2xlYXJDaGVja291dFN1YnNjcmlwdGlvbkZyb21TZXNzaW9uKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVBlcnNpc3RlbmNlLnJlbW92ZSgnY2hlY2tvdXRTdWJzY3JpcHRpb25JZCcpXHJcbiAgfVxyXG5cclxuICBjaGVja0NvdXBvbihuaWNrbmFtZTogc3RyaW5nLCBfdXNlckVtYWlsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENvdXBvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hlY2tvdXRTdWJzY3JpcHRpb24oKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PlxyXG4gICAgICAgIHRoaXMuY291cG9uU2VydmljZVxyXG4gICAgICAgICAgLmNoZWNrQ291cG9uKHtcclxuICAgICAgICAgICAgbmlja25hbWUsXHJcbiAgICAgICAgICAgIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcy5TVUJTQ1JJUFRJT04sXHJcbiAgICAgICAgICAgIGNoZWNrb3V0LFxyXG4gICAgICAgICAgICBwbGFuOiBjaGVja291dC5zdWJzY3JpcHRpb25QbGFuLm5hbWUsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLnBpcGUoKSxcclxuICAgICAgKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIGNhbGNEaXNjb3VudFN1YnNjcmlwdGlvbihjb3Vwb246IENvdXBvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hlY2tvdXRTdWJzY3JpcHRpb24oKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmNvdXBvblNlcnZpY2UuY2FsY0Rpc2NvdW50U3Vic2NyaXB0aW9uKGNvdXBvbiwgY2hlY2tvdXQpLnBpcGUoKSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNoZWNrb3V0U3Vic2NyaXB0aW9uKFxyXG4gICAgY2hlY2tvdXREYXRhPzogUmVxdWlyZWRDaGVja291dFN1YnNjcmlwdGlvbkRhdGEsXHJcbiAgKTogUHJvbWlzZTxDaGVja291dFN1YnNjcmlwdGlvbj4ge1xyXG4gICAgY29uc3QgY2hlY2tvdXQgPSBhd2FpdCB0aGlzLmNoZWNrb3V0U3Vic2NyaXB0aW9uUmVwb3NpdG9yeS5jcmVhdGUoe1xyXG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXHJcbiAgICAgIC4uLkNoZWNrb3V0U3Vic2NyaXB0aW9uLnRvSW5zdGFuY2UocGljayhjaGVja291dERhdGEsIFsndXNlcicsICdzaG9wJ10pKS50b1BsYWluKCksXHJcbiAgICB9KVxyXG5cclxuICAgIGF3YWl0IHRoaXMuZGF0YVBlcnNpc3RlbmNlLnNldCgnY2hlY2tvdXRTdWJzY3JpcHRpb25JZCcsIGNoZWNrb3V0LmlkKS50b1Byb21pc2UoKVxyXG5cclxuICAgIHJldHVybiBjaGVja291dFxyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Checkout, isNil, NotFoundError, pick, } from '@infrab4a/connect';
|
|
2
|
+
import { from, of, throwError } from 'rxjs';
|
|
3
|
+
import { concatMap, map } from 'rxjs/operators';
|
|
4
|
+
import { Injectable } from '@angular/core';
|
|
5
|
+
import { CheckoutDependenciesFacade, CheckoutRepositoriesFacade } from './checkout';
|
|
6
|
+
import { ConfigurationFacade } from './shared';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "./checkout";
|
|
9
|
+
import * as i2 from "./shared";
|
|
10
|
+
export class CheckoutService {
|
|
11
|
+
constructor(repositoriesFacade, dependenciesFacade, configurationFacade) {
|
|
12
|
+
this.repositoriesFacade = repositoriesFacade;
|
|
13
|
+
this.dependenciesFacade = dependenciesFacade;
|
|
14
|
+
this.configurationFacade = configurationFacade;
|
|
15
|
+
this.checkoutUrl = null;
|
|
16
|
+
this.checkoutUrl = this.configurationFacade.getCheckoutUrl();
|
|
17
|
+
}
|
|
18
|
+
getCheckout(checkoutData) {
|
|
19
|
+
return this.dependenciesFacade.dataPersistence
|
|
20
|
+
.get('checkoutId')
|
|
21
|
+
.pipe(concatMap((id) => !isNil(id) ? this.repositoriesFacade.checkoutRepository.get({ id }) : this.createCheckout(checkoutData)));
|
|
22
|
+
}
|
|
23
|
+
getUserByCheckout(checkoutId) {
|
|
24
|
+
return from(this.repositoriesFacade.checkoutRepository.get({ id: checkoutId })).pipe(concatMap((checkout) => checkout?.user?.id
|
|
25
|
+
? of(checkout.user)
|
|
26
|
+
: from(this.repositoriesFacade.userRepository.get({ id: checkout.user.id }))), concatMap((user) => of(user) || throwError(() => new NotFoundError('User is not found'))));
|
|
27
|
+
}
|
|
28
|
+
updateCheckoutLineItems(checkout) {
|
|
29
|
+
return from(this.repositoriesFacade.checkoutRepository.update(Checkout.toInstance({ id: checkout.id, lineItems: checkout.lineItems })));
|
|
30
|
+
}
|
|
31
|
+
updateCheckoutUser(checkout) {
|
|
32
|
+
return from(this.repositoriesFacade.checkoutRepository.update(Checkout.toInstance({ id: checkout.id, user: checkout.user })));
|
|
33
|
+
}
|
|
34
|
+
clearCheckoutFromSession() {
|
|
35
|
+
return this.dependenciesFacade.dataPersistence.remove('checkoutId');
|
|
36
|
+
}
|
|
37
|
+
resetCheckoutValues() {
|
|
38
|
+
return this.getCheckout().pipe(concatMap((checkout) => this.dependenciesFacade.httpClient.post(`${this.checkoutUrl}/checkoutResetValues`, {
|
|
39
|
+
checkoutId: checkout.id,
|
|
40
|
+
})), concatMap(() => this.getCheckout()));
|
|
41
|
+
}
|
|
42
|
+
applyCouponDiscount(nickname, checkoutType) {
|
|
43
|
+
return this.getCheckout().pipe(concatMap((checkout) => this.dependenciesFacade.httpClient.post(`${this.checkoutUrl}/checkoutApplyDiscount`, {
|
|
44
|
+
checkoutId: checkout.id,
|
|
45
|
+
coupon: nickname,
|
|
46
|
+
checkoutType,
|
|
47
|
+
})), concatMap(() => this.getCheckout()), map((checkout) => checkout.coupon));
|
|
48
|
+
}
|
|
49
|
+
removeCouponDiscount() {
|
|
50
|
+
return this.getCheckout().pipe(concatMap((checkout) => this.dependenciesFacade.httpClient.post(`${this.checkoutUrl}/checkoutRemoveDiscount`, {
|
|
51
|
+
checkoutId: checkout.id,
|
|
52
|
+
})), concatMap(() => this.getCheckout()));
|
|
53
|
+
}
|
|
54
|
+
validateStockProducts() {
|
|
55
|
+
return this.getCheckout().pipe(concatMap((checkout) => this.dependenciesFacade.httpClient.post(`${this.checkoutUrl}/checkoutValidateProductStock`, {
|
|
56
|
+
checkoutId: checkout.id,
|
|
57
|
+
})));
|
|
58
|
+
}
|
|
59
|
+
selectShippingAddress(address) {
|
|
60
|
+
return this.getCheckout().pipe(concatMap((checkout) => {
|
|
61
|
+
return this.repositoriesFacade.checkoutRepository.update(Checkout.toInstance({ id: checkout.id, shippingAddress: address, billingAddress: address }));
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
getAvailableShippingForProduct(productShipping) {
|
|
65
|
+
return this.dependenciesFacade.httpClient.post(`${this.checkoutUrl}/checkoutGetAvailableShipping`, {
|
|
66
|
+
checkoutId: null,
|
|
67
|
+
productShipping,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
getAvailableShippingForCheckout() {
|
|
71
|
+
return this.getCheckout().pipe(concatMap((checkout) => this.dependenciesFacade.httpClient.post(`${this.checkoutUrl}/checkoutGetAvailableShipping`, {
|
|
72
|
+
checkoutId: checkout.id,
|
|
73
|
+
productShipping: null,
|
|
74
|
+
})));
|
|
75
|
+
}
|
|
76
|
+
selectShipping(option) {
|
|
77
|
+
return this.getCheckout().pipe(concatMap((checkout) => this.dependenciesFacade.httpClient.post(`${this.checkoutUrl}/checkoutSelectShipping`, {
|
|
78
|
+
checkoutId: checkout.id,
|
|
79
|
+
shippingOption: option,
|
|
80
|
+
})), concatMap(() => this.getCheckout()));
|
|
81
|
+
}
|
|
82
|
+
createOrder(checkoutPayload, paymentProvider, applicationVersion) {
|
|
83
|
+
return this.dependenciesFacade.httpClient.post(`${this.checkoutUrl}/checkout`, {
|
|
84
|
+
data: {
|
|
85
|
+
...checkoutPayload,
|
|
86
|
+
applicationVersion,
|
|
87
|
+
paymentProvider,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async createCheckout(checkoutData) {
|
|
92
|
+
const checkout = await this.repositoriesFacade.checkoutRepository.create({
|
|
93
|
+
createdAt: new Date(),
|
|
94
|
+
...Checkout.toInstance(pick(checkoutData, ['user', 'shop'])).toPlain(),
|
|
95
|
+
shop: checkoutData?.shop || this.configurationFacade.defaultShop,
|
|
96
|
+
});
|
|
97
|
+
await this.dependenciesFacade.dataPersistence.set('checkoutId', checkout.id).toPromise();
|
|
98
|
+
return checkout;
|
|
99
|
+
}
|
|
100
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CheckoutService, deps: [{ token: i1.CheckoutRepositoriesFacade }, { token: i1.CheckoutDependenciesFacade }, { token: i2.ConfigurationFacade }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
101
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CheckoutService }); }
|
|
102
|
+
}
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CheckoutService, decorators: [{
|
|
104
|
+
type: Injectable
|
|
105
|
+
}], ctorParameters: () => [{ type: i1.CheckoutRepositoriesFacade }, { type: i1.CheckoutDependenciesFacade }, { type: i2.ConfigurationFacade }] });
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvY2hlY2tvdXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQU1SLEtBQUssRUFDTCxhQUFhLEVBQ2IsSUFBSSxHQUtMLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUcxQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFBOzs7O0FBRzlDLE1BQU0sT0FBTyxlQUFlO0lBRzFCLFlBQ21CLGtCQUE4QyxFQUM5QyxrQkFBOEMsRUFDOUMsbUJBQXdDO1FBRnhDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBNEI7UUFDOUMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUE0QjtRQUM5Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBTG5ELGdCQUFXLEdBQVcsSUFBSSxDQUFBO1FBT2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQzlELENBQUM7SUFFRCxXQUFXLENBQUMsWUFBbUM7UUFDN0MsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZTthQUMzQyxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ2pCLElBQUksQ0FDSCxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUNmLENBQUMsS0FB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LElBQUksRUFBRTtnQkFDSixHQUFHLGVBQWU7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsZUFBZTthQUNoQjtTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQW1DO1FBQzlELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztZQUN2RSxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDckIsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUN0RSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVztTQUNqRSxDQUFDLENBQUE7UUFFRixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFeEYsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQzs4R0ExS1UsZUFBZTtrSEFBZixlQUFlOzsyRkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGVja291dCxcclxuICBDaGVja291dFBheWxvYWRSZXF1ZXN0LFxyXG4gIENoZWNrb3V0UmVzcG9uc2UsXHJcbiAgQ2hlY2tvdXRTdG9ja1ZhbGlkYXRpb24sXHJcbiAgQ2hlY2tvdXRUeXBlcyxcclxuICBDb3Vwb24sXHJcbiAgaXNOaWwsXHJcbiAgTm90Rm91bmRFcnJvcixcclxuICBwaWNrLFxyXG4gIFNoaXBwaW5nTWV0aG9kUmVzcG9uc2UsXHJcbiAgU2hpcHBpbmdQcm9kdWN0UmVxdWVzdCxcclxuICBVc2VyLFxyXG4gIFVzZXJBZGRyZXNzLFxyXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xyXG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5cclxuaW1wb3J0IHsgUmVxdWlyZWRDaGVja291dERhdGEgfSBmcm9tICcuL3R5cGVzJ1xyXG5pbXBvcnQgeyBDaGVja291dERlcGVuZGVuY2llc0ZhY2FkZSwgQ2hlY2tvdXRSZXBvc2l0b3JpZXNGYWNhZGUgfSBmcm9tICcuL2NoZWNrb3V0J1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRmFjYWRlIH0gZnJvbSAnLi9zaGFyZWQnXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDaGVja291dFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgY2hlY2tvdXRVcmw6IHN0cmluZyA9IG51bGxcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcG9zaXRvcmllc0ZhY2FkZTogQ2hlY2tvdXRSZXBvc2l0b3JpZXNGYWNhZGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcGVuZGVuY2llc0ZhY2FkZTogQ2hlY2tvdXREZXBlbmRlbmNpZXNGYWNhZGUsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb25GYWNhZGU6IENvbmZpZ3VyYXRpb25GYWNhZGUsXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNoZWNrb3V0VXJsID0gdGhpcy5jb25maWd1cmF0aW9uRmFjYWRlLmdldENoZWNrb3V0VXJsKClcclxuICB9XHJcblxyXG4gIGdldENoZWNrb3V0KGNoZWNrb3V0RGF0YT86IFJlcXVpcmVkQ2hlY2tvdXREYXRhKTogT2JzZXJ2YWJsZTxDaGVja291dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzRmFjYWRlLmRhdGFQZXJzaXN0ZW5jZVxyXG4gICAgICAuZ2V0KCdjaGVja291dElkJylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgY29uY2F0TWFwKChpZCkgPT5cclxuICAgICAgICAgICFpc05pbChpZCkgPyB0aGlzLnJlcG9zaXRvcmllc0ZhY2FkZS5jaGVja291dFJlcG9zaXRvcnkuZ2V0KHsgaWQgfSkgOiB0aGlzLmNyZWF0ZUNoZWNrb3V0KGNoZWNrb3V0RGF0YSksXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckJ5Q2hlY2tvdXQoY2hlY2tvdXRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxVc2VyPiB7XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLnJlcG9zaXRvcmllc0ZhY2FkZS5jaGVja291dFJlcG9zaXRvcnkuZ2V0KHsgaWQ6IGNoZWNrb3V0SWQgfSkpLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+XHJcbiAgICAgICAgY2hlY2tvdXQ/LnVzZXI/LmlkXHJcbiAgICAgICAgICA/IG9mKGNoZWNrb3V0LnVzZXIpXHJcbiAgICAgICAgICA6IGZyb20odGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUudXNlclJlcG9zaXRvcnkuZ2V0KHsgaWQ6IGNoZWNrb3V0LnVzZXIuaWQgfSkpLFxyXG4gICAgICApLFxyXG4gICAgICBjb25jYXRNYXAoKHVzZXIpID0+IG9mKHVzZXIpIHx8IHRocm93RXJyb3IoKCkgPT4gbmV3IE5vdEZvdW5kRXJyb3IoJ1VzZXIgaXMgbm90IGZvdW5kJykpKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIHVwZGF0ZUNoZWNrb3V0TGluZUl0ZW1zKGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IE9ic2VydmFibGU8Q2hlY2tvdXQ+IHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLnJlcG9zaXRvcmllc0ZhY2FkZS5jaGVja291dFJlcG9zaXRvcnkudXBkYXRlKFxyXG4gICAgICAgIENoZWNrb3V0LnRvSW5zdGFuY2UoeyBpZDogY2hlY2tvdXQuaWQsIGxpbmVJdGVtczogY2hlY2tvdXQubGluZUl0ZW1zIH0pLFxyXG4gICAgICApLFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2hlY2tvdXRVc2VyKGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IE9ic2VydmFibGU8Q2hlY2tvdXQ+IHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLnJlcG9zaXRvcmllc0ZhY2FkZS5jaGVja291dFJlcG9zaXRvcnkudXBkYXRlKENoZWNrb3V0LnRvSW5zdGFuY2UoeyBpZDogY2hlY2tvdXQuaWQsIHVzZXI6IGNoZWNrb3V0LnVzZXIgfSkpLFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgY2xlYXJDaGVja291dEZyb21TZXNzaW9uKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzRmFjYWRlLmRhdGFQZXJzaXN0ZW5jZS5yZW1vdmUoJ2NoZWNrb3V0SWQnKVxyXG4gIH1cclxuXHJcbiAgcmVzZXRDaGVja291dFZhbHVlcygpOiBPYnNlcnZhYmxlPENoZWNrb3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+XHJcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNGYWNhZGUuaHR0cENsaWVudC5wb3N0KGAke3RoaXMuY2hlY2tvdXRVcmx9L2NoZWNrb3V0UmVzZXRWYWx1ZXNgLCB7XHJcbiAgICAgICAgICBjaGVja291dElkOiBjaGVja291dC5pZCxcclxuICAgICAgICB9KSxcclxuICAgICAgKSxcclxuICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0Q2hlY2tvdXQoKSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBhcHBseUNvdXBvbkRpc2NvdW50KG5pY2tuYW1lOiBzdHJpbmcsIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcyk6IE9ic2VydmFibGU8Q291cG9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+XHJcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNGYWNhZGUuaHR0cENsaWVudC5wb3N0KGAke3RoaXMuY2hlY2tvdXRVcmx9L2NoZWNrb3V0QXBwbHlEaXNjb3VudGAsIHtcclxuICAgICAgICAgIGNoZWNrb3V0SWQ6IGNoZWNrb3V0LmlkLFxyXG4gICAgICAgICAgY291cG9uOiBuaWNrbmFtZSxcclxuICAgICAgICAgIGNoZWNrb3V0VHlwZSxcclxuICAgICAgICB9KSxcclxuICAgICAgKSxcclxuICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0Q2hlY2tvdXQoKSksXHJcbiAgICAgIG1hcCgoY2hlY2tvdXQpID0+IGNoZWNrb3V0LmNvdXBvbiksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZW1vdmVDb3Vwb25EaXNjb3VudCgpOiBPYnNlcnZhYmxlPENoZWNrb3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+XHJcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNGYWNhZGUuaHR0cENsaWVudC5wb3N0KGAke3RoaXMuY2hlY2tvdXRVcmx9L2NoZWNrb3V0UmVtb3ZlRGlzY291bnRgLCB7XHJcbiAgICAgICAgICBjaGVja291dElkOiBjaGVja291dC5pZCxcclxuICAgICAgICB9KSxcclxuICAgICAgKSxcclxuICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0Q2hlY2tvdXQoKSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVN0b2NrUHJvZHVjdHMoKTogT2JzZXJ2YWJsZTxDaGVja291dFN0b2NrVmFsaWRhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hlY2tvdXQoKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PlxyXG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRmFjYWRlLmh0dHBDbGllbnQucG9zdDx7XHJcbiAgICAgICAgICB2YWxpZDogYm9vbGVhblxyXG4gICAgICAgICAgb3V0T2ZTdG9jazogc3RyaW5nW11cclxuICAgICAgICAgIGxpbWl0ZWRTdG9jazogc3RyaW5nW11cclxuICAgICAgICB9PihgJHt0aGlzLmNoZWNrb3V0VXJsfS9jaGVja291dFZhbGlkYXRlUHJvZHVjdFN0b2NrYCwge1xyXG4gICAgICAgICAgY2hlY2tvdXRJZDogY2hlY2tvdXQuaWQsXHJcbiAgICAgICAgfSksXHJcbiAgICAgICksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzZWxlY3RTaGlwcGluZ0FkZHJlc3MoYWRkcmVzczogVXNlckFkZHJlc3MpOiBPYnNlcnZhYmxlPENoZWNrb3V0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUuY2hlY2tvdXRSZXBvc2l0b3J5LnVwZGF0ZShcclxuICAgICAgICAgIENoZWNrb3V0LnRvSW5zdGFuY2UoeyBpZDogY2hlY2tvdXQuaWQsIHNoaXBwaW5nQWRkcmVzczogYWRkcmVzcywgYmlsbGluZ0FkZHJlc3M6IGFkZHJlc3MgfSksXHJcbiAgICAgICAgKVxyXG4gICAgICB9KSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIGdldEF2YWlsYWJsZVNoaXBwaW5nRm9yUHJvZHVjdChwcm9kdWN0U2hpcHBpbmc6IFNoaXBwaW5nUHJvZHVjdFJlcXVlc3QpOiBPYnNlcnZhYmxlPFNoaXBwaW5nTWV0aG9kUmVzcG9uc2VbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzRmFjYWRlLmh0dHBDbGllbnQucG9zdDxTaGlwcGluZ01ldGhvZFJlc3BvbnNlW10+KFxyXG4gICAgICBgJHt0aGlzLmNoZWNrb3V0VXJsfS9jaGVja291dEdldEF2YWlsYWJsZVNoaXBwaW5nYCxcclxuICAgICAge1xyXG4gICAgICAgIGNoZWNrb3V0SWQ6IG51bGwsXHJcbiAgICAgICAgcHJvZHVjdFNoaXBwaW5nLFxyXG4gICAgICB9LFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgZ2V0QXZhaWxhYmxlU2hpcHBpbmdGb3JDaGVja291dCgpOiBPYnNlcnZhYmxlPFNoaXBwaW5nTWV0aG9kUmVzcG9uc2VbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hlY2tvdXQoKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PlxyXG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRmFjYWRlLmh0dHBDbGllbnQucG9zdDxTaGlwcGluZ01ldGhvZFJlc3BvbnNlW10+KFxyXG4gICAgICAgICAgYCR7dGhpcy5jaGVja291dFVybH0vY2hlY2tvdXRHZXRBdmFpbGFibGVTaGlwcGluZ2AsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoZWNrb3V0SWQ6IGNoZWNrb3V0LmlkLFxyXG4gICAgICAgICAgICBwcm9kdWN0U2hpcHBpbmc6IG51bGwsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICksXHJcbiAgICAgICksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzZWxlY3RTaGlwcGluZyhvcHRpb246IHN0cmluZyk6IE9ic2VydmFibGU8Q2hlY2tvdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmdldENoZWNrb3V0KCkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChjaGVja291dCkgPT5cclxuICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0ZhY2FkZS5odHRwQ2xpZW50LnBvc3QoYCR7dGhpcy5jaGVja291dFVybH0vY2hlY2tvdXRTZWxlY3RTaGlwcGluZ2AsIHtcclxuICAgICAgICAgIGNoZWNrb3V0SWQ6IGNoZWNrb3V0LmlkLFxyXG4gICAgICAgICAgc2hpcHBpbmdPcHRpb246IG9wdGlvbixcclxuICAgICAgICB9KSxcclxuICAgICAgKSxcclxuICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0Q2hlY2tvdXQoKSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBjcmVhdGVPcmRlcihcclxuICAgIGNoZWNrb3V0UGF5bG9hZDogQ2hlY2tvdXRQYXlsb2FkUmVxdWVzdCxcclxuICAgIHBheW1lbnRQcm92aWRlcjogc3RyaW5nLFxyXG4gICAgYXBwbGljYXRpb25WZXJzaW9uOiBzdHJpbmcsXHJcbiAgKTogT2JzZXJ2YWJsZTxDaGVja291dFJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXNGYWNhZGUuaHR0cENsaWVudC5wb3N0PENoZWNrb3V0UmVzcG9uc2U+KGAke3RoaXMuY2hlY2tvdXRVcmx9L2NoZWNrb3V0YCwge1xyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgLi4uY2hlY2tvdXRQYXlsb2FkLFxyXG4gICAgICAgIGFwcGxpY2F0aW9uVmVyc2lvbixcclxuICAgICAgICBwYXltZW50UHJvdmlkZXIsXHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVDaGVja291dChjaGVja291dERhdGE/OiBSZXF1aXJlZENoZWNrb3V0RGF0YSk6IFByb21pc2U8Q2hlY2tvdXQ+IHtcclxuICAgIGNvbnN0IGNoZWNrb3V0ID0gYXdhaXQgdGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUuY2hlY2tvdXRSZXBvc2l0b3J5LmNyZWF0ZSh7XHJcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgLi4uQ2hlY2tvdXQudG9JbnN0YW5jZShwaWNrKGNoZWNrb3V0RGF0YSwgWyd1c2VyJywgJ3Nob3AnXSkpLnRvUGxhaW4oKSxcclxuICAgICAgc2hvcDogY2hlY2tvdXREYXRhPy5zaG9wIHx8IHRoaXMuY29uZmlndXJhdGlvbkZhY2FkZS5kZWZhdWx0U2hvcCxcclxuICAgIH0pXHJcblxyXG4gICAgYXdhaXQgdGhpcy5kZXBlbmRlbmNpZXNGYWNhZGUuZGF0YVBlcnNpc3RlbmNlLnNldCgnY2hlY2tvdXRJZCcsIGNoZWNrb3V0LmlkKS50b1Byb21pc2UoKVxyXG5cclxuICAgIHJldHVybiBjaGVja291dFxyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class CouponRepositoriesFacade {
|
|
4
|
+
constructor(couponRepository, orderRepository, categoryRepository) {
|
|
5
|
+
this.couponRepository = couponRepository;
|
|
6
|
+
this.orderRepository = orderRepository;
|
|
7
|
+
this.categoryRepository = categoryRepository;
|
|
8
|
+
}
|
|
9
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponRepositoriesFacade, deps: [{ token: 'CouponRepository' }, { token: 'OrderRepository' }, { token: 'CategoryRepository' }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
10
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponRepositoriesFacade }); }
|
|
11
|
+
}
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponRepositoriesFacade, decorators: [{
|
|
13
|
+
type: Injectable
|
|
14
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
15
|
+
type: Inject,
|
|
16
|
+
args: ['CouponRepository']
|
|
17
|
+
}] }, { type: undefined, decorators: [{
|
|
18
|
+
type: Inject,
|
|
19
|
+
args: ['OrderRepository']
|
|
20
|
+
}] }, { type: undefined, decorators: [{
|
|
21
|
+
type: Inject,
|
|
22
|
+
args: ['CategoryRepository']
|
|
23
|
+
}] }] });
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLXJlcG9zaXRvcmllcy5mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi9jb3Vwb24tcmVwb3NpdG9yaWVzLmZhY2FkZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTs7QUFJbEQsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxZQUM4QyxnQkFBa0MsRUFDbkMsZUFBZ0MsRUFDN0Isa0JBQXNDO1FBRnhDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbkMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQzdCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7SUFDbkYsQ0FBQzs4R0FMTyx3QkFBd0Isa0JBRXpCLGtCQUFrQixhQUNsQixpQkFBaUIsYUFDakIsb0JBQW9CO2tIQUpuQix3QkFBd0I7OzJGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVU7OzBCQUdOLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDekIsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IENhdGVnb3J5UmVwb3NpdG9yeSwgQ291cG9uUmVwb3NpdG9yeSwgT3JkZXJSZXBvc2l0b3J5IH0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3Vwb25SZXBvc2l0b3JpZXNGYWNhZGUge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnQ291cG9uUmVwb3NpdG9yeScpIHB1YmxpYyByZWFkb25seSBjb3Vwb25SZXBvc2l0b3J5OiBDb3Vwb25SZXBvc2l0b3J5LFxyXG4gICAgQEluamVjdCgnT3JkZXJSZXBvc2l0b3J5JykgcHVibGljIHJlYWRvbmx5IG9yZGVyUmVwb3NpdG9yeTogT3JkZXJSZXBvc2l0b3J5LFxyXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlSZXBvc2l0b3J5JykgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5UmVwb3NpdG9yeTogQ2F0ZWdvcnlSZXBvc2l0b3J5LFxyXG4gICkge31cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { CouponRepositoriesFacade } from './coupon-repositories.facade';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENvdXBvblJlcG9zaXRvcmllc0ZhY2FkZSB9IGZyb20gJy4vY291cG9uLXJlcG9zaXRvcmllcy5mYWNhZGUnXHJcbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLXBhcmFtcy50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9zZXJ2aWNlcy9jb3Vwb24vdHlwZXMvY291cG9uLXBhcmFtcy50eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGVja291dCwgQ2hlY2tvdXRUeXBlcywgQ291cG9uIH0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXHJcblxyXG5leHBvcnQgdHlwZSBDaGVja0NvdXBvblBhcmFtcyA9IHtcclxuICBuaWNrbmFtZTogc3RyaW5nXHJcbiAgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzXHJcbiAgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+XHJcbiAgcGxhbjogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIENvdXBvblJ1bGVzVmFsaWRhdGlvblBhcmFtcyA9IHtcclxuICBjb3Vwb246IENvdXBvblxyXG4gIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlc1xyXG4gIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PlxyXG4gIHBsYW46IHN0cmluZ1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { 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 { CouponRepositoriesFacade } from './coupon';
|
|
6
|
+
import { ConfigurationFacade } from './shared';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "./coupon";
|
|
9
|
+
import * as i2 from "./shared";
|
|
10
|
+
export class CouponService {
|
|
11
|
+
constructor(repositoriesFacade, configurationFacade) {
|
|
12
|
+
this.repositoriesFacade = repositoriesFacade;
|
|
13
|
+
this.configurationFacade = configurationFacade;
|
|
14
|
+
this.emailIsFromCollaborator = (userEmail) => !!userEmail?.match(/@b4a.com.br/g);
|
|
15
|
+
}
|
|
16
|
+
checkCoupon(params) {
|
|
17
|
+
const { nickname, checkoutType, checkout, plan } = params;
|
|
18
|
+
return from(this.repositoriesFacade.couponRepository
|
|
19
|
+
.find({
|
|
20
|
+
filters: {
|
|
21
|
+
nickname: { operator: Where.EQUALS, value: nickname },
|
|
22
|
+
active: { operator: Where.EQUALS, value: true },
|
|
23
|
+
},
|
|
24
|
+
})
|
|
25
|
+
.then((result) => result.data[0])).pipe(concatMap((coupon) => this.couponValidation(coupon, checkoutType)), concatMap((couponValid) => this.couponRulesValidation({ coupon: couponValid, checkoutType, checkout, plan })), map((couponValidated) => couponValidated));
|
|
26
|
+
}
|
|
27
|
+
async couponValidation(coupon, checkoutType) {
|
|
28
|
+
if (!coupon)
|
|
29
|
+
throw 'Cupom inválido.';
|
|
30
|
+
if (coupon?.beginAt && coupon?.beginAt.getTime() > new Date().getTime())
|
|
31
|
+
throw 'Cupom inválido.';
|
|
32
|
+
if (coupon?.expiresIn && (coupon?.expiresIn).getTime() < new Date().getTime())
|
|
33
|
+
throw 'Cupom expirado.';
|
|
34
|
+
const isInShop = coupon.shopAvailability === Shops.ALL || coupon.shopAvailability === this.configurationFacade.defaultShop;
|
|
35
|
+
if (!isInShop)
|
|
36
|
+
throw 'Cupom inválido para loja.';
|
|
37
|
+
const isCheckoutType = coupon.checkoutType === CheckoutTypes.ALL || coupon.checkoutType === checkoutType;
|
|
38
|
+
if (!isCheckoutType)
|
|
39
|
+
throw 'Cupom inválido. Erro de checkout.';
|
|
40
|
+
return coupon;
|
|
41
|
+
}
|
|
42
|
+
async couponRulesValidation(params) {
|
|
43
|
+
const { coupon, checkoutType, checkout, plan } = params;
|
|
44
|
+
if (checkoutType == CheckoutTypes.SUBSCRIPTION) {
|
|
45
|
+
return this.validateSubscriptionCoupon(coupon, plan);
|
|
46
|
+
}
|
|
47
|
+
return this.validateEcommerceCoupon(coupon, checkoutType, checkout);
|
|
48
|
+
}
|
|
49
|
+
validateSubscriptionCoupon(coupon, plan) {
|
|
50
|
+
if (coupon.plan && coupon.plan.toUpperCase() !== plan.toUpperCase()) {
|
|
51
|
+
throw 'Cupom inválido para sua assinatura.';
|
|
52
|
+
}
|
|
53
|
+
return coupon;
|
|
54
|
+
}
|
|
55
|
+
async validateEcommerceCoupon(coupon, checkoutType, checkout) {
|
|
56
|
+
this.validateUserEligibility(coupon, checkout?.user);
|
|
57
|
+
await this.validateUsageLimits(coupon, checkoutType, checkout);
|
|
58
|
+
await this.validateProductEligibility(coupon, checkout);
|
|
59
|
+
return coupon;
|
|
60
|
+
}
|
|
61
|
+
validateUserEligibility(coupon, user) {
|
|
62
|
+
const validUser = this.coupomUserValidation(coupon, user);
|
|
63
|
+
if (!validUser)
|
|
64
|
+
throw 'Usuário não elegível.';
|
|
65
|
+
}
|
|
66
|
+
async validateUsageLimits(coupon, checkoutType, checkout) {
|
|
67
|
+
const couponUseLimits = this.getCouponUseLimits(coupon, checkoutType, checkout.user);
|
|
68
|
+
if (couponUseLimits.firstOrder) {
|
|
69
|
+
await this.validateFirstOrderLimit(checkout.user.email);
|
|
70
|
+
}
|
|
71
|
+
if (!couponUseLimits.unlimited || couponUseLimits.limitedPerUser) {
|
|
72
|
+
await this.validateCouponUsageLimits(coupon, couponUseLimits, checkout.user.email);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async validateFirstOrderLimit(userEmail) {
|
|
76
|
+
const ordersUser = await this.getOrdersFromUser(userEmail.toLocaleLowerCase());
|
|
77
|
+
if (ordersUser.length >= 1)
|
|
78
|
+
throw 'Limite de uso atingido';
|
|
79
|
+
}
|
|
80
|
+
async validateCouponUsageLimits(coupon, couponUseLimits, userEmail) {
|
|
81
|
+
const ordersCoupon = await this.getOrdersWithCoupon(coupon);
|
|
82
|
+
if (!couponUseLimits.unlimited && couponUseLimits.total && ordersCoupon.length >= couponUseLimits.total) {
|
|
83
|
+
throw 'Limite de uso atingido.';
|
|
84
|
+
}
|
|
85
|
+
if (couponUseLimits.limitedPerUser) {
|
|
86
|
+
const ordersWithUser = this.countOrdersWithUser(ordersCoupon, userEmail);
|
|
87
|
+
if (ordersWithUser > 0)
|
|
88
|
+
throw 'Limite de uso por usuário atingido.';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async validateProductEligibility(coupon, checkout) {
|
|
92
|
+
const hasProductCategories = await this.hasProductCategories(coupon, checkout);
|
|
93
|
+
if (!hasProductCategories)
|
|
94
|
+
throw 'Seu carrinho não possui produtos elegíveis para desconto.';
|
|
95
|
+
const hasMinSubTotal = await this.hasMinSubTotal(coupon, checkout);
|
|
96
|
+
if (!hasMinSubTotal) {
|
|
97
|
+
this.throwMinSubTotalError(coupon);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
throwMinSubTotalError(coupon) {
|
|
101
|
+
const formattedValue = Intl.NumberFormat('pt-BR', {
|
|
102
|
+
style: 'currency',
|
|
103
|
+
currency: 'BRL',
|
|
104
|
+
}).format(coupon.minSubTotalValue);
|
|
105
|
+
if (coupon.productsCategories?.length) {
|
|
106
|
+
throw `Valor mínimo de ${formattedValue} não atingido na(s) categoria(s) elegíveis para o desconto.`;
|
|
107
|
+
}
|
|
108
|
+
throw `Valor mínimo de ${formattedValue} não atingido.`;
|
|
109
|
+
}
|
|
110
|
+
calcDiscountSubscription(coupon, checkout) {
|
|
111
|
+
let discount = 0;
|
|
112
|
+
if (coupon.discount.subscription.type == CouponTypes.ABSOLUTE)
|
|
113
|
+
discount = coupon.discount.subscription.value;
|
|
114
|
+
else
|
|
115
|
+
discount = checkout.subscriptionPlan.recurrencePrice * (coupon.discount.subscription.value / 100);
|
|
116
|
+
return of(discount);
|
|
117
|
+
}
|
|
118
|
+
async hasMinSubTotal(coupon, checkout) {
|
|
119
|
+
if (!coupon.minSubTotalValue)
|
|
120
|
+
return true;
|
|
121
|
+
const lineItensDiscount = await this.getLineItensEligebleForDiscount(coupon.productsCategories, checkout);
|
|
122
|
+
const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user);
|
|
123
|
+
if (coupon.minSubTotalValue <= subTotal)
|
|
124
|
+
return true;
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
async hasProductCategories(coupon, checkout) {
|
|
128
|
+
if (!coupon.productsCategories?.length) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
const couponCategories = await this.getCouponCategoriesId(coupon.productsCategories);
|
|
132
|
+
const hasCategories = checkout.lineItems?.filter((item) => {
|
|
133
|
+
if (item.isGift)
|
|
134
|
+
return false;
|
|
135
|
+
if (!item.categories?.length)
|
|
136
|
+
return true;
|
|
137
|
+
return item.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
138
|
+
});
|
|
139
|
+
return hasCategories?.length ? true : false;
|
|
140
|
+
}
|
|
141
|
+
coupomUserValidation(coupon, user) {
|
|
142
|
+
if (!user || coupon.exclusivityType.includes(Exclusivities.ALL_USERS))
|
|
143
|
+
return true;
|
|
144
|
+
const userTypes = [];
|
|
145
|
+
if (coupon.exclusivityType.includes(Exclusivities.COLLABORATORS) &&
|
|
146
|
+
this.emailIsFromCollaborator(user.email.toLocaleLowerCase()))
|
|
147
|
+
userTypes.push(Exclusivities.COLLABORATORS);
|
|
148
|
+
if (coupon.exclusivityType.includes(Exclusivities.SPECIFIC_USER) &&
|
|
149
|
+
coupon.userExclusiveEmail.includes(user.email.toLocaleLowerCase()))
|
|
150
|
+
userTypes.push(Exclusivities.SPECIFIC_USER);
|
|
151
|
+
if (coupon.exclusivityType.includes(Exclusivities.ACTIVE_SUBSCRIBER) &&
|
|
152
|
+
user.isSubscriber &&
|
|
153
|
+
user.subscriptionPlan != '')
|
|
154
|
+
userTypes.push(Exclusivities.ACTIVE_SUBSCRIBER);
|
|
155
|
+
if (user.isSubscriber &&
|
|
156
|
+
user.subscriptionPlan == '' &&
|
|
157
|
+
coupon.exclusivityType.includes(Exclusivities.INACTIVE_SUBSCRIBER))
|
|
158
|
+
userTypes.push(Exclusivities.INACTIVE_SUBSCRIBER);
|
|
159
|
+
if (coupon.exclusivityType.includes(Exclusivities.NON_SUBSCRIBER) && !user.isSubscriber)
|
|
160
|
+
userTypes.push(Exclusivities.NON_SUBSCRIBER);
|
|
161
|
+
return coupon.exclusivityType.some((r) => userTypes.includes(r));
|
|
162
|
+
}
|
|
163
|
+
async getCouponCategoriesId(productsCategories) {
|
|
164
|
+
const couponCategories = [];
|
|
165
|
+
for (let index = 0; index < productsCategories.length; index++) {
|
|
166
|
+
const category = await this.repositoriesFacade.categoryRepository.get({
|
|
167
|
+
id: productsCategories[index],
|
|
168
|
+
});
|
|
169
|
+
if (category) {
|
|
170
|
+
const children = await this.repositoriesFacade.categoryRepository.getChildren(parseInt(productsCategories[index]));
|
|
171
|
+
couponCategories.push(category.id, ...children.map((c) => c.id.toString()));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return [...new Set(couponCategories)];
|
|
175
|
+
}
|
|
176
|
+
async getLineItensEligebleForDiscount(productsCategories, checkout) {
|
|
177
|
+
let lineItensDiscount = [];
|
|
178
|
+
const couponCategories = await this.getCouponCategoriesId(productsCategories);
|
|
179
|
+
if (productsCategories?.length) {
|
|
180
|
+
lineItensDiscount = checkout.lineItems?.filter((item) => {
|
|
181
|
+
if (item.isGift)
|
|
182
|
+
return false;
|
|
183
|
+
if (item.categories?.length) {
|
|
184
|
+
return item.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
185
|
+
}
|
|
186
|
+
return true;
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
lineItensDiscount = checkout.lineItems.filter((item) => !item.isGift);
|
|
191
|
+
}
|
|
192
|
+
return lineItensDiscount;
|
|
193
|
+
}
|
|
194
|
+
calcCheckoutSubtotal(lineItens, user) {
|
|
195
|
+
return (lineItens
|
|
196
|
+
?.filter((item) => !item.isGift)
|
|
197
|
+
.reduce((acc, curr) => user?.isSubscriber && curr.price?.subscriberPrice
|
|
198
|
+
? acc + curr.price?.subscriberPrice * curr.quantity
|
|
199
|
+
: acc + curr.pricePaid * curr.quantity, 0) || 0);
|
|
200
|
+
}
|
|
201
|
+
async getOrdersWithCoupon(coupon) {
|
|
202
|
+
return await this.repositoriesFacade.orderRepository
|
|
203
|
+
.find({
|
|
204
|
+
filters: {
|
|
205
|
+
coupon: { id: coupon.id },
|
|
206
|
+
status: { operator: Where.NOTEQUALS, value: OrderStatus.CANCELADO },
|
|
207
|
+
},
|
|
208
|
+
})
|
|
209
|
+
.then((result) => result.data);
|
|
210
|
+
}
|
|
211
|
+
async getOrdersFromUser(email) {
|
|
212
|
+
return await this.repositoriesFacade.orderRepository
|
|
213
|
+
.find({
|
|
214
|
+
filters: {
|
|
215
|
+
user: { email: { operator: Where.EQUALS, value: email } },
|
|
216
|
+
status: { operator: Where.NOTEQUALS, value: OrderStatus.CANCELADO },
|
|
217
|
+
},
|
|
218
|
+
})
|
|
219
|
+
.then((result) => result.data);
|
|
220
|
+
}
|
|
221
|
+
countOrdersWithUser(orders, email) {
|
|
222
|
+
return orders.filter((o) => o.user.email == email).length;
|
|
223
|
+
}
|
|
224
|
+
getCouponUseLimits(coupon, checkoutType, user) {
|
|
225
|
+
let couponUseLimits;
|
|
226
|
+
if (checkoutType == CheckoutTypes.ECOMMERCE || checkoutType == CheckoutTypes.ALL) {
|
|
227
|
+
if (coupon.exclusivityType.length === 1 &&
|
|
228
|
+
(coupon.exclusivityType.at(0) === Exclusivities.SPECIFIC_USER ||
|
|
229
|
+
coupon.exclusivityType.at(0) === Exclusivities.COLLABORATORS))
|
|
230
|
+
couponUseLimits = coupon.useLimits.non_subscriber;
|
|
231
|
+
else
|
|
232
|
+
couponUseLimits = user?.isSubscriber ? coupon.useLimits.subscriber : coupon.useLimits.non_subscriber;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
couponUseLimits = coupon.useLimits.subscription;
|
|
236
|
+
}
|
|
237
|
+
return couponUseLimits;
|
|
238
|
+
}
|
|
239
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponService, deps: [{ token: i1.CouponRepositoriesFacade }, { token: i2.ConfigurationFacade }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
240
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponService, providedIn: 'root' }); }
|
|
241
|
+
}
|
|
242
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: CouponService, decorators: [{
|
|
243
|
+
type: Injectable,
|
|
244
|
+
args: [{
|
|
245
|
+
providedIn: 'root',
|
|
246
|
+
}]
|
|
247
|
+
}], ctorParameters: () => [{ type: i1.CouponRepositoriesFacade }, { type: i2.ConfigurationFacade }] });
|
|
248
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxFQUlMLGFBQWEsRUFFYixXQUFXLEVBQ1gsYUFBYSxFQUdiLFdBQVcsRUFDWCxLQUFLLEVBRUwsS0FBSyxHQUNOLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUUvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFBOzs7O0FBSzlDLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQ21CLGtCQUE0QyxFQUM1QyxtQkFBd0M7UUFEeEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEwQjtRQUM1Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBME9uRCw0QkFBdUIsR0FBRyxDQUFDLFNBQWlCLEVBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBek9qRyxDQUFDO0lBRUosV0FBVyxDQUFDLE1BQXlCO1FBQ25DLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUE7UUFFekQsT0FBTyxJQUFJLENBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQjthQUNyQyxJQUFJLENBQUM7WUFDSixPQUFPLEVBQUU7Z0JBQ1AsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFDckQsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTthQUNoRDtTQUNGLENBQUM7YUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEMsQ0FBQyxJQUFJLENBQ0osU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQ2xFLFNBQVMsQ0FBQyxDQUFDLFdBQW1CLEVBQUUsRUFBRSxDQUNoQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDbEYsRUFDRCxHQUFHLENBQUMsQ0FBQyxlQUF1QixFQUFFLEVBQUUsQ0FBQyxlQUF5QixDQUFDLENBQzVELENBQUE7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxZQUEyQjtRQUN4RSxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0saUJBQWlCLENBQUE7UUFFcEMsSUFBSSxNQUFNLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFBRSxNQUFNLGlCQUFpQixDQUFBO1FBRWhHLElBQUksTUFBTSxFQUFFLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFrQixDQUFBLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFBRSxNQUFNLGlCQUFpQixDQUFBO1FBRTlHLE1BQU0sUUFBUSxHQUNaLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFBO1FBRTNHLElBQUksQ0FBQyxRQUFRO1lBQUUsTUFBTSwyQkFBMkIsQ0FBQTtRQUVoRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsWUFBWSxLQUFLLGFBQWEsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxZQUFZLENBQUE7UUFFeEcsSUFBSSxDQUFDLGNBQWM7WUFBRSxNQUFNLG1DQUFtQyxDQUFBO1FBRTlELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFtQztRQUNyRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFBO1FBRXZELElBQUksWUFBWSxJQUFJLGFBQWEsQ0FBQyxZQUFZLEVBQUU7WUFDOUMsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ3JEO1FBRUQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNyRSxDQUFDO0lBRU8sMEJBQTBCLENBQUMsTUFBYyxFQUFFLElBQVk7UUFDN0QsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ25FLE1BQU0scUNBQXFDLENBQUE7U0FDNUM7UUFFRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTyxLQUFLLENBQUMsdUJBQXVCLENBQ25DLE1BQWMsRUFDZCxZQUEyQixFQUMzQixRQUEyQjtRQUUzQixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNwRCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzlELE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUV2RCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsSUFBVTtRQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRXpELElBQUksQ0FBQyxTQUFTO1lBQUUsTUFBTSx1QkFBdUIsQ0FBQTtJQUMvQyxDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUMvQixNQUFjLEVBQ2QsWUFBMkIsRUFDM0IsUUFBMkI7UUFFM0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXBGLElBQUksZUFBZSxDQUFDLFVBQVUsRUFBRTtZQUM5QixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQ3hEO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLGNBQWMsRUFBRTtZQUNoRSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDbkY7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQWlCO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUE7UUFFOUUsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxNQUFNLHdCQUF3QixDQUFBO0lBQzVELENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCLENBQUMsTUFBYyxFQUFFLGVBQW9CLEVBQUUsU0FBaUI7UUFDN0YsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsTUFBTSxJQUFJLGVBQWUsQ0FBQyxLQUFLLEVBQUU7WUFDdkcsTUFBTSx5QkFBeUIsQ0FBQTtTQUNoQztRQUVELElBQUksZUFBZSxDQUFDLGNBQWMsRUFBRTtZQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBRXhFLElBQUksY0FBYyxHQUFHLENBQUM7Z0JBQUUsTUFBTSxxQ0FBcUMsQ0FBQTtTQUNwRTtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQUMsTUFBYyxFQUFFLFFBQTJCO1FBQ2xGLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBRTlFLElBQUksQ0FBQyxvQkFBb0I7WUFBRSxNQUFNLDJEQUEyRCxDQUFBO1FBRTVGLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFFbEUsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDbkM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsTUFBYztRQUMxQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUNoRCxLQUFLLEVBQUUsVUFBVTtZQUNqQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBRWxDLElBQUksTUFBTSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRTtZQUNyQyxNQUFNLG1CQUFtQixjQUFjLDZEQUE2RCxDQUFBO1NBQ3JHO1FBRUQsTUFBTSxtQkFBbUIsY0FBYyxnQkFBZ0IsQ0FBQTtJQUN6RCxDQUFDO0lBRU0sd0JBQXdCLENBQUMsTUFBYyxFQUFFLFFBQXVDO1FBQ3JGLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUVoQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsUUFBUTtZQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUE7O1lBQ3ZHLFFBQVEsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFBO1FBRXRHLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQWMsRUFBRSxRQUEyQjtRQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQjtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXpDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3pHLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFNUUsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXBELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsUUFBMkI7UUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUU7WUFDdEMsT0FBTyxJQUFJLENBQUE7U0FDWjtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDcEYsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN4RCxJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFBO1lBRTdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU07Z0JBQUUsT0FBTyxJQUFJLENBQUE7WUFFekMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM5RSxDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDN0MsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE1BQWMsRUFBRSxJQUFVO1FBQ3JELElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRWxGLE1BQU0sU0FBUyxHQUFvQixFQUFFLENBQUE7UUFFckMsSUFDRSxNQUFNLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1lBQzVELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFNUQsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFN0MsSUFDRSxNQUFNLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1lBQzVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRWxFLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRTdDLElBQ0UsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDO1lBQ2hFLElBQUksQ0FBQyxZQUFZO1lBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFO1lBRTNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFakQsSUFDRSxJQUFJLENBQUMsWUFBWTtZQUNqQixJQUFJLENBQUMsZ0JBQWdCLElBQUksRUFBRTtZQUMzQixNQUFNLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFFbEUsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUVuRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQ3JGLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRTlDLE9BQU8sTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNsRSxDQUFDO0lBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLGtCQUE0QjtRQUM5RCxNQUFNLGdCQUFnQixHQUFrQixFQUFFLENBQUE7UUFFMUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM5RCxNQUFNLFFBQVEsR0FBd0MsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDO2dCQUN6RyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDO2FBQzlCLENBQUMsQ0FBQTtZQUVGLElBQUksUUFBUSxFQUFFO2dCQUNaLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FDM0UsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3BDLENBQUE7Z0JBRUQsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQTthQUM1RTtTQUNGO1FBRUQsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFJTyxLQUFLLENBQUMsK0JBQStCLENBQzNDLGtCQUE0QixFQUM1QixRQUEyQjtRQUUzQixJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQTtRQUMxQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFFN0UsSUFBSSxrQkFBa0IsRUFBRSxNQUFNLEVBQUU7WUFDOUIsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDdEQsSUFBSSxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPLEtBQUssQ0FBQTtnQkFFN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRTtvQkFDM0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtpQkFDN0U7Z0JBRUQsT0FBTyxJQUFJLENBQUE7WUFDYixDQUFDLENBQUMsQ0FBQTtTQUNIO2FBQU07WUFDTCxpQkFBaUIsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDdEU7UUFFRCxPQUFPLGlCQUFpQixDQUFBO0lBQzFCLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxTQUFxQixFQUFFLElBQVU7UUFDNUQsT0FBTyxDQUNMLFNBQVM7WUFDUCxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQy9CLE1BQU0sQ0FDTCxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUNaLElBQUksRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlO1lBQy9DLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVE7WUFDbkQsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQzFDLENBQUMsQ0FDRixJQUFJLENBQUMsQ0FDVCxDQUFBO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUFjO1FBQzlDLE9BQU8sTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZTthQUNqRCxJQUFJLENBQUM7WUFDSixPQUFPLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFO2FBQ3BFO1NBQ0YsQ0FBQzthQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYTtRQUMzQyxPQUFPLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWU7YUFDakQsSUFBSSxDQUFDO1lBQ0osT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekQsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUU7YUFDcEU7U0FDRixDQUFDO2FBQ0QsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQWUsRUFBRSxLQUFhO1FBQ3hELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFBO0lBQzNELENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsWUFBMkIsRUFBRSxJQUFVO1FBQ2hGLElBQUksZUFBd0csQ0FBQTtRQUU1RyxJQUFJLFlBQVksSUFBSSxhQUFhLENBQUMsU0FBUyxJQUFJLFlBQVksSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQ2hGLElBQ0UsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDbkMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsYUFBYTtvQkFDM0QsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLGFBQWEsQ0FBQztnQkFFL0QsZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFBOztnQkFDOUMsZUFBZSxHQUFHLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQTtTQUMxRzthQUFNO1lBQ0wsZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFBO1NBQ2hEO1FBRUQsT0FBTyxlQUFlLENBQUE7SUFDeEIsQ0FBQzs4R0EvVFUsYUFBYTtrSEFBYixhQUFhLGNBRlosTUFBTTs7MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtcclxuICBDYXRlZ29yeSxcclxuICBDaGVja291dCxcclxuICBDaGVja291dFN1YnNjcmlwdGlvbixcclxuICBDaGVja291dFR5cGVzLFxyXG4gIENvdXBvbixcclxuICBDb3Vwb25UeXBlcyxcclxuICBFeGNsdXNpdml0aWVzLFxyXG4gIExpbmVJdGVtLFxyXG4gIE9yZGVyLFxyXG4gIE9yZGVyU3RhdHVzLFxyXG4gIFNob3BzLFxyXG4gIFVzZXIsXHJcbiAgV2hlcmUsXHJcbn0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXHJcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgY29uY2F0TWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuXHJcbmltcG9ydCB7IENvdXBvblJlcG9zaXRvcmllc0ZhY2FkZSB9IGZyb20gJy4vY291cG9uJ1xyXG5pbXBvcnQgeyBDaGVja0NvdXBvblBhcmFtcywgQ291cG9uUnVsZXNWYWxpZGF0aW9uUGFyYW1zIH0gZnJvbSAnLi9jb3Vwb24vdHlwZXMvY291cG9uLXBhcmFtcy50eXBlJ1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRmFjYWRlIH0gZnJvbSAnLi9zaGFyZWQnXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291cG9uU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcG9zaXRvcmllc0ZhY2FkZTogQ291cG9uUmVwb3NpdG9yaWVzRmFjYWRlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWd1cmF0aW9uRmFjYWRlOiBDb25maWd1cmF0aW9uRmFjYWRlLFxyXG4gICkge31cclxuXHJcbiAgY2hlY2tDb3Vwb24ocGFyYW1zOiBDaGVja0NvdXBvblBhcmFtcyk6IE9ic2VydmFibGU8Q291cG9uPiB7XHJcbiAgICBjb25zdCB7IG5pY2tuYW1lLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LCBwbGFuIH0gPSBwYXJhbXNcclxuXHJcbiAgICByZXR1cm4gZnJvbShcclxuICAgICAgdGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUuY291cG9uUmVwb3NpdG9yeVxyXG4gICAgICAgIC5maW5kKHtcclxuICAgICAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICAgICAgbmlja25hbWU6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IG5pY2tuYW1lIH0sXHJcbiAgICAgICAgICAgIGFjdGl2ZTogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhWzBdKSxcclxuICAgICkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChjb3Vwb24pID0+IHRoaXMuY291cG9uVmFsaWRhdGlvbihjb3Vwb24sIGNoZWNrb3V0VHlwZSkpLFxyXG4gICAgICBjb25jYXRNYXAoKGNvdXBvblZhbGlkOiBDb3Vwb24pID0+XHJcbiAgICAgICAgdGhpcy5jb3Vwb25SdWxlc1ZhbGlkYXRpb24oeyBjb3Vwb246IGNvdXBvblZhbGlkLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LCBwbGFuIH0pLFxyXG4gICAgICApLFxyXG4gICAgICBtYXAoKGNvdXBvblZhbGlkYXRlZDogQ291cG9uKSA9PiBjb3Vwb25WYWxpZGF0ZWQgYXMgQ291cG9uKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY291cG9uVmFsaWRhdGlvbihjb3Vwb246IENvdXBvbiwgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzKSB7XHJcbiAgICBpZiAoIWNvdXBvbikgdGhyb3cgJ0N1cG9tIGludsOhbGlkby4nXHJcblxyXG4gICAgaWYgKGNvdXBvbj8uYmVnaW5BdCAmJiBjb3Vwb24/LmJlZ2luQXQuZ2V0VGltZSgpID4gbmV3IERhdGUoKS5nZXRUaW1lKCkpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uJ1xyXG5cclxuICAgIGlmIChjb3Vwb24/LmV4cGlyZXNJbiAmJiAoY291cG9uPy5leHBpcmVzSW4gYXMgRGF0ZSkuZ2V0VGltZSgpIDwgbmV3IERhdGUoKS5nZXRUaW1lKCkpIHRocm93ICdDdXBvbSBleHBpcmFkby4nXHJcblxyXG4gICAgY29uc3QgaXNJblNob3AgPVxyXG4gICAgICBjb3Vwb24uc2hvcEF2YWlsYWJpbGl0eSA9PT0gU2hvcHMuQUxMIHx8IGNvdXBvbi5zaG9wQXZhaWxhYmlsaXR5ID09PSB0aGlzLmNvbmZpZ3VyYXRpb25GYWNhZGUuZGVmYXVsdFNob3BcclxuXHJcbiAgICBpZiAoIWlzSW5TaG9wKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvIHBhcmEgbG9qYS4nXHJcblxyXG4gICAgY29uc3QgaXNDaGVja291dFR5cGUgPSBjb3Vwb24uY2hlY2tvdXRUeXBlID09PSBDaGVja291dFR5cGVzLkFMTCB8fCBjb3Vwb24uY2hlY2tvdXRUeXBlID09PSBjaGVja291dFR5cGVcclxuXHJcbiAgICBpZiAoIWlzQ2hlY2tvdXRUeXBlKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvLiBFcnJvIGRlIGNoZWNrb3V0LidcclxuXHJcbiAgICByZXR1cm4gY291cG9uXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNvdXBvblJ1bGVzVmFsaWRhdGlvbihwYXJhbXM6IENvdXBvblJ1bGVzVmFsaWRhdGlvblBhcmFtcykge1xyXG4gICAgY29uc3QgeyBjb3Vwb24sIGNoZWNrb3V0VHlwZSwgY2hlY2tvdXQsIHBsYW4gfSA9IHBhcmFtc1xyXG5cclxuICAgIGlmIChjaGVja291dFR5cGUgPT0gQ2hlY2tvdXRUeXBlcy5TVUJTQ1JJUFRJT04pIHtcclxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTdWJzY3JpcHRpb25Db3Vwb24oY291cG9uLCBwbGFuKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlRWNvbW1lcmNlQ291cG9uKGNvdXBvbiwgY2hlY2tvdXRUeXBlLCBjaGVja291dClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVTdWJzY3JpcHRpb25Db3Vwb24oY291cG9uOiBDb3Vwb24sIHBsYW46IHN0cmluZyk6IENvdXBvbiB7XHJcbiAgICBpZiAoY291cG9uLnBsYW4gJiYgY291cG9uLnBsYW4udG9VcHBlckNhc2UoKSAhPT0gcGxhbi50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgIHRocm93ICdDdXBvbSBpbnbDoWxpZG8gcGFyYSBzdWEgYXNzaW5hdHVyYS4nXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvdXBvblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUVjb21tZXJjZUNvdXBvbihcclxuICAgIGNvdXBvbjogQ291cG9uLFxyXG4gICAgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLFxyXG4gICAgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+LFxyXG4gICk6IFByb21pc2U8Q291cG9uPiB7XHJcbiAgICB0aGlzLnZhbGlkYXRlVXNlckVsaWdpYmlsaXR5KGNvdXBvbiwgY2hlY2tvdXQ/LnVzZXIpXHJcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlVXNhZ2VMaW1pdHMoY291cG9uLCBjaGVja291dFR5cGUsIGNoZWNrb3V0KVxyXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVByb2R1Y3RFbGlnaWJpbGl0eShjb3Vwb24sIGNoZWNrb3V0KVxyXG5cclxuICAgIHJldHVybiBjb3Vwb25cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVVc2VyRWxpZ2liaWxpdHkoY291cG9uOiBDb3Vwb24sIHVzZXI6IFVzZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZhbGlkVXNlciA9IHRoaXMuY291cG9tVXNlclZhbGlkYXRpb24oY291cG9uLCB1c2VyKVxyXG5cclxuICAgIGlmICghdmFsaWRVc2VyKSB0aHJvdyAnVXN1w6FyaW8gbsOjbyBlbGVnw612ZWwuJ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVVzYWdlTGltaXRzKFxyXG4gICAgY291cG9uOiBDb3Vwb24sXHJcbiAgICBjaGVja291dFR5cGU6IENoZWNrb3V0VHlwZXMsXHJcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBjb3Vwb25Vc2VMaW1pdHMgPSB0aGlzLmdldENvdXBvblVzZUxpbWl0cyhjb3Vwb24sIGNoZWNrb3V0VHlwZSwgY2hlY2tvdXQudXNlcilcclxuXHJcbiAgICBpZiAoY291cG9uVXNlTGltaXRzLmZpcnN0T3JkZXIpIHtcclxuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUZpcnN0T3JkZXJMaW1pdChjaGVja291dC51c2VyLmVtYWlsKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghY291cG9uVXNlTGltaXRzLnVubGltaXRlZCB8fCBjb3Vwb25Vc2VMaW1pdHMubGltaXRlZFBlclVzZXIpIHtcclxuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUNvdXBvblVzYWdlTGltaXRzKGNvdXBvbiwgY291cG9uVXNlTGltaXRzLCBjaGVja291dC51c2VyLmVtYWlsKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUZpcnN0T3JkZXJMaW1pdCh1c2VyRW1haWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgb3JkZXJzVXNlciA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzRnJvbVVzZXIodXNlckVtYWlsLnRvTG9jYWxlTG93ZXJDYXNlKCkpXHJcblxyXG4gICAgaWYgKG9yZGVyc1VzZXIubGVuZ3RoID49IDEpIHRocm93ICdMaW1pdGUgZGUgdXNvIGF0aW5naWRvJ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUNvdXBvblVzYWdlTGltaXRzKGNvdXBvbjogQ291cG9uLCBjb3Vwb25Vc2VMaW1pdHM6IGFueSwgdXNlckVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG9yZGVyc0NvdXBvbiA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzV2l0aENvdXBvbihjb3Vwb24pXHJcblxyXG4gICAgaWYgKCFjb3Vwb25Vc2VMaW1pdHMudW5saW1pdGVkICYmIGNvdXBvblVzZUxpbWl0cy50b3RhbCAmJiBvcmRlcnNDb3Vwb24ubGVuZ3RoID49IGNvdXBvblVzZUxpbWl0cy50b3RhbCkge1xyXG4gICAgICB0aHJvdyAnTGltaXRlIGRlIHVzbyBhdGluZ2lkby4nXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvdXBvblVzZUxpbWl0cy5saW1pdGVkUGVyVXNlcikge1xyXG4gICAgICBjb25zdCBvcmRlcnNXaXRoVXNlciA9IHRoaXMuY291bnRPcmRlcnNXaXRoVXNlcihvcmRlcnNDb3Vwb24sIHVzZXJFbWFpbClcclxuXHJcbiAgICAgIGlmIChvcmRlcnNXaXRoVXNlciA+IDApIHRocm93ICdMaW1pdGUgZGUgdXNvIHBvciB1c3XDoXJpbyBhdGluZ2lkby4nXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUHJvZHVjdEVsaWdpYmlsaXR5KGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dD4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGhhc1Byb2R1Y3RDYXRlZ29yaWVzID0gYXdhaXQgdGhpcy5oYXNQcm9kdWN0Q2F0ZWdvcmllcyhjb3Vwb24sIGNoZWNrb3V0KVxyXG5cclxuICAgIGlmICghaGFzUHJvZHVjdENhdGVnb3JpZXMpIHRocm93ICdTZXUgY2FycmluaG8gbsOjbyBwb3NzdWkgcHJvZHV0b3MgZWxlZ8OtdmVpcyBwYXJhIGRlc2NvbnRvLidcclxuXHJcbiAgICBjb25zdCBoYXNNaW5TdWJUb3RhbCA9IGF3YWl0IHRoaXMuaGFzTWluU3ViVG90YWwoY291cG9uLCBjaGVja291dClcclxuXHJcbiAgICBpZiAoIWhhc01pblN1YlRvdGFsKSB7XHJcbiAgICAgIHRoaXMudGhyb3dNaW5TdWJUb3RhbEVycm9yKGNvdXBvbilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGhyb3dNaW5TdWJUb3RhbEVycm9yKGNvdXBvbjogQ291cG9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IEludGwuTnVtYmVyRm9ybWF0KCdwdC1CUicsIHtcclxuICAgICAgc3R5bGU6ICdjdXJyZW5jeScsXHJcbiAgICAgIGN1cnJlbmN5OiAnQlJMJyxcclxuICAgIH0pLmZvcm1hdChjb3Vwb24ubWluU3ViVG90YWxWYWx1ZSlcclxuXHJcbiAgICBpZiAoY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IGBWYWxvciBtw61uaW1vIGRlICR7Zm9ybWF0dGVkVmFsdWV9IG7Do28gYXRpbmdpZG8gbmEocykgY2F0ZWdvcmlhKHMpIGVsZWfDrXZlaXMgcGFyYSBvIGRlc2NvbnRvLmBcclxuICAgIH1cclxuXHJcbiAgICB0aHJvdyBgVmFsb3IgbcOtbmltbyBkZSAke2Zvcm1hdHRlZFZhbHVlfSBuw6NvIGF0aW5naWRvLmBcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYWxjRGlzY291bnRTdWJzY3JpcHRpb24oY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0U3Vic2NyaXB0aW9uPik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICBsZXQgZGlzY291bnQgPSAwXHJcblxyXG4gICAgaWYgKGNvdXBvbi5kaXNjb3VudC5zdWJzY3JpcHRpb24udHlwZSA9PSBDb3Vwb25UeXBlcy5BQlNPTFVURSkgZGlzY291bnQgPSBjb3Vwb24uZGlzY291bnQuc3Vic2NyaXB0aW9uLnZhbHVlXHJcbiAgICBlbHNlIGRpc2NvdW50ID0gY2hlY2tvdXQuc3Vic2NyaXB0aW9uUGxhbi5yZWN1cnJlbmNlUHJpY2UgKiAoY291cG9uLmRpc2NvdW50LnN1YnNjcmlwdGlvbi52YWx1ZSAvIDEwMClcclxuXHJcbiAgICByZXR1cm4gb2YoZGlzY291bnQpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhc01pblN1YlRvdGFsKGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghY291cG9uLm1pblN1YlRvdGFsVmFsdWUpIHJldHVybiB0cnVlXHJcblxyXG4gICAgY29uc3QgbGluZUl0ZW5zRGlzY291bnQgPSBhd2FpdCB0aGlzLmdldExpbmVJdGVuc0VsaWdlYmxlRm9yRGlzY291bnQoY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcywgY2hlY2tvdXQpXHJcbiAgICBjb25zdCBzdWJUb3RhbCA9IHRoaXMuY2FsY0NoZWNrb3V0U3VidG90YWwobGluZUl0ZW5zRGlzY291bnQsIGNoZWNrb3V0LnVzZXIpXHJcblxyXG4gICAgaWYgKGNvdXBvbi5taW5TdWJUb3RhbFZhbHVlIDw9IHN1YlRvdGFsKSByZXR1cm4gdHJ1ZVxyXG5cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBoYXNQcm9kdWN0Q2F0ZWdvcmllcyhjb3Vwb246IENvdXBvbiwgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXM/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvdXBvbkNhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLmdldENvdXBvbkNhdGVnb3JpZXNJZChjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzKVxyXG4gICAgY29uc3QgaGFzQ2F0ZWdvcmllcyA9IGNoZWNrb3V0LmxpbmVJdGVtcz8uZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLmlzR2lmdCkgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgICBpZiAoIWl0ZW0uY2F0ZWdvcmllcz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZVxyXG5cclxuICAgICAgcmV0dXJuIGl0ZW0uY2F0ZWdvcmllcy5zb21lKChjKSA9PiBjb3Vwb25DYXRlZ29yaWVzLnNvbWUoKGNhdCkgPT4gY2F0ID09IGMpKVxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gaGFzQ2F0ZWdvcmllcz8ubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvdXBvbVVzZXJWYWxpZGF0aW9uKGNvdXBvbjogQ291cG9uLCB1c2VyOiBVc2VyKSB7XHJcbiAgICBpZiAoIXVzZXIgfHwgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLkFMTF9VU0VSUykpIHJldHVybiB0cnVlXHJcblxyXG4gICAgY29uc3QgdXNlclR5cGVzOiBFeGNsdXNpdml0aWVzW10gPSBbXVxyXG5cclxuICAgIGlmIChcclxuICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpICYmXHJcbiAgICAgIHRoaXMuZW1haWxJc0Zyb21Db2xsYWJvcmF0b3IodXNlci5lbWFpbC50b0xvY2FsZUxvd2VyQ2FzZSgpKVxyXG4gICAgKVxyXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpXHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUikgJiZcclxuICAgICAgY291cG9uLnVzZXJFeGNsdXNpdmVFbWFpbC5pbmNsdWRlcyh1c2VyLmVtYWlsLnRvTG9jYWxlTG93ZXJDYXNlKCkpXHJcbiAgICApXHJcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUilcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5BQ1RJVkVfU1VCU0NSSUJFUikgJiZcclxuICAgICAgdXNlci5pc1N1YnNjcmliZXIgJiZcclxuICAgICAgdXNlci5zdWJzY3JpcHRpb25QbGFuICE9ICcnXHJcbiAgICApXHJcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuQUNUSVZFX1NVQlNDUklCRVIpXHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB1c2VyLmlzU3Vic2NyaWJlciAmJlxyXG4gICAgICB1c2VyLnN1YnNjcmlwdGlvblBsYW4gPT0gJycgJiZcclxuICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLklOQUNUSVZFX1NVQlNDUklCRVIpXHJcbiAgICApXHJcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuSU5BQ1RJVkVfU1VCU0NSSUJFUilcclxuXHJcbiAgICBpZiAoY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLk5PTl9TVUJTQ1JJQkVSKSAmJiAhdXNlci5pc1N1YnNjcmliZXIpXHJcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuTk9OX1NVQlNDUklCRVIpXHJcblxyXG4gICAgcmV0dXJuIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuc29tZSgocikgPT4gdXNlclR5cGVzLmluY2x1ZGVzKHIpKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRDb3Vwb25DYXRlZ29yaWVzSWQocHJvZHVjdHNDYXRlZ29yaWVzOiBzdHJpbmdbXSk6IFByb21pc2U8QXJyYXk8U3RyaW5nPj4ge1xyXG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllczogQXJyYXk8U3RyaW5nPiA9IFtdXHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByb2R1Y3RzQ2F0ZWdvcmllcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgY2F0ZWdvcnk6IENhdGVnb3J5ICYgeyBmaXJlc3RvcmVJZD86IHN0cmluZyB9ID0gYXdhaXQgdGhpcy5yZXBvc2l0b3JpZXNGYWNhZGUuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldCh7XHJcbiAgICAgICAgaWQ6IHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0sXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBpZiAoY2F0ZWdvcnkpIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHRoaXMucmVwb3NpdG9yaWVzRmFjYWRlLmNhdGVnb3J5UmVwb3NpdG9yeS5nZXRDaGlsZHJlbihcclxuICAgICAgICAgIHBhcnNlSW50KHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0pLFxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgY291cG9uQ2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5LmlkLCAuLi5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQudG9TdHJpbmcoKSkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoY291cG9uQ2F0ZWdvcmllcyldXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtYWlsSXNGcm9tQ29sbGFib3JhdG9yID0gKHVzZXJFbWFpbDogc3RyaW5nKTogYm9vbGVhbiA9PiAhIXVzZXJFbWFpbD8ubWF0Y2goL0BiNGEuY29tLmJyL2cpXHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0TGluZUl0ZW5zRWxpZ2VibGVGb3JEaXNjb3VudChcclxuICAgIHByb2R1Y3RzQ2F0ZWdvcmllczogc3RyaW5nW10sXHJcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXHJcbiAgKTogUHJvbWlzZTxMaW5lSXRlbVtdPiB7XHJcbiAgICBsZXQgbGluZUl0ZW5zRGlzY291bnQgPSBbXVxyXG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllcyA9IGF3YWl0IHRoaXMuZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKHByb2R1Y3RzQ2F0ZWdvcmllcylcclxuXHJcbiAgICBpZiAocHJvZHVjdHNDYXRlZ29yaWVzPy5sZW5ndGgpIHtcclxuICAgICAgbGluZUl0ZW5zRGlzY291bnQgPSBjaGVja291dC5saW5lSXRlbXM/LmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmlzR2lmdCkgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgICAgIGlmIChpdGVtLmNhdGVnb3JpZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcmV0dXJuIGl0ZW0uY2F0ZWdvcmllcy5zb21lKChjKSA9PiBjb3Vwb25DYXRlZ29yaWVzLnNvbWUoKGNhdCkgPT4gY2F0ID09IGMpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxpbmVJdGVuc0Rpc2NvdW50ID0gY2hlY2tvdXQubGluZUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNHaWZ0KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lSXRlbnNEaXNjb3VudFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjQ2hlY2tvdXRTdWJ0b3RhbChsaW5lSXRlbnM6IExpbmVJdGVtW10sIHVzZXI6IFVzZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgbGluZUl0ZW5zXHJcbiAgICAgICAgPy5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzR2lmdClcclxuICAgICAgICAucmVkdWNlKFxyXG4gICAgICAgICAgKGFjYywgY3VycikgPT5cclxuICAgICAgICAgICAgdXNlcj8uaXNTdWJzY3JpYmVyICYmIGN1cnIucHJpY2U/LnN1YnNjcmliZXJQcmljZVxyXG4gICAgICAgICAgICAgID8gYWNjICsgY3Vyci5wcmljZT8uc3Vic2NyaWJlclByaWNlICogY3Vyci5xdWFudGl0eVxyXG4gICAgICAgICAgICAgIDogYWNjICsgY3Vyci5wcmljZVBhaWQgKiBjdXJyLnF1YW50aXR5LFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICApIHx8IDBcclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3JkZXJzV2l0aENvdXBvbihjb3Vwb246IENvdXBvbik6IFByb21pc2U8T3JkZXJbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVwb3NpdG9yaWVzRmFjYWRlLm9yZGVyUmVwb3NpdG9yeVxyXG4gICAgICAuZmluZCh7XHJcbiAgICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgICAgY291cG9uOiB7IGlkOiBjb3Vwb24uaWQgfSxcclxuICAgICAgICAgIHN0YXR1czogeyBvcGVyYXRvcjogV2hlcmUuTk9URVFVQUxTLCB2YWx1ZTogT3JkZXJTdGF0dXMuQ0FOQ0VMQURPIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGEpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldE9yZGVyc0Zyb21Vc2VyKGVtYWlsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcG9zaXRvcmllc0ZhY2FkZS5vcmRlclJlcG9zaXRvcnlcclxuICAgICAgLmZpbmQoe1xyXG4gICAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICAgIHVzZXI6IHsgZW1haWw6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IGVtYWlsIH0gfSxcclxuICAgICAgICAgIHN0YXR1czogeyBvcGVyYXRvcjogV2hlcmUuTk9URVFVQUxTLCB2YWx1ZTogT3JkZXJTdGF0dXMuQ0FOQ0VMQURPIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmRhdGEpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvdW50T3JkZXJzV2l0aFVzZXIob3JkZXJzOiBPcmRlcltdLCBlbWFpbDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBvcmRlcnMuZmlsdGVyKChvKSA9PiBvLnVzZXIuZW1haWwgPT0gZW1haWwpLmxlbmd0aFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDb3Vwb25Vc2VMaW1pdHMoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcywgdXNlcjogVXNlcikge1xyXG4gICAgbGV0IGNvdXBvblVzZUxpbWl0czogeyB1bmxpbWl0ZWQ/OiBib29sZWFuOyB0b3RhbD86IG51bWJlcjsgbGltaXRlZFBlclVzZXI/OiBib29sZWFuOyBmaXJzdE9yZGVyPzogYm9vbGVhbiB9XHJcblxyXG4gICAgaWYgKGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLkVDT01NRVJDRSB8fCBjaGVja291dFR5cGUgPT0gQ2hlY2tvdXRUeXBlcy5BTEwpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUubGVuZ3RoID09PSAxICYmXHJcbiAgICAgICAgKGNvdXBvbi5leGNsdXNpdml0eVR5cGUuYXQoMCkgPT09IEV4Y2x1c2l2aXRpZXMuU1BFQ0lGSUNfVVNFUiB8fFxyXG4gICAgICAgICAgY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5hdCgwKSA9PT0gRXhjbHVzaXZpdGllcy5DT0xMQUJPUkFUT1JTKVxyXG4gICAgICApXHJcbiAgICAgICAgY291cG9uVXNlTGltaXRzID0gY291cG9uLnVzZUxpbWl0cy5ub25fc3Vic2NyaWJlclxyXG4gICAgICBlbHNlIGNvdXBvblVzZUxpbWl0cyA9IHVzZXI/LmlzU3Vic2NyaWJlciA/IGNvdXBvbi51c2VMaW1pdHMuc3Vic2NyaWJlciA6IGNvdXBvbi51c2VMaW1pdHMubm9uX3N1YnNjcmliZXJcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvdXBvblVzZUxpbWl0cyA9IGNvdXBvbi51c2VMaW1pdHMuc3Vic2NyaXB0aW9uXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvdXBvblVzZUxpbWl0c1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './util.helper';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hlbHBlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3V0aWwuaGVscGVyJ1xyXG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class UtilHelper {
|
|
2
|
+
static createSlug(name) {
|
|
3
|
+
return name
|
|
4
|
+
.toLowerCase()
|
|
5
|
+
.replace(/\s+/g, '-')
|
|
6
|
+
.replace(/[ãàáäâ]/g, 'a')
|
|
7
|
+
.replace(/[ẽèéëê]/g, 'e')
|
|
8
|
+
.replace(/[ìíïî]/g, 'i')
|
|
9
|
+
.replace(/[õòóöô]/g, 'o')
|
|
10
|
+
.replace(/[ùúüû]/g, 'u')
|
|
11
|
+
.replace(/[ñ]/g, 'n')
|
|
12
|
+
.replace(/[ç]/g, 'c')
|
|
13
|
+
.replace(/[&]/g, 'and')
|
|
14
|
+
.replace(/[^\w-]+/g, '')
|
|
15
|
+
.replace(/--+/g, '-');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hlbHBlcnMvdXRpbC5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFVBQVU7SUFDckIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFZO1FBQzVCLE9BQU8sSUFBSTthQUNSLFdBQVcsRUFBRTthQUNiLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO2FBQ3BCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO2FBQ3hCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO2FBQ3hCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO2FBQ3ZCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO2FBQ3hCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO2FBQ3ZCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO2FBQ3BCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO2FBQ3BCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2FBQ3ZCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDekIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFV0aWxIZWxwZXIge1xyXG4gIHN0YXRpYyBjcmVhdGVTbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmFtZVxyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpXHJcbiAgICAgIC5yZXBsYWNlKC9bw6PDoMOhw6TDol0vZywgJ2EnKVxyXG4gICAgICAucmVwbGFjZSgvW+G6vcOow6nDq8OqXS9nLCAnZScpXHJcbiAgICAgIC5yZXBsYWNlKC9bw6zDrcOvw65dL2csICdpJylcclxuICAgICAgLnJlcGxhY2UoL1vDtcOyw7PDtsO0XS9nLCAnbycpXHJcbiAgICAgIC5yZXBsYWNlKC9bw7nDusO8w7tdL2csICd1JylcclxuICAgICAgLnJlcGxhY2UoL1vDsV0vZywgJ24nKVxyXG4gICAgICAucmVwbGFjZSgvW8OnXS9nLCAnYycpXHJcbiAgICAgIC5yZXBsYWNlKC9bJl0vZywgJ2FuZCcpXHJcbiAgICAgIC5yZXBsYWNlKC9bXlxcdy1dKy9nLCAnJylcclxuICAgICAgLnJlcGxhY2UoLy0tKy9nLCAnLScpXHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class HomeShopRepositoriesFacade {
|
|
4
|
+
constructor(categoryRepository, homeRepository, productRepository) {
|
|
5
|
+
this.categoryRepository = categoryRepository;
|
|
6
|
+
this.homeRepository = homeRepository;
|
|
7
|
+
this.productRepository = productRepository;
|
|
8
|
+
}
|
|
9
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: HomeShopRepositoriesFacade, deps: [{ token: 'CategoryRepository' }, { token: 'HomeRepository' }, { token: 'ProductRepository' }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
10
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: HomeShopRepositoriesFacade }); }
|
|
11
|
+
}
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: HomeShopRepositoriesFacade, decorators: [{
|
|
13
|
+
type: Injectable
|
|
14
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
15
|
+
type: Inject,
|
|
16
|
+
args: ['CategoryRepository']
|
|
17
|
+
}] }, { type: undefined, decorators: [{
|
|
18
|
+
type: Inject,
|
|
19
|
+
args: ['HomeRepository']
|
|
20
|
+
}] }, { type: undefined, decorators: [{
|
|
21
|
+
type: Inject,
|
|
22
|
+
args: ['ProductRepository']
|
|
23
|
+
}] }] });
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS1zaG9wLXJlcG9zaXRvcmllcy5mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hvbWUtc2hvcC9ob21lLXNob3AtcmVwb3NpdG9yaWVzLmZhY2FkZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTs7QUFJbEQsTUFBTSxPQUFPLDBCQUEwQjtJQUNyQyxZQUNnRCxrQkFBc0MsRUFDMUMsY0FBOEIsRUFDM0IsaUJBQW9DO1FBRm5DLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzNCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFDaEYsQ0FBQzs4R0FMTywwQkFBMEIsa0JBRTNCLG9CQUFvQixhQUNwQixnQkFBZ0IsYUFDaEIsbUJBQW1CO2tIQUpsQiwwQkFBMEI7OzJGQUExQiwwQkFBMEI7a0JBRHRDLFVBQVU7OzBCQUdOLE1BQU07MkJBQUMsb0JBQW9COzswQkFDM0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUN2QixNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IENhdGVnb3J5UmVwb3NpdG9yeSwgSG9tZVJlcG9zaXRvcnksIFByb2R1Y3RSZXBvc2l0b3J5IH0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBIb21lU2hvcFJlcG9zaXRvcmllc0ZhY2FkZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KCdDYXRlZ29yeVJlcG9zaXRvcnknKSBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnlSZXBvc2l0b3J5OiBDYXRlZ29yeVJlcG9zaXRvcnksXHJcbiAgICBASW5qZWN0KCdIb21lUmVwb3NpdG9yeScpIHB1YmxpYyByZWFkb25seSBob21lUmVwb3NpdG9yeTogSG9tZVJlcG9zaXRvcnksXHJcbiAgICBASW5qZWN0KCdQcm9kdWN0UmVwb3NpdG9yeScpIHB1YmxpYyByZWFkb25seSBwcm9kdWN0UmVwb3NpdG9yeTogUHJvZHVjdFJlcG9zaXRvcnksXHJcbiAgKSB7fVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { HomeShopRepositoriesFacade } from './home-shop-repositories.facade';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hvbWUtc2hvcC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEhvbWVTaG9wUmVwb3NpdG9yaWVzRmFjYWRlIH0gZnJvbSAnLi9ob21lLXNob3AtcmVwb3NpdG9yaWVzLmZhY2FkZSdcclxuIl19
|