@infrab4a/connect-angular 4.17.3-beta.20 → 4.17.3-beta.22

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.
Files changed (112) hide show
  1. package/angular-connect.module.d.ts +32 -29
  2. package/angular-elastic-search.module.d.ts +9 -9
  3. package/angular-firebase-auth.module.d.ts +11 -11
  4. package/angular-firestore.module.d.ts +17 -17
  5. package/angular-hasura-graphql.module.d.ts +16 -16
  6. package/angular-vertex-search.module.d.ts +9 -9
  7. package/consts/backend-url.const.d.ts +1 -1
  8. package/consts/category-structure.d.ts +1 -1
  9. package/consts/default-shop.const.d.ts +1 -1
  10. package/consts/es-config.const.d.ts +1 -1
  11. package/consts/firebase-const.d.ts +4 -3
  12. package/consts/hasura-options.const.d.ts +1 -1
  13. package/consts/index.d.ts +8 -8
  14. package/consts/persistence.const.d.ts +1 -1
  15. package/consts/storage-base-url.const.d.ts +1 -1
  16. package/consts/vertex-config.const.d.ts +1 -1
  17. package/esm2020/angular-connect.module.mjs +189 -144
  18. package/esm2020/angular-elastic-search.module.mjs +34 -34
  19. package/esm2020/angular-firebase-auth.module.mjs +141 -115
  20. package/esm2020/angular-firestore.module.mjs +527 -527
  21. package/esm2020/angular-hasura-graphql.module.mjs +331 -309
  22. package/esm2020/angular-vertex-search.module.mjs +34 -34
  23. package/esm2020/consts/backend-url.const.mjs +1 -1
  24. package/esm2020/consts/category-structure.mjs +2 -2
  25. package/esm2020/consts/default-shop.const.mjs +2 -2
  26. package/esm2020/consts/es-config.const.mjs +2 -2
  27. package/esm2020/consts/firebase-const.mjs +5 -4
  28. package/esm2020/consts/hasura-options.const.mjs +2 -2
  29. package/esm2020/consts/index.mjs +9 -9
  30. package/esm2020/consts/persistence.const.mjs +2 -2
  31. package/esm2020/consts/storage-base-url.const.mjs +2 -2
  32. package/esm2020/consts/vertex-config.const.mjs +2 -2
  33. package/esm2020/helpers/index.mjs +2 -2
  34. package/esm2020/helpers/mobile-operation-system-checker.helper.mjs +7 -7
  35. package/esm2020/index.mjs +7 -7
  36. package/esm2020/infrab4a-connect-angular.mjs +4 -4
  37. package/esm2020/persistence/cookie-data-persistence.mjs +22 -22
  38. package/esm2020/persistence/data-persistence.mjs +2 -2
  39. package/esm2020/persistence/index.mjs +3 -3
  40. package/esm2020/services/auth.service.mjs +37 -37
  41. package/esm2020/services/cart.service.mjs +293 -191
  42. package/esm2020/services/catalog/adapters/category-structure.adapter.mjs +2 -2
  43. package/esm2020/services/catalog/adapters/index.mjs +4 -4
  44. package/esm2020/services/catalog/adapters/new-category-structure.adapter.mjs +43 -43
  45. package/esm2020/services/catalog/adapters/old-category-structure.adapter.mjs +23 -23
  46. package/esm2020/services/catalog/catalog.service.mjs +295 -295
  47. package/esm2020/services/catalog/category.service.mjs +51 -51
  48. package/esm2020/services/catalog/enums/index.mjs +2 -2
  49. package/esm2020/services/catalog/enums/product-sorts.enum.mjs +11 -11
  50. package/esm2020/services/catalog/index.mjs +8 -8
  51. package/esm2020/services/catalog/models/category-with-tree.model.mjs +10 -10
  52. package/esm2020/services/catalog/models/index.mjs +2 -2
  53. package/esm2020/services/catalog/types/index.mjs +2 -2
  54. package/esm2020/services/catalog/types/product-sort.type.mjs +2 -2
  55. package/esm2020/services/catalog/wishlist.service.mjs +235 -235
  56. package/esm2020/services/checkout-subscription.service.mjs +50 -50
  57. package/esm2020/services/checkout.service.mjs +68 -123
  58. package/esm2020/services/coupon.service.mjs +284 -272
  59. package/esm2020/services/helpers/index.mjs +2 -2
  60. package/esm2020/services/helpers/util.helper.mjs +18 -18
  61. package/esm2020/services/home-shop.service.mjs +125 -125
  62. package/esm2020/services/index.mjs +11 -10
  63. package/esm2020/services/order.service.mjs +30 -30
  64. package/esm2020/services/shipping.service.mjs +96 -0
  65. package/esm2020/services/types/index.mjs +3 -3
  66. package/esm2020/services/types/required-checkout-data.type.mjs +2 -2
  67. package/esm2020/services/types/required-checkout-subscription-data.type.mjs +2 -2
  68. package/esm2020/services/types/shipping-methods.type.mjs +2 -0
  69. package/esm2020/types/firebase-app-config.type.mjs +2 -2
  70. package/esm2020/types/index.mjs +2 -2
  71. package/fesm2015/infrab4a-connect-angular.mjs +2827 -2584
  72. package/fesm2015/infrab4a-connect-angular.mjs.map +1 -1
  73. package/fesm2020/infrab4a-connect-angular.mjs +2779 -2538
  74. package/fesm2020/infrab4a-connect-angular.mjs.map +1 -1
  75. package/helpers/index.d.ts +1 -1
  76. package/helpers/mobile-operation-system-checker.helper.d.ts +3 -3
  77. package/index.d.ts +6 -6
  78. package/package.json +2 -2
  79. package/persistence/cookie-data-persistence.d.ts +10 -10
  80. package/persistence/data-persistence.d.ts +6 -6
  81. package/persistence/index.d.ts +2 -2
  82. package/services/auth.service.d.ts +18 -18
  83. package/services/cart.service.d.ts +43 -31
  84. package/services/catalog/adapters/category-structure.adapter.d.ts +4 -4
  85. package/services/catalog/adapters/index.d.ts +3 -3
  86. package/services/catalog/adapters/new-category-structure.adapter.d.ts +12 -12
  87. package/services/catalog/adapters/old-category-structure.adapter.d.ts +10 -10
  88. package/services/catalog/catalog.service.d.ts +93 -93
  89. package/services/catalog/category.service.d.ts +20 -20
  90. package/services/catalog/enums/index.d.ts +1 -1
  91. package/services/catalog/enums/product-sorts.enum.d.ts +9 -9
  92. package/services/catalog/index.d.ts +7 -7
  93. package/services/catalog/models/category-with-tree.model.d.ts +4 -4
  94. package/services/catalog/models/index.d.ts +1 -1
  95. package/services/catalog/types/index.d.ts +1 -1
  96. package/services/catalog/types/product-sort.type.d.ts +2 -2
  97. package/services/catalog/wishlist.service.d.ts +50 -50
  98. package/services/checkout-subscription.service.d.ts +19 -19
  99. package/services/checkout.service.d.ts +27 -34
  100. package/services/coupon.service.d.ts +33 -27
  101. package/services/helpers/index.d.ts +1 -1
  102. package/services/helpers/util.helper.d.ts +3 -3
  103. package/services/home-shop.service.d.ts +26 -26
  104. package/services/index.d.ts +10 -9
  105. package/services/order.service.d.ts +13 -13
  106. package/services/shipping.service.d.ts +19 -0
  107. package/services/types/index.d.ts +2 -2
  108. package/services/types/required-checkout-data.type.d.ts +2 -2
  109. package/services/types/required-checkout-subscription-data.type.d.ts +2 -2
  110. package/services/types/shipping-methods.type.d.ts +12 -0
  111. package/types/firebase-app-config.type.d.ts +1 -1
  112. package/types/index.d.ts +1 -1
@@ -1,191 +1,293 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Inject, Injectable } from '@angular/core';
3
- import { Checkout, LineItem, Shops } from '@infrab4a/connect';
4
- import { of, Subject } from 'rxjs';
5
- import { concatMap, map, tap } from 'rxjs/operators';
6
- import { DEFAULT_SHOP, FIREBASE_OPTIONS } from '../consts';
7
- import { AuthService } from './auth.service';
8
- import { CheckoutService } from './checkout.service';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./auth.service";
11
- import * as i2 from "./checkout.service";
12
- import * as i3 from "@angular/common/http";
13
- import * as i4 from "@infrab4a/connect";
14
- export class CartService {
15
- constructor(authService, checkoutService, defaultShop, firebaseOptions,
16
- // @Inject('ProductRepository') private readonly productRepository: ProductRepository,
17
- // @Inject('CategoryRepository') private readonly categoryRepository: CategoryRepository,
18
- // @Inject('VariantRepository') private readonly variantRepository: VariantRepository,
19
- // @Inject('Buy2WinRepository') private readonly buy2WinRepository: Buy2WinFirestoreRepository,
20
- http) {
21
- this.authService = authService;
22
- this.checkoutService = checkoutService;
23
- this.defaultShop = defaultShop;
24
- this.firebaseOptions = firebaseOptions;
25
- this.http = http;
26
- this.cartSubject = new Subject();
27
- this.checkoutUrl = null;
28
- // private updateLineItemInCart = (lineItem: LineItem, quantity: number, checkout?: Checkout): Observable<Cart> =>
29
- // (isNil(checkout) ? this.checkoutService.getCheckout() : of(checkout)).pipe(
30
- // concatMap((checkoutLoaded) => {
31
- // const items: LineItem[] = []
32
- // const index = checkoutLoaded.lineItems?.map((checkoutItem) => checkoutItem.id).indexOf(lineItem.id)
33
- // const isGift = checkoutLoaded.lineItems?.[index]?.isGift
34
- // if (index > -1) {
35
- // checkoutLoaded.lineItems[index].quantity += quantity
36
- // checkoutLoaded.lineItems[index].pricePaid = isGift ? 0 : lineItem.pricePaid
37
- // checkoutLoaded.lineItems[index].price = lineItem.price
38
- // } else
39
- // checkoutLoaded.lineItems = items.concat(
40
- // checkoutLoaded.lineItems ? checkoutLoaded.lineItems.concat([lineItem]) : [lineItem],
41
- // )
42
- // return this.checkoutService
43
- // .updateCheckoutLineItems(checkoutLoaded)
44
- // .pipe(map((updatedCheckout) => this.generateCartObject(updatedCheckout.lineItems)))
45
- // }),
46
- // )
47
- this.generateCartObject = (items) => items?.reduce((cart, item) => ({
48
- ...cart,
49
- [item.id]: LineItem.toInstance({
50
- ...(cart[item.id] || item),
51
- quantity: (cart[item.id]?.quantity || 0) + (item.quantity ? item.quantity : 1),
52
- }),
53
- }), {}) || {};
54
- this.checkoutUrl = `https://southamerica-east1-${this.firebaseOptions.projectId}.cloudfunctions.net`;
55
- // this.checkoutUrl = `http://docker.for.localhost:5001/b4astage-cb80a/southamerica-east1`
56
- }
57
- addItem(item, quantity = 1) {
58
- return this.checkoutService.getCheckout().pipe(concatMap((checkout) => {
59
- console.log('getCheckout', checkout);
60
- return this.http.post(`${this.checkoutUrl}/checkoutAddItemToCart`, {
61
- checkoutId: checkout.id,
62
- productId: item.id,
63
- quantity,
64
- });
65
- }), concatMap(() => this.checkoutService.getCheckout()), map((updatedCheckout) => {
66
- console.log('updatedCheckout', updatedCheckout);
67
- return this.generateCartObject(updatedCheckout.lineItems);
68
- }), tap((cart) => this.cartSubject.next(cart)));
69
- // return this.generateCartObject(checkoutUpdated.lineItems as LineItem[])
70
- // return from(this.checkoutService.getCheckout()).pipe(
71
- // concatMap(async (checkout) => await this.buildLineItem({ checkout, item, quantity: quantity || 1 })),
72
- // mergeMap(({ checkout, lineItem }) => this.updateLineItemInCart(lineItem, quantity || 1, checkout as Checkout)),
73
- // tap((cart) => this.cartSubject.next(cart)),
74
- // )
75
- }
76
- decreaseItem(item) {
77
- return this.checkoutService.getCheckout().pipe(concatMap((checkout) => this.http.post(`${this.checkoutUrl}/checkoutDecreaseProductFromCart`, {
78
- checkoutId: checkout.id,
79
- productId: item.id,
80
- quantity: 1,
81
- })), concatMap(() => this.checkoutService.getCheckout()), map((updatedCheckout) => {
82
- console.log('updatedCheckout', updatedCheckout);
83
- return this.generateCartObject(updatedCheckout.lineItems);
84
- }), tap((cart) => this.cartSubject.next(cart)));
85
- // return this.checkoutService.getCheckout().pipe(
86
- // map((checkout) => {
87
- // const checkoutItem = checkout.lineItems?.find((lineItem) => lineItem.id === item.id)
88
- // if (!isNil(checkoutItem)) checkoutItem.quantity -= checkoutItem.quantity > 1 ? 1 : 0
89
- // return checkout
90
- // }),
91
- // concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)),
92
- // map((checkout) => this.generateCartObject(checkout.lineItems)),
93
- // tap((cart) => this.cartSubject.next(cart)),
94
- // )
95
- }
96
- removeItem(item) {
97
- return this.checkoutService.getCheckout().pipe(concatMap((checkout) => this.http.post(`${this.checkoutUrl}/checkoutRemoveProductFromCart`, {
98
- checkoutId: checkout.id,
99
- productId: item.id,
100
- })), concatMap(() => this.checkoutService.getCheckout()), map((updatedCheckout) => {
101
- console.log('updatedCheckout', updatedCheckout);
102
- return this.generateCartObject(updatedCheckout.lineItems);
103
- }), tap((cart) => this.cartSubject.next(cart)));
104
- // return this.checkoutService.getCheckout().pipe(
105
- // map((checkout) => {
106
- // const index = checkout.lineItems.findIndex((lineItem) => lineItem.id === item.id)
107
- // if (index >= 0) checkout.lineItems.splice(index, 1)
108
- // return checkout
109
- // }),
110
- // concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)),
111
- // map((checkout) => this.generateCartObject(checkout.lineItems)),
112
- // tap((cart) => this.cartSubject.next(cart)),
113
- }
114
- updateUserCart(user) {
115
- return this.checkoutService.getCheckout().pipe(concatMap((checkout) => {
116
- console.log('getCheckout', checkout);
117
- return this.checkoutService.updateCheckoutUser(Checkout.toInstance({ ...checkout.toPlain(), user }));
118
- }), concatMap((checkout) => {
119
- console.log('getCheckout User', checkout);
120
- return this.http.post(`${this.checkoutUrl}/checkoutUpdateUserCart`, {
121
- checkoutId: checkout.id,
122
- });
123
- }), concatMap(() => this.checkoutService.getCheckout()), map((updatedCheckout) => {
124
- console.log('updatedCheckout', updatedCheckout);
125
- return this.generateCartObject(updatedCheckout.lineItems);
126
- }), tap((cart) => this.cartSubject.next(cart)));
127
- // return this.checkoutService.getCheckout().pipe(
128
- // concatMap((checkout) =>
129
- // this.checkoutService.updateCheckoutUser(Checkout.toInstance({ ...checkout.toPlain(), user })),
130
- // ),
131
- // concatMap(
132
- // async (checkout) =>
133
- // await this.checkoutService
134
- // .updateCheckoutLineItems(
135
- // Checkout.toInstance({
136
- // ...checkout.toPlain(),
137
- // lineItems: checkout.lineItems?.length
138
- // ? await Promise.all(
139
- // checkout.lineItems?.map(async (item) => (await this.buildLineItem({ checkout, item })).lineItem),
140
- // )
141
- // : [],
142
- // }),
143
- // )
144
- // .toPromise(),
145
- // ),
146
- // map((checkout) => this.generateCartObject(checkout.lineItems)),
147
- // tap((cart) => (this.user = user)),
148
- // tap((cart) => this.cartSubject.next(cart)),
149
- // )
150
- }
151
- getCart(checkout) {
152
- this.buildCartFromCheckout(checkout).subscribe((cart) => this.cartSubject.next(cart));
153
- return this.cartSubject;
154
- }
155
- // /**
156
- // * @deprecated The method should not be used
157
- // */
158
- // getVariantPriceDiscount(item: LineItem): Observable<number> {
159
- // return this.authService.getUser().pipe(
160
- // concatMap((user) =>
161
- // iif(
162
- // () => user.isSubscriber && !!item.price.subscriberPrice,
163
- // of(item.price.subscriberPrice),
164
- // of(item.price.price),
165
- // ),
166
- // ),
167
- // catchError(() => of(item.price.price)),
168
- // )
169
- // }
170
- clearCart() {
171
- return this.checkoutService.getCheckout().pipe(map((checkout) => {
172
- this.checkoutService.clearCheckoutFromSession();
173
- return checkout;
174
- }), concatMap((oldCheckout) => this.buildCartFromCheckout(oldCheckout)), tap((cart) => this.cartSubject.next(cart)));
175
- }
176
- buildCartFromCheckout(checkoutData) {
177
- return this.checkoutService.getCheckout(checkoutData).pipe(map((checkout) => checkout.lineItems), concatMap((lineItems) => of(this.generateCartObject(lineItems))));
178
- }
179
- }
180
- CartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CartService, deps: [{ token: i1.AuthService }, { token: i2.CheckoutService }, { token: DEFAULT_SHOP }, { token: FIREBASE_OPTIONS }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
181
- CartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CartService });
182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CartService, decorators: [{
183
- type: Injectable
184
- }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.CheckoutService }, { type: i4.Shops, decorators: [{
185
- type: Inject,
186
- args: [DEFAULT_SHOP]
187
- }] }, { type: undefined, decorators: [{
188
- type: Inject,
189
- args: [FIREBASE_OPTIONS]
190
- }] }, { type: i3.HttpClient }]; } });
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRWxELE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBUSxNQUFNLG1CQUFtQixDQUFBO0FBQ25FLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTs7Ozs7O0FBUXBELE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQ21CLFdBQXdCLEVBQ3hCLGVBQWdDLEVBQ1YsV0FBa0IsRUFDZCxlQUFnQztJQUMzRSxzRkFBc0Y7SUFDdEYseUZBQXlGO0lBQ3pGLHNGQUFzRjtJQUN0RiwrRkFBK0Y7SUFDdkYsSUFBZ0I7UUFSUCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDVixnQkFBVyxHQUFYLFdBQVcsQ0FBTztRQUNkLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUtuRSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBWmxCLGdCQUFXLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUE7UUFDMUMsZ0JBQVcsR0FBVyxJQUFJ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LElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUM1QyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtZQUMvQyxPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUNuRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQzNDLENBQUE7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsWUFBbUM7UUFDL0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQ3hELEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUNyQyxTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNqRSxDQUFBO0lBQ0gsQ0FBQzs7d0dBNUxVLFdBQVcsNEVBT1osWUFBWSxhQUNaLGdCQUFnQjs0R0FSZixXQUFXOzJGQUFYLFdBQVc7a0JBRHZCLFVBQVU7OzBCQVFOLE1BQU07MkJBQUMsWUFBWTs7MEJBQ25CLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBGaXJlYmFzZU9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9maXJlL2FwcCdcclxuaW1wb3J0IHsgQ2hlY2tvdXQsIExpbmVJdGVtLCBTaG9wcywgVXNlciB9IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuaW1wb3J0IHsgREVGQVVMVF9TSE9QLCBGSVJFQkFTRV9PUFRJT05TIH0gZnJvbSAnLi4vY29uc3RzJ1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBDaGVja291dFNlcnZpY2UgfSBmcm9tICcuL2NoZWNrb3V0LnNlcnZpY2UnXHJcbmltcG9ydCB7IFJlcXVpcmVkQ2hlY2tvdXREYXRhIH0gZnJvbSAnLi90eXBlcydcclxuXHJcbmV4cG9ydCB0eXBlIENhcnQgPSB7XHJcbiAgW2lkOiBzdHJpbmddOiBMaW5lSXRlbVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDYXJ0U2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjYXJ0U3ViamVjdDogU3ViamVjdDxDYXJ0PiA9IG5ldyBTdWJqZWN0KClcclxuICBwcml2YXRlIGNoZWNrb3V0VXJsOiBzdHJpbmcgPSBudWxsXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoZWNrb3V0U2VydmljZTogQ2hlY2tvdXRTZXJ2aWNlLFxyXG4gICAgQEluamVjdChERUZBVUxUX1NIT1ApIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNob3A6IFNob3BzLFxyXG4gICAgQEluamVjdChGSVJFQkFTRV9PUFRJT05TKSBwcml2YXRlIHJlYWRvbmx5IGZpcmViYXNlT3B0aW9uczogRmlyZWJhc2VPcHRpb25zLFxyXG4gICAgLy8gQEluamVjdCgnUHJvZHVjdFJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RSZXBvc2l0b3J5OiBQcm9kdWN0UmVwb3NpdG9yeSxcclxuICAgIC8vIEBJbmplY3QoJ0NhdGVnb3J5UmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgY2F0ZWdvcnlSZXBvc2l0b3J5OiBDYXRlZ29yeVJlcG9zaXRvcnksXHJcbiAgICAvLyBASW5qZWN0KCdWYXJpYW50UmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgdmFyaWFudFJlcG9zaXRvcnk6IFZhcmlhbnRSZXBvc2l0b3J5LFxyXG4gICAgLy8gQEluamVjdCgnQnV5MldpblJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IGJ1eTJXaW5SZXBvc2l0b3J5OiBCdXkyV2luRmlyZXN0b3JlUmVwb3NpdG9yeSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICApIHtcclxuICAgIHRoaXMuY2hlY2tvdXRVcmwgPSBgaHR0cHM6Ly9zb3V0aGFtZXJpY2EtZWFzdDEtJHt0aGlzLmZpcmViYXNlT3B0aW9ucy5wcm9qZWN0SWR9LmNsb3VkZnVuY3Rpb25zLm5ldGBcclxuICAgIC8vIHRoaXMuY2hlY2tvdXRVcmwgPSBgaHR0cDovL2RvY2tlci5mb3IubG9jYWxob3N0OjUwMDEvYjRhc3RhZ2UtY2I4MGEvc291dGhhbWVyaWNhLWVhc3QxYFxyXG4gIH1cclxuXHJcbiAgYWRkSXRlbShpdGVtOiBMaW5lSXRlbSwgcXVhbnRpdHk6IG51bWJlciA9IDEpOiBPYnNlcnZhYmxlPENhcnQ+IHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZ2V0Q2hlY2tvdXQnLCBjaGVja291dClcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuY2hlY2tvdXRVcmx9L2NoZWNrb3V0QWRkSXRlbVRvQ2FydGAsIHtcclxuICAgICAgICAgIGNoZWNrb3V0SWQ6IGNoZWNrb3V0LmlkLFxyXG4gICAgICAgICAgcHJvZHVjdElkOiBpdGVtLmlkLFxyXG4gICAgICAgICAgcXVhbnRpdHksXHJcbiAgICAgICAgfSlcclxuICAgICAgfSksXHJcbiAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpKSxcclxuICAgICAgbWFwKCh1cGRhdGVkQ2hlY2tvdXQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygndXBkYXRlZENoZWNrb3V0JywgdXBkYXRlZENoZWNrb3V0KVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2FydE9iamVjdCh1cGRhdGVkQ2hlY2tvdXQubGluZUl0ZW1zKVxyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxyXG4gICAgKVxyXG5cclxuICAgIC8vIHJldHVybiB0aGlzLmdlbmVyYXRlQ2FydE9iamVjdChjaGVja291dFVwZGF0ZWQubGluZUl0ZW1zIGFzIExpbmVJdGVtW10pXHJcblxyXG4gICAgLy8gcmV0dXJuIGZyb20odGhpcy5jaGVja291dFNlcnZpY2UuZ2V0Q2hlY2tvdXQoKSkucGlwZShcclxuICAgIC8vICAgY29uY2F0TWFwKGFzeW5jIChjaGVja291dCkgPT4gYXdhaXQgdGhpcy5idWlsZExpbmVJdGVtKHsgY2hlY2tvdXQsIGl0ZW0sIHF1YW50aXR5OiBxdWFudGl0eSB8fCAxIH0pKSxcclxuICAgIC8vICAgbWVyZ2VNYXAoKHsgY2hlY2tvdXQsIGxpbmVJdGVtIH0pID0+IHRoaXMudXBkYXRlTGluZUl0ZW1JbkNhcnQobGluZUl0ZW0sIHF1YW50aXR5IHx8IDEsIGNoZWNrb3V0IGFzIENoZWNrb3V0KSksXHJcbiAgICAvLyAgIHRhcCgoY2FydCkgPT4gdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpKSxcclxuICAgIC8vIClcclxuICB9XHJcblxyXG4gIGRlY3JlYXNlSXRlbShpdGVtOiBMaW5lSXRlbSk6IE9ic2VydmFibGU8Q2FydD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChjaGVja291dCkgPT5cclxuICAgICAgICB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmNoZWNrb3V0VXJsfS9jaGVja291dERlY3JlYXNlUHJvZHVjdEZyb21DYXJ0YCwge1xyXG4gICAgICAgICAgY2hlY2tvdXRJZDogY2hlY2tvdXQuaWQsXHJcbiAgICAgICAgICBwcm9kdWN0SWQ6IGl0ZW0uaWQsXHJcbiAgICAgICAgICBxdWFudGl0eTogMSxcclxuICAgICAgICB9KSxcclxuICAgICAgKSxcclxuICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkpLFxyXG4gICAgICBtYXAoKHVwZGF0ZWRDaGVja291dCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd1cGRhdGVkQ2hlY2tvdXQnLCB1cGRhdGVkQ2hlY2tvdXQpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVDYXJ0T2JqZWN0KHVwZGF0ZWRDaGVja291dC5saW5lSXRlbXMpXHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXHJcbiAgICApXHJcbiAgICAvLyByZXR1cm4gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0Q2hlY2tvdXQoKS5waXBlKFxyXG4gICAgLy8gICBtYXAoKGNoZWNrb3V0KSA9PiB7XHJcbiAgICAvLyAgICAgY29uc3QgY2hlY2tvdXRJdGVtID0gY2hlY2tvdXQubGluZUl0ZW1zPy5maW5kKChsaW5lSXRlbSkgPT4gbGluZUl0ZW0uaWQgPT09IGl0ZW0uaWQpXHJcblxyXG4gICAgLy8gICAgIGlmICghaXNOaWwoY2hlY2tvdXRJdGVtKSkgY2hlY2tvdXRJdGVtLnF1YW50aXR5IC09IGNoZWNrb3V0SXRlbS5xdWFudGl0eSA+IDEgPyAxIDogMFxyXG5cclxuICAgIC8vICAgICByZXR1cm4gY2hlY2tvdXRcclxuICAgIC8vICAgfSksXHJcbiAgICAvLyAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLnVwZGF0ZUNoZWNrb3V0TGluZUl0ZW1zKGNoZWNrb3V0KSksXHJcbiAgICAvLyAgIG1hcCgoY2hlY2tvdXQpID0+IHRoaXMuZ2VuZXJhdGVDYXJ0T2JqZWN0KGNoZWNrb3V0LmxpbmVJdGVtcykpLFxyXG4gICAgLy8gICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXHJcbiAgICAvLyApXHJcbiAgfVxyXG5cclxuICByZW1vdmVJdGVtKGl0ZW06IExpbmVJdGVtKTogT2JzZXJ2YWJsZTxDYXJ0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0Q2hlY2tvdXQoKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PlxyXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuY2hlY2tvdXRVcmx9L2NoZWNrb3V0UmVtb3ZlUHJvZHVjdEZyb21DYXJ0YCwge1xyXG4gICAgICAgICAgY2hlY2tvdXRJZDogY2hlY2tvdXQuaWQsXHJcbiAgICAgICAgICBwcm9kdWN0SWQ6IGl0ZW0uaWQsXHJcbiAgICAgICAgfSksXHJcbiAgICAgICksXHJcbiAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpKSxcclxuICAgICAgbWFwKCh1cGRhdGVkQ2hlY2tvdXQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygndXBkYXRlZENoZWNrb3V0JywgdXBkYXRlZENoZWNrb3V0KVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2FydE9iamVjdCh1cGRhdGVkQ2hlY2tvdXQubGluZUl0ZW1zKVxyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxyXG4gICAgKVxyXG4gICAgLy8gcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkucGlwZShcclxuICAgIC8vICAgbWFwKChjaGVja291dCkgPT4ge1xyXG4gICAgLy8gICAgIGNvbnN0IGluZGV4ID0gY2hlY2tvdXQubGluZUl0ZW1zLmZpbmRJbmRleCgobGluZUl0ZW0pID0+IGxpbmVJdGVtLmlkID09PSBpdGVtLmlkKVxyXG5cclxuICAgIC8vICAgICBpZiAoaW5kZXggPj0gMCkgY2hlY2tvdXQubGluZUl0ZW1zLnNwbGljZShpbmRleCwgMSlcclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIGNoZWNrb3V0XHJcbiAgICAvLyAgIH0pLFxyXG4gICAgLy8gICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dExpbmVJdGVtcyhjaGVja291dCkpLFxyXG4gICAgLy8gICBtYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmdlbmVyYXRlQ2FydE9iamVjdChjaGVja291dC5saW5lSXRlbXMpKSxcclxuICAgIC8vICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxyXG4gIH1cclxuXHJcbiAgdXBkYXRlVXNlckNhcnQodXNlcjogVXNlcik6IE9ic2VydmFibGU8Q2FydD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChjaGVja291dCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdnZXRDaGVja291dCcsIGNoZWNrb3V0KVxyXG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dFVzZXIoQ2hlY2tvdXQudG9JbnN0YW5jZSh7IC4uLmNoZWNrb3V0LnRvUGxhaW4oKSwgdXNlciB9KSlcclxuICAgICAgfSksXHJcbiAgICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZ2V0Q2hlY2tvdXQgVXNlcicsIGNoZWNrb3V0KVxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmNoZWNrb3V0VXJsfS9jaGVja291dFVwZGF0ZVVzZXJDYXJ0YCwge1xyXG4gICAgICAgICAgY2hlY2tvdXRJZDogY2hlY2tvdXQuaWQsXHJcbiAgICAgICAgfSlcclxuICAgICAgfSksXHJcbiAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpKSxcclxuICAgICAgbWFwKCh1cGRhdGVkQ2hlY2tvdXQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygndXBkYXRlZENoZWNrb3V0JywgdXBkYXRlZENoZWNrb3V0KVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2FydE9iamVjdCh1cGRhdGVkQ2hlY2tvdXQubGluZUl0ZW1zKVxyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxyXG4gICAgKVxyXG5cclxuICAgIC8vIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXHJcbiAgICAvLyAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+XHJcbiAgICAvLyAgICAgdGhpcy5jaGVja291dFNlcnZpY2UudXBkYXRlQ2hlY2tvdXRVc2VyKENoZWNrb3V0LnRvSW5zdGFuY2UoeyAuLi5jaGVja291dC50b1BsYWluKCksIHVzZXIgfSkpLFxyXG4gICAgLy8gICApLFxyXG4gICAgLy8gICBjb25jYXRNYXAoXHJcbiAgICAvLyAgICAgYXN5bmMgKGNoZWNrb3V0KSA9PlxyXG4gICAgLy8gICAgICAgYXdhaXQgdGhpcy5jaGVja291dFNlcnZpY2VcclxuICAgIC8vICAgICAgICAgLnVwZGF0ZUNoZWNrb3V0TGluZUl0ZW1zKFxyXG4gICAgLy8gICAgICAgICAgIENoZWNrb3V0LnRvSW5zdGFuY2Uoe1xyXG4gICAgLy8gICAgICAgICAgICAgLi4uY2hlY2tvdXQudG9QbGFpbigpLFxyXG4gICAgLy8gICAgICAgICAgICAgbGluZUl0ZW1zOiBjaGVja291dC5saW5lSXRlbXM/Lmxlbmd0aFxyXG4gICAgLy8gICAgICAgICAgICAgICA/IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgY2hlY2tvdXQubGluZUl0ZW1zPy5tYXAoYXN5bmMgKGl0ZW0pID0+IChhd2FpdCB0aGlzLmJ1aWxkTGluZUl0ZW0oeyBjaGVja291dCwgaXRlbSB9KSkubGluZUl0ZW0pLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIClcclxuICAgIC8vICAgICAgICAgICAgICAgOiBbXSxcclxuICAgIC8vICAgICAgICAgICB9KSxcclxuICAgIC8vICAgICAgICAgKVxyXG4gICAgLy8gICAgICAgICAudG9Qcm9taXNlKCksXHJcbiAgICAvLyAgICksXHJcbiAgICAvLyAgIG1hcCgoY2hlY2tvdXQpID0+IHRoaXMuZ2VuZXJhdGVDYXJ0T2JqZWN0KGNoZWNrb3V0LmxpbmVJdGVtcykpLFxyXG4gICAgLy8gICB0YXAoKGNhcnQpID0+ICh0aGlzLnVzZXIgPSB1c2VyKSksXHJcbiAgICAvLyAgIHRhcCgoY2FydCkgPT4gdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpKSxcclxuICAgIC8vIClcclxuICB9XHJcblxyXG4gIGdldENhcnQoY2hlY2tvdXQ/OiBSZXF1aXJlZENoZWNrb3V0RGF0YSk6IE9ic2VydmFibGU8Q2FydD4ge1xyXG4gICAgdGhpcy5idWlsZENhcnRGcm9tQ2hlY2tvdXQoY2hlY2tvdXQpLnN1YnNjcmliZSgoY2FydCkgPT4gdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpKVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNhcnRTdWJqZWN0XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiBAZGVwcmVjYXRlZCBUaGUgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZFxyXG4gIC8vICAqL1xyXG4gIC8vIGdldFZhcmlhbnRQcmljZURpc2NvdW50KGl0ZW06IExpbmVJdGVtKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAvLyAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXIoKS5waXBlKFxyXG4gIC8vICAgICBjb25jYXRNYXAoKHVzZXIpID0+XHJcbiAgLy8gICAgICAgaWlmKFxyXG4gIC8vICAgICAgICAgKCkgPT4gdXNlci5pc1N1YnNjcmliZXIgJiYgISFpdGVtLnByaWNlLnN1YnNjcmliZXJQcmljZSxcclxuICAvLyAgICAgICAgIG9mKGl0ZW0ucHJpY2Uuc3Vic2NyaWJlclByaWNlKSxcclxuICAvLyAgICAgICAgIG9mKGl0ZW0ucHJpY2UucHJpY2UpLFxyXG4gIC8vICAgICAgICksXHJcbiAgLy8gICAgICksXHJcbiAgLy8gICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoaXRlbS5wcmljZS5wcmljZSkpLFxyXG4gIC8vICAgKVxyXG4gIC8vIH1cclxuXHJcbiAgY2xlYXJDYXJ0KCk6IE9ic2VydmFibGU8Q2FydD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkucGlwZShcclxuICAgICAgbWFwKChjaGVja291dCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmNsZWFyQ2hlY2tvdXRGcm9tU2Vzc2lvbigpXHJcbiAgICAgICAgcmV0dXJuIGNoZWNrb3V0XHJcbiAgICAgIH0pLFxyXG4gICAgICBjb25jYXRNYXAoKG9sZENoZWNrb3V0KSA9PiB0aGlzLmJ1aWxkQ2FydEZyb21DaGVja291dChvbGRDaGVja291dCkpLFxyXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkQ2FydEZyb21DaGVja291dChjaGVja291dERhdGE/OiBSZXF1aXJlZENoZWNrb3V0RGF0YSk6IE9ic2VydmFibGU8Q2FydD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KGNoZWNrb3V0RGF0YSkucGlwZShcclxuICAgICAgbWFwKChjaGVja291dCkgPT4gY2hlY2tvdXQubGluZUl0ZW1zKSxcclxuICAgICAgY29uY2F0TWFwKChsaW5lSXRlbXMpID0+IG9mKHRoaXMuZ2VuZXJhdGVDYXJ0T2JqZWN0KGxpbmVJdGVtcykpKSxcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgdXBkYXRlTGluZUl0ZW1JbkNhcnQgPSAobGluZUl0ZW06IExpbmVJdGVtLCBxdWFudGl0eTogbnVtYmVyLCBjaGVja291dD86IENoZWNrb3V0KTogT2JzZXJ2YWJsZTxDYXJ0PiA9PlxyXG4gIC8vICAgKGlzTmlsKGNoZWNrb3V0KSA/IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkgOiBvZihjaGVja291dCkpLnBpcGUoXHJcbiAgLy8gICAgIGNvbmNhdE1hcCgoY2hlY2tvdXRMb2FkZWQpID0+IHtcclxuICAvLyAgICAgICBjb25zdCBpdGVtczogTGluZUl0ZW1bXSA9IFtdXHJcbiAgLy8gICAgICAgY29uc3QgaW5kZXggPSBjaGVja291dExvYWRlZC5saW5lSXRlbXM/Lm1hcCgoY2hlY2tvdXRJdGVtKSA9PiBjaGVja291dEl0ZW0uaWQpLmluZGV4T2YobGluZUl0ZW0uaWQpXHJcbiAgLy8gICAgICAgY29uc3QgaXNHaWZ0ID0gY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zPy5baW5kZXhdPy5pc0dpZnRcclxuXHJcbiAgLy8gICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAvLyAgICAgICAgIGNoZWNrb3V0TG9hZGVkLmxpbmVJdGVtc1tpbmRleF0ucXVhbnRpdHkgKz0gcXVhbnRpdHlcclxuICAvLyAgICAgICAgIGNoZWNrb3V0TG9hZGVkLmxpbmVJdGVtc1tpbmRleF0ucHJpY2VQYWlkID0gaXNHaWZ0ID8gMCA6IGxpbmVJdGVtLnByaWNlUGFpZFxyXG4gIC8vICAgICAgICAgY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zW2luZGV4XS5wcmljZSA9IGxpbmVJdGVtLnByaWNlXHJcbiAgLy8gICAgICAgfSBlbHNlXHJcbiAgLy8gICAgICAgICBjaGVja291dExvYWRlZC5saW5lSXRlbXMgPSBpdGVtcy5jb25jYXQoXHJcbiAgLy8gICAgICAgICAgIGNoZWNrb3V0TG9hZGVkLmxpbmVJdGVtcyA/IGNoZWNrb3V0TG9hZGVkLmxpbmVJdGVtcy5jb25jYXQoW2xpbmVJdGVtXSkgOiBbbGluZUl0ZW1dLFxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZVxyXG4gIC8vICAgICAgICAgLnVwZGF0ZUNoZWNrb3V0TGluZUl0ZW1zKGNoZWNrb3V0TG9hZGVkKVxyXG4gIC8vICAgICAgICAgLnBpcGUobWFwKCh1cGRhdGVkQ2hlY2tvdXQpID0+IHRoaXMuZ2VuZXJhdGVDYXJ0T2JqZWN0KHVwZGF0ZWRDaGVja291dC5saW5lSXRlbXMpKSlcclxuICAvLyAgICAgfSksXHJcbiAgLy8gICApXHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVDYXJ0T2JqZWN0ID0gKGl0ZW1zOiBMaW5lSXRlbVtdKTogQ2FydCA9PlxyXG4gICAgaXRlbXM/LnJlZHVjZShcclxuICAgICAgKGNhcnQsIGl0ZW0pID0+ICh7XHJcbiAgICAgICAgLi4uY2FydCxcclxuICAgICAgICBbaXRlbS5pZF06IExpbmVJdGVtLnRvSW5zdGFuY2Uoe1xyXG4gICAgICAgICAgLi4uKGNhcnRbaXRlbS5pZF0gfHwgaXRlbSksXHJcbiAgICAgICAgICBxdWFudGl0eTogKGNhcnRbaXRlbS5pZF0/LnF1YW50aXR5IHx8IDApICsgKGl0ZW0ucXVhbnRpdHkgPyBpdGVtLnF1YW50aXR5IDogMSksXHJcbiAgICAgICAgfSksXHJcbiAgICAgIH0pLFxyXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBMaW5lSXRlbT4sXHJcbiAgICApIHx8IHt9XHJcblxyXG4gIC8vIHByaXZhdGUgYnVpbGRMaW5lSXRlbSA9IGFzeW5jICh7XHJcbiAgLy8gICBjaGVja291dCxcclxuICAvLyAgIGl0ZW0sXHJcbiAgLy8gICBxdWFudGl0eSxcclxuICAvLyB9OiB7XHJcbiAgLy8gICBjaGVja291dDogUmVxdWlyZWRDaGVja291dERhdGFcclxuICAvLyAgIGl0ZW06IExpbmVJdGVtXHJcbiAgLy8gICBxdWFudGl0eT86IG51bWJlclxyXG4gIC8vIH0pOiBQcm9taXNlPHsgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+OyBsaW5lSXRlbTogTGluZUl0ZW0gfT4gPT4ge1xyXG4gIC8vICAgY29uc3QgcHJvZHVjdCA9IGF3YWl0IHRoaXMuZ2V0UHJvZHVjdERhdGEoaXRlbS5pZClcclxuXHJcbiAgLy8gICBpdGVtLnF1YW50aXR5ID0gaXRlbT8ucXVhbnRpdHkgfHwgY2hlY2tvdXQ/LmxpbmVJdGVtcz8uZmluZCgobGluZUl0ZW0pID0+IGxpbmVJdGVtLmlkID09PSBpdGVtLmlkKT8ucXVhbnRpdHkgfHwgMFxyXG5cclxuICAvLyAgIGlmICh0aGlzLmNoZWNrTWF4U3RvY2socHJvZHVjdC5zdG9jay5xdWFudGl0eSwgaXRlbS5xdWFudGl0eSB8fCAwLCBxdWFudGl0eSB8fCAwKSlcclxuICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdEZXNjdWxwZSEgVGVtb3MgYXBlbmFzICcgKyBwcm9kdWN0LnN0b2NrPy5xdWFudGl0eSArICcgZW0gZXN0b3F1ZS4nKVxyXG5cclxuICAvLyAgIGNvbnN0IGltYWdlID0gaXRlbS5pbWFnZSB8fCBpdGVtLmltYWdlcz8uc2hpZnQoKVxyXG4gIC8vICAgY29uc3QgeyBpZCwgbmFtZSwgRUFOLCBzbHVnLCB3ZWlnaHQsIHNrdSwgdHlwZSB9ID0gaXRlbVxyXG4gIC8vICAgY29uc3QgaXNHaWZ0ID0gaXRlbT8uaXNHaWZ0IHx8IG51bGxcclxuICAvLyAgIGNvbnN0IHByaWNlUGFpZCA9IGlzR2lmdFxyXG4gIC8vICAgICA/IDBcclxuICAvLyAgICAgOiB0aGlzLmdldFByb2R1Y3RQcmljZSh7XHJcbiAgLy8gICAgICAgICBwcm9kdWN0OiBMaW5lSXRlbS50b0luc3RhbmNlKHByb2R1Y3QpLFxyXG4gIC8vICAgICAgICAgc2hvcDogY2hlY2tvdXQuc2hvcCB8fCB0aGlzLmRlZmF1bHRTaG9wLFxyXG4gIC8vICAgICAgICAgaXNTdWJzY3JpYmVyOiBjaGVja291dC51c2VyPy5pc1N1YnNjcmliZXIsXHJcbiAgLy8gICAgICAgfSlcclxuXHJcbiAgLy8gICBSb3VuZFByb2R1Y3RQcmljZXNIZWxwZXIucm91bmRQcm9kdWN0UHJpY2VzKGl0ZW0pXHJcbiAgLy8gICBSb3VuZFByb2R1Y3RQcmljZXNIZWxwZXIucm91bmRQcm9kdWN0UHJpY2VzKHByb2R1Y3QgYXMgUHJvZHVjdClcclxuXHJcbiAgLy8gICByZXR1cm4ge1xyXG4gIC8vICAgICBjaGVja291dCxcclxuICAvLyAgICAgbGluZUl0ZW06IExpbmVJdGVtLnRvSW5zdGFuY2Uoe1xyXG4gIC8vICAgICAgIGlkLFxyXG4gIC8vICAgICAgIG5hbWU6IG5hbWUgPz8gcHJvZHVjdC5uYW1lLFxyXG4gIC8vICAgICAgIEVBTjogRUFOID8/IHByb2R1Y3QuRUFOLFxyXG4gIC8vICAgICAgIGJyYW5kOiBwcm9kdWN0LmJyYW5kLFxyXG4gIC8vICAgICAgIHNsdWc6IHNsdWcgPz8gcHJvZHVjdC5zbHVnLFxyXG4gIC8vICAgICAgIHNrdTogc2t1ID8/IHByb2R1Y3Quc2t1LFxyXG4gIC8vICAgICAgIHN0b2NrOiBwcm9kdWN0LnN0b2NrLFxyXG4gIC8vICAgICAgIHByaWNlOiB0aGlzLnJvdW5kUHJpY2UocHJvZHVjdC5wcmljZSksXHJcbiAgLy8gICAgICAgaW1hZ2UsXHJcbiAgLy8gICAgICAgd2VpZ2h0OiB3ZWlnaHQgPz8gcHJvZHVjdC53ZWlnaHQsXHJcbiAgLy8gICAgICAgcXVhbnRpdHk6IChpdGVtLnF1YW50aXR5IHx8IDApICsgKHF1YW50aXR5IHx8IDApLFxyXG4gIC8vICAgICAgIHByaWNlUGFpZCxcclxuICAvLyAgICAgICBkaXNjb3VudDogMCxcclxuICAvLyAgICAgICBjYXRlZ29yaWVzOiBwcm9kdWN0LmNhdGVnb3JpZXMgfHwgcHJvZHVjdC5jYXRlZ29yeT8uaWQgPyBbcHJvZHVjdC5jYXRlZ29yeT8uaWQsIC4uLnByb2R1Y3QuY2F0ZWdvcmllc10gOiBbXSxcclxuICAvLyAgICAgICBjYXRlZ29yeTogcHJvZHVjdC5jYXRlZ29yeSxcclxuICAvLyAgICAgICBpc0dpZnQ6IGlzR2lmdCA/PyBudWxsLFxyXG4gIC8vICAgICAgIGNvc3RQcmljZTogaXNHaWZ0ID8gMCA6IHByb2R1Y3QuY29zdFByaWNlID8/IDAsXHJcbiAgLy8gICAgICAgdHlwZSxcclxuICAvLyAgICAgICBsYWJlbDogcHJvZHVjdC5sYWJlbCxcclxuICAvLyAgICAgfSksXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwcml2YXRlIHJvdW5kUHJpY2UocHJvZHVjdFByaWNlOiBTaG9wUHJpY2UpOiBTaG9wUHJpY2Uge1xyXG4gIC8vICAgY29uc3QgeyBwcmljZSwgZnVsbFByaWNlLCBzdWJzY3JpYmVyUHJpY2UgfSA9IHByb2R1Y3RQcmljZVxyXG4gIC8vICAgcmV0dXJuIHtcclxuICAvLyAgICAgLi4ucHJvZHVjdFByaWNlLFxyXG4gIC8vICAgICBwcmljZTogTnVtYmVyKHByaWNlLnRvRml4ZWQoMikpLFxyXG4gIC8vICAgICBmdWxsUHJpY2U6IE51bWJlcihmdWxsUHJpY2UudG9GaXhlZCgyKSksXHJcbiAgLy8gICAgIC4uLihzdWJzY3JpYmVyUHJpY2UgJiYgeyBzdWJzY3JpYmVyUHJpY2U6IE51bWJlcihzdWJzY3JpYmVyUHJpY2UudG9GaXhlZCgyKSkgfSksXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwcml2YXRlIGFzeW5jIGdldFByb2R1Y3REYXRhKHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxQYXJ0aWFsPFByb2R1Y3Q+PiB7XHJcbiAgLy8gICBsZXQgcHJvZHVjdDogUHJvZHVjdFxyXG4gIC8vICAgbGV0IHZhcmlhbnQ6IFZhcmlhbnRcclxuXHJcbiAgLy8gICB0cnkge1xyXG4gIC8vICAgICBwcm9kdWN0ID0gYXdhaXQgdGhpcy5wcm9kdWN0UmVwb3NpdG9yeS5nZXQoeyBpZDogcHJvZHVjdElkIH0pXHJcbiAgLy8gICB9IGNhdGNoIChlcnJvcikge1xyXG4gIC8vICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlcnJvclxyXG5cclxuICAvLyAgICAgY29uc3QgeyBkYXRhOiB2YXJpYW50cyB9ID0gYXdhaXQgdGhpcy52YXJpYW50UmVwb3NpdG9yeS5maW5kKHsgZmlsdGVyczogeyBpZDogcHJvZHVjdElkIH0gfSlcclxuXHJcbiAgLy8gICAgIHZhcmlhbnQgPSB2YXJpYW50cy5zaGlmdCgpXHJcblxyXG4gIC8vICAgICBpZiAoIXZhcmlhbnQpIHRocm93IGVycm9yXHJcblxyXG4gIC8vICAgICBwcm9kdWN0ID0gYXdhaXQgdGhpcy5wcm9kdWN0UmVwb3NpdG9yeS5nZXQoeyBpZDogdmFyaWFudC5wcm9kdWN0SWQgfSlcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICByZXR1cm4ge1xyXG4gIC8vICAgICAuLi5wcm9kdWN0LnRvUGxhaW4oKSxcclxuICAvLyAgICAgLi4uKHZhcmlhbnQgJiYgeyAuLi52YXJpYW50LnRvUGxhaW4oKSB9KSxcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIHByaXZhdGUgZ2V0UHJvZHVjdFByaWNlID0gKHtcclxuICAvLyAgIHByb2R1Y3QsXHJcbiAgLy8gICBpc1N1YnNjcmliZXIsXHJcbiAgLy8gfToge1xyXG4gIC8vICAgcHJvZHVjdDogTGluZUl0ZW1cclxuICAvLyAgIHNob3A6IFNob3BzXHJcbiAgLy8gICBpc1N1YnNjcmliZXI6IGJvb2xlYW5cclxuICAvLyB9KTogbnVtYmVyID0+IHtcclxuICAvLyAgIGNvbnN0IGluZm8gPSBwcm9kdWN0LnByaWNlXHJcblxyXG4gIC8vICAgaWYgKHByb2R1Y3QuaXNHaWZ0KSByZXR1cm4gMFxyXG5cclxuICAvLyAgIHJldHVybiBpc1N1YnNjcmliZXIgJiYgaW5mby5zdWJzY3JpYmVyUHJpY2UgPiAwXHJcbiAgLy8gICAgID8gTnVtYmVyKGluZm8uc3Vic2NyaWJlclByaWNlLnRvRml4ZWQoMikpXHJcbiAgLy8gICAgIDogTnVtYmVyKGluZm8ucHJpY2UudG9GaXhlZCgyKSlcclxuICAvLyB9XHJcblxyXG4gIC8vIHByaXZhdGUgY2hlY2tNYXhTdG9jayA9IChjdXJyZW50U3RvY2s6IG51bWJlciwgY3VycmVudEl0ZW1RdGQ6IG51bWJlciwgcXVhbnRpdHlUb0FkZDogbnVtYmVyKSA9PiB7XHJcbiAgLy8gICBjb25zdCBtYXhTdG9jayA9IGN1cnJlbnRTdG9jayB8fCAwXHJcbiAgLy8gICBjb25zdCBjdXJyZW50SXRlbUFtb3VudCA9IGN1cnJlbnRJdGVtUXRkIHx8IDBcclxuXHJcbiAgLy8gICByZXR1cm4gY3VycmVudEl0ZW1BbW91bnQgKyBxdWFudGl0eVRvQWRkID4gbWF4U3RvY2tcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldEdpZnRzKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkucGlwZShcclxuICAvLyAgICAgbWVyZ2VNYXAoYXN5bmMgKGNoZWNrb3V0KSA9PiB7XHJcbiAgLy8gICAgICAgY29uc3Qgbm90R2lmdEl0ZW1zOiBMaW5lSXRlbVtdID0gY2hlY2tvdXQubGluZUl0ZW1zID8gY2hlY2tvdXQubGluZUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNHaWZ0KSA6IFtdXHJcblxyXG4gIC8vICAgICAgIGlmICghbm90R2lmdEl0ZW1zLmxlbmd0aCkgcmV0dXJuIHsgLi4uY2hlY2tvdXQsIGxpbmVJdGVtczogW10gfSBhcyBDaGVja291dFxyXG5cclxuICAvLyAgICAgICBjb25zdCBjYW1wYWlnbnMgPSBhd2FpdCB0aGlzLmJ1eTJXaW5SZXBvc2l0b3J5XHJcbiAgLy8gICAgICAgICAuZmluZCh7XHJcbiAgLy8gICAgICAgICAgIGZpbHRlcnM6IHtcclxuICAvLyAgICAgICAgICAgICBhY3RpdmU6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IHRydWUgfSxcclxuICAvLyAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICAudGhlbigoZGF0YSkgPT5cclxuICAvLyAgICAgICAgICAgZGF0YS5kYXRhLmZpbHRlcigoY2FtcGFpZ24pID0+IGNhbXBhaWduLnNob3AgPT09IFNob3BzLkFMTCB8fCBjYW1wYWlnbi5zaG9wID09PSB0aGlzLmRlZmF1bHRTaG9wKSxcclxuICAvLyAgICAgICAgIClcclxuXHJcbiAgLy8gICAgICAgaWYgKCFjYW1wYWlnbnMubGVuZ3RoKSByZXR1cm4geyAuLi5jaGVja291dCwgbGluZUl0ZW1zOiBub3RHaWZ0SXRlbXMgfSBhcyBDaGVja291dFxyXG5cclxuICAvLyAgICAgICBjb25zdCBlbGVnaWJsZUNhbXBhaWduczogQnV5MldpbltdID0gW11cclxuXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBjYW1wYWlnbiBvZiBjYW1wYWlnbnMpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcclxuXHJcbiAgLy8gICAgICAgICBpZiAoIShjYW1wYWlnbi5zdGFydERhdGUuZ2V0VGltZSgpIDw9IHRvZGF5KSAmJiAhKGNhbXBhaWduLmVuZERhdGUuZ2V0VGltZSgpID49IHRvZGF5KSkgY29udGludWVcclxuXHJcbiAgLy8gICAgICAgICBpZiAoY2FtcGFpZ24uYWN0aXZlQ2F0ZWdvcnkpIHtcclxuICAvLyAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NhbXBhaW5nID0gY2FtcGFpZ24uY2F0ZWdvcmllcy5tYXAoKGMpID0+IGMuaWQudG9TdHJpbmcoKSlcclxuICAvLyAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NhbXBhaW5nRnVsbFRyZWUgPSBbXVxyXG5cclxuICAvLyAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBjYXRlZ29yaWVzQ2FtcGFpbmcpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHRoaXMuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldENoaWxkcmVuKHBhcnNlSW50KGlkKSlcclxuICAvLyAgICAgICAgICAgICBjYXRlZ29yaWVzQ2FtcGFpbmdGdWxsVHJlZS5wdXNoKGlkLCAuLi5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQudG9TdHJpbmcoKSkpXHJcbiAgLy8gICAgICAgICAgIH1cclxuXHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDYW1wYWluZ1RyZWUgPSBbLi4ubmV3IFNldChjYXRlZ29yaWVzQ2FtcGFpbmdGdWxsVHJlZSldXHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGZpbHRlclByb2R1Y3RzQ2F0ZWdvcmllcyA9IG5vdEdpZnRJdGVtcy5maWx0ZXIoKGwpID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZiAoIWwuY2F0ZWdvcmllcyB8fCAhbC5jYXRlZ29yaWVzPy5sZW5ndGgpIHJldHVybiB0cnVlXHJcblxyXG4gIC8vICAgICAgICAgICAgIHJldHVybiBsLmNhdGVnb3JpZXMuc29tZSgoYykgPT4gY2F0ZWdvcmllc0NhbXBhaW5nVHJlZS5zb21lKChjYXQpID0+IGNhdCA9PSBjKSlcclxuICAvLyAgICAgICAgICAgfSlcclxuXHJcbiAgLy8gICAgICAgICAgIGlmIChmaWx0ZXJQcm9kdWN0c0NhdGVnb3JpZXMubGVuZ3RoKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgY2FydFZhbHVlbFdpdGhDYXRlZ29yaWVzID0gZmlsdGVyUHJvZHVjdHNDYXRlZ29yaWVzLnJlZHVjZShcclxuICAvLyAgICAgICAgICAgICAgIChhLCBiKSA9PiBhICsgYi5wcmljZVBhaWQgKiBiLnF1YW50aXR5LFxyXG4gIC8vICAgICAgICAgICAgICAgMCxcclxuICAvLyAgICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgY2FydEl0ZW5zUXVhbnRpdHlXaXRoQ2F0ZWdvcmllcyA9IGZpbHRlclByb2R1Y3RzQ2F0ZWdvcmllcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLnF1YW50aXR5LCAwKVxyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGhhc01pblZhbHVlID0gY2FtcGFpZ24uY2FydFZhbHVlTWluICYmIGNhcnRWYWx1ZWxXaXRoQ2F0ZWdvcmllcyA+PSBjYW1wYWlnbi5jYXJ0VmFsdWVNaW5cclxuICAvLyAgICAgICAgICAgICBjb25zdCBoYXNNaW5RdWFudGl0eSA9XHJcbiAgLy8gICAgICAgICAgICAgICBjYW1wYWlnbi5jYXJ0SXRlbnNRdWFudGl0eU1pbiAmJiBjYXJ0SXRlbnNRdWFudGl0eVdpdGhDYXRlZ29yaWVzID49IGNhbXBhaWduLmNhcnRJdGVuc1F1YW50aXR5TWluXHJcblxyXG4gIC8vICAgICAgICAgICAgIGlmIChoYXNNaW5RdWFudGl0eSB8fCBoYXNNaW5WYWx1ZSkgZWxlZ2libGVDYW1wYWlnbnMucHVzaChjYW1wYWlnbilcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgY29uc3QgY2FydFRvdGFsID0gbm90R2lmdEl0ZW1zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIucHJpY2VQYWlkICogYi5xdWFudGl0eSwgMClcclxuICAvLyAgICAgICAgICAgY29uc3QgY2FydEl0ZW5zUXVhbnRpdHkgPSBub3RHaWZ0SXRlbXMucmVkdWNlKChhLCBiKSA9PiBhICsgYi5xdWFudGl0eSwgMClcclxuICAvLyAgICAgICAgICAgY29uc3QgaGFzTWluVmFsdWUgPSBjYW1wYWlnbi5jYXJ0VmFsdWUgJiYgY2FtcGFpZ24uY2FydFZhbHVlID4gMCAmJiBjYW1wYWlnbi5jYXJ0VmFsdWUgPD0gY2FydFRvdGFsXHJcbiAgLy8gICAgICAgICAgIGNvbnN0IGhhc01pblF1YW50aXR5ID0gY2FtcGFpZ24uY2FydEl0ZW5zUXVhbnRpdHlNaW4gJiYgY2FydEl0ZW5zUXVhbnRpdHkgPj0gY2FtcGFpZ24uY2FydEl0ZW5zUXVhbnRpdHlNaW5cclxuXHJcbiAgLy8gICAgICAgICAgIGlmIChoYXNNaW5RdWFudGl0eSB8fCBoYXNNaW5WYWx1ZSkgZWxlZ2libGVDYW1wYWlnbnMucHVzaChjYW1wYWlnbilcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGlmICghZWxlZ2libGVDYW1wYWlnbnMubGVuZ3RoKSByZXR1cm4geyAuLi5jaGVja291dCwgbGluZUl0ZW1zOiBub3RHaWZ0SXRlbXMgfSBhcyBDaGVja291dFxyXG5cclxuICAvLyAgICAgICBjb25zdCBjYW1wYWluZ25Qcm9kdWN0czogUHJvZHVjdFtdW10gPSBbXVxyXG5cclxuICAvLyAgICAgICBmb3IgKGNvbnN0IGNhbXBhaWduIG9mIGVsZWdpYmxlQ2FtcGFpZ25zKSB7XHJcbiAgLy8gICAgICAgICBsZXQgZWxlZ2libGVQcm9kdWN0cyA9IFtdXHJcblxyXG4gIC8vICAgICAgICAgZm9yIChjb25zdCBwcm9kdWN0IG9mIGNhbXBhaWduLnByb2R1Y3RzKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IHsgZGF0YTogcHJvZHVjdERhdGEgfSA9IGF3YWl0IHRoaXMucHJvZHVjdFJlcG9zaXRvcnkuZmluZCh7IGZpbHRlcnM6IHsgc2t1OiBwcm9kdWN0IH0gfSlcclxuXHJcbiAgLy8gICAgICAgICAgIGlmICghcHJvZHVjdERhdGEubGVuZ3RoKSBjb250aW51ZVxyXG5cclxuICAvLyAgICAgICAgICAgY29uc3QgZ2lmdCA9IHByb2R1Y3REYXRhLnNoaWZ0KClcclxuXHJcbiAgLy8gICAgICAgICAgIGlmIChnaWZ0LnN0b2NrLnF1YW50aXR5IDwgMSkgY29udGludWVcclxuXHJcbiAgLy8gICAgICAgICAgIGVsZWdpYmxlUHJvZHVjdHMucHVzaChnaWZ0KVxyXG4gIC8vICAgICAgICAgfVxyXG5cclxuICAvLyAgICAgICAgIGNhbXBhaW5nblByb2R1Y3RzLnB1c2goZWxlZ2libGVQcm9kdWN0cylcclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGlmICghY2FtcGFpbmduUHJvZHVjdHMubGVuZ3RoKSByZXR1cm4geyAuLi5jaGVja291dCwgbGluZUl0ZW1zOiBub3RHaWZ0SXRlbXMgfSBhcyBDaGVja291dFxyXG5cclxuICAvLyAgICAgICBjb25zdCBnaWZ0cyA9IHRoaXMuZ2lmdFRvTGluZUl0ZW1zKFtdLmNvbmNhdCguLi5jYW1wYWluZ25Qcm9kdWN0cykpXHJcblxyXG4gIC8vICAgICAgIHJldHVybiB7IC4uLmNoZWNrb3V0LCBsaW5lSXRlbXM6IG5vdEdpZnRJdGVtcy5jb25jYXQoZ2lmdHMpIH1cclxuICAvLyAgICAgfSksXHJcbiAgLy8gICAgIGNvbmNhdE1hcCgoY2hlY2tvdXQpID0+IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLnVwZGF0ZUNoZWNrb3V0TGluZUl0ZW1zKGNoZWNrb3V0KSksXHJcbiAgLy8gICAgIG1hcCgoY2hlY2tvdXQpID0+IHRoaXMuZ2VuZXJhdGVDYXJ0T2JqZWN0KGNoZWNrb3V0LmxpbmVJdGVtcykpLFxyXG4gIC8vICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXHJcbiAgLy8gICApXHJcbiAgLy8gfVxyXG5cclxuICAvLyBwcml2YXRlIGdpZnRUb0xpbmVJdGVtcyhpdGVtczogUHJvZHVjdFtdKTogTGluZUl0ZW1bXSB7XHJcbiAgLy8gICByZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IHsgYnJhbmQsIGNhdGVnb3JpZXMsIGNhdGVnb3J5LCBpZCwgbmFtZSwgcHJpY2UsIHNrdSwgc2x1Zywgc3RvY2ssIHdlaWdodCwgRUFOIH0gPSBpdGVtXHJcbiAgLy8gICAgIGNvbnN0IGltYWdlID0gaXRlbT8ubWluaWF0dXJlcz8ubGVuZ3RoID8gaXRlbS5taW5pYXR1cmVzWzBdIDogaXRlbS5pbWFnZXNbMF1cclxuXHJcbiAgLy8gICAgIHJldHVybiBMaW5lSXRlbS50b0luc3RhbmNlKHtcclxuICAvLyAgICAgICBicmFuZCxcclxuICAvLyAgICAgICBjYXRlZ29yaWVzLFxyXG4gIC8vICAgICAgIGNhdGVnb3J5LFxyXG4gIC8vICAgICAgIGlkOiBpZC50b1N0cmluZygpLFxyXG4gIC8vICAgICAgIG5hbWUsXHJcbiAgLy8gICAgICAgcHJpY2UsXHJcbiAgLy8gICAgICAgc2t1LFxyXG4gIC8vICAgICAgIHNsdWcsXHJcbiAgLy8gICAgICAgc3RvY2ssXHJcbiAgLy8gICAgICAgd2VpZ2h0LFxyXG4gIC8vICAgICAgIEVBTixcclxuICAvLyAgICAgICBpbWFnZSxcclxuICAvLyAgICAgICBwcmljZVBhaWQ6IDAsXHJcbiAgLy8gICAgICAgcXVhbnRpdHk6IDEsXHJcbiAgLy8gICAgICAgaXNHaWZ0OiB0cnVlLFxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgfSlcclxuICAvLyB9XHJcbn1cclxuIl19
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { Buy2WinFirestoreRepository, Checkout, isNil, LineItem, NotFoundError, RoundProductPricesHelper, Shops, Where, } from '@infrab4a/connect';
3
+ import { from, iif, of, Subject } from 'rxjs';
4
+ import { catchError, concatMap, map, mergeMap, tap } from 'rxjs/operators';
5
+ import { DEFAULT_SHOP } from '../consts';
6
+ import { AuthService } from './auth.service';
7
+ import { CheckoutService } from './checkout.service';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./auth.service";
10
+ import * as i2 from "./checkout.service";
11
+ import * as i3 from "@infrab4a/connect";
12
+ export class CartService {
13
+ constructor(authService, checkoutService, defaultShop, productRepository, categoryRepository, variantRepository, buy2WinRepository) {
14
+ this.authService = authService;
15
+ this.checkoutService = checkoutService;
16
+ this.defaultShop = defaultShop;
17
+ this.productRepository = productRepository;
18
+ this.categoryRepository = categoryRepository;
19
+ this.variantRepository = variantRepository;
20
+ this.buy2WinRepository = buy2WinRepository;
21
+ this.cartSubject = new Subject();
22
+ this.updateLineItemInCart = (lineItem, quantity, checkout) => (isNil(checkout) ? this.checkoutService.getCheckout() : of(checkout)).pipe(concatMap((checkoutLoaded) => {
23
+ const items = [];
24
+ const index = checkoutLoaded.lineItems?.map((checkoutItem) => checkoutItem.id).indexOf(lineItem.id);
25
+ const isGift = checkoutLoaded.lineItems?.[index]?.isGift;
26
+ if (index > -1) {
27
+ checkoutLoaded.lineItems[index].quantity += quantity;
28
+ checkoutLoaded.lineItems[index].pricePaid = isGift ? 0 : lineItem.pricePaid;
29
+ checkoutLoaded.lineItems[index].price = lineItem.price;
30
+ }
31
+ else
32
+ checkoutLoaded.lineItems = items.concat(checkoutLoaded.lineItems ? checkoutLoaded.lineItems.concat([lineItem]) : [lineItem]);
33
+ return this.checkoutService
34
+ .updateCheckoutLineItems(checkoutLoaded)
35
+ .pipe(map((updatedCheckout) => this.generateCartObject(updatedCheckout.lineItems)));
36
+ }));
37
+ this.generateCartObject = (items) => items?.reduce((cart, item) => ({
38
+ ...cart,
39
+ [item.id]: LineItem.toInstance({
40
+ ...(cart[item.id] || item),
41
+ quantity: (cart[item.id]?.quantity || 0) + (item.quantity ? item.quantity : 1),
42
+ }),
43
+ }), {}) || {};
44
+ this.buildLineItem = async ({ checkout, item, quantity, }) => {
45
+ const product = await this.getProductData(item.id);
46
+ item.quantity = item?.quantity || checkout?.lineItems?.find((lineItem) => lineItem.id === item.id)?.quantity || 0;
47
+ if (this.checkMaxStock(product.stock.quantity, item.quantity || 0, quantity || 0))
48
+ throw new Error('Desculpe! Temos apenas ' + product.stock?.quantity + ' em estoque.');
49
+ const image = item.image || item.images?.shift();
50
+ const { id, name, EAN, slug, weight, sku, type } = item;
51
+ const isGift = item?.isGift || null;
52
+ const pricePaid = isGift
53
+ ? 0
54
+ : this.getProductPrice({
55
+ product: LineItem.toInstance(product),
56
+ shop: checkout.shop || this.defaultShop,
57
+ isSubscriber: checkout.user?.isSubscriber,
58
+ });
59
+ RoundProductPricesHelper.roundProductPrices(item);
60
+ RoundProductPricesHelper.roundProductPrices(product);
61
+ return {
62
+ checkout,
63
+ lineItem: LineItem.toInstance({
64
+ id,
65
+ name: name ?? product.name,
66
+ EAN: EAN ?? product.EAN,
67
+ brand: product.brand,
68
+ slug: slug ?? product.slug,
69
+ sku: sku ?? product.sku,
70
+ stock: product.stock,
71
+ price: this.roundPrice(product.price),
72
+ image,
73
+ weight: weight ?? product.weight,
74
+ quantity: (item.quantity || 0) + (quantity || 0),
75
+ pricePaid,
76
+ discount: 0,
77
+ categories: product.categories || product.category?.id ? [product.category?.id, ...product.categories] : [],
78
+ category: product.category,
79
+ isGift: isGift ?? null,
80
+ costPrice: isGift ? 0 : product.costPrice ?? 0,
81
+ type,
82
+ label: product.label,
83
+ }),
84
+ };
85
+ };
86
+ this.getProductPrice = ({ product, isSubscriber, }) => {
87
+ const info = product.price;
88
+ if (product.isGift)
89
+ return 0;
90
+ return isSubscriber && info.subscriberPrice > 0
91
+ ? Number(info.subscriberPrice.toFixed(2))
92
+ : Number(info.price.toFixed(2));
93
+ };
94
+ this.checkMaxStock = (currentStock, currentItemQtd, quantityToAdd) => {
95
+ const maxStock = currentStock || 0;
96
+ const currentItemAmount = currentItemQtd || 0;
97
+ return currentItemAmount + quantityToAdd > maxStock;
98
+ };
99
+ }
100
+ addItem(item, quantity = 1) {
101
+ return from(this.checkoutService.getCheckout()).pipe(concatMap(async (checkout) => await this.buildLineItem({ checkout, item, quantity: quantity || 1 })), mergeMap(({ checkout, lineItem }) => this.updateLineItemInCart(lineItem, quantity || 1, checkout)), tap((cart) => this.cartSubject.next(cart)));
102
+ }
103
+ decreaseItem(item) {
104
+ return this.checkoutService.getCheckout().pipe(map((checkout) => {
105
+ const checkoutItem = checkout.lineItems?.find((lineItem) => lineItem.id === item.id);
106
+ if (!isNil(checkoutItem))
107
+ checkoutItem.quantity -= checkoutItem.quantity > 1 ? 1 : 0;
108
+ return checkout;
109
+ }), concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
110
+ }
111
+ getCart(checkout) {
112
+ this.buildCartFromCheckout(checkout).subscribe((cart) => this.cartSubject.next(cart));
113
+ return this.cartSubject;
114
+ }
115
+ /**
116
+ * @deprecated The method should not be used
117
+ */
118
+ getVariantPriceDiscount(item) {
119
+ return this.authService.getUser().pipe(concatMap((user) => iif(() => user.isSubscriber && !!item.price.subscriberPrice, of(item.price.subscriberPrice), of(item.price.price))), catchError(() => of(item.price.price)));
120
+ }
121
+ removeItem(item) {
122
+ return this.checkoutService.getCheckout().pipe(map((checkout) => {
123
+ const index = checkout.lineItems.findIndex((lineItem) => lineItem.id === item.id);
124
+ if (index >= 0)
125
+ checkout.lineItems.splice(index, 1);
126
+ return checkout;
127
+ }), concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
128
+ }
129
+ updateUserCart(user) {
130
+ return this.checkoutService.getCheckout().pipe(concatMap((checkout) => this.checkoutService.updateCheckoutUser(Checkout.toInstance({ ...checkout.toPlain(), user }))), concatMap(async (checkout) => await this.checkoutService
131
+ .updateCheckoutLineItems(Checkout.toInstance({
132
+ ...checkout.toPlain(),
133
+ lineItems: checkout.lineItems?.length
134
+ ? await Promise.all(checkout.lineItems?.map(async (item) => (await this.buildLineItem({ checkout, item })).lineItem))
135
+ : [],
136
+ }))
137
+ .toPromise()), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => (this.user = user)), tap((cart) => this.cartSubject.next(cart)));
138
+ }
139
+ clearCart() {
140
+ return this.checkoutService.getCheckout().pipe(map((checkout) => {
141
+ this.checkoutService.clearCheckoutFromSession();
142
+ return checkout;
143
+ }), concatMap((oldCheckout) => this.buildCartFromCheckout(oldCheckout)), tap((cart) => this.cartSubject.next(cart)));
144
+ }
145
+ buildCartFromCheckout(checkoutData) {
146
+ return this.checkoutService.getCheckout(checkoutData).pipe(map((checkout) => checkout.lineItems), concatMap((lineItems) => of(this.generateCartObject(lineItems))));
147
+ }
148
+ roundPrice(productPrice) {
149
+ const { price, fullPrice, subscriberPrice } = productPrice;
150
+ return {
151
+ ...productPrice,
152
+ price: Number(price.toFixed(2)),
153
+ fullPrice: Number(fullPrice.toFixed(2)),
154
+ ...(subscriberPrice && { subscriberPrice: Number(subscriberPrice.toFixed(2)) }),
155
+ };
156
+ }
157
+ async getProductData(productId) {
158
+ let product;
159
+ let variant;
160
+ try {
161
+ product = await this.productRepository.get({ id: productId });
162
+ }
163
+ catch (error) {
164
+ if (!(error instanceof NotFoundError))
165
+ throw error;
166
+ const { data: variants } = await this.variantRepository.find({ filters: { id: productId } });
167
+ variant = variants.shift();
168
+ if (!variant)
169
+ throw error;
170
+ product = await this.productRepository.get({ id: variant.productId });
171
+ }
172
+ return {
173
+ ...product.toPlain(),
174
+ ...(variant && { ...variant.toPlain() }),
175
+ };
176
+ }
177
+ getGifts() {
178
+ return this.checkoutService.getCheckout().pipe(mergeMap(async (checkout) => {
179
+ const notGiftItems = checkout.lineItems ? checkout.lineItems.filter((item) => !item.isGift) : [];
180
+ if (!notGiftItems.length)
181
+ return { ...checkout, lineItems: [] };
182
+ const campaigns = await this.buy2WinRepository
183
+ .find({
184
+ filters: {
185
+ active: { operator: Where.EQUALS, value: true },
186
+ },
187
+ })
188
+ .then((data) => data.data.filter((campaign) => campaign.shop === Shops.ALL || campaign.shop === this.defaultShop));
189
+ if (!campaigns.length)
190
+ return { ...checkout, lineItems: notGiftItems };
191
+ const elegibleCampaigns = [];
192
+ for (const campaign of campaigns) {
193
+ const today = new Date().getTime();
194
+ if (!(campaign.startDate.getTime() <= today) && !(campaign.endDate.getTime() >= today))
195
+ continue;
196
+ if (campaign.activeCategory) {
197
+ const categoriesCampaing = campaign.categories.map((c) => c.id.toString());
198
+ const categoriesCampaingFullTree = [];
199
+ for (const id of categoriesCampaing) {
200
+ const children = await this.categoryRepository.getChildren(parseInt(id));
201
+ categoriesCampaingFullTree.push(id, ...children.map((c) => c.id.toString()));
202
+ }
203
+ const categoriesCampaingTree = [...new Set(categoriesCampaingFullTree)];
204
+ const filterProductsCategories = notGiftItems.filter((l) => {
205
+ if (!l.categories || !l.categories?.length)
206
+ return true;
207
+ return l.categories.some((c) => categoriesCampaingTree.some((cat) => cat == c));
208
+ });
209
+ if (filterProductsCategories.length) {
210
+ const cartValuelWithCategories = filterProductsCategories.reduce((a, b) => a + b.pricePaid * b.quantity, 0);
211
+ const cartItensQuantityWithCategories = filterProductsCategories.reduce((a, b) => a + b.quantity, 0);
212
+ const hasMinValue = campaign.cartValueMin && cartValuelWithCategories >= campaign.cartValueMin;
213
+ const hasMinQuantity = campaign.cartItensQuantityMin && cartItensQuantityWithCategories >= campaign.cartItensQuantityMin;
214
+ if (hasMinQuantity || hasMinValue)
215
+ elegibleCampaigns.push(campaign);
216
+ }
217
+ }
218
+ else {
219
+ const cartTotal = notGiftItems.reduce((a, b) => a + b.pricePaid * b.quantity, 0);
220
+ const cartItensQuantity = notGiftItems.reduce((a, b) => a + b.quantity, 0);
221
+ const hasMinValue = campaign.cartValue && campaign.cartValue > 0 && campaign.cartValue <= cartTotal;
222
+ const hasMinQuantity = campaign.cartItensQuantityMin && cartItensQuantity >= campaign.cartItensQuantityMin;
223
+ if (hasMinQuantity || hasMinValue)
224
+ elegibleCampaigns.push(campaign);
225
+ }
226
+ }
227
+ if (!elegibleCampaigns.length)
228
+ return { ...checkout, lineItems: notGiftItems };
229
+ const campaingnProducts = [];
230
+ for (const campaign of elegibleCampaigns) {
231
+ let elegibleProducts = [];
232
+ for (const product of campaign.products) {
233
+ const { data: productData } = await this.productRepository.find({ filters: { sku: product } });
234
+ if (!productData.length)
235
+ continue;
236
+ const gift = productData.shift();
237
+ if (gift.stock.quantity < 1)
238
+ continue;
239
+ elegibleProducts.push(gift);
240
+ }
241
+ campaingnProducts.push(elegibleProducts);
242
+ }
243
+ if (!campaingnProducts.length)
244
+ return { ...checkout, lineItems: notGiftItems };
245
+ const gifts = this.giftToLineItems([].concat(...campaingnProducts));
246
+ return { ...checkout, lineItems: notGiftItems.concat(gifts) };
247
+ }), concatMap((checkout) => this.checkoutService.updateCheckoutLineItems(checkout)), map((checkout) => this.generateCartObject(checkout.lineItems)), tap((cart) => this.cartSubject.next(cart)));
248
+ }
249
+ giftToLineItems(items) {
250
+ return items.map((item) => {
251
+ const { brand, categories, category, id, name, price, sku, slug, stock, weight, EAN } = item;
252
+ const image = item?.miniatures?.length ? item.miniatures[0] : item.images[0];
253
+ return LineItem.toInstance({
254
+ brand,
255
+ categories,
256
+ category,
257
+ id: id.toString(),
258
+ name,
259
+ price,
260
+ sku,
261
+ slug,
262
+ stock,
263
+ weight,
264
+ EAN,
265
+ image,
266
+ pricePaid: 0,
267
+ quantity: 1,
268
+ isGift: true,
269
+ });
270
+ });
271
+ }
272
+ }
273
+ CartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CartService, deps: [{ token: i1.AuthService }, { token: i2.CheckoutService }, { token: DEFAULT_SHOP }, { token: 'ProductRepository' }, { token: 'CategoryRepository' }, { token: 'VariantRepository' }, { token: 'Buy2WinRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
274
+ CartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CartService });
275
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: CartService, decorators: [{
276
+ type: Injectable
277
+ }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.CheckoutService }, { type: i3.Shops, decorators: [{
278
+ type: Inject,
279
+ args: [DEFAULT_SHOP]
280
+ }] }, { type: undefined, decorators: [{
281
+ type: Inject,
282
+ args: ['ProductRepository']
283
+ }] }, { type: undefined, decorators: [{
284
+ type: Inject,
285
+ args: ['CategoryRepository']
286
+ }] }, { type: undefined, decorators: [{
287
+ type: Inject,
288
+ args: ['VariantRepository']
289
+ }] }, { type: i3.Buy2WinFirestoreRepository, decorators: [{
290
+ type: Inject,
291
+ args: ['Buy2WinRepository']
292
+ }] }]; } });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUVMLDBCQUEwQixFQUUxQixRQUFRLEVBQ1IsS0FBSyxFQUNMLFFBQVEsRUFDUixhQUFhLEVBR2Isd0JBQXdCLEVBRXhCLEtBQUssRUFJTCxLQUFLLEdBQ04sTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBOzs7OztBQVFwRCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUNtQixXQUF3QixFQUN4QixlQUFnQyxFQUNWLFdBQWtCLEVBQ1gsaUJBQW9DLEVBQ25DLGtCQUFzQyxFQUN2QyxpQkFBb0MsRUFDcEMsaUJBQTZDO1FBTjFFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNWLGdCQUFXLEdBQVgsV0FBVyxDQUFPO1FBQ1gsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3ZDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7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QzVGLE1BQU0sS0FBSyxHQUFHLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRTVFLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQztnQkFDekIsS0FBSztnQkFDTCxVQUFVO2dCQUNWLFFBQVE7Z0JBQ1IsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUk7Z0JBQ0osS0FBSztnQkFDTCxHQUFHO2dCQUNILElBQUk7Z0JBQ0osS0FBSztnQkFDTCxNQUFNO2dCQUNOLEdBQUc7Z0JBQ0gsS0FBSztnQkFDTCxTQUFTLEVBQUUsQ0FBQztnQkFDWixRQUFRLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEVBQUUsSUFBSTthQUNiLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzs7d0dBbFlVLFdBQVcsNEVBT1osWUFBWSxhQUNaLG1CQUFtQixhQUNuQixvQkFBb0IsYUFDcEIsbUJBQW1CLGFBQ25CLG1CQUFtQjs0R0FYbEIsV0FBVzsyRkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFRTixNQUFNOzJCQUFDLFlBQVk7OzBCQUNuQixNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsb0JBQW9COzswQkFDM0IsTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUMxQixNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBCdXkyV2luLFxuICBCdXkyV2luRmlyZXN0b3JlUmVwb3NpdG9yeSxcbiAgQ2F0ZWdvcnlSZXBvc2l0b3J5LFxuICBDaGVja291dCxcbiAgaXNOaWwsXG4gIExpbmVJdGVtLFxuICBOb3RGb3VuZEVycm9yLFxuICBQcm9kdWN0LFxuICBQcm9kdWN0UmVwb3NpdG9yeSxcbiAgUm91bmRQcm9kdWN0UHJpY2VzSGVscGVyLFxuICBTaG9wUHJpY2UsXG4gIFNob3BzLFxuICBVc2VyLFxuICBWYXJpYW50LFxuICBWYXJpYW50UmVwb3NpdG9yeSxcbiAgV2hlcmUsXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xuaW1wb3J0IHsgZnJvbSwgaWlmLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBjb25jYXRNYXAsIG1hcCwgbWVyZ2VNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgREVGQVVMVF9TSE9QIH0gZnJvbSAnLi4vY29uc3RzJ1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSdcbmltcG9ydCB7IENoZWNrb3V0U2VydmljZSB9IGZyb20gJy4vY2hlY2tvdXQuc2VydmljZSdcbmltcG9ydCB7IFJlcXVpcmVkQ2hlY2tvdXREYXRhIH0gZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IHR5cGUgQ2FydCA9IHtcbiAgW2lkOiBzdHJpbmddOiBMaW5lSXRlbVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ2FydFNlcnZpY2Uge1xuICBwcml2YXRlIGNhcnRTdWJqZWN0OiBTdWJqZWN0PENhcnQ+ID0gbmV3IFN1YmplY3QoKVxuICBwcml2YXRlIHVzZXI6IFVzZXJcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoZWNrb3V0U2VydmljZTogQ2hlY2tvdXRTZXJ2aWNlLFxuICAgIEBJbmplY3QoREVGQVVMVF9TSE9QKSBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRTaG9wOiBTaG9wcyxcbiAgICBASW5qZWN0KCdQcm9kdWN0UmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdFJlcG9zaXRvcnk6IFByb2R1Y3RSZXBvc2l0b3J5LFxuICAgIEBJbmplY3QoJ0NhdGVnb3J5UmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgY2F0ZWdvcnlSZXBvc2l0b3J5OiBDYXRlZ29yeVJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnVmFyaWFudFJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IHZhcmlhbnRSZXBvc2l0b3J5OiBWYXJpYW50UmVwb3NpdG9yeSxcbiAgICBASW5qZWN0KCdCdXkyV2luUmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgYnV5MldpblJlcG9zaXRvcnk6IEJ1eTJXaW5GaXJlc3RvcmVSZXBvc2l0b3J5LFxuICApIHt9XG5cbiAgYWRkSXRlbShpdGVtOiBMaW5lSXRlbSwgcXVhbnRpdHk6IG51bWJlciA9IDEpOiBPYnNlcnZhYmxlPENhcnQ+IHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpKS5waXBlKFxuICAgICAgY29uY2F0TWFwKGFzeW5jIChjaGVja291dCkgPT4gYXdhaXQgdGhpcy5idWlsZExpbmVJdGVtKHsgY2hlY2tvdXQsIGl0ZW0sIHF1YW50aXR5OiBxdWFudGl0eSB8fCAxIH0pKSxcbiAgICAgIG1lcmdlTWFwKCh7IGNoZWNrb3V0LCBsaW5lSXRlbSB9KSA9PiB0aGlzLnVwZGF0ZUxpbmVJdGVtSW5DYXJ0KGxpbmVJdGVtLCBxdWFudGl0eSB8fCAxLCBjaGVja291dCBhcyBDaGVja291dCkpLFxuICAgICAgdGFwKChjYXJ0KSA9PiB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCkpLFxuICAgIClcbiAgfVxuXG4gIGRlY3JlYXNlSXRlbShpdGVtOiBMaW5lSXRlbSk6IE9ic2VydmFibGU8Q2FydD4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXG4gICAgICBtYXAoKGNoZWNrb3V0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrb3V0SXRlbSA9IGNoZWNrb3V0LmxpbmVJdGVtcz8uZmluZCgobGluZUl0ZW0pID0+IGxpbmVJdGVtLmlkID09PSBpdGVtLmlkKVxuXG4gICAgICAgIGlmICghaXNOaWwoY2hlY2tvdXRJdGVtKSkgY2hlY2tvdXRJdGVtLnF1YW50aXR5IC09IGNoZWNrb3V0SXRlbS5xdWFudGl0eSA+IDEgPyAxIDogMFxuXG4gICAgICAgIHJldHVybiBjaGVja291dFxuICAgICAgfSksXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dExpbmVJdGVtcyhjaGVja291dCkpLFxuICAgICAgbWFwKChjaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QoY2hlY2tvdXQubGluZUl0ZW1zKSksXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXG4gICAgKVxuICB9XG5cbiAgZ2V0Q2FydChjaGVja291dD86IFJlcXVpcmVkQ2hlY2tvdXREYXRhKTogT2JzZXJ2YWJsZTxDYXJ0PiB7XG4gICAgdGhpcy5idWlsZENhcnRGcm9tQ2hlY2tvdXQoY2hlY2tvdXQpLnN1YnNjcmliZSgoY2FydCkgPT4gdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpKVxuXG4gICAgcmV0dXJuIHRoaXMuY2FydFN1YmplY3RcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZFxuICAgKi9cbiAgZ2V0VmFyaWFudFByaWNlRGlzY291bnQoaXRlbTogTGluZUl0ZW0pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXIoKS5waXBlKFxuICAgICAgY29uY2F0TWFwKCh1c2VyKSA9PlxuICAgICAgICBpaWYoXG4gICAgICAgICAgKCkgPT4gdXNlci5pc1N1YnNjcmliZXIgJiYgISFpdGVtLnByaWNlLnN1YnNjcmliZXJQcmljZSxcbiAgICAgICAgICBvZihpdGVtLnByaWNlLnN1YnNjcmliZXJQcmljZSksXG4gICAgICAgICAgb2YoaXRlbS5wcmljZS5wcmljZSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihpdGVtLnByaWNlLnByaWNlKSksXG4gICAgKVxuICB9XG5cbiAgcmVtb3ZlSXRlbShpdGVtOiBMaW5lSXRlbSk6IE9ic2VydmFibGU8Q2FydD4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXG4gICAgICBtYXAoKGNoZWNrb3V0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2hlY2tvdXQubGluZUl0ZW1zLmZpbmRJbmRleCgobGluZUl0ZW0pID0+IGxpbmVJdGVtLmlkID09PSBpdGVtLmlkKVxuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSBjaGVja291dC5saW5lSXRlbXMuc3BsaWNlKGluZGV4LCAxKVxuXG4gICAgICAgIHJldHVybiBjaGVja291dFxuICAgICAgfSksXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dExpbmVJdGVtcyhjaGVja291dCkpLFxuICAgICAgbWFwKChjaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QoY2hlY2tvdXQubGluZUl0ZW1zKSksXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXG4gICAgKVxuICB9XG5cbiAgdXBkYXRlVXNlckNhcnQodXNlcjogVXNlcik6IE9ic2VydmFibGU8Q2FydD4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrb3V0U2VydmljZS5nZXRDaGVja291dCgpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PlxuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dFVzZXIoQ2hlY2tvdXQudG9JbnN0YW5jZSh7IC4uLmNoZWNrb3V0LnRvUGxhaW4oKSwgdXNlciB9KSksXG4gICAgICApLFxuICAgICAgY29uY2F0TWFwKFxuICAgICAgICBhc3luYyAoY2hlY2tvdXQpID0+XG4gICAgICAgICAgYXdhaXQgdGhpcy5jaGVja291dFNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVDaGVja291dExpbmVJdGVtcyhcbiAgICAgICAgICAgICAgQ2hlY2tvdXQudG9JbnN0YW5jZSh7XG4gICAgICAgICAgICAgICAgLi4uY2hlY2tvdXQudG9QbGFpbigpLFxuICAgICAgICAgICAgICAgIGxpbmVJdGVtczogY2hlY2tvdXQubGluZUl0ZW1zPy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXQubGluZUl0ZW1zPy5tYXAoYXN5bmMgKGl0ZW0pID0+IChhd2FpdCB0aGlzLmJ1aWxkTGluZUl0ZW0oeyBjaGVja291dCwgaXRlbSB9KSkubGluZUl0ZW0pLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IFtdLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKSxcbiAgICAgICksXG4gICAgICBtYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmdlbmVyYXRlQ2FydE9iamVjdChjaGVja291dC5saW5lSXRlbXMpKSxcbiAgICAgIHRhcCgoY2FydCkgPT4gKHRoaXMudXNlciA9IHVzZXIpKSxcbiAgICAgIHRhcCgoY2FydCkgPT4gdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpKSxcbiAgICApXG4gIH1cblxuICBjbGVhckNhcnQoKTogT2JzZXJ2YWJsZTxDYXJ0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkucGlwZShcbiAgICAgIG1hcCgoY2hlY2tvdXQpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UuY2xlYXJDaGVja291dEZyb21TZXNzaW9uKClcbiAgICAgICAgcmV0dXJuIGNoZWNrb3V0XG4gICAgICB9KSxcbiAgICAgIGNvbmNhdE1hcCgob2xkQ2hlY2tvdXQpID0+IHRoaXMuYnVpbGRDYXJ0RnJvbUNoZWNrb3V0KG9sZENoZWNrb3V0KSksXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENhcnRGcm9tQ2hlY2tvdXQoY2hlY2tvdXREYXRhPzogUmVxdWlyZWRDaGVja291dERhdGEpOiBPYnNlcnZhYmxlPENhcnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGVja291dFNlcnZpY2UuZ2V0Q2hlY2tvdXQoY2hlY2tvdXREYXRhKS5waXBlKFxuICAgICAgbWFwKChjaGVja291dCkgPT4gY2hlY2tvdXQubGluZUl0ZW1zKSxcbiAgICAgIGNvbmNhdE1hcCgobGluZUl0ZW1zKSA9PiBvZih0aGlzLmdlbmVyYXRlQ2FydE9iamVjdChsaW5lSXRlbXMpKSksXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMaW5lSXRlbUluQ2FydCA9IChsaW5lSXRlbTogTGluZUl0ZW0sIHF1YW50aXR5OiBudW1iZXIsIGNoZWNrb3V0PzogQ2hlY2tvdXQpOiBPYnNlcnZhYmxlPENhcnQ+ID0+XG4gICAgKGlzTmlsKGNoZWNrb3V0KSA/IHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkgOiBvZihjaGVja291dCkpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0TG9hZGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBMaW5lSXRlbVtdID0gW11cbiAgICAgICAgY29uc3QgaW5kZXggPSBjaGVja291dExvYWRlZC5saW5lSXRlbXM/Lm1hcCgoY2hlY2tvdXRJdGVtKSA9PiBjaGVja291dEl0ZW0uaWQpLmluZGV4T2YobGluZUl0ZW0uaWQpXG4gICAgICAgIGNvbnN0IGlzR2lmdCA9IGNoZWNrb3V0TG9hZGVkLmxpbmVJdGVtcz8uW2luZGV4XT8uaXNHaWZ0XG5cbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBjaGVja291dExvYWRlZC5saW5lSXRlbXNbaW5kZXhdLnF1YW50aXR5ICs9IHF1YW50aXR5XG4gICAgICAgICAgY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zW2luZGV4XS5wcmljZVBhaWQgPSBpc0dpZnQgPyAwIDogbGluZUl0ZW0ucHJpY2VQYWlkXG4gICAgICAgICAgY2hlY2tvdXRMb2FkZWQubGluZUl0ZW1zW2luZGV4XS5wcmljZSA9IGxpbmVJdGVtLnByaWNlXG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGNoZWNrb3V0TG9hZGVkLmxpbmVJdGVtcyA9IGl0ZW1zLmNvbmNhdChcbiAgICAgICAgICAgIGNoZWNrb3V0TG9hZGVkLmxpbmVJdGVtcyA/IGNoZWNrb3V0TG9hZGVkLmxpbmVJdGVtcy5jb25jYXQoW2xpbmVJdGVtXSkgOiBbbGluZUl0ZW1dLFxuICAgICAgICAgIClcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlXG4gICAgICAgICAgLnVwZGF0ZUNoZWNrb3V0TGluZUl0ZW1zKGNoZWNrb3V0TG9hZGVkKVxuICAgICAgICAgIC5waXBlKG1hcCgodXBkYXRlZENoZWNrb3V0KSA9PiB0aGlzLmdlbmVyYXRlQ2FydE9iamVjdCh1cGRhdGVkQ2hlY2tvdXQubGluZUl0ZW1zKSkpXG4gICAgICB9KSxcbiAgICApXG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNhcnRPYmplY3QgPSAoaXRlbXM6IExpbmVJdGVtW10pOiBDYXJ0ID0+XG4gICAgaXRlbXM/LnJlZHVjZShcbiAgICAgIChjYXJ0LCBpdGVtKSA9PiAoe1xuICAgICAgICAuLi5jYXJ0LFxuICAgICAgICBbaXRlbS5pZF06IExpbmVJdGVtLnRvSW5zdGFuY2Uoe1xuICAgICAgICAgIC4uLihjYXJ0W2l0ZW0uaWRdIHx8IGl0ZW0pLFxuICAgICAgICAgIHF1YW50aXR5OiAoY2FydFtpdGVtLmlkXT8ucXVhbnRpdHkgfHwgMCkgKyAoaXRlbS5xdWFudGl0eSA/IGl0ZW0ucXVhbnRpdHkgOiAxKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIExpbmVJdGVtPixcbiAgICApIHx8IHt9XG5cbiAgcHJpdmF0ZSBidWlsZExpbmVJdGVtID0gYXN5bmMgKHtcbiAgICBjaGVja291dCxcbiAgICBpdGVtLFxuICAgIHF1YW50aXR5LFxuICB9OiB7XG4gICAgY2hlY2tvdXQ6IFJlcXVpcmVkQ2hlY2tvdXREYXRhXG4gICAgaXRlbTogTGluZUl0ZW1cbiAgICBxdWFudGl0eT86IG51bWJlclxuICB9KTogUHJvbWlzZTx7IGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PjsgbGluZUl0ZW06IExpbmVJdGVtIH0+ID0+IHtcbiAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgdGhpcy5nZXRQcm9kdWN0RGF0YShpdGVtLmlkKVxuXG4gICAgaXRlbS5xdWFudGl0eSA9IGl0ZW0/LnF1YW50aXR5IHx8IGNoZWNrb3V0Py5saW5lSXRlbXM/LmZpbmQoKGxpbmVJdGVtKSA9PiBsaW5lSXRlbS5pZCA9PT0gaXRlbS5pZCk/LnF1YW50aXR5IHx8IDBcblxuICAgIGlmICh0aGlzLmNoZWNrTWF4U3RvY2socHJvZHVjdC5zdG9jay5xdWFudGl0eSwgaXRlbS5xdWFudGl0eSB8fCAwLCBxdWFudGl0eSB8fCAwKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVzY3VscGUhIFRlbW9zIGFwZW5hcyAnICsgcHJvZHVjdC5zdG9jaz8ucXVhbnRpdHkgKyAnIGVtIGVzdG9xdWUuJylcblxuICAgIGNvbnN0IGltYWdlID0gaXRlbS5pbWFnZSB8fCBpdGVtLmltYWdlcz8uc2hpZnQoKVxuICAgIGNvbnN0IHsgaWQsIG5hbWUsIEVBTiwgc2x1Zywgd2VpZ2h0LCBza3UsIHR5cGUgfSA9IGl0ZW1cbiAgICBjb25zdCBpc0dpZnQgPSBpdGVtPy5pc0dpZnQgfHwgbnVsbFxuICAgIGNvbnN0IHByaWNlUGFpZCA9IGlzR2lmdFxuICAgICAgPyAwXG4gICAgICA6IHRoaXMuZ2V0UHJvZHVjdFByaWNlKHtcbiAgICAgICAgICBwcm9kdWN0OiBMaW5lSXRlbS50b0luc3RhbmNlKHByb2R1Y3QpLFxuICAgICAgICAgIHNob3A6IGNoZWNrb3V0LnNob3AgfHwgdGhpcy5kZWZhdWx0U2hvcCxcbiAgICAgICAgICBpc1N1YnNjcmliZXI6IGNoZWNrb3V0LnVzZXI/LmlzU3Vic2NyaWJlcixcbiAgICAgICAgfSlcblxuICAgIFJvdW5kUHJvZHVjdFByaWNlc0hlbHBlci5yb3VuZFByb2R1Y3RQcmljZXMoaXRlbSlcbiAgICBSb3VuZFByb2R1Y3RQcmljZXNIZWxwZXIucm91bmRQcm9kdWN0UHJpY2VzKHByb2R1Y3QgYXMgUHJvZHVjdClcblxuICAgIHJldHVybiB7XG4gICAgICBjaGVja291dCxcbiAgICAgIGxpbmVJdGVtOiBMaW5lSXRlbS50b0luc3RhbmNlKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWU6IG5hbWUgPz8gcHJvZHVjdC5uYW1lLFxuICAgICAgICBFQU46IEVBTiA/PyBwcm9kdWN0LkVBTixcbiAgICAgICAgYnJhbmQ6IHByb2R1Y3QuYnJhbmQsXG4gICAgICAgIHNsdWc6IHNsdWcgPz8gcHJvZHVjdC5zbHVnLFxuICAgICAgICBza3U6IHNrdSA/PyBwcm9kdWN0LnNrdSxcbiAgICAgICAgc3RvY2s6IHByb2R1Y3Quc3RvY2ssXG4gICAgICAgIHByaWNlOiB0aGlzLnJvdW5kUHJpY2UocHJvZHVjdC5wcmljZSksXG4gICAgICAgIGltYWdlLFxuICAgICAgICB3ZWlnaHQ6IHdlaWdodCA/PyBwcm9kdWN0LndlaWdodCxcbiAgICAgICAgcXVhbnRpdHk6IChpdGVtLnF1YW50aXR5IHx8IDApICsgKHF1YW50aXR5IHx8IDApLFxuICAgICAgICBwcmljZVBhaWQsXG4gICAgICAgIGRpc2NvdW50OiAwLFxuICAgICAgICBjYXRlZ29yaWVzOiBwcm9kdWN0LmNhdGVnb3JpZXMgfHwgcHJvZHVjdC5jYXRlZ29yeT8uaWQgPyBbcHJvZHVjdC5jYXRlZ29yeT8uaWQsIC4uLnByb2R1Y3QuY2F0ZWdvcmllc10gOiBbXSxcbiAgICAgICAgY2F0ZWdvcnk6IHByb2R1Y3QuY2F0ZWdvcnksXG4gICAgICAgIGlzR2lmdDogaXNHaWZ0ID8/IG51bGwsXG4gICAgICAgIGNvc3RQcmljZTogaXNHaWZ0ID8gMCA6IHByb2R1Y3QuY29zdFByaWNlID8/IDAsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGxhYmVsOiBwcm9kdWN0LmxhYmVsLFxuICAgICAgfSksXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByb3VuZFByaWNlKHByb2R1Y3RQcmljZTogU2hvcFByaWNlKTogU2hvcFByaWNlIHtcbiAgICBjb25zdCB7IHByaWNlLCBmdWxsUHJpY2UsIHN1YnNjcmliZXJQcmljZSB9ID0gcHJvZHVjdFByaWNlXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByb2R1Y3RQcmljZSxcbiAgICAgIHByaWNlOiBOdW1iZXIocHJpY2UudG9GaXhlZCgyKSksXG4gICAgICBmdWxsUHJpY2U6IE51bWJlcihmdWxsUHJpY2UudG9GaXhlZCgyKSksXG4gICAgICAuLi4oc3Vic2NyaWJlclByaWNlICYmIHsgc3Vic2NyaWJlclByaWNlOiBOdW1iZXIoc3Vic2NyaWJlclByaWNlLnRvRml4ZWQoMikpIH0pLFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UHJvZHVjdERhdGEocHJvZHVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFBhcnRpYWw8UHJvZHVjdD4+IHtcbiAgICBsZXQgcHJvZHVjdDogUHJvZHVjdFxuICAgIGxldCB2YXJpYW50OiBWYXJpYW50XG5cbiAgICB0cnkge1xuICAgICAgcHJvZHVjdCA9IGF3YWl0IHRoaXMucHJvZHVjdFJlcG9zaXRvcnkuZ2V0KHsgaWQ6IHByb2R1Y3RJZCB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlcnJvclxuXG4gICAgICBjb25zdCB7IGRhdGE6IHZhcmlhbnRzIH0gPSBhd2FpdCB0aGlzLnZhcmlhbnRSZXBvc2l0b3J5LmZpbmQoeyBmaWx0ZXJzOiB7IGlkOiBwcm9kdWN0SWQgfSB9KVxuXG4gICAgICB2YXJpYW50ID0gdmFyaWFudHMuc2hpZnQoKVxuXG4gICAgICBpZiAoIXZhcmlhbnQpIHRocm93IGVycm9yXG5cbiAgICAgIHByb2R1Y3QgPSBhd2FpdCB0aGlzLnByb2R1Y3RSZXBvc2l0b3J5LmdldCh7IGlkOiB2YXJpYW50LnByb2R1Y3RJZCB9KVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5wcm9kdWN0LnRvUGxhaW4oKSxcbiAgICAgIC4uLih2YXJpYW50ICYmIHsgLi4udmFyaWFudC50b1BsYWluKCkgfSksXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm9kdWN0UHJpY2UgPSAoe1xuICAgIHByb2R1Y3QsXG4gICAgaXNTdWJzY3JpYmVyLFxuICB9OiB7XG4gICAgcHJvZHVjdDogTGluZUl0ZW1cbiAgICBzaG9wOiBTaG9wc1xuICAgIGlzU3Vic2NyaWJlcjogYm9vbGVhblxuICB9KTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBpbmZvID0gcHJvZHVjdC5wcmljZVxuXG4gICAgaWYgKHByb2R1Y3QuaXNHaWZ0KSByZXR1cm4gMFxuXG4gICAgcmV0dXJuIGlzU3Vic2NyaWJlciAmJiBpbmZvLnN1YnNjcmliZXJQcmljZSA+IDBcbiAgICAgID8gTnVtYmVyKGluZm8uc3Vic2NyaWJlclByaWNlLnRvRml4ZWQoMikpXG4gICAgICA6IE51bWJlcihpbmZvLnByaWNlLnRvRml4ZWQoMikpXG4gIH1cblxuICBwcml2YXRlIGNoZWNrTWF4U3RvY2sgPSAoY3VycmVudFN0b2NrOiBudW1iZXIsIGN1cnJlbnRJdGVtUXRkOiBudW1iZXIsIHF1YW50aXR5VG9BZGQ6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG1heFN0b2NrID0gY3VycmVudFN0b2NrIHx8IDBcbiAgICBjb25zdCBjdXJyZW50SXRlbUFtb3VudCA9IGN1cnJlbnRJdGVtUXRkIHx8IDBcblxuICAgIHJldHVybiBjdXJyZW50SXRlbUFtb3VudCArIHF1YW50aXR5VG9BZGQgPiBtYXhTdG9ja1xuICB9XG5cbiAgZ2V0R2lmdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmdldENoZWNrb3V0KCkucGlwZShcbiAgICAgIG1lcmdlTWFwKGFzeW5jIChjaGVja291dCkgPT4ge1xuICAgICAgICBjb25zdCBub3RHaWZ0SXRlbXM6IExpbmVJdGVtW10gPSBjaGVja291dC5saW5lSXRlbXMgPyBjaGVja291dC5saW5lSXRlbXMuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc0dpZnQpIDogW11cblxuICAgICAgICBpZiAoIW5vdEdpZnRJdGVtcy5sZW5ndGgpIHJldHVybiB7IC4uLmNoZWNrb3V0LCBsaW5lSXRlbXM6IFtdIH0gYXMgQ2hlY2tvdXRcblxuICAgICAgICBjb25zdCBjYW1wYWlnbnMgPSBhd2FpdCB0aGlzLmJ1eTJXaW5SZXBvc2l0b3J5XG4gICAgICAgICAgLmZpbmQoe1xuICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICBhY3RpdmU6IHsgb3BlcmF0b3I6IFdoZXJlLkVRVUFMUywgdmFsdWU6IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoZGF0YSkgPT5cbiAgICAgICAgICAgIGRhdGEuZGF0YS5maWx0ZXIoKGNhbXBhaWduKSA9PiBjYW1wYWlnbi5zaG9wID09PSBTaG9wcy5BTEwgfHwgY2FtcGFpZ24uc2hvcCA9PT0gdGhpcy5kZWZhdWx0U2hvcCksXG4gICAgICAgICAgKVxuXG4gICAgICAgIGlmICghY2FtcGFpZ25zLmxlbmd0aCkgcmV0dXJuIHsgLi4uY2hlY2tvdXQsIGxpbmVJdGVtczogbm90R2lmdEl0ZW1zIH0gYXMgQ2hlY2tvdXRcblxuICAgICAgICBjb25zdCBlbGVnaWJsZUNhbXBhaWduczogQnV5MldpbltdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGNhbXBhaWduIG9mIGNhbXBhaWducykge1xuICAgICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcblxuICAgICAgICAgIGlmICghKGNhbXBhaWduLnN0YXJ0RGF0ZS5nZXRUaW1lKCkgPD0gdG9kYXkpICYmICEoY2FtcGFpZ24uZW5kRGF0ZS5nZXRUaW1lKCkgPj0gdG9kYXkpKSBjb250aW51ZVxuXG4gICAgICAgICAgaWYgKGNhbXBhaWduLmFjdGl2ZUNhdGVnb3J5KSB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ2FtcGFpbmcgPSBjYW1wYWlnbi5jYXRlZ29yaWVzLm1hcCgoYykgPT4gYy5pZC50b1N0cmluZygpKVxuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NhbXBhaW5nRnVsbFRyZWUgPSBbXVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGNhdGVnb3JpZXNDYW1wYWluZykge1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHRoaXMuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldENoaWxkcmVuKHBhcnNlSW50KGlkKSlcbiAgICAgICAgICAgICAgY2F0ZWdvcmllc0NhbXBhaW5nRnVsbFRyZWUucHVzaChpZCwgLi4uY2hpbGRyZW4ubWFwKChjKSA9PiBjLmlkLnRvU3RyaW5nKCkpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ2FtcGFpbmdUcmVlID0gWy4uLm5ldyBTZXQoY2F0ZWdvcmllc0NhbXBhaW5nRnVsbFRyZWUpXVxuICAgICAgICAgICAgY29uc3QgZmlsdGVyUHJvZHVjdHNDYXRlZ29yaWVzID0gbm90R2lmdEl0ZW1zLmZpbHRlcigobCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWwuY2F0ZWdvcmllcyB8fCAhbC5jYXRlZ29yaWVzPy5sZW5ndGgpIHJldHVybiB0cnVlXG5cbiAgICAgICAgICAgICAgcmV0dXJuIGwuY2F0ZWdvcmllcy5zb21lKChjKSA9PiBjYXRlZ29yaWVzQ2FtcGFpbmdUcmVlLnNvbWUoKGNhdCkgPT4gY2F0ID09IGMpKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGZpbHRlclByb2R1Y3RzQ2F0ZWdvcmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2FydFZhbHVlbFdpdGhDYXRlZ29yaWVzID0gZmlsdGVyUHJvZHVjdHNDYXRlZ29yaWVzLnJlZHVjZShcbiAgICAgICAgICAgICAgICAoYSwgYikgPT4gYSArIGIucHJpY2VQYWlkICogYi5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGNhcnRJdGVuc1F1YW50aXR5V2l0aENhdGVnb3JpZXMgPSBmaWx0ZXJQcm9kdWN0c0NhdGVnb3JpZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYi5xdWFudGl0eSwgMClcbiAgICAgICAgICAgICAgY29uc3QgaGFzTWluVmFsdWUgPSBjYW1wYWlnbi5jYXJ0VmFsdWVNaW4gJiYgY2FydFZhbHVlbFdpdGhDYXRlZ29yaWVzID49IGNhbXBhaWduLmNhcnRWYWx1ZU1pblxuICAgICAgICAgICAgICBjb25zdCBoYXNNaW5RdWFudGl0eSA9XG4gICAgICAgICAgICAgICAgY2FtcGFpZ24uY2FydEl0ZW5zUXVhbnRpdHlNaW4gJiYgY2FydEl0ZW5zUXVhbnRpdHlXaXRoQ2F0ZWdvcmllcyA+PSBjYW1wYWlnbi5jYXJ0SXRlbnNRdWFudGl0eU1pblxuXG4gICAgICAgICAgICAgIGlmIChoYXNNaW5RdWFudGl0eSB8fCBoYXNNaW5WYWx1ZSkgZWxlZ2libGVDYW1wYWlnbnMucHVzaChjYW1wYWlnbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2FydFRvdGFsID0gbm90R2lmdEl0ZW1zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIucHJpY2VQYWlkICogYi5xdWFudGl0eSwgMClcbiAgICAgICAgICAgIGNvbnN0IGNhcnRJdGVuc1F1YW50aXR5ID0gbm90R2lmdEl0ZW1zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIucXVhbnRpdHksIDApXG4gICAgICAgICAgICBjb25zdCBoYXNNaW5WYWx1ZSA9IGNhbXBhaWduLmNhcnRWYWx1ZSAmJiBjYW1wYWlnbi5jYXJ0VmFsdWUgPiAwICYmIGNhbXBhaWduLmNhcnRWYWx1ZSA8PSBjYXJ0VG90YWxcbiAgICAgICAgICAgIGNvbnN0IGhhc01pblF1YW50aXR5ID0gY2FtcGFpZ24uY2FydEl0ZW5zUXVhbnRpdHlNaW4gJiYgY2FydEl0ZW5zUXVhbnRpdHkgPj0gY2FtcGFpZ24uY2FydEl0ZW5zUXVhbnRpdHlNaW5cblxuICAgICAgICAgICAgaWYgKGhhc01pblF1YW50aXR5IHx8IGhhc01pblZhbHVlKSBlbGVnaWJsZUNhbXBhaWducy5wdXNoKGNhbXBhaWduKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZWxlZ2libGVDYW1wYWlnbnMubGVuZ3RoKSByZXR1cm4geyAuLi5jaGVja291dCwgbGluZUl0ZW1zOiBub3RHaWZ0SXRlbXMgfSBhcyBDaGVja291dFxuXG4gICAgICAgIGNvbnN0IGNhbXBhaW5nblByb2R1Y3RzOiBQcm9kdWN0W11bXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBjYW1wYWlnbiBvZiBlbGVnaWJsZUNhbXBhaWducykge1xuICAgICAgICAgIGxldCBlbGVnaWJsZVByb2R1Y3RzID0gW11cblxuICAgICAgICAgIGZvciAoY29uc3QgcHJvZHVjdCBvZiBjYW1wYWlnbi5wcm9kdWN0cykge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBwcm9kdWN0RGF0YSB9ID0gYXdhaXQgdGhpcy5wcm9kdWN0UmVwb3NpdG9yeS5maW5kKHsgZmlsdGVyczogeyBza3U6IHByb2R1Y3QgfSB9KVxuXG4gICAgICAgICAgICBpZiAoIXByb2R1Y3REYXRhLmxlbmd0aCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgZ2lmdCA9IHByb2R1Y3REYXRhLnNoaWZ0KClcblxuICAgICAgICAgICAgaWYgKGdpZnQuc3RvY2sucXVhbnRpdHkgPCAxKSBjb250aW51ZVxuXG4gICAgICAgICAgICBlbGVnaWJsZVByb2R1Y3RzLnB1c2goZ2lmdClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYW1wYWluZ25Qcm9kdWN0cy5wdXNoKGVsZWdpYmxlUHJvZHVjdHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNhbXBhaW5nblByb2R1Y3RzLmxlbmd0aCkgcmV0dXJuIHsgLi4uY2hlY2tvdXQsIGxpbmVJdGVtczogbm90R2lmdEl0ZW1zIH0gYXMgQ2hlY2tvdXRcblxuICAgICAgICBjb25zdCBnaWZ0cyA9IHRoaXMuZ2lmdFRvTGluZUl0ZW1zKFtdLmNvbmNhdCguLi5jYW1wYWluZ25Qcm9kdWN0cykpXG5cbiAgICAgICAgcmV0dXJuIHsgLi4uY2hlY2tvdXQsIGxpbmVJdGVtczogbm90R2lmdEl0ZW1zLmNvbmNhdChnaWZ0cykgfVxuICAgICAgfSksXG4gICAgICBjb25jYXRNYXAoKGNoZWNrb3V0KSA9PiB0aGlzLmNoZWNrb3V0U2VydmljZS51cGRhdGVDaGVja291dExpbmVJdGVtcyhjaGVja291dCkpLFxuICAgICAgbWFwKChjaGVja291dCkgPT4gdGhpcy5nZW5lcmF0ZUNhcnRPYmplY3QoY2hlY2tvdXQubGluZUl0ZW1zKSksXG4gICAgICB0YXAoKGNhcnQpID0+IHRoaXMuY2FydFN1YmplY3QubmV4dChjYXJ0KSksXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBnaWZ0VG9MaW5lSXRlbXMoaXRlbXM6IFByb2R1Y3RbXSk6IExpbmVJdGVtW10ge1xuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsgYnJhbmQsIGNhdGVnb3JpZXMsIGNhdGVnb3J5LCBpZCwgbmFtZSwgcHJpY2UsIHNrdSwgc2x1Zywgc3RvY2ssIHdlaWdodCwgRUFOIH0gPSBpdGVtXG4gICAgICBjb25zdCBpbWFnZSA9IGl0ZW0/Lm1pbmlhdHVyZXM/Lmxlbmd0aCA/IGl0ZW0ubWluaWF0dXJlc1swXSA6IGl0ZW0uaW1hZ2VzWzBdXG5cbiAgICAgIHJldHVybiBMaW5lSXRlbS50b0luc3RhbmNlKHtcbiAgICAgICAgYnJhbmQsXG4gICAgICAgIGNhdGVnb3JpZXMsXG4gICAgICAgIGNhdGVnb3J5LFxuICAgICAgICBpZDogaWQudG9TdHJpbmcoKSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcHJpY2UsXG4gICAgICAgIHNrdSxcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgc3RvY2ssXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgRUFOLFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgcHJpY2VQYWlkOiAwLFxuICAgICAgICBxdWFudGl0eTogMSxcbiAgICAgICAgaXNHaWZ0OiB0cnVlLFxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG4iXX0=