UNPKG

@spartacus/cart

Version:

`@spartacus/cart` is a package that you can include in your application, which allows you to use various cart features.

290 lines 37.2 kB
import { Injectable } from '@angular/core'; import { select } from '@ngrx/store'; import { DeleteSavedCartEvent, } from '@spartacus/cart/saved-cart/root'; import { getWishlistName, isSelectiveCart, ProcessSelectors, } from '@spartacus/core'; import { combineLatest, EMPTY, queueScheduler } from 'rxjs'; import { distinctUntilChanged, filter, map, observeOn, pluck, shareReplay, startWith, tap, withLatestFrom, } from 'rxjs/operators'; import { SavedCartActions } from '../store/actions/index'; import { SAVED_CART_CLONE_CART_PROCESS_ID, SAVED_CART_LIST_PROCESS_ID, SAVED_CART_RESTORE_CART_PROCESS_ID, SAVED_CART_SAVE_CART_PROCESS_ID, } from '../store/saved-cart-constants'; import * as i0 from "@angular/core"; import * as i1 from "@ngrx/store"; import * as i2 from "@spartacus/core"; export class SavedCartService { constructor(store, userIdService, userService, multiCartService, eventService) { this.store = store; this.userIdService = userIdService; this.userService = userService; this.multiCartService = multiCartService; this.eventService = eventService; } /** * Loads a single saved cart */ loadSavedCart(cartId) { this.userIdService.takeUserId(true).subscribe((userId) => { return this.store.dispatch(new SavedCartActions.LoadSavedCart({ userId, cartId })); }, () => { // TODO: for future releases, refactor this part to thrown errors }); } /** * Gets a single saved cart * it won't emit if the delete saved cart event gets triggered to avoid race condition between actions * * @param cartId * @returns observable with cart */ get(cartId) { return this.getSavedCart(cartId).pipe(observeOn(queueScheduler), withLatestFrom(this.eventService.get(DeleteSavedCartEvent).pipe(startWith({}))), filter(([state, _event]) => !!state), tap(([state, event]) => { if (Object.keys(event).length > 0) { return EMPTY; } if (!(state.loading || state.success || state.error)) { this.loadSavedCart(cartId); } }), filter(([state]) => state.success || !!state.error), map(([state]) => state.value)); } /** * Gets the selected cart state * * @param cartId * @returns observable of selected cart with loader state */ getSavedCart(cartId) { return this.multiCartService.getCartEntity(cartId); } /** * Returns true when there are no operations on that in progress and it is not currently loading * * @param cartId */ isStable(cartId) { return this.multiCartService.isStable(cartId); } /** * Loads a list of saved carts */ loadSavedCarts() { this.userIdService.takeUserId(true).subscribe((userId) => { return this.store.dispatch(new SavedCartActions.LoadSavedCarts({ userId })); }, () => { // TODO: for future releases, refactor this part to thrown errors }); } /** * Gets a list of saved carts * * @returns observable with list of saved carts */ getList() { return this.getSavedCartList().pipe(withLatestFrom(this.getSavedCartListProcess()), tap(([_, state]) => { if (!(state.loading || state.success || state.error)) { this.loadSavedCarts(); } }), pluck(0), shareReplay({ bufferSize: 1, refCount: true })); } /** * Gets a list of saved carts from all carts in the state * by filtering through the carts that are not wishlist and not saved cart * * @returns observable with list of saved carts */ getSavedCartList() { return combineLatest([ this.multiCartService.getCarts(), this.userService.get(), ]).pipe(distinctUntilChanged(), map(([carts, user]) => carts.filter((cart) => ((user === null || user === void 0 ? void 0 : user.customerId) !== undefined ? (cart === null || cart === void 0 ? void 0 : cart.name) !== getWishlistName(user === null || user === void 0 ? void 0 : user.customerId) : true) && !isSelectiveCart(cart === null || cart === void 0 ? void 0 : cart.code) && (cart === null || cart === void 0 ? void 0 : cart.saveTime)))); } /** * Gets the loading flag of getting a list of saved carts * * @returns observable with boolean of the loading state */ getSavedCartListProcessLoading() { return this.store.pipe(select(ProcessSelectors.getProcessLoadingFactory(SAVED_CART_LIST_PROCESS_ID))); } /** * Gets the loading state of getting a list of saved carts * * @returns observable with boolean of the loader state */ getSavedCartListProcess() { return this.store.pipe(select(ProcessSelectors.getProcessStateFactory(SAVED_CART_LIST_PROCESS_ID))); } /** * Clears the process state of performing a saved cart */ clearSavedCarts() { this.store.dispatch(new SavedCartActions.ClearSavedCarts()); } /** * Triggers a restore saved cart * * @param cartId */ restoreSavedCart(cartId) { this.userIdService.takeUserId(true).subscribe((userId) => { return this.store.dispatch(new SavedCartActions.RestoreSavedCart({ userId, cartId, })); }, () => { // TODO: for future releases, refactor this part to thrown errors }); } /** * Gets the loading state of restoring saved cart * * @returns observable with boolean of the loading state */ getRestoreSavedCartProcessLoading() { return this.store.pipe(select(ProcessSelectors.getProcessLoadingFactory(SAVED_CART_RESTORE_CART_PROCESS_ID))); } /** * Gets the success state of restoring saved cart * * @returns observable with boolean of the success state */ getRestoreSavedCartProcessSuccess() { return this.store.pipe(select(ProcessSelectors.getProcessSuccessFactory(SAVED_CART_RESTORE_CART_PROCESS_ID))); } /** * Gets the error state of restoring saved cart * * @returns observable with boolean of the error state */ getRestoreSavedCartProcessError() { return this.store.pipe(select(ProcessSelectors.getProcessErrorFactory(SAVED_CART_RESTORE_CART_PROCESS_ID))); } /** * Clears the process state of performing a restore saved cart */ clearRestoreSavedCart() { this.store.dispatch(new SavedCartActions.ClearRestoreSavedCart()); } /** * Triggers delete saved cart * @param cartId */ deleteSavedCart(cartId) { this.userIdService.takeUserId(true).subscribe((userId) => { return this.multiCartService.deleteCart(cartId, userId); }, () => { // TODO: for future releases, refactor this part to thrown errors }); } /** * Triggers a saved cart * */ saveCart({ cartId, saveCartName, saveCartDescription, }) { this.userIdService.takeUserId(true).subscribe((userId) => { return this.store.dispatch(new SavedCartActions.SaveCart({ userId, cartId, saveCartName, saveCartDescription, })); }, () => { // TODO: for future releases, refactor this part to thrown errors }); } /** * Gets the loading state of saving a cart * * @returns observable with boolean of the loading state */ getSaveCartProcessLoading() { return this.store.pipe(select(ProcessSelectors.getProcessLoadingFactory(SAVED_CART_SAVE_CART_PROCESS_ID))); } /** * Gets the success state of saving a cart * * @returns observable with boolean of the success state */ getSaveCartProcessSuccess() { return this.store.pipe(select(ProcessSelectors.getProcessSuccessFactory(SAVED_CART_SAVE_CART_PROCESS_ID))); } /** * Gets the error state of saving a cart * * @returns observable with boolean of the error state */ getSaveCartProcessError() { return this.store.pipe(select(ProcessSelectors.getProcessErrorFactory(SAVED_CART_SAVE_CART_PROCESS_ID))); } /** * Clears the process state of performing a save cart */ clearSaveCart() { this.store.dispatch(new SavedCartActions.ClearSaveCart()); } /** * Triggers an edit saved cart * */ editSavedCart({ cartId, saveCartName, saveCartDescription, }) { this.userIdService.takeUserId(true).subscribe((userId) => { return this.store.dispatch(new SavedCartActions.EditSavedCart({ userId, cartId, saveCartName, saveCartDescription, })); }, () => { // TODO: for future releases, refactor this part to thrown errors }); } /** * Triggers a clone saved cart * * @param cartId */ cloneSavedCart(cartId, saveCartName) { this.userIdService.takeUserId(true).subscribe((userId) => { return this.store.dispatch(new SavedCartActions.CloneSavedCart({ userId, cartId, saveCartName })); }, () => { // TODO: for future releases, refactor this part to thrown errors }); } /** * Gets the loading state of cloning a saved cart * * @returns observable with boolean of the loading state */ getCloneSavedCartProcessLoading() { return this.store.pipe(select(ProcessSelectors.getProcessLoadingFactory(SAVED_CART_CLONE_CART_PROCESS_ID))); } /** * Gets the success state of cloning a saved cart * * @returns observable with boolean of the success state */ getCloneSavedCartProcessSuccess() { return this.store.pipe(select(ProcessSelectors.getProcessSuccessFactory(SAVED_CART_CLONE_CART_PROCESS_ID))); } /** * Gets the error state of cloning a saved cart * * @returns observable with boolean of the error state */ getCloneSavedCartProcessError() { return this.store.pipe(select(ProcessSelectors.getProcessErrorFactory(SAVED_CART_CLONE_CART_PROCESS_ID))); } /** * Clears the process state of cloning a saved cart */ clearCloneSavedCart() { this.store.dispatch(new SavedCartActions.ClearCloneSavedCart()); } } SavedCartService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SavedCartService, deps: [{ token: i1.Store }, { token: i2.UserIdService }, { token: i2.UserService }, { token: i2.MultiCartService }, { token: i2.EventService }], target: i0.ɵɵFactoryTarget.Injectable }); SavedCartService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SavedCartService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: SavedCartService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.UserIdService }, { type: i2.UserService }, { type: i2.MultiCartService }, { type: i2.EventService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vZmVhdHVyZS1saWJzL2NhcnQvc2F2ZWQtY2FydC9jb3JlL2ZhY2FkZS9zYXZlZC1jYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFTLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBR0wsZUFBZSxFQUNmLGVBQWUsRUFFZixnQkFBZ0IsR0FNakIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sR0FBRyxFQUNILFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxHQUFHLEVBQ0gsY0FBYyxHQUNmLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUNMLGdDQUFnQyxFQUNoQywwQkFBMEIsRUFDMUIsa0NBQWtDLEVBQ2xDLCtCQUErQixHQUNoQyxNQUFNLCtCQUErQixDQUFDOzs7O0FBR3ZDLE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDWSxLQUF5RCxFQUN6RCxhQUE0QixFQUM1QixXQUF3QixFQUN4QixnQkFBa0MsRUFDbEMsWUFBMEI7UUFKMUIsVUFBSyxHQUFMLEtBQUssQ0FBb0Q7UUFDekQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxp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QUUsRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ3hCLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUN0RSxDQUFDO1FBQ0osQ0FBQyxFQUNELEdBQUcsRUFBRTtZQUNILGlFQUFpRTtRQUNuRSxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsK0JBQStCO1FBQzdCLE9BQXVDLElBQUksQ0FBQyxLQUFNLENBQUMsSUFBSSxDQUNyRCxNQUFNLENBQ0osZ0JBQWdCLENBQUMsd0JBQXdCLENBQ3ZDLGdDQUFnQyxDQUNqQyxDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsK0JBQStCO1FBQzdCLE9BQXVDLElBQUksQ0FBQyxLQUFNLENBQUMsSUFBSSxDQUNyRCxNQUFNLENBQ0osZ0JBQWdCLENBQUMsd0JBQXdCLENBQ3ZDLGdDQUFnQyxDQUNqQyxDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsNkJBQTZCO1FBQzNCLE9BQXVDLElBQUksQ0FBQyxLQUFNLENBQUMsSUFBSSxDQUNyRCxNQUFNLENBQ0osZ0JBQWdCLENBQUMsc0JBQXNCLENBQ3JDLGdDQUFnQyxDQUNqQyxDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDOzs2R0FoYlUsZ0JBQWdCO2lIQUFoQixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNlbGVjdCwgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBEZWxldGVTYXZlZENhcnRFdmVudCxcbiAgU2F2ZWRDYXJ0RmFjYWRlLFxufSBmcm9tICdAc3BhcnRhY3VzL2NhcnQvc2F2ZWQtY2FydC9yb290JztcbmltcG9ydCB7XG4gIENhcnQsXG4gIEV2ZW50U2VydmljZSxcbiAgZ2V0V2lzaGxpc3ROYW1lLFxuICBpc1NlbGVjdGl2ZUNhcnQsXG4gIE11bHRpQ2FydFNlcnZpY2UsXG4gIFByb2Nlc3NTZWxlY3RvcnMsXG4gIFN0YXRlVXRpbHMsXG4gIFN0YXRlV2l0aE11bHRpQ2FydCxcbiAgU3RhdGVXaXRoUHJvY2VzcyxcbiAgVXNlcklkU2VydmljZSxcbiAgVXNlclNlcnZpY2UsXG59IGZyb20gJ0BzcGFydGFjdXMvY29yZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBFTVBUWSwgT2JzZXJ2YWJsZSwgcXVldWVTY2hlZHVsZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgb2JzZXJ2ZU9uLFxuICBwbHVjayxcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgdGFwLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2F2ZWRDYXJ0QWN0aW9ucyB9IGZyb20gJy4uL3N0b3JlL2FjdGlvbnMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgU0FWRURfQ0FSVF9DTE9ORV9DQVJUX1BST0NFU1NfSUQsXG4gIFNBVkVEX0NBUlRfTElTVF9QUk9DRVNTX0lELFxuICBTQVZFRF9DQVJUX1JFU1RPUkVfQ0FSVF9QUk9DRVNTX0lELFxuICBTQVZFRF9DQVJUX1NBVkVfQ0FSVF9QUk9DRVNTX0lELFxufSBmcm9tICcuLi9zdG9yZS9zYXZlZC1jYXJ0LWNvbnN0YW50cyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTYXZlZENhcnRTZXJ2aWNlIGltcGxlbWVudHMgU2F2ZWRDYXJ0RmFjYWRlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHN0b3JlOiBTdG9yZTxTdGF0ZVdpdGhNdWx0aUNhcnQgfCBTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+PixcbiAgICBwcm90ZWN0ZWQgdXNlcklkU2VydmljZTogVXNlcklkU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBtdWx0aUNhcnRTZXJ2aWNlOiBNdWx0aUNhcnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgc2luZ2xlIHNhdmVkIGNhcnRcbiAgICovXG4gIGxvYWRTYXZlZENhcnQoY2FydElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJJZFNlcnZpY2UudGFrZVVzZXJJZCh0cnVlKS5zdWJzY3JpYmUoXG4gICAgICAodXNlcklkKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLkxvYWRTYXZlZENhcnQoeyB1c2VySWQsIGNhcnRJZCB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gVE9ETzogZm9yIGZ1dHVyZSByZWxlYXNlcywgcmVmYWN0b3IgdGhpcyBwYXJ0IHRvIHRocm93biBlcnJvcnNcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzaW5nbGUgc2F2ZWQgY2FydFxuICAgKiBpdCB3b24ndCBlbWl0IGlmIHRoZSBkZWxldGUgc2F2ZWQgY2FydCBldmVudCBnZXRzIHRyaWdnZXJlZCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGFjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIGNhcnRJZFxuICAgKiBAcmV0dXJucyBvYnNlcnZhYmxlIHdpdGggY2FydFxuICAgKi9cbiAgZ2V0KGNhcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDYXJ0IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2F2ZWRDYXJ0KGNhcnRJZCkucGlwZShcbiAgICAgIG9ic2VydmVPbihxdWV1ZVNjaGVkdWxlciksXG4gICAgICB3aXRoTGF0ZXN0RnJvbShcbiAgICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZ2V0KERlbGV0ZVNhdmVkQ2FydEV2ZW50KS5waXBlKHN0YXJ0V2l0aCh7fSkpXG4gICAgICApLFxuICAgICAgZmlsdGVyKChbc3RhdGUsIF9ldmVudF0pID0+ICEhc3RhdGUpLFxuICAgICAgdGFwKChbc3RhdGUsIGV2ZW50XSkgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZXZlbnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShzdGF0ZS5sb2FkaW5nIHx8IHN0YXRlLnN1Y2Nlc3MgfHwgc3RhdGUuZXJyb3IpKSB7XG4gICAgICAgICAgdGhpcy5sb2FkU2F2ZWRDYXJ0KGNhcnRJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgZmlsdGVyKChbc3RhdGVdKSA9PiBzdGF0ZS5zdWNjZXNzIHx8ICEhc3RhdGUuZXJyb3IpLFxuICAgICAgbWFwKChbc3RhdGVdKSA9PiBzdGF0ZS52YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNlbGVjdGVkIGNhcnQgc3RhdGVcbiAgICpcbiAgICogQHBhcmFtIGNhcnRJZFxuICAgKiBAcmV0dXJucyBvYnNlcnZhYmxlIG9mIHNlbGVjdGVkIGNhcnQgd2l0aCBsb2FkZXIgc3RhdGVcbiAgICovXG4gIGdldFNhdmVkQ2FydChcbiAgICBjYXJ0SWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPFN0YXRlVXRpbHMuUHJvY2Vzc2VzTG9hZGVyU3RhdGU8Q2FydD4+IHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aUNhcnRTZXJ2aWNlLmdldENhcnRFbnRpdHkoY2FydElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGVyZSBhcmUgbm8gb3BlcmF0aW9ucyBvbiB0aGF0IGluIHByb2dyZXNzIGFuZCBpdCBpcyBub3QgY3VycmVudGx5IGxvYWRpbmdcbiAgICpcbiAgICogQHBhcmFtIGNhcnRJZFxuICAgKi9cbiAgaXNTdGFibGUoY2FydElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aUNhcnRTZXJ2aWNlLmlzU3RhYmxlKGNhcnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSBsaXN0IG9mIHNhdmVkIGNhcnRzXG4gICAqL1xuICBsb2FkU2F2ZWRDYXJ0cygpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJJZFNlcnZpY2UudGFrZVVzZXJJZCh0cnVlKS5zdWJzY3JpYmUoXG4gICAgICAodXNlcklkKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIG5ldyBTYXZlZENhcnRBY3Rpb25zLkxvYWRTYXZlZENhcnRzKHsgdXNlcklkIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBUT0RPOiBmb3IgZnV0dXJlIHJlbGVhc2VzLCByZWZhY3RvciB0aGlzIHBhcnQgdG8gdGhyb3duIGVycm9yc1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2Ygc2F2ZWQgY2FydHNcbiAgICpcbiAgICogQHJldHVybnMgb2JzZXJ2YWJsZSB3aXRoIGxpc3Qgb2Ygc2F2ZWQgY2FydHNcbiAgICovXG4gIGdldExpc3QoKTogT2JzZXJ2YWJsZTxDYXJ0W10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRTYXZlZENhcnRMaXN0KCkucGlwZShcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuZ2V0U2F2ZWRDYXJ0TGlzdFByb2Nlc3MoKSksXG4gICAgICB0YXAoKFtfLCBzdGF0ZV0pID0+IHtcbiAgICAgICAgaWYgKCEoc3RhdGUubG9hZGluZyB8fCBzdGF0ZS5zdWNjZXNzIHx8IHN0YXRlLmVycm9yKSkge1xuICAgICAgICAgIHRoaXMubG9hZFNhdmVkQ2FydHMoKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBwbHVjaygwKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBsaXN0IG9mIHNhdmVkIGNhcnRzIGZyb20gYWxsIGNhcnRzIGluIHRoZSBzdGF0ZVxuICAgKiBieSBmaWx0ZXJpbmcgdGhyb3VnaCB0aGUgY2FydHMgdGhhdCBhcmUgbm90IHdpc2hsaXN0IGFuZCBub3Qgc2F2ZWQgY2FydFxuICAgKlxuICAgKiBAcmV0dXJucyBvYnNlcnZhYmxlIHdpdGggbGlzdCBvZiBzYXZlZCBjYXJ0c1xuICAgKi9cbiAgZ2V0U2F2ZWRDYXJ0TGlzdCgpOiBPYnNlcnZhYmxlPENhcnRbXT4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMubXVsdGlDYXJ0U2VydmljZS5nZXRDYXJ0cygpLFxuICAgICAgdGhpcy51c2VyU2VydmljZS5nZXQoKSxcbiAgICBdKS5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1hcCgoW2NhcnRzLCB1c2VyXSkgPT5cbiAgICAgICAgY2FydHMuZmlsdGVyKFxuICAgICAgICAgIChjYXJ0KSA9PlxuICAgICAgICAgICAgKHVzZXI/LmN1c3RvbWVySWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IGNhcnQ/Lm5hbWUgIT09IGdldFdpc2hsaXN0TmFtZSh1c2VyPy5jdXN0b21lcklkKVxuICAgICAgICAgICAgICA6IHRydWUpICYmXG4gICAgICAgICAgICAhaXNTZWxlY3RpdmVDYXJ0KGNhcnQ/LmNvZGUpICYmXG4gICAgICAgICAgICBjYXJ0Py5zYXZlVGltZVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb2FkaW5nIGZsYWcgb2YgZ2V0dGluZyBhIGxpc3Qgb2Ygc2F2ZWQgY2FydHNcbiAgICpcbiAgICogQHJldHVybnMgb2JzZXJ2YWJsZSB3aXRoIGJvb2xlYW4gb2YgdGhlIGxvYWRpbmcgc3RhdGVcbiAgICovXG4gIGdldFNhdmVkQ2FydExpc3RQcm9jZXNzTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NMb2FkaW5nRmFjdG9yeShTQVZFRF9DQVJUX0xJU1RfUFJPQ0VTU19JRClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxvYWRpbmcgc3RhdGUgb2YgZ2V0dGluZyBhIGxpc3Qgb2Ygc2F2ZWQgY2FydHNcbiAgICpcbiAgICogQHJldHVybnMgb2JzZXJ2YWJsZSB3aXRoIGJvb2xlYW4gb2YgdGhlIGxvYWRlciBzdGF0ZVxuICAgKi9cbiAgZ2V0U2F2ZWRDYXJ0TGlzdFByb2Nlc3MoKTogT2JzZXJ2YWJsZTxTdGF0ZVV0aWxzLkxvYWRlclN0YXRlPGFueT4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NTdGF0ZUZhY3RvcnkoU0FWRURfQ0FSVF9MSVNUX1BST0NFU1NfSUQpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHByb2Nlc3Mgc3RhdGUgb2YgcGVyZm9ybWluZyBhIHNhdmVkIGNhcnRcbiAgICovXG4gIGNsZWFyU2F2ZWRDYXJ0cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTYXZlZENhcnRBY3Rpb25zLkNsZWFyU2F2ZWRDYXJ0cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIHJlc3RvcmUgc2F2ZWQgY2FydFxuICAgKlxuICAgKiBAcGFyYW0gY2FydElkXG4gICAqL1xuICByZXN0b3JlU2F2ZWRDYXJ0KGNhcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51c2VySWRTZXJ2aWNlLnRha2VVc2VySWQodHJ1ZSkuc3Vic2NyaWJlKFxuICAgICAgKHVzZXJJZCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICBuZXcgU2F2ZWRDYXJ0QWN0aW9ucy5SZXN0b3JlU2F2ZWRDYXJ0KHtcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIGNhcnRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gVE9ETzogZm9yIGZ1dHVyZSByZWxlYXNlcywgcmVmYWN0b3IgdGhpcyBwYXJ0IHRvIHRocm93biBlcnJvcnNcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxvYWRpbmcgc3RhdGUgb2YgcmVzdG9yaW5nIHNhdmVkIGNhcnRcbiAgICpcbiAgICogQHJldHVybnMgb2JzZXJ2YWJsZSB3aXRoIGJvb2xlYW4gb2YgdGhlIGxvYWRpbmcgc3RhdGVcbiAgICovXG4gIGdldFJlc3RvcmVTYXZlZENhcnRQcm9jZXNzTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NMb2FkaW5nRmFjdG9yeShcbiAgICAgICAgICBTQVZFRF9DQVJUX1JFU1RPUkVfQ0FSVF9QUk9DRVNTX0lEXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN1Y2Nlc3Mgc3RhdGUgb2YgcmVzdG9yaW5nIHNhdmVkIGNhcnRcbiAgICpcbiAgICogQHJldHVybnMgb2JzZXJ2YWJsZSB3aXRoIGJvb2xlYW4gb2YgdGhlIHN1Y2Nlc3Mgc3RhdGVcbiAgICovXG4gIGdldFJlc3RvcmVTYXZlZENhcnRQcm9jZXNzU3VjY2VzcygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NTdWNjZXNzRmFjdG9yeShcbiAgICAgICAgICBTQVZFRF9DQVJUX1JFU1RPUkVfQ0FSVF9QUk9DRVNTX0lEXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVycm9yIHN0YXRlIG9mIHJlc3RvcmluZyBzYXZlZCBjYXJ0XG4gICAqXG4gICAqIEByZXR1cm5zIG9ic2VydmFibGUgd2l0aCBib29sZWFuIG9mIHRoZSBlcnJvciBzdGF0ZVxuICAgKi9cbiAgZ2V0UmVzdG9yZVNhdmVkQ2FydFByb2Nlc3NFcnJvcigpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NFcnJvckZhY3RvcnkoXG4gICAgICAgICAgU0FWRURfQ0FSVF9SRVNUT1JFX0NBUlRfUFJPQ0VTU19JRFxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHByb2Nlc3Mgc3RhdGUgb2YgcGVyZm9ybWluZyBhIHJlc3RvcmUgc2F2ZWQgY2FydFxuICAgKi9cbiAgY2xlYXJSZXN0b3JlU2F2ZWRDYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNhdmVkQ2FydEFjdGlvbnMuQ2xlYXJSZXN0b3JlU2F2ZWRDYXJ0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGRlbGV0ZSBzYXZlZCBjYXJ0XG4gICAqIEBwYXJhbSBjYXJ0SWRcbiAgICovXG4gIGRlbGV0ZVNhdmVkQ2FydChjYXJ0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXNlcklkU2VydmljZS50YWtlVXNlcklkKHRydWUpLnN1YnNjcmliZShcbiAgICAgICh1c2VySWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlDYXJ0U2VydmljZS5kZWxldGVDYXJ0KGNhcnRJZCwgdXNlcklkKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIFRPRE86IGZvciBmdXR1cmUgcmVsZWFzZXMsIHJlZmFjdG9yIHRoaXMgcGFydCB0byB0aHJvd24gZXJyb3JzXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIHNhdmVkIGNhcnRcbiAgICpcbiAgICovXG4gIHNhdmVDYXJ0KHtcbiAgICBjYXJ0SWQsXG4gICAgc2F2ZUNhcnROYW1lLFxuICAgIHNhdmVDYXJ0RGVzY3JpcHRpb24sXG4gIH06IHtcbiAgICBjYXJ0SWQ6IHN0cmluZztcbiAgICBzYXZlQ2FydE5hbWU/OiBzdHJpbmc7XG4gICAgc2F2ZUNhcnREZXNjcmlwdGlvbj86IHN0cmluZztcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMudXNlcklkU2VydmljZS50YWtlVXNlcklkKHRydWUpLnN1YnNjcmliZShcbiAgICAgICh1c2VySWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgICAgbmV3IFNhdmVkQ2FydEFjdGlvbnMuU2F2ZUNhcnQoe1xuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgY2FydElkLFxuICAgICAgICAgICAgc2F2ZUNhcnROYW1lLFxuICAgICAgICAgICAgc2F2ZUNhcnREZXNjcmlwdGlvbixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gVE9ETzogZm9yIGZ1dHVyZSByZWxlYXNlcywgcmVmYWN0b3IgdGhpcyBwYXJ0IHRvIHRocm93biBlcnJvcnNcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxvYWRpbmcgc3RhdGUgb2Ygc2F2aW5nIGEgY2FydFxuICAgKlxuICAgKiBAcmV0dXJucyBvYnNlcnZhYmxlIHdpdGggYm9vbGVhbiBvZiB0aGUgbG9hZGluZyBzdGF0ZVxuICAgKi9cbiAgZ2V0U2F2ZUNhcnRQcm9jZXNzTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NMb2FkaW5nRmFjdG9yeShcbiAgICAgICAgICBTQVZFRF9DQVJUX1NBVkVfQ0FSVF9QUk9DRVNTX0lEXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN1Y2Nlc3Mgc3RhdGUgb2Ygc2F2aW5nIGEgY2FydFxuICAgKlxuICAgKiBAcmV0dXJucyBvYnNlcnZhYmxlIHdpdGggYm9vbGVhbiBvZiB0aGUgc3VjY2VzcyBzdGF0ZVxuICAgKi9cbiAgZ2V0U2F2ZUNhcnRQcm9jZXNzU3VjY2VzcygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NTdWNjZXNzRmFjdG9yeShcbiAgICAgICAgICBTQVZFRF9DQVJUX1NBVkVfQ0FSVF9QUk9DRVNTX0lEXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVycm9yIHN0YXRlIG9mIHNhdmluZyBhIGNhcnRcbiAgICpcbiAgICogQHJldHVybnMgb2JzZXJ2YWJsZSB3aXRoIGJvb2xlYW4gb2YgdGhlIGVycm9yIHN0YXRlXG4gICAqL1xuICBnZXRTYXZlQ2FydFByb2Nlc3NFcnJvcigpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NFcnJvckZhY3RvcnkoU0FWRURfQ0FSVF9TQVZFX0NBUlRfUFJPQ0VTU19JRClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcHJvY2VzcyBzdGF0ZSBvZiBwZXJmb3JtaW5nIGEgc2F2ZSBjYXJ0XG4gICAqL1xuICBjbGVhclNhdmVDYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNhdmVkQ2FydEFjdGlvbnMuQ2xlYXJTYXZlQ2FydCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhbiBlZGl0IHNhdmVkIGNhcnRcbiAgICpcbiAgICovXG4gIGVkaXRTYXZlZENhcnQoe1xuICAgIGNhcnRJZCxcbiAgICBzYXZlQ2FydE5hbWUsXG4gICAgc2F2ZUNhcnREZXNjcmlwdGlvbixcbiAgfToge1xuICAgIGNhcnRJZDogc3RyaW5nO1xuICAgIHNhdmVDYXJ0TmFtZT86IHN0cmluZztcbiAgICBzYXZlQ2FydERlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy51c2VySWRTZXJ2aWNlLnRha2VVc2VySWQodHJ1ZSkuc3Vic2NyaWJlKFxuICAgICAgKHVzZXJJZCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICBuZXcgU2F2ZWRDYXJ0QWN0aW9ucy5FZGl0U2F2ZWRDYXJ0KHtcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIGNhcnRJZCxcbiAgICAgICAgICAgIHNhdmVDYXJ0TmFtZSxcbiAgICAgICAgICAgIHNhdmVDYXJ0RGVzY3JpcHRpb24sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIFRPRE86IGZvciBmdXR1cmUgcmVsZWFzZXMsIHJlZmFjdG9yIHRoaXMgcGFydCB0byB0aHJvd24gZXJyb3JzXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGNsb25lIHNhdmVkIGNhcnRcbiAgICpcbiAgICogQHBhcmFtIGNhcnRJZFxuICAgKi9cbiAgY2xvbmVTYXZlZENhcnQoY2FydElkOiBzdHJpbmcsIHNhdmVDYXJ0TmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXNlcklkU2VydmljZS50YWtlVXNlcklkKHRydWUpLnN1YnNjcmliZShcbiAgICAgICh1c2VySWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgICAgbmV3IFNhdmVkQ2FydEFjdGlvbnMuQ2xvbmVTYXZlZENhcnQoeyB1c2VySWQsIGNhcnRJZCwgc2F2ZUNhcnROYW1lIH0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBUT0RPOiBmb3IgZnV0dXJlIHJlbGVhc2VzLCByZWZhY3RvciB0aGlzIHBhcnQgdG8gdGhyb3duIGVycm9yc1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbG9hZGluZyBzdGF0ZSBvZiBjbG9uaW5nIGEgc2F2ZWQgY2FydFxuICAgKlxuICAgKiBAcmV0dXJucyBvYnNlcnZhYmxlIHdpdGggYm9vbGVhbiBvZiB0aGUgbG9hZGluZyBzdGF0ZVxuICAgKi9cbiAgZ2V0Q2xvbmVTYXZlZENhcnRQcm9jZXNzTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKDxTdG9yZTxTdGF0ZVdpdGhQcm9jZXNzPHZvaWQ+Pj50aGlzLnN0b3JlKS5waXBlKFxuICAgICAgc2VsZWN0KFxuICAgICAgICBQcm9jZXNzU2VsZWN0b3JzLmdldFByb2Nlc3NMb2FkaW5nRmFjdG9yeShcbiAgICAgICAgICBTQVZFRF9DQVJUX0NMT05FX0NBUlRfUFJPQ0VTU19JRFxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdWNjZXNzIHN0YXRlIG9mIGNsb25pbmcgYSBzYXZlZCBjYXJ0XG4gICAqXG4gICAqIEByZXR1cm5zIG9ic2VydmFibGUgd2l0aCBib29sZWFuIG9mIHRoZSBzdWNjZXNzIHN0YXRlXG4gICAqL1xuICBnZXRDbG9uZVNhdmVkQ2FydFByb2Nlc3NTdWNjZXNzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoPFN0b3JlPFN0YXRlV2l0aFByb2Nlc3M8dm9pZD4+PnRoaXMuc3RvcmUpLnBpcGUoXG4gICAgICBzZWxlY3QoXG4gICAgICAgIFByb2Nlc3NTZWxlY3RvcnMuZ2V0UHJvY2Vzc1N1Y2Nlc3NGYWN0b3J5KFxuICAgICAgICAgIFNBVkVEX0NBUlRfQ0xPTkVfQ0FSVF9QUk9DRVNTX0lEXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVycm9yIHN0YXRlIG9mIGNsb25pbmcgYSBzYXZlZCBjYXJ0XG4gICAqXG4gICAqIEByZXR1cm5zIG9ic2VydmFibGUgd2l0aCBib29sZWFuIG9mIHRoZSBlcnJvciBzdGF0ZVxuICAgKi9cbiAgZ2V0Q2xvbmVTYXZlZENhcnRQcm9jZXNzRXJyb3IoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuICg8U3RvcmU8U3RhdGVXaXRoUHJvY2Vzczx2b2lkPj4+dGhpcy5zdG9yZSkucGlwZShcbiAgICAgIHNlbGVjdChcbiAgICAgICAgUHJvY2Vzc1NlbGVjdG9ycy5nZXRQcm9jZXNzRXJyb3JGYWN0b3J5KFxuICAgICAgICAgIFNBVkVEX0NBUlRfQ0xPTkVfQ0FSVF9QUk9DRVNTX0lEXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcHJvY2VzcyBzdGF0ZSBvZiBjbG9uaW5nIGEgc2F2ZWQgY2FydFxuICAgKi9cbiAgY2xlYXJDbG9uZVNhdmVkQ2FydCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTYXZlZENhcnRBY3Rpb25zLkNsZWFyQ2xvbmVTYXZlZENhcnQoKSk7XG4gIH1cbn1cbiJdfQ==