@spartacus/checkout
Version:
Checkout feature library for Spartacus
148 lines • 31 kB
JavaScript
import { Injectable } from '@angular/core';
import { combineLatest, of } from 'rxjs';
import { debounceTime, distinctUntilChanged, filter, map, switchMap, tap, } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
import * as i2 from "@spartacus/checkout/root";
import * as i3 from "./checkout-details.service";
import * as i4 from "../services/checkout-config.service";
export class ExpressCheckoutService {
constructor(userAddressService, userPaymentService, checkoutDeliveryService, checkoutPaymentService, checkoutDetailsService, checkoutConfigService, clearCheckoutService) {
this.userAddressService = userAddressService;
this.userPaymentService = userPaymentService;
this.checkoutDeliveryService = checkoutDeliveryService;
this.checkoutPaymentService = checkoutPaymentService;
this.checkoutDetailsService = checkoutDetailsService;
this.checkoutConfigService = checkoutConfigService;
this.clearCheckoutService = clearCheckoutService;
this.setShippingAddress();
this.setDeliveryMode();
this.setPaymentMethod();
}
setShippingAddress() {
this.shippingAddressSet$ = combineLatest([
this.userAddressService.getAddresses(),
this.userAddressService.getAddressesLoadedSuccess(),
this.checkoutDeliveryService.getSetDeliveryAddressProcess(),
]).pipe(debounceTime(0), tap(([, addressesLoadedSuccess]) => {
if (!addressesLoadedSuccess) {
this.userAddressService.loadAddresses();
}
}), filter(([, addressesLoadedSuccess]) => addressesLoadedSuccess), switchMap(([addresses, , setDeliveryAddressProcess]) => {
const defaultAddress = addresses.find((address) => address.defaultAddress) || addresses[0];
if (defaultAddress && Object.keys(defaultAddress).length) {
if (!(setDeliveryAddressProcess.success ||
setDeliveryAddressProcess.error ||
setDeliveryAddressProcess.loading)) {
this.checkoutDeliveryService.setDeliveryAddress(defaultAddress);
}
return of(setDeliveryAddressProcess).pipe(filter((setDeliveryAddressProcessState) => {
var _a;
return ((_a = ((setDeliveryAddressProcessState.success ||
setDeliveryAddressProcessState.error) &&
!setDeliveryAddressProcessState.loading)) !== null && _a !== void 0 ? _a : false);
}), switchMap((setDeliveryAddressProcessState) => {
if (setDeliveryAddressProcessState.success) {
return this.checkoutDetailsService.getDeliveryAddress();
}
return of(false);
}), map((data) => Boolean(data && Object.keys(data).length)));
}
return of(false);
}), distinctUntilChanged());
}
setPaymentMethod() {
this.paymentMethodSet$ = combineLatest([
this.deliveryModeSet$,
this.userPaymentService.getPaymentMethods(),
this.userPaymentService.getPaymentMethodsLoadedSuccess(),
this.checkoutPaymentService.getSetPaymentDetailsResultProcess(),
]).pipe(debounceTime(0), tap(([, , paymentMethodsLoadedSuccess]) => {
if (!paymentMethodsLoadedSuccess) {
this.userPaymentService.loadPaymentMethods();
}
}), filter(([, , success]) => success), switchMap(([deliveryModeSet, payments, , setPaymentDetailsProcess]) => {
if (!deliveryModeSet) {
return of(false);
}
const defaultPayment = payments.find((address) => address.defaultPayment) || payments[0];
if (defaultPayment && Object.keys(defaultPayment).length) {
if (!(setPaymentDetailsProcess.success ||
setPaymentDetailsProcess.error ||
setPaymentDetailsProcess.loading)) {
this.checkoutPaymentService.setPaymentDetails(defaultPayment);
}
return of(setPaymentDetailsProcess).pipe(filter((setPaymentDetailsProcessState) => {
var _a;
return ((_a = ((setPaymentDetailsProcessState.success ||
setPaymentDetailsProcessState.error) &&
!setPaymentDetailsProcessState.loading)) !== null && _a !== void 0 ? _a : false);
}), switchMap((setPaymentDetailsProcessState) => {
if (setPaymentDetailsProcessState.success) {
return this.checkoutDetailsService.getPaymentDetails();
}
return of(false);
}), map((data) => Boolean(data && Object.keys(data).length)));
}
return of(false);
}));
}
setDeliveryMode() {
this.deliveryModeSet$ = combineLatest([
this.shippingAddressSet$,
this.checkoutDeliveryService.getSupportedDeliveryModes(),
this.checkoutDeliveryService.getSetDeliveryModeProcess(),
this.checkoutDeliveryService.getLoadSupportedDeliveryModeProcess(),
]).pipe(debounceTime(0), switchMap(([addressSet, supportedDeliveryModes, setDeliveryModeStatusFlag, loadSupportedDeliveryModeStatus,]) => {
if (addressSet) {
return of([
supportedDeliveryModes,
setDeliveryModeStatusFlag,
loadSupportedDeliveryModeStatus,
]).pipe(filter(([, , supportedDeliveryModeStatus]) => { var _a; return (_a = supportedDeliveryModeStatus.success) !== null && _a !== void 0 ? _a : false; }), switchMap(([deliveryModes, setDeliveryModeStatus, ,]) => {
if (Boolean(deliveryModes.length)) {
const preferredDeliveryMode = this.checkoutConfigService.getPreferredDeliveryMode(deliveryModes);
return of([
preferredDeliveryMode,
setDeliveryModeStatus,
]).pipe(tap(([deliveryMode, deliveryModeLoadingStatus]) => {
if (deliveryMode &&
!(deliveryModeLoadingStatus.success ||
deliveryModeLoadingStatus.error ||
deliveryModeLoadingStatus.loading)) {
this.checkoutDeliveryService.setDeliveryMode(deliveryMode);
}
}), filter(([, deliveryModeLoadingStatus]) => {
var _a;
return ((_a = ((deliveryModeLoadingStatus.success ||
deliveryModeLoadingStatus.error) &&
!deliveryModeLoadingStatus.loading)) !== null && _a !== void 0 ? _a : false);
}), switchMap(([, deliveryModeLoadingStatus]) => {
if (deliveryModeLoadingStatus.success) {
return this.checkoutDetailsService.getSelectedDeliveryModeCode();
}
return of(false);
}), map((data) => Boolean(data)));
}
return of(false);
}));
}
else {
return of(false);
}
}), distinctUntilChanged());
}
trySetDefaultCheckoutDetails() {
this.clearCheckoutService.resetCheckoutProcesses();
return this.paymentMethodSet$.pipe(map((paymentMethodSet) => Boolean(paymentMethodSet)));
}
}
ExpressCheckoutService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ExpressCheckoutService, deps: [{ token: i1.UserAddressService }, { token: i1.UserPaymentService }, { token: i2.CheckoutDeliveryFacade }, { token: i2.CheckoutPaymentFacade }, { token: i3.CheckoutDetailsService }, { token: i4.CheckoutConfigService }, { token: i2.ClearCheckoutFacade }], target: i0.ɵɵFactoryTarget.Injectable });
ExpressCheckoutService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ExpressCheckoutService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ExpressCheckoutService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.UserAddressService }, { type: i1.UserPaymentService }, { type: i2.CheckoutDeliveryFacade }, { type: i2.CheckoutPaymentFacade }, { type: i3.CheckoutDetailsService }, { type: i4.CheckoutConfigService }, { type: i2.ClearCheckoutFacade }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy1jaGVja291dC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZmVhdHVyZS1saWJzL2NoZWNrb3V0L2NvbXBvbmVudHMvc2VydmljZXMvZXhwcmVzcy1jaGVja291dC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFjM0MsT0FBTyxFQUFFLGFBQWEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU94QixNQUFNLE9BQU8sc0JBQXNCO0lBS2pDLFlBQ1ksa0JBQXNDLEVBQ3RDLGtCQUFzQyxFQUN0Qyx1QkFBK0MsRUFDL0Msc0JBQTZDLEVBQzdDLHNCQUE4QyxFQUM5QyxxQkFBNEMsRUFDNUMsb0JBQXlDO1FBTnpDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0Qyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXdCO1FBQy9DLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBdUI7UUFDN0MsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzVDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFFbkQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztZQUN2QyxJQUFJLENBQUMsa0JB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b0JBQ0QsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLENBQUMsQ0FDRixDQUNGLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQjtRQUNILENBQUMsQ0FDRixFQUNELG9CQUFvQixFQUFFLENBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRU0sNEJBQTRCO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRW5ELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDaEMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQ3JELENBQUM7SUFDSixDQUFDOzttSEEzUlUsc0JBQXNCO3VIQUF0QixzQkFBc0IsY0FGckIsTUFBTTsyRkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ2hlY2tvdXREZWxpdmVyeUZhY2FkZSxcbiAgQ2hlY2tvdXRQYXltZW50RmFjYWRlLFxuICBDbGVhckNoZWNrb3V0RmFjYWRlLFxufSBmcm9tICdAc3BhcnRhY3VzL2NoZWNrb3V0L3Jvb3QnO1xuaW1wb3J0IHtcbiAgQWRkcmVzcyxcbiAgRGVsaXZlcnlNb2RlLFxuICBQYXltZW50RGV0YWlscyxcbiAgU3RhdGVVdGlscyxcbiAgVXNlckFkZHJlc3NTZXJ2aWNlLFxuICBVc2VyUGF5bWVudFNlcnZpY2UsXG59IGZyb20gJ0BzcGFydGFjdXMvY29yZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDaGVja291dENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jaGVja291dC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDaGVja291dERldGFpbHNTZXJ2aWNlIH0gZnJvbSAnLi9jaGVja291dC1kZXRhaWxzLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRXhwcmVzc0NoZWNrb3V0U2VydmljZSB7XG4gIHByaXZhdGUgc2hpcHBpbmdBZGRyZXNzU2V0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgcHJpdmF0ZSBkZWxpdmVyeU1vZGVTZXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBwcml2YXRlIHBheW1lbnRNZXRob2RTZXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCB1c2VyQWRkcmVzc1NlcnZpY2U6IFVzZXJBZGRyZXNzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdXNlclBheW1lbnRTZXJ2aWNlOiBVc2VyUGF5bWVudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNoZWNrb3V0RGVsaXZlcnlTZXJ2aWNlOiBDaGVja291dERlbGl2ZXJ5RmFjYWRlLFxuICAgIHByb3RlY3RlZCBjaGVja291dFBheW1lbnRTZXJ2aWNlOiBDaGVja291dFBheW1lbnRGYWNhZGUsXG4gICAgcHJvdGVjdGVkIGNoZWNrb3V0RGV0YWlsc1NlcnZpY2U6IENoZWNrb3V0RGV0YWlsc1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNoZWNrb3V0Q29uZmlnU2VydmljZTogQ2hlY2tvdXRDb25maWdTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjbGVhckNoZWNrb3V0U2VydmljZTogQ2xlYXJDaGVja291dEZhY2FkZVxuICApIHtcbiAgICB0aGlzLnNldFNoaXBwaW5nQWRkcmVzcygpO1xuICAgIHRoaXMuc2V0RGVsaXZlcnlNb2RlKCk7XG4gICAgdGhpcy5zZXRQYXltZW50TWV0aG9kKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0U2hpcHBpbmdBZGRyZXNzKCkge1xuICAgIHRoaXMuc2hpcHBpbmdBZGRyZXNzU2V0JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy51c2VyQWRkcmVzc1NlcnZpY2UuZ2V0QWRkcmVzc2VzKCksXG4gICAgICB0aGlzLnVzZXJBZGRyZXNzU2VydmljZS5nZXRBZGRyZXNzZXNMb2FkZWRTdWNjZXNzKCksXG4gICAgICB0aGlzLmNoZWNrb3V0RGVsaXZlcnlTZXJ2aWNlLmdldFNldERlbGl2ZXJ5QWRkcmVzc1Byb2Nlc3MoKSxcbiAgICBdKS5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgdGFwKFxuICAgICAgICAoWywgYWRkcmVzc2VzTG9hZGVkU3VjY2Vzc106IFtcbiAgICAgICAgICBBZGRyZXNzW10sXG4gICAgICAgICAgYm9vbGVhbixcbiAgICAgICAgICBTdGF0ZVV0aWxzLkxvYWRlclN0YXRlPHZvaWQ+XG4gICAgICAgIF0pID0+IHtcbiAgICAgICAgICBpZiAoIWFkZHJlc3Nlc0xvYWRlZFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMudXNlckFkZHJlc3NTZXJ2aWNlLmxvYWRBZGRyZXNzZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBmaWx0ZXIoXG4gICAgICAgIChbLCBhZGRyZXNzZXNMb2FkZWRTdWNjZXNzXTogW1xuICAgICAgICAgIEFkZHJlc3NbXSxcbiAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgIFN0YXRlVXRpbHMuTG9hZGVyU3RhdGU8dm9pZD5cbiAgICAgICAgXSkgPT4gYWRkcmVzc2VzTG9hZGVkU3VjY2Vzc1xuICAgICAgKSxcbiAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgKFthZGRyZXNzZXMsICwgc2V0RGVsaXZlcnlBZGRyZXNzUHJvY2Vzc106IFtcbiAgICAgICAgICBBZGRyZXNzW10sXG4gICAgICAgICAgYm9vbGVhbixcbiAgICAgICAgICBTdGF0ZVV0aWxzLkxvYWRlclN0YXRlPHZvaWQ+XG4gICAgICAgIF0pID0+IHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0QWRkcmVzcyA9XG4gICAgICAgICAgICBhZGRyZXNzZXMuZmluZCgoYWRkcmVzcykgPT4gYWRkcmVzcy5kZWZhdWx0QWRkcmVzcykgfHwgYWRkcmVzc2VzWzBdO1xuICAgICAgICAgIGlmIChkZWZhdWx0QWRkcmVzcyAmJiBPYmplY3Qua2V5cyhkZWZhdWx0QWRkcmVzcykubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgc2V0RGVsaXZlcnlBZGRyZXNzUHJvY2Vzcy5zdWNjZXNzIHx8XG4gICAgICAgICAgICAgICAgc2V0RGVsaXZlcnlBZGRyZXNzUHJvY2Vzcy5lcnJvciB8fFxuICAgICAgICAgICAgICAgIHNldERlbGl2ZXJ5QWRkcmVzc1Byb2Nlc3MubG9hZGluZ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5jaGVja291dERlbGl2ZXJ5U2VydmljZS5zZXREZWxpdmVyeUFkZHJlc3MoZGVmYXVsdEFkZHJlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKHNldERlbGl2ZXJ5QWRkcmVzc1Byb2Nlc3MpLnBpcGUoXG4gICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICBzZXREZWxpdmVyeUFkZHJlc3NQcm9jZXNzU3RhdGU6IFN0YXRlVXRpbHMuTG9hZGVyU3RhdGU8dm9pZD5cbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICgoc2V0RGVsaXZlcnlBZGRyZXNzUHJvY2Vzc1N0YXRlLnN1Y2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICBzZXREZWxpdmVyeUFkZHJlc3NQcm9jZXNzU3RhdGUuZXJyb3IpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIXNldERlbGl2ZXJ5QWRkcmVzc1Byb2Nlc3NTdGF0ZS5sb2FkaW5nKSA/P1xuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICBzZXREZWxpdmVyeUFkZHJlc3NQcm9jZXNzU3RhdGU6IFN0YXRlVXRpbHMuTG9hZGVyU3RhdGU8dm9pZD5cbiAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChzZXREZWxpdmVyeUFkZHJlc3NQcm9jZXNzU3RhdGUuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja291dERldGFpbHNTZXJ2aWNlLmdldERlbGl2ZXJ5QWRkcmVzcygpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIG1hcCgoZGF0YSkgPT4gQm9vbGVhbihkYXRhICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0UGF5bWVudE1ldGhvZCgpIHtcbiAgICB0aGlzLnBheW1lbnRNZXRob2RTZXQkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmRlbGl2ZXJ5TW9kZVNldCQsXG4gICAgICB0aGlzLnVzZXJQYXltZW50U2VydmljZS5nZXRQYXltZW50TWV0aG9kcygpLFxuICAgICAgdGhpcy51c2VyUGF5bWVudFNlcnZpY2UuZ2V0UGF5bWVudE1ldGhvZHNMb2FkZWRTdWNjZXNzKCksXG4gICAgICB0aGlzLmNoZWNrb3V0UGF5bWVudFNlcnZpY2UuZ2V0U2V0UGF5bWVudERldGFpbHNSZXN1bHRQcm9jZXNzKCksXG4gICAgXSkucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgIHRhcChcbiAgICAgICAgKFssICwgcGF5bWVudE1ldGhvZHNMb2FkZWRTdWNjZXNzXTogW1xuICAgICAgICAgIGJvb2xlYW4sXG4gICAgICAgICAgUGF5bWVudERldGFpbHNbXSxcbiAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgIFN0YXRlVXRpbHMuTG9hZGVyU3RhdGU8dm9pZD5cbiAgICAgICAgXSkgPT4ge1xuICAgICAgICAgIGlmICghcGF5bWVudE1ldGhvZHNMb2FkZWRTdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXJQYXltZW50U2VydmljZS5sb2FkUGF5bWVudE1ldGhvZHMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBmaWx0ZXIoXG4gICAgICAgIChbLCAsIHN1Y2Nlc3NdOiBbXG4gICAgICAgICAgYm9vbGVhbixcbiAgICAgICAgICBQYXltZW50RGV0YWlsc1tdLFxuICAgICAgICAgIGJvb2xlYW4sXG4gICAgICAgICAgU3RhdGVVdGlscy5Mb2FkZXJTdGF0ZTx2b2lkPlxuICAgICAgICBdKSA9PiBzdWNjZXNzXG4gICAgICApLFxuICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAoW2RlbGl2ZXJ5TW9kZVNldCwgcGF5bWVudHMsICwgc2V0UGF5bWVudERldGFpbHNQcm9jZXNzXTogW1xuICAgICAgICAgIGJvb2xlYW4sXG4gICAgICAgICAgUGF5bWVudERldGFpbHNbXSxcbiAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgIFN0YXRlVXRpbHMuTG9hZGVyU3RhdGU8dm9pZD5cbiAgICAgICAgXSkgPT4ge1xuICAgICAgICAgIGlmICghZGVsaXZlcnlNb2RlU2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYXltZW50ID1cbiAgICAgICAgICAgIHBheW1lbnRzLmZpbmQoKGFkZHJlc3MpID0+IGFkZHJlc3MuZGVmYXVsdFBheW1lbnQpIHx8IHBheW1lbnRzWzBdO1xuICAgICAgICAgIGlmIChkZWZhdWx0UGF5bWVudCAmJiBPYmplY3Qua2V5cyhkZWZhdWx0UGF5bWVudCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgc2V0UGF5bWVudERldGFpbHNQcm9jZXNzLnN1Y2Nlc3MgfHxcbiAgICAgICAgICAgICAgICBzZXRQYXltZW50RGV0YWlsc1Byb2Nlc3MuZXJyb3IgfHxcbiAgICAgICAgICAgICAgICBzZXRQYXltZW50RGV0YWlsc1Byb2Nlc3MubG9hZGluZ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5jaGVja291dFBheW1lbnRTZXJ2aWNlLnNldFBheW1lbnREZXRhaWxzKGRlZmF1bHRQYXltZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvZihzZXRQYXltZW50RGV0YWlsc1Byb2Nlc3MpLnBpcGUoXG4gICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICBzZXRQYXltZW50RGV0YWlsc1Byb2Nlc3NTdGF0ZTogU3RhdGVVdGlscy5Mb2FkZXJTdGF0ZTx2b2lkPlxuICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgKChzZXRQYXltZW50RGV0YWlsc1Byb2Nlc3NTdGF0ZS5zdWNjZXNzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgc2V0UGF5bWVudERldGFpbHNQcm9jZXNzU3RhdGUuZXJyb3IpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIXNldFBheW1lbnREZXRhaWxzUHJvY2Vzc1N0YXRlLmxvYWRpbmcpID8/XG4gICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgIHNldFBheW1lbnREZXRhaWxzUHJvY2Vzc1N0YXRlOiBTdGF0ZVV0aWxzLkxvYWRlclN0YXRlPHZvaWQ+XG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoc2V0UGF5bWVudERldGFpbHNQcm9jZXNzU3RhdGUuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja291dERldGFpbHNTZXJ2aWNlLmdldFBheW1lbnREZXRhaWxzKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgbWFwKChkYXRhKSA9PiBCb29sZWFuKGRhdGEgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldERlbGl2ZXJ5TW9kZSgpIHtcbiAgICB0aGlzLmRlbGl2ZXJ5TW9kZVNldCQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc2hpcHBpbmdBZGRyZXNzU2V0JCxcbiAgICAgIHRoaXMuY2hlY2tvdXREZWxpdmVyeVNlcnZpY2UuZ2V0U3VwcG9ydGVkRGVsaXZlcnlNb2RlcygpLFxuICAgICAgdGhpcy5jaGVja291dERlbGl2ZXJ5U2VydmljZS5nZXRTZXREZWxpdmVyeU1vZGVQcm9jZXNzKCksXG4gICAgICB0aGlzLmNoZWNrb3V0RGVsaXZlcnlTZXJ2aWNlLmdldExvYWRTdXBwb3J0ZWREZWxpdmVyeU1vZGVQcm9jZXNzKCksXG4gICAgXSkucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgKFtcbiAgICAgICAgICBhZGRyZXNzU2V0LFxuICAgICAgICAgIHN1cHBvcnRlZERlbGl2ZXJ5TW9kZXMsXG4gICAgICAgICAgc2V0RGVsaXZlcnlNb2RlU3RhdHVzRmxhZyxcbiAgICAgICAgICBsb2FkU3VwcG9ydGVkRGVsaXZlcnlNb2RlU3RhdHVzLFxuICAgICAgICBdOiBbXG4gICAgICAgICAgYm9vbGVhbixcbiAgICAgICAgICBEZWxpdmVyeU1vZGVbXSxcbiAgICAgICAgICBTdGF0ZVV0aWxzLkxvYWRlclN0YXRlPHZvaWQ+LFxuICAgICAgICAgIFN0YXRlVXRpbHMuTG9hZGVyU3RhdGU8dm9pZD5cbiAgICAgICAgXSkgPT4ge1xuICAgICAgICAgIGlmIChhZGRyZXNzU2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW1xuICAgICAgICAgICAgICBzdXBwb3J0ZWREZWxpdmVyeU1vZGVzLFxuICAgICAgICAgICAgICBzZXREZWxpdmVyeU1vZGVTdGF0dXNGbGFnLFxuICAgICAgICAgICAgICBsb2FkU3VwcG9ydGVkRGVsaXZlcnlNb2RlU3RhdHVzLFxuICAgICAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgICAgZmlsdGVyKFxuICAgICAgICAgICAgICAgIChbLCAsIHN1cHBvcnRlZERlbGl2ZXJ5TW9kZVN0YXR1c106IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZERlbGl2ZXJ5TW9kZVN0YXR1cy5zdWNjZXNzID8/IGZhbHNlXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAgICAgICAoW2RlbGl2ZXJ5TW9kZXMsIHNldERlbGl2ZXJ5TW9kZVN0YXR1cywgLF06IFtcbiAgICAgICAgICAgICAgICAgIERlbGl2ZXJ5TW9kZVtdLFxuICAgICAgICAgICAgICAgICAgU3RhdGVVdGlscy5Mb2FkZXJTdGF0ZTx2b2lkPixcbiAgICAgICAgICAgICAgICAgIFN0YXRlVXRpbHMuTG9hZGVyU3RhdGU8dm9pZD5cbiAgICAgICAgICAgICAgICBdKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbihkZWxpdmVyeU1vZGVzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlZmVycmVkRGVsaXZlcnlNb2RlID1cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Q29uZmlnU2VydmljZS5nZXRQcmVmZXJyZWREZWxpdmVyeU1vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeU1vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtcbiAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWREZWxpdmVyeU1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgc2V0RGVsaXZlcnlNb2RlU3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBdKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgIHRhcCgoW2RlbGl2ZXJ5TW9kZSwgZGVsaXZlcnlNb2RlTG9hZGluZ1N0YXR1c106IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeU1vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeU1vZGVMb2FkaW5nU3RhdHVzLnN1Y2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeU1vZGVMb2FkaW5nU3RhdHVzLmVycm9yIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlNb2RlTG9hZGluZ1N0YXR1cy5sb2FkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0RGVsaXZlcnlTZXJ2aWNlLnNldERlbGl2ZXJ5TW9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeU1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAoWywgZGVsaXZlcnlNb2RlTG9hZGluZ1N0YXR1c106IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZVV0aWxzLkxvYWRlclN0YXRlPHZvaWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkZWxpdmVyeU1vZGVMb2FkaW5nU3RhdHVzLnN1Y2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5TW9kZUxvYWRpbmdTdGF0dXMuZXJyb3IpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGVsaXZlcnlNb2RlTG9hZGluZ1N0YXR1cy5sb2FkaW5nKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoWywgZGVsaXZlcnlNb2RlTG9hZGluZ1N0YXR1c106IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZVV0aWxzLkxvYWRlclN0YXRlPHZvaWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpdmVyeU1vZGVMb2FkaW5nU3RhdHVzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja291dERldGFpbHNTZXJ2aWNlLmdldFNlbGVjdGVkRGVsaXZlcnlNb2RlQ29kZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICBtYXAoKGRhdGEpID0+IEJvb2xlYW4oZGF0YSkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0cnlTZXREZWZhdWx0Q2hlY2tvdXREZXRhaWxzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHRoaXMuY2xlYXJDaGVja291dFNlcnZpY2UucmVzZXRDaGVja291dFByb2Nlc3NlcygpO1xuXG4gICAgcmV0dXJuIHRoaXMucGF5bWVudE1ldGhvZFNldCQucGlwZShcbiAgICAgIG1hcCgocGF5bWVudE1ldGhvZFNldCkgPT4gQm9vbGVhbihwYXltZW50TWV0aG9kU2V0KSlcbiAgICApO1xuICB9XG59XG4iXX0=