@hmcts/ccpay-web-component 6.5.14 → 6.5.15-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/hmcts-ccpay-web-component.mjs +5 -0
- package/esm2022/lib/components/add-remission/add-remission.component.mjs +1276 -0
- package/esm2022/lib/components/allocate-payments/allocate-payments.component.mjs +423 -0
- package/esm2022/lib/components/card-details/card-details.component.mjs +32 -0
- package/esm2022/lib/components/case-transactions/case-transactions.component.mjs +885 -0
- package/esm2022/lib/components/contact-details/contact-details.component.mjs +338 -0
- package/esm2022/lib/components/error-banner/error-banner.component.mjs +18 -0
- package/esm2022/lib/components/fee-summary/fee-summary.component.mjs +280 -0
- package/esm2022/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.mjs +195 -0
- package/esm2022/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.mjs +275 -0
- package/esm2022/lib/components/notification-preview/notification-preview.component.mjs +79 -0
- package/esm2022/lib/components/page-not-found.component.mjs +17 -0
- package/esm2022/lib/components/payment-list/payment-list.component.mjs +36 -0
- package/esm2022/lib/components/payment-view/payment-view.component.mjs +467 -0
- package/esm2022/lib/components/pba-details/pba-details.component.mjs +18 -0
- package/esm2022/lib/components/pba-payment/pba-payment.component.mjs +163 -0
- package/esm2022/lib/components/process-refund/process-refund.component.mjs +417 -0
- package/esm2022/lib/components/processed-payments/processed-payments.component.mjs +37 -0
- package/esm2022/lib/components/refund-list/refund-list.component.mjs +73 -0
- package/esm2022/lib/components/refund-status/refund-status.component.mjs +481 -0
- package/esm2022/lib/components/reports/reports.component.mjs +337 -0
- package/esm2022/lib/components/service-request/service-request.component.mjs +516 -0
- package/esm2022/lib/components/status-history/status-history.component.mjs +33 -0
- package/esm2022/lib/components/table/table.component.mjs +127 -0
- package/esm2022/lib/components/unprocessed-payments/unprocessed-payments.component.mjs +236 -0
- package/esm2022/lib/interfaces/AddRemissionRequest.mjs +17 -0
- package/esm2022/lib/interfaces/AddRetroRemissionRequest.mjs +9 -0
- package/esm2022/lib/interfaces/AllocatePaymentRequest.mjs +41 -0
- package/esm2022/lib/interfaces/IAllocationPaymentsRequest.mjs +20 -0
- package/esm2022/lib/interfaces/IBSPayments.mjs +2 -0
- package/esm2022/lib/interfaces/ICardDetails.mjs +2 -0
- package/esm2022/lib/interfaces/IFee.mjs +2 -0
- package/esm2022/lib/interfaces/INotificationPreview.mjs +2 -0
- package/esm2022/lib/interfaces/IOrderReferenceFee.mjs +2 -0
- package/esm2022/lib/interfaces/IPatchRefundAction.mjs +2 -0
- package/esm2022/lib/interfaces/IPayment.mjs +2 -0
- package/esm2022/lib/interfaces/IPaymentFailure.mjs +2 -0
- package/esm2022/lib/interfaces/IPaymentGroup.mjs +2 -0
- package/esm2022/lib/interfaces/IPaymentStatus.mjs +12 -0
- package/esm2022/lib/interfaces/IPaymentView.mjs +2 -0
- package/esm2022/lib/interfaces/IPayments.mjs +2 -0
- package/esm2022/lib/interfaces/IPutNotificationRequest.mjs +13 -0
- package/esm2022/lib/interfaces/IRefundAction.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundContactDetails.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundFee.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundList.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundReasons.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundRejectReason.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundStatus.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundStatusHistory.mjs +2 -0
- package/esm2022/lib/interfaces/IRefundsNotifications.mjs +2 -0
- package/esm2022/lib/interfaces/IRemission.mjs +2 -0
- package/esm2022/lib/interfaces/IResubmitRefundRequest.mjs +13 -0
- package/esm2022/lib/interfaces/IStatusHistories.mjs +2 -0
- package/esm2022/lib/interfaces/IStatusHistory.mjs +2 -0
- package/esm2022/lib/interfaces/IserviceRequestCardPayment.mjs +11 -0
- package/esm2022/lib/interfaces/IserviceRequestPbaPayment.mjs +15 -0
- package/esm2022/lib/interfaces/IssueRefundRequest.mjs +11 -0
- package/esm2022/lib/interfaces/NotificationPreviewRequest.mjs +46 -0
- package/esm2022/lib/interfaces/PayhubAntennaRequest.mjs +14 -0
- package/esm2022/lib/interfaces/PaymentToPayhubRequest.mjs +17 -0
- package/esm2022/lib/interfaces/PostIssueRefundRetroRemission.mjs +9 -0
- package/esm2022/lib/interfaces/PostRefundRetroRemission.mjs +18 -0
- package/esm2022/lib/interfaces/RefundsRequest.mjs +9 -0
- package/esm2022/lib/interfaces/UnidentifiedPaymentsRequest.mjs +16 -0
- package/esm2022/lib/interfaces/UnsolicitedPaymentsRequest.mjs +22 -0
- package/esm2022/lib/payment-lib.component.mjs +430 -0
- package/esm2022/lib/payment-lib.module.mjs +181 -0
- package/esm2022/lib/payment-lib.service.mjs +49 -0
- package/esm2022/lib/pipes/capitalize.pipe.mjs +18 -0
- package/esm2022/lib/pipes/ccd-hyphens.pipe.mjs +22 -0
- package/esm2022/lib/pipes/key-value.pipe.mjs +23 -0
- package/esm2022/lib/pipes/sanitize-html.pipe.mjs +20 -0
- package/esm2022/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.mjs +87 -0
- package/esm2022/lib/services/card-details/card-details.service.mjs +39 -0
- package/esm2022/lib/services/case-transactions/case-transactions.service.mjs +39 -0
- package/esm2022/lib/services/notification/notification.service.mjs +70 -0
- package/esm2022/lib/services/orderslist.service.mjs +154 -0
- package/esm2022/lib/services/payment-list/payment-list.service.mjs +40 -0
- package/esm2022/lib/services/payment-view/payment-view.service.mjs +156 -0
- package/esm2022/lib/services/refunds/refunds.service.mjs +120 -0
- package/esm2022/lib/services/shared/error-handler.service.mjs +76 -0
- package/esm2022/lib/services/shared/httpclient/webcomponent.http.client.mjs +64 -0
- package/esm2022/lib/services/shared/logger/console-logger.service.mjs +43 -0
- package/esm2022/lib/services/shared/logger/logger.service.mjs +23 -0
- package/esm2022/lib/services/status-history/status-history.service.mjs +41 -0
- package/esm2022/lib/services/xl-file/xl-file.service.mjs +197 -0
- package/esm2022/public_api.mjs +7 -0
- package/fesm2022/hmcts-ccpay-web-component.mjs +217 -262
- package/fesm2022/hmcts-ccpay-web-component.mjs.map +1 -1
- package/index.d.ts +5 -2340
- package/lib/components/add-remission/add-remission.component.d.ts +208 -0
- package/lib/components/allocate-payments/allocate-payments.component.d.ts +115 -0
- package/lib/components/card-details/card-details.component.d.ts +18 -0
- package/lib/components/case-transactions/case-transactions.component.d.ts +143 -0
- package/lib/components/contact-details/contact-details.component.d.ts +54 -0
- package/lib/components/error-banner/error-banner.component.d.ts +9 -0
- package/lib/components/fee-summary/fee-summary.component.d.ts +72 -0
- package/lib/components/mark-unidentified-payment/mark-unidentified-payment.component.d.ts +52 -0
- package/lib/components/mark-unsolicited-payment/mark-unsolicited-payment.component.d.ts +63 -0
- package/lib/components/notification-preview/notification-preview.component.d.ts +30 -0
- package/lib/components/page-not-found.component.d.ts +5 -0
- package/lib/components/payment-list/payment-list.component.d.ts +19 -0
- package/lib/components/payment-view/payment-view.component.d.ts +110 -0
- package/lib/components/pba-details/pba-details.component.d.ts +10 -0
- package/lib/components/pba-payment/pba-payment.component.d.ts +41 -0
- package/lib/components/process-refund/process-refund.component.d.ts +82 -0
- package/lib/components/processed-payments/processed-payments.component.d.ts +17 -0
- package/lib/components/refund-list/refund-list.component.d.ts +26 -0
- package/lib/components/refund-status/refund-status.component.d.ts +119 -0
- package/lib/components/reports/reports.component.d.ts +49 -0
- package/lib/components/service-request/service-request.component.d.ts +141 -0
- package/lib/components/status-history/status-history.component.d.ts +19 -0
- package/lib/components/table/table.component.d.ts +45 -0
- package/lib/components/unprocessed-payments/unprocessed-payments.component.d.ts +61 -0
- package/lib/interfaces/AddRemissionRequest.d.ts +11 -0
- package/lib/interfaces/AddRetroRemissionRequest.d.ts +5 -0
- package/lib/interfaces/AllocatePaymentRequest.d.ts +31 -0
- package/lib/interfaces/IAllocationPaymentsRequest.d.ts +9 -0
- package/lib/interfaces/IBSPayments.d.ts +19 -0
- package/lib/interfaces/ICardDetails.d.ts +7 -0
- package/lib/interfaces/IFee.d.ts +29 -0
- package/lib/interfaces/INotificationPreview.d.ts +27 -0
- package/lib/interfaces/IOrderReferenceFee.d.ts +9 -0
- package/lib/interfaces/IPatchRefundAction.d.ts +4 -0
- package/lib/interfaces/IPayment.d.ts +35 -0
- package/lib/interfaces/IPaymentFailure.d.ts +13 -0
- package/lib/interfaces/IPaymentGroup.d.ts +11 -0
- package/lib/interfaces/IPaymentStatus.d.ts +11 -0
- package/lib/interfaces/IPaymentView.d.ts +5 -0
- package/lib/interfaces/IPayments.d.ts +4 -0
- package/lib/interfaces/IPutNotificationRequest.d.ts +6 -0
- package/lib/interfaces/IRefundAction.d.ts +4 -0
- package/lib/interfaces/IRefundContactDetails.d.ts +9 -0
- package/lib/interfaces/IRefundFee.d.ts +7 -0
- package/lib/interfaces/IRefundList.d.ts +20 -0
- package/lib/interfaces/IRefundReasons.d.ts +6 -0
- package/lib/interfaces/IRefundRejectReason.d.ts +4 -0
- package/lib/interfaces/IRefundStatus.d.ts +8 -0
- package/lib/interfaces/IRefundStatusHistory.d.ts +5 -0
- package/lib/interfaces/IRefundsNotifications.d.ts +16 -0
- package/lib/interfaces/IRemission.d.ts +14 -0
- package/lib/interfaces/IResubmitRefundRequest.d.ts +9 -0
- package/lib/interfaces/IStatusHistories.d.ts +7 -0
- package/lib/interfaces/IStatusHistory.d.ts +7 -0
- package/lib/interfaces/IserviceRequestCardPayment.d.ts +6 -0
- package/lib/interfaces/IserviceRequestPbaPayment.d.ts +8 -0
- package/lib/interfaces/IssueRefundRequest.d.ts +6 -0
- package/lib/interfaces/NotificationPreviewRequest.d.ts +25 -0
- package/lib/interfaces/PayhubAntennaRequest.d.ts +8 -0
- package/lib/interfaces/PaymentToPayhubRequest.d.ts +11 -0
- package/lib/interfaces/PostIssueRefundRetroRemission.d.ts +6 -0
- package/lib/interfaces/PostRefundRetroRemission.d.ts +11 -0
- package/lib/interfaces/RefundsRequest.d.ts +5 -0
- package/lib/interfaces/UnidentifiedPaymentsRequest.d.ts +7 -0
- package/lib/interfaces/UnsolicitedPaymentsRequest.d.ts +10 -0
- package/lib/payment-lib.component.d.ts +156 -0
- package/lib/payment-lib.module.d.ts +42 -0
- package/lib/payment-lib.service.d.ts +21 -0
- package/lib/pipes/capitalize.pipe.d.ts +8 -0
- package/lib/pipes/ccd-hyphens.pipe.d.ts +8 -0
- package/lib/pipes/key-value.pipe.d.ts +8 -0
- package/lib/pipes/sanitize-html.pipe.d.ts +10 -0
- package/lib/services/bulk-scaning-payment/bulk-scaning-payment.service.d.ts +27 -0
- package/lib/services/card-details/card-details.service.d.ts +17 -0
- package/lib/services/case-transactions/case-transactions.service.d.ts +17 -0
- package/lib/services/notification/notification.service.d.ts +21 -0
- package/lib/services/orderslist.service.d.ts +77 -0
- package/lib/services/payment-list/payment-list.service.d.ts +18 -0
- package/lib/services/payment-view/payment-view.service.d.ts +61 -0
- package/lib/services/refunds/refunds.service.d.ts +36 -0
- package/lib/services/shared/error-handler.service.d.ts +14 -0
- package/lib/services/shared/httpclient/webcomponent.http.client.d.ts +17 -0
- package/lib/services/shared/logger/console-logger.service.d.ts +11 -0
- package/lib/services/shared/logger/logger.service.d.ts +14 -0
- package/lib/services/status-history/status-history.service.d.ts +17 -0
- package/lib/services/xl-file/xl-file.service.d.ts +16 -0
- package/package.json +5 -3
- package/public_api.d.ts +3 -0
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { ChangeDetectorRef, Component, forwardRef, Inject, Input } from '@angular/core';
|
|
2
|
+
import { PaymentViewService } from '../../services/payment-view/payment-view.service';
|
|
3
|
+
import { NotificationService } from '../../services/notification/notification.service';
|
|
4
|
+
import { PostRefundRetroRemission } from '../../interfaces/PostRefundRetroRemission';
|
|
5
|
+
import { OrderslistService } from '../../services/orderslist.service';
|
|
6
|
+
import { AddRemissionComponent } from '../add-remission/add-remission.component';
|
|
7
|
+
import { CommonModule } from '@angular/common';
|
|
8
|
+
import { StatusHistoryComponent } from '../status-history/status-history.component';
|
|
9
|
+
import { ServiceRequestComponent } from '../service-request/service-request.component';
|
|
10
|
+
import { ContactDetailsComponent } from '../contact-details/contact-details.component';
|
|
11
|
+
import { NotificationPreviewComponent } from '../notification-preview/notification-preview.component';
|
|
12
|
+
import { CcdHyphensPipe } from '../../pipes/ccd-hyphens.pipe';
|
|
13
|
+
import { CapitalizePipe } from '../../pipes/capitalize.pipe';
|
|
14
|
+
import { RpxTranslationModule } from 'rpx-xui-translation';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../../services/payment-view/payment-view.service";
|
|
17
|
+
import * as i2 from "../../services/notification/notification.service";
|
|
18
|
+
import * as i3 from "../../services/orderslist.service";
|
|
19
|
+
import * as i4 from "@angular/common";
|
|
20
|
+
import * as i5 from "rpx-xui-translation";
|
|
21
|
+
const BS_ENABLE_FLAG = 'bulk-scan-enabling-fe';
|
|
22
|
+
export class PaymentViewComponent {
|
|
23
|
+
paymentViewService;
|
|
24
|
+
notificationService;
|
|
25
|
+
paymentLibComponent;
|
|
26
|
+
cd;
|
|
27
|
+
OrderslistService;
|
|
28
|
+
isTurnOff;
|
|
29
|
+
isTakePayment;
|
|
30
|
+
caseType;
|
|
31
|
+
orderRef;
|
|
32
|
+
orderStatus;
|
|
33
|
+
orderTotalPayments;
|
|
34
|
+
payment;
|
|
35
|
+
LOGGEDINUSERROLES;
|
|
36
|
+
ISPAYMENTSTATUSENABLED;
|
|
37
|
+
orderParty;
|
|
38
|
+
orderCreated;
|
|
39
|
+
orderCCDEvent;
|
|
40
|
+
orderFeesTotal;
|
|
41
|
+
orderRemissionTotal;
|
|
42
|
+
orderDetail;
|
|
43
|
+
fees;
|
|
44
|
+
isFullyRefund;
|
|
45
|
+
isServiceRequest;
|
|
46
|
+
errorMsg;
|
|
47
|
+
paymentGroup;
|
|
48
|
+
errorMessage;
|
|
49
|
+
ccdCaseNumber;
|
|
50
|
+
selectedOption;
|
|
51
|
+
dcnNumber;
|
|
52
|
+
isStatusAllocated;
|
|
53
|
+
isRemissionsMatch;
|
|
54
|
+
feeId;
|
|
55
|
+
viewStatus;
|
|
56
|
+
isRefundRemission = false;
|
|
57
|
+
isStrategicFixEnable;
|
|
58
|
+
isAddFeeBtnEnabled = false;
|
|
59
|
+
isIssueRefunfBtnEnable = false;
|
|
60
|
+
allowedRolesToAccessRefund = ['payments-refund-approver', 'payments-refund'];
|
|
61
|
+
remissions = [];
|
|
62
|
+
allPaymentsFailure = [];
|
|
63
|
+
selectedPaymentsStatus;
|
|
64
|
+
remissionFeeAmt;
|
|
65
|
+
isRefundRemissionBtnEnable;
|
|
66
|
+
serviceReference;
|
|
67
|
+
isFromServiceRequestPage;
|
|
68
|
+
isFromPaymentDetailPage;
|
|
69
|
+
paymentFees;
|
|
70
|
+
paymentType;
|
|
71
|
+
isContinueBtnDisabled = true;
|
|
72
|
+
viewCompStatus;
|
|
73
|
+
contactDetailsObj;
|
|
74
|
+
notification;
|
|
75
|
+
isConfirmationBtnDisabled;
|
|
76
|
+
refundReference;
|
|
77
|
+
refundAmount;
|
|
78
|
+
templateInstructionType;
|
|
79
|
+
notificationPreview;
|
|
80
|
+
constructor(paymentViewService, notificationService, paymentLibComponent, cd, OrderslistService) {
|
|
81
|
+
this.paymentViewService = paymentViewService;
|
|
82
|
+
this.notificationService = notificationService;
|
|
83
|
+
this.paymentLibComponent = paymentLibComponent;
|
|
84
|
+
this.cd = cd;
|
|
85
|
+
this.OrderslistService = OrderslistService;
|
|
86
|
+
}
|
|
87
|
+
ngAfterContentChecked() {
|
|
88
|
+
this.cd.detectChanges();
|
|
89
|
+
}
|
|
90
|
+
ngOnInit() {
|
|
91
|
+
this.ccdCaseNumber = this.paymentLibComponent.CCD_CASE_NUMBER;
|
|
92
|
+
this.selectedOption = this.paymentLibComponent.SELECTED_OPTION;
|
|
93
|
+
this.dcnNumber = this.paymentLibComponent.DCN_NUMBER;
|
|
94
|
+
this.isTurnOff = this.paymentLibComponent.ISTURNOFF;
|
|
95
|
+
this.serviceReference = this.paymentLibComponent.paymentGroupReference;
|
|
96
|
+
this.viewStatus = 'paymentview';
|
|
97
|
+
this.paymentViewService.getApportionPaymentDetails(this.paymentLibComponent.paymentReference).subscribe(paymentGroup => {
|
|
98
|
+
let fees = [];
|
|
99
|
+
paymentGroup.fees.forEach(fee => {
|
|
100
|
+
this.isRemissionsMatch = false;
|
|
101
|
+
paymentGroup.remissions.forEach(rem => {
|
|
102
|
+
if (rem.fee_code === fee.code) {
|
|
103
|
+
this.isRemissionsMatch = true;
|
|
104
|
+
fee['remissions'] = rem;
|
|
105
|
+
fees.push(fee);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
if (!this.isRemissionsMatch) {
|
|
109
|
+
fees.push(fee);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
paymentGroup.fees = fees;
|
|
113
|
+
this.paymentFees = fees;
|
|
114
|
+
this.paymentGroup = paymentGroup;
|
|
115
|
+
this.paymentGroup.payments = this.paymentGroup.payments.filter(paymentGroupObj => paymentGroupObj['reference'].includes(this.paymentLibComponent.paymentReference));
|
|
116
|
+
const paymentAllocation = this.paymentGroup.payments[0].payment_allocation;
|
|
117
|
+
this.isStatusAllocated = paymentAllocation.length > 0 && paymentAllocation[0].allocation_status === 'Allocated' || paymentAllocation.length === 0;
|
|
118
|
+
this.paymentLibComponent.addPaymentGroup(this.paymentGroup);
|
|
119
|
+
}, (error) => this.errorMessage = error);
|
|
120
|
+
this.paymentViewService.getPaymentFailure(this.paymentLibComponent.paymentReference).subscribe({
|
|
121
|
+
next: (res) => {
|
|
122
|
+
JSON.parse(res).payment_failure_list.reverse().forEach(payments => {
|
|
123
|
+
this.allPaymentsFailure.push(payments.payment_failure_initiated);
|
|
124
|
+
if (payments.payment_failure_closed) {
|
|
125
|
+
this.allPaymentsFailure.push(payments.payment_failure_closed);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
this.allPaymentsFailure = this.allPaymentsFailure.reverse();
|
|
129
|
+
},
|
|
130
|
+
error: (e) => {
|
|
131
|
+
this.allPaymentsFailure = [];
|
|
132
|
+
this.errorMsg = "Server error";
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
get isCardPayment() {
|
|
137
|
+
return this.paymentGroup.payments[0].method === 'card';
|
|
138
|
+
}
|
|
139
|
+
get isTelephonyPayment() {
|
|
140
|
+
return this.paymentGroup.payments[0].channel === 'telephony';
|
|
141
|
+
}
|
|
142
|
+
goToPaymentList() {
|
|
143
|
+
this.paymentLibComponent.viewName = 'payment-list';
|
|
144
|
+
}
|
|
145
|
+
getOverPaymentValue() {
|
|
146
|
+
let feesOverPayment = 0;
|
|
147
|
+
this.paymentGroup.fees.forEach(fee => {
|
|
148
|
+
feesOverPayment += fee.over_payment;
|
|
149
|
+
});
|
|
150
|
+
return feesOverPayment > 0 ? feesOverPayment : this.paymentLibComponent.overPaymentAmount;
|
|
151
|
+
}
|
|
152
|
+
goToServiceRequestPage() {
|
|
153
|
+
this.paymentLibComponent.viewName = 'case-transactions';
|
|
154
|
+
this.paymentLibComponent.TAKEPAYMENT = false;
|
|
155
|
+
this.paymentLibComponent.SERVICEREQUEST = 'true';
|
|
156
|
+
this.paymentLibComponent.isFromServiceRequestPage = true;
|
|
157
|
+
window.location.reload();
|
|
158
|
+
}
|
|
159
|
+
goToCaseTransationPage(event) {
|
|
160
|
+
event.preventDefault();
|
|
161
|
+
if (!this.paymentLibComponent.isFromServiceRequestPage) {
|
|
162
|
+
this.OrderslistService.setnavigationPage('casetransactions');
|
|
163
|
+
this.OrderslistService.setisFromServiceRequestPage(false);
|
|
164
|
+
this.paymentLibComponent.viewName = 'case-transactions';
|
|
165
|
+
this.paymentLibComponent.ISBSENABLE = true;
|
|
166
|
+
this.resetOrderData();
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.OrderslistService.getorderRefs().subscribe((data) => this.orderRef = data);
|
|
170
|
+
this.OrderslistService.getorderCCDEvents().subscribe((data) => this.orderCCDEvent = data);
|
|
171
|
+
this.OrderslistService.getorderCreateds().subscribe((data) => this.orderCreated = data);
|
|
172
|
+
this.OrderslistService.getorderDetail().subscribe((data) => this.orderDetail = data);
|
|
173
|
+
this.OrderslistService.getorderPartys().subscribe((data) => this.orderParty = data);
|
|
174
|
+
this.OrderslistService.getorderRemissionTotals().subscribe((data) => this.orderRemissionTotal = data);
|
|
175
|
+
this.OrderslistService.getorderFeesTotals().subscribe((data) => this.orderFeesTotal = data);
|
|
176
|
+
this.OrderslistService.getoorderTotalPaymentss().subscribe((data) => this.orderTotalPayments = data);
|
|
177
|
+
this.viewStatus = 'order-full-view';
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
addRemission(fee) {
|
|
181
|
+
if (this.chkIsAddRemissionBtnEnable(fee)) {
|
|
182
|
+
this.feeId = fee;
|
|
183
|
+
this.paymentViewService.getApportionPaymentDetails(this.paymentGroup.payments[0].reference).subscribe(paymentGroup => {
|
|
184
|
+
this.paymentGroup = paymentGroup;
|
|
185
|
+
this.paymentGroup.payments = this.paymentGroup.payments.filter(paymentGroupObj => paymentGroupObj['reference'].includes(this.paymentLibComponent.paymentReference));
|
|
186
|
+
this.payment = this.paymentGroup.payments[0];
|
|
187
|
+
this.paymentLibComponent.isFromPaymentDetailPage = true;
|
|
188
|
+
this.viewStatus = 'addremission';
|
|
189
|
+
this.isRefundRemission = true;
|
|
190
|
+
this.cd.detectChanges();
|
|
191
|
+
}, (error) => this.errorMessage = error);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
checkForFees(paymentGroup) {
|
|
195
|
+
if (paymentGroup !== null && paymentGroup !== undefined) {
|
|
196
|
+
if (paymentGroup.fees !== null && paymentGroup.fees !== undefined) {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
processRefund() {
|
|
203
|
+
this.isConfirmationBtnDisabled = true;
|
|
204
|
+
this.errorMessage = '';
|
|
205
|
+
const obj = this.paymentGroup.fees[0];
|
|
206
|
+
this.fees = [{
|
|
207
|
+
id: obj.id,
|
|
208
|
+
code: obj.code,
|
|
209
|
+
version: obj.version,
|
|
210
|
+
apportion_amount: obj.apportion_amount,
|
|
211
|
+
calculated_amount: obj.calculated_amount,
|
|
212
|
+
updated_volume: obj.updated_volume ? obj.updated_volume : obj.volume,
|
|
213
|
+
volume: obj.volume,
|
|
214
|
+
refund_amount: this.getOverPaymentValue()
|
|
215
|
+
}];
|
|
216
|
+
const requestBody = new PostRefundRetroRemission(this.contactDetailsObj, this.fees, this.paymentGroup.payments[0].reference, 'RR037', this.getOverPaymentValue(), 'op');
|
|
217
|
+
this.paymentViewService.postRefundsReason(requestBody).subscribe(response => {
|
|
218
|
+
if (JSON.parse(response)) {
|
|
219
|
+
this.viewCompStatus = '';
|
|
220
|
+
this.viewStatus = 'refundconfirmationpage';
|
|
221
|
+
this.refundReference = JSON.parse(response).refund_reference;
|
|
222
|
+
this.refundAmount = JSON.parse(response).refund_amount;
|
|
223
|
+
}
|
|
224
|
+
}, (error) => {
|
|
225
|
+
this.errorMessage = error;
|
|
226
|
+
this.isConfirmationBtnDisabled = false;
|
|
227
|
+
this.cd.detectChanges();
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
gotoAddressPage(note) {
|
|
231
|
+
if (note) {
|
|
232
|
+
this.notification = { contact_details: note, notification_type: note.notification_type };
|
|
233
|
+
}
|
|
234
|
+
this.errorMessage = '';
|
|
235
|
+
this.viewCompStatus = 'overPaymentAddressCapture';
|
|
236
|
+
}
|
|
237
|
+
addRefundForRemission(payment, remission, fees) {
|
|
238
|
+
//if(!this.chkIsIssueRefundBtnEnable(payment)) {
|
|
239
|
+
this.paymentViewService.getApportionPaymentDetails(payment.reference).subscribe(paymentGroup => {
|
|
240
|
+
this.paymentGroup = paymentGroup;
|
|
241
|
+
this.paymentGroup.payments = this.paymentGroup.payments.filter(paymentGroupObj => paymentGroupObj['reference'].includes(payment.reference));
|
|
242
|
+
this.payment = this.paymentGroup.payments[0];
|
|
243
|
+
this.remissions = remission;
|
|
244
|
+
this.remissionFeeAmt = fees.filter(data => data.code === this.remissions['fee_code'])[0].net_amount;
|
|
245
|
+
this.viewStatus = 'addrefundforremission';
|
|
246
|
+
// const paymentAllocation = this.paymentGroup.payments[0].payment_allocation;
|
|
247
|
+
// this.isStatusAllocated = paymentAllocation.length > 0 && paymentAllocation[0].allocation_status === 'Allocated' || paymentAllocation.length === 0;
|
|
248
|
+
}, (error) => this.errorMessage = error);
|
|
249
|
+
//}
|
|
250
|
+
}
|
|
251
|
+
goToPaymentViewComponent() {
|
|
252
|
+
this.viewCompStatus = '';
|
|
253
|
+
this.viewStatus = 'paymentview';
|
|
254
|
+
}
|
|
255
|
+
issueRefund(paymentgrp) {
|
|
256
|
+
this.paymentLibComponent.addPaymentGroup(this.paymentGroup);
|
|
257
|
+
if (paymentgrp !== null && paymentgrp !== undefined) {
|
|
258
|
+
if (this.chkIsIssueRefundBtnEnable(paymentgrp.payments[0])) {
|
|
259
|
+
// No refund and no over payment --> showIssueRefundPage()
|
|
260
|
+
if (!this.isAnyRefundsForThisCase() && this.getBalanceToBePaid() == 0) {
|
|
261
|
+
this.showIssueRefundPage(paymentgrp);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// No refund and over payment --> showOverPayment()
|
|
265
|
+
if (!this.isAnyRefundsForThisCase() && this.getBalanceToBePaid() > 0) {
|
|
266
|
+
this.showOverPayment();
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
// Refunds > 0 and overPayment == 0 ---> refunds accepted. showIssueRefundPage(s)
|
|
270
|
+
if (this.isAnyRefundsForThisCase() && this.getBalanceToBePaid() == 0) {
|
|
271
|
+
this.showIssueRefundPage(paymentgrp);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
// Refunds > 0 and overPayment > 0 --> refunds in process or Rejected.
|
|
275
|
+
if (this.isAnyRefundsForThisCase() && this.getBalanceToBePaid() > 0) {
|
|
276
|
+
// rejected by fee refunds === refunds by fee it means that refund for the current fee is rejected.
|
|
277
|
+
if (this.paymentLibComponent.isTheCurrentRefundRejectedForTheFee(this.paymentFees.at(0).id.toString())) {
|
|
278
|
+
this.showOverPayment();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// refunds in process Sent for approval,Approved
|
|
282
|
+
this.showIssueRefundPage(paymentgrp);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
isAnyRefundsForThisCase() {
|
|
289
|
+
return (this.paymentLibComponent.refunds != null) && (this.paymentLibComponent.refunds.length > 0);
|
|
290
|
+
}
|
|
291
|
+
showOverPayment() {
|
|
292
|
+
this.viewCompStatus = 'overpayment';
|
|
293
|
+
}
|
|
294
|
+
showIssueRefundPage(paymentgrp) {
|
|
295
|
+
this.paymentGroup = paymentgrp;
|
|
296
|
+
this.viewStatus = 'issuerefund';
|
|
297
|
+
this.isRefundRemission = true;
|
|
298
|
+
this.paymentLibComponent.isFromPaymentDetailPage = true;
|
|
299
|
+
this.isFromPaymentDetailPage = true;
|
|
300
|
+
this.isFromServiceRequestPage = false;
|
|
301
|
+
}
|
|
302
|
+
getBalanceToBePaid() {
|
|
303
|
+
return this.paymentLibComponent.overPaymentAmount;
|
|
304
|
+
}
|
|
305
|
+
getRemissionByFeeCode(feeCode, remissions) {
|
|
306
|
+
if (remissions && remissions.length > 0) {
|
|
307
|
+
for (const remission of remissions) {
|
|
308
|
+
if (remission.fee_code === feeCode) {
|
|
309
|
+
return remission;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
chkIsIssueRefundBtnEnable(payment) {
|
|
316
|
+
if (payment !== null && payment !== undefined) {
|
|
317
|
+
return payment.issue_refund && payment.refund_enable;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
chkIsAddRefundBtnEnable(remission) {
|
|
324
|
+
if (remission !== null && remission !== undefined) {
|
|
325
|
+
return remission.add_refund;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
canItBeRefunded(remission) {
|
|
332
|
+
if (remission !== null && remission !== undefined) {
|
|
333
|
+
if (remission.add_refund == false) {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
if (remission.overall_balance > 0) {
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
chkIsAddRemissionBtnEnable(fee) {
|
|
343
|
+
this.paymentLibComponent.addPaymentGroup(this.paymentGroup);
|
|
344
|
+
if (fee !== null && fee !== undefined) {
|
|
345
|
+
if (this.paymentLibComponent.getRoundedOverPayment() > 0) {
|
|
346
|
+
return fee.add_remission && fee.remission_enable && this.paymentLibComponent.isTheCurrentRefundInProcessForThisFee(fee);
|
|
347
|
+
}
|
|
348
|
+
return fee.add_remission && fee.remission_enable;
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
selectPymentOption(paymentType) {
|
|
355
|
+
this.paymentType = paymentType;
|
|
356
|
+
this.isContinueBtnDisabled = false;
|
|
357
|
+
}
|
|
358
|
+
continuePayment(paymentgrp) {
|
|
359
|
+
if (this.paymentType === 'op') {
|
|
360
|
+
this.isFullyRefund = false;
|
|
361
|
+
this.viewCompStatus = 'overPaymentAddressCapture';
|
|
362
|
+
}
|
|
363
|
+
else if (this.paymentType === 'fp') {
|
|
364
|
+
this.isFullyRefund = true;
|
|
365
|
+
this.paymentGroup = paymentgrp;
|
|
366
|
+
this.viewStatus = 'issuerefund';
|
|
367
|
+
this.viewCompStatus = "";
|
|
368
|
+
this.isRefundRemission = true;
|
|
369
|
+
this.paymentLibComponent.isFromPaymentDetailPage = true;
|
|
370
|
+
this.isFromPaymentDetailPage = true;
|
|
371
|
+
this.isFromServiceRequestPage = this.paymentLibComponent.isFromServiceRequestPage;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
gotoPaymentSelectPage(event) {
|
|
375
|
+
event.preventDefault();
|
|
376
|
+
this.viewCompStatus = 'overpayment';
|
|
377
|
+
}
|
|
378
|
+
getContactDetails(obj) {
|
|
379
|
+
this.contactDetailsObj = obj;
|
|
380
|
+
this.notificationPreview = false;
|
|
381
|
+
this.getTemplateInstructionType(this.paymentGroup.payments[0]);
|
|
382
|
+
this.viewCompStatus = 'overpaymentcheckandanswer';
|
|
383
|
+
}
|
|
384
|
+
resetOrderData() {
|
|
385
|
+
this.OrderslistService.setOrderRef(null);
|
|
386
|
+
this.OrderslistService.setorderCCDEvent(null);
|
|
387
|
+
this.OrderslistService.setorderCreated(null);
|
|
388
|
+
this.OrderslistService.setorderDetail(null);
|
|
389
|
+
this.OrderslistService.setorderParty(null);
|
|
390
|
+
this.OrderslistService.setorderTotalPayments(null);
|
|
391
|
+
this.OrderslistService.setorderRemissionTotal(null);
|
|
392
|
+
this.OrderslistService.setorderFeesTotal(null);
|
|
393
|
+
}
|
|
394
|
+
goToPaymentFailuePage(payment) {
|
|
395
|
+
this.viewStatus = 'payment-failure';
|
|
396
|
+
this.selectedPaymentsStatus = payment;
|
|
397
|
+
}
|
|
398
|
+
goBackToPaymentView(event) {
|
|
399
|
+
event.preventDefault();
|
|
400
|
+
this.viewStatus = 'paymentview';
|
|
401
|
+
}
|
|
402
|
+
getTemplateInstructionType(payment) {
|
|
403
|
+
if (payment == undefined || payment == null) {
|
|
404
|
+
this.templateInstructionType = 'Template';
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
this.templateInstructionType = this.notificationService.getNotificationInstructionType(payment.channel, payment.method);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
showNotificationPreview() {
|
|
411
|
+
this.notificationPreview = true;
|
|
412
|
+
}
|
|
413
|
+
hideNotificationPreview() {
|
|
414
|
+
this.notificationPreview = false;
|
|
415
|
+
}
|
|
416
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentViewComponent, deps: [{ token: i1.PaymentViewService }, { token: i2.NotificationService }, { token: 'PAYMENT_LIB' }, { token: i0.ChangeDetectorRef }, { token: i3.OrderslistService }], target: i0.ɵɵFactoryTarget.Component });
|
|
417
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaymentViewComponent, isStandalone: true, selector: "ccpay-payment-view", inputs: { isTurnOff: "isTurnOff", isTakePayment: "isTakePayment", caseType: "caseType", orderRef: "orderRef", orderStatus: "orderStatus", orderTotalPayments: "orderTotalPayments", payment: "payment", LOGGEDINUSERROLES: "LOGGEDINUSERROLES", ISPAYMENTSTATUSENABLED: "ISPAYMENTSTATUSENABLED", orderParty: "orderParty", orderCreated: "orderCreated", orderCCDEvent: "orderCCDEvent", orderFeesTotal: "orderFeesTotal", orderRemissionTotal: "orderRemissionTotal", orderDetail: "orderDetail", isServiceRequest: "isServiceRequest" }, providers: [{ provide: 'PAYMENT_VIEW', useExisting: forwardRef(() => PaymentViewComponent) }], ngImport: i0, template: "<div class=\"payment-view-section\">\n<ng-container *ngIf=\"viewStatus === 'paymentview' && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n<div class=\"govuk-width-container\">\n\n <div class=\"govuk-breadcrumbs\">\n <ol class=\"govuk-breadcrumbs__list\">\n <li class=\"govuk-breadcrumbs__list-item\">\n <a href=\"javascript:void(0)\" (click)=\"goToCaseTransationPage($event)\" class=\"govuk-back-link\">{{ \"Back\" | rpxTranslate }}</a>\n </li>\n </ol>\n </div>\n\n <main class=\"govuk-main-wrapper govuk-!-padding-top-0\" id=\"main-content\" role=\"main\">\n\n <div *ngIf=\"errorMessage\">\n <div class=\"error-summary\" role=\"group\" aria-labelledby=\"failure-error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-medium error-summary-heading\" id=\"failure-error-summary-heading\">\n {{ \"Payment details could not be retrieved\" | rpxTranslate }}\n </h2>\n <div class=\"govuk-error-summary__body\">\n {{ errorMessage | rpxTranslate }}\n </div>\n </div>\n </div>\n\n <div class=\"payment-view-alignment\" *ngIf=\"!errorMessage && paymentGroup?.payments[0]\">\n\n <input #myInput type='hidden' class='iFrameDrivenImageValue' value='PAYMENTDETAILS'>\n <div class=\"govuk-grid-row\">\n <div class=\"column\">\n <h1 class=\"heading-large govuk-!-margin-top-0\">{{ \"Payment details\" | rpxTranslate }}</h1>\n </div>\n </div>\n <table>\n <tbody>\n\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Service request reference\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ serviceReference }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Payment reference\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.reference }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Payment amount\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">\u00A3{{ paymentGroup?.payments[0]?.amount | number:'.2' }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0]?.over_payment > 0\">\n <td class=\"bold tb-col-w\">{{ \"Over payment\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">\u00A3{{ getOverPaymentValue() | number:'.2' }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0] && paymentGroup?.payments[0]?.document_control_number && !paymentGroup?.payments[0]?.external_reference\">\n <td class=\"bold tb-col-w\">{{ \"Payment asset number\" | rpxTranslate}}(DCN)</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.document_control_number }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0] && paymentGroup?.payments[0]?.document_control_number && !paymentGroup?.payments[0]?.external_reference\">\n <td class=\"bold tb-col-w\">{{ \"Banked date\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.banked_date | date:'dd MMM yyyy' }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0] && paymentGroup?.payments[0]?.external_reference\">\n <td class=\"bold tb-col-w\">{{ \"GovPay Transaction ID\" | rpxTranslate: {gov: \"GovPay\", id: \"ID\"} }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.external_reference }}</td>\n </tr>\n <tr class=\"section\" >\n <td class=\"bold tb-col-w\">{{ \"Payment method\" | rpxTranslate }}</td>\n <td class=\"tb-col-w text-transform\">{{ paymentGroup?.payments[0]?.method | rpxTranslate }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0]?.method === 'payment by account'\" >\n <td class=\"bold tb-col-w\">{{ \"Type\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\" *ngIf=\"paymentGroup?.payments[0]?.method !== 'card'\">{{ \"Credit\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\" *ngIf=\"paymentGroup?.payments[0]?.method === 'card'\">{{ \"Card\" | rpxTranslate }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Channel\" | rpxTranslate }}</td>\n <td class=\"tb-col-w text-transform\">{{ paymentGroup?.payments[0]?.channel | rpxTranslate }}</td>\n </tr>\n <!-- <tr class=\"section\">\n <td class=\"bold tb-col-w\">Method</td>\n <td *ngIf=\"paymentGroup?.payments[0]?.method !== 'card'\">{{ paymentGroup?.payments[0]?.method }}</td>\n <td *ngIf=\"paymentGroup?.payments[0]?.method === 'card'\">CARD</td>\n </tr> -->\n <!-- <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0]?.channel !== 'telephony'\">\n <td class=\"bold tb-col-w\">Status</td>\n <td>{{ paymentGroup?.payments[0]?.status }}</td>\n </tr> -->\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0]?.payment_allocation[0] !== undefined\">\n <td class=\"bold tb-col-w\">{{ \"Allocaton status\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.payment_allocation[0]?.allocation_status | rpxTranslate }}</td>\n </tr>\n\n <tr *ngIf=\"paymentGroup?.payments[0].organisation_name\">\n <td class=\"bold tb-col-w\">{{ \"PBA account name\" | rpxTranslate: {pba: \"PBA\"} }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.organisation_name }}</td>\n </tr>\n\n <tr *ngIf=\"paymentGroup?.payments[0].account_number\">\n <td class=\"bold tb-col-w\">PBA {{ \"number\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.account_number }}</td>\n </tr>\n\n <tr *ngIf=\"paymentGroup?.payments[0].customer_reference\">\n <td class=\"bold tb-col-w\">{{ \"Customer internal reference\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.customer_reference }}</td>\n </tr>\n\n </tbody>\n </table>\n\n <div>\n <!-- Status histories -->\n <ccpay-payment-statuses *ngIf=\"isStatusAllocated\" [isTakePayment]=\"isTakePayment\"></ccpay-payment-statuses>\n </div>\n <div class=\"remission\">\n <button [disabled]=\"!chkIsIssueRefundBtnEnable(paymentGroup?.payments[0])\" (click)=\"issueRefund(paymentGroup)\" class=\"govuk-button govuk-button--secondary\">{{ \"Issue refund\" | rpxTranslate }}</button>\n </div>\n<div *ngIf=\"ISPAYMENTSTATUSENABLED\">\n <div class=\"column\">\n <h2 class=\"heading-medium\">{{ \"Disputed payment history\" | rpxTranslate }}</h2>\n </div>\n \n <div>\n <table>\n <thead>\n <tr>\n <th>{{ \"Status\" | rpxTranslate }}</th>\n <th>{{ \"Amount\" | rpxTranslate }}</th>\n <th>{{ \"Date\" | rpxTranslate }}</th>\n <th>{{ \"Payment reference\" | rpxTranslate }}</th>\n <th>{{ \"Event\" | rpxTranslate }}</th>\n <th></th>\n </tr>\n </thead> \n <tbody *ngIf=\"!errorMsg && allPaymentsFailure.length > 0\">\n <tr *ngFor=\"let payment of allPaymentsFailure\">\n <td>{{ payment.status | capitalize | rpxTranslate }}</td>\n <td>\u00A3{{ payment.disputed_amount | number:'.2' }}</td>\n <td>{{(payment.representment_date ? payment.representment_date : payment.failure_event_date_time) | date:'dd MMM yyyy'}}</td>\n <td>{{ payment.payment_reference }}</td>\n <td >{{ payment.failure_type | rpxTranslate }}</td>\n <td>\n \n <a href=\"javascript:void(0)\" (click)=\"goToPaymentFailuePage(payment)\">{{ \"Show detail\" | rpxTranslate }}</a>\n\n </td>\n </tr>\n </tbody>\n <tbody *ngIf=\"errorMsg || allPaymentsFailure.length === 0\">\n <tr>\n <td colspan=\"6\"> {{ \"No disputed payment history available.\" | rpxTranslate }} </td>\n </tr>\n </tbody>\n </table>\n </div>\n <br/>\n <br/>\n </div>\n \n <div *ngIf=\"checkForFees(paymentGroup)\">\n <div *ngIf=\"paymentGroup.fees.length > 0\">\n <div class=\"column\">\n <br/>\n <br/>\n <h2 class=\"heading-large\">{{ \"Fee and remission details\" | rpxTranslate }}</h2>\n\n </div>\n </div>\n\n <div *ngFor=\"let fee of paymentGroup.fees\">\n <table class=\"table\">\n <tbody>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Description\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ \"Application for\" | rpxTranslate }} {{ fee.description | rpxTranslate }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Fee code\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ fee?.code }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\" [ngClass]=\"{'tr-border': !fee.apportion_amount && !fee.remissions && !isTurnOff }\">{{ \"Fee amount\" | rpxTranslate }}</td>\n <td [ngClass]=\"{'tr-border': !fee.apportion_amount && !fee.remissions && !isTurnOff}\">\u00A3{{ fee?.calculated_amount | number:'.2' }}</td>\n </tr>\n\n <tr *ngIf=\"fee.apportion_amount\">\n <td class=\"bold tb-col-w tr-border\" [ngClass]=\"{'tr-border': !fee.remissions}\">{{ \"Allocated amount\" | rpxTranslate }}</td>\n <td [ngClass]=\"{'tr-border': !fee.remissions}\">\u00A3{{ fee?.apportion_amount | number:'.2' }}</td>\n </tr>\n\n </tbody>\n </table>\n <button [disabled]=\"!chkIsAddRemissionBtnEnable(fee)\" (click)=\"addRemission(fee)\" class=\"govuk-button govuk-button--secondary\"> {{ \"Add remission\" | rpxTranslate }}</button>\n </div>\n\n <!-- remissions -->\n <div class=\"order-class\">\n <div class=\"column\">\n <table class=\"govuk-table\">\n <thead class=\"govuk-table__head\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__header col-24 whitespace-inherit\" scope=\"col\">{{ \"Help with fees or remission code\" | rpxTranslate }}</td>\n <td class=\"govuk-table__header col-27 whitespace-inherit\" scope=\"col\">{{ \"Reference\" | rpxTranslate }}</td>\n <td class=\"govuk-table__header whitespace-inherit\" scope=\"col\">{{ \"Fee\" | rpxTranslate }}</td>\n <td class=\"govuk-table__header whitespace-inherit\" scope=\"col\">{{ \"Remission Amount\" | rpxTranslate }}</td>\n <td class=\"govuk-table__header whitespace-inherit refundBtn\" scope=\"col\"></td>\n </tr>\n </thead>\n <tbody class=\"govuk-table__body\" *ngFor=\"let remission of paymentGroup.remissions\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell whitespace-inherit\">{{ remission?.hwf_reference }}</td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{ remission?.remission_reference }}</td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{ remission?.fee_code }}</td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{ remission?.hwf_amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n <td class=\"govuk-table__cell refundBtn whitespace-inherit\" >\n <button [disabled]=\"!canItBeRefunded(remission)\" (click)=\"addRefundForRemission(paymentGroup.payments[0],remission,paymentGroup.fees)\" class=\"govuk-button govuk-button--secondary\"> Add refund</button>\n </td>\n </tr>\n </tbody>\n\n\n </table>\n </div></div>\n\n <div *ngIf=\"paymentGroup.remissions?.length === 0\">\n <span class=\"mar-17\" >{{ \"No help with fees or remissions.\" | rpxTranslate }}</span>\n </div>\n\n </div>\n </div>\n </main>\n</div>\n\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'addremission' && feeId && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n<ccpay-add-remission \n[isTurnOff]=\"isTurnOff\"\n[isStrategicFixEnable]=\"isStrategicFixEnable\"\n[viewCompStatus]= \"viewStatus\"\n[fee]=\"feeId\"\n[payment] = \"payment\"\n[orderStatus] =\"paymentGroup.payments[0].status\"\n[paidAmount]= \"paymentGroup.payments[0].amount\"\n[isRefundRemission]=\"isRefundRemission\"\n[caseType]=\"caseType\"\n[paymentGroupRef]=\"paymentGroup.payment_group_reference\"\n[isFromPaymentDetailPage] = \"true\"\n[ccdCaseNumber]=\"ccdCaseNumber\"\n[orderFeesTotal] = \"orderFeesTotal\"\n[orderTotalPayments] = \"orderTotalPayments\"\n[orderRemissionTotal] = \"orderRemissionTotal\"\n[orderRef] = \"orderRef\"\n[orderCreated] = \"orderCreated\"\n[orderParty] = \"orderParty\"\n[orderCCDEvent] = \"orderCCDEvent\"\n[orderDetail] = \"orderDetail\"\n[LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"></ccpay-add-remission>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'addrefundforremission' && payment && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n\n<ccpay-add-remission\n[isTurnOff]=\"isTurnOff\"\n[isStrategicFixEnable]=\"isStrategicFixEnable\"\n[viewCompStatus]= \"viewStatus\"\n[payment]=\"payment\"\n[orderStatus] =\"orderStatus\"\n[paidAmount]= \"orderTotalPayments\"\n[isRefundRemission]=\"isRefundRemission\"\n[caseType]=\"caseType\"\n[feeamount]=\"remissionFeeAmt\"\n[remission] = \"remissions\"\n[isFromServiceRequestPage]=\"false\"\n[paymentGroupRef]=\"paymentGroup.payment_group_reference\"\n[ccdCaseNumber]=\"ccdCaseNumber\"\n[orderFeesTotal] = \"orderFeesTotal\"\n[orderTotalPayments] = \"orderTotalPayments\"\n[orderRemissionTotal] = \"orderRemissionTotal\"\n[orderRef] = \"orderRef\"\n[orderCreated] = \"orderCreated\"\n[orderParty] = \"orderParty\"\n[orderCCDEvent] = \"orderCCDEvent\"\n[orderDetail] = \"orderDetail\"\n[LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"></ccpay-add-remission>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'issuerefund' && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n <ccpay-add-remission \n [isTurnOff]=\"isTurnOff\"\n [isStrategicFixEnable]=\"isStrategicFixEnable\"\n [payment] = 'paymentGroup.payments[0]'\n [viewCompStatus]= \"viewStatus\"\n [orderStatus] =\"paymentGroup.payments[0].status\"\n [paidAmount]= \"paymentGroup.payments[0].amount\"\n [isRefundRemission]=\"isRefundRemission\"\n [caseType]=\"caseType\"\n [isFromServiceRequestPage]=\"isFromServiceRequestPage\"\n [isFromPaymentDetailPage] = \"isFromPaymentDetailPage\"\n [paymentGroupRef]=\"paymentGroup.payment_group_reference\"\n [ccdCaseNumber]=\"ccdCaseNumber\"\n [orderFeesTotal] = \"orderFeesTotal\"\n [orderTotalPayments] = \"orderTotalPayments\"\n [orderRemissionTotal] = \"orderRemissionTotal\"\n [orderRef] = \"orderRef\"\n [orderCreated] = \"orderCreated\"\n [orderParty] = \"orderParty\"\n [orderCCDEvent] = \"orderCCDEvent\"\n [orderDetail] = \"orderDetail\"\n [fees] =\"paymentFees\"\n [isFullyRefund] = \"isFullyRefund\"\n [LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\">\n \n ></ccpay-add-remission>\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'order-full-view' && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n <ccpay-service-request\n [viewStatus] = \"viewStatus\"\n [orderRef] = \"orderRef\"\n [orderStatus] = \"orderStatus\"\n [orderCreated] = \"orderCreated\"\n [orderParty] = \"orderParty\"\n [orderCCDEvent] = \"orderCCDEvent\"\n [orderDetail] = \"orderDetail\"\n [LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"\n [takePayment] = \"isTakePayment\"\n [ccdCaseNumber] = \"ccdCaseNumber\"\n [orderFeesTotal] = \"orderFeesTotal\"\n [orderTotalPayments] = \"orderTotalPayments\"\n [orderRemissionTotal] = \"orderRemissionTotal\"\n [isServiceRequest] = \"isServiceRequest\"\n (goToServiceRquestComponent) = \"goToServiceRequestPage()\"\n>\n</ccpay-service-request>\n\n</ng-container>\n</div>\n<div class=\"over-payment\">\n<ng-container *ngIf=\"viewCompStatus === 'overpayment'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='OVERPAYMENTPAGE'> \n <h1 class=\"heading-large\">{{ \"Issue refund\" | rpxTranslate }}</h1>\n <h1 class=\"heading-medium\">{{ \"Case reference\" | rpxTranslate}}: {{ccdCaseNumber | ccdHyphens }}</h1>\n <span id=\"how-contacted-conditional-hint govuk-font19px\" class=\"form-hint\">\n {{ \"Payment reference\" | rpxTranslate }}: {{paymentGroup?.payments[0]?.reference}}\n </span>\n<div class=\"govuk-form-group\">\n <fieldset class=\"govuk-fieldset\">\n <legend class=\"govuk-fieldset__legend govuk-fieldset__legend--l\">\n <h1 class=\"heading-medium\">{{ \"Select payment to refund\" | rpxTranslate }}</h1>\n </legend>\n <div class=\"govuk-radios\" data-module=\"govuk-radios\">\n <div class=\"govuk-radios__item\">\n <input class=\"govuk-radios__input\" id=\"over-payment\" name=\"over-payment\" type=\"radio\" (click)=\"selectPymentOption('op')\" value=\"op\">\n <label class=\"govuk-label govuk-radios__label govuk-font19px\" for=\"where-do-you-live\">\n {{ \"Over payment\" | rpxTranslate }} \u00A3{{getOverPaymentValue() | number:'.2'}}\n </label>\n </div>\n <div class=\"govuk-radios__item\">\n <input class=\"govuk-radios__input\" id=\"full-payment\" name=\"over-payment\" type=\"radio\" (click)=\"selectPymentOption('fp')\" value=\"fp\">\n <label class=\"govuk-label govuk-radios__label govuk-font19px\" for=\"where-do-you-live-2\">\n {{ \"Full payment\" | rpxTranslate }} \u00A3{{paymentGroup?.payments[0]?.amount | number:'.2'}}\n </label>\n </div>\n </div>\n <button class=\"govuk-button govuk-button--secondary over-payment-alignment govuk-font19px\"\n (click)=\"goToPaymentViewComponent()\"> {{ \"Previous\" | rpxTranslate }}</button>\n <button \n (click)=\"continuePayment(paymentGroup)\"\n [disabled]=\"isContinueBtnDisabled\"\n [ngClass]='isContinueBtnDisabled ? \"button button--disabled govuk-!-margin-right-1 govuk-font19px\" : \"button govuk-!-margin-right-1 govuk-font19px\"'\n class=\"govuk-button\"> {{ \"Continue\" | rpxTranslate }}</button>\n </fieldset>\n</div>\n</ng-container>\n\n<ng-container *ngIf=\"viewCompStatus === 'overPaymentAddressCapture'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='OVERPAYMENTADDRESSCAPTUREPAGE'> \n <h1 class=\"govuk-heading-l\">{{ \"Issue refund\" | rpxTranslate }}</h1>\n <h2 class=\"govuk-heading-m govuk-font19px\">{{ \"Case reference\" | rpxTranslate }}: {{ccdCaseNumber | ccdHyphens }}</h2>\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint govuk-font19px\">\n {{ \"Payment reference\" | rpxTranslate }}: {{paymentGroup?.payments[0]?.reference}}\n </span>\n<ccpay-contact-details \n[addressObj] = notification\n(assignContactDetails)=\"getContactDetails($event)\"\n(redirectToIssueRefund)=\"gotoPaymentSelectPage($event)\" ></ccpay-contact-details>\n<p>\n <a (click)=\"goToCaseTransationPage($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n {{ \"Cancel\" | rpxTranslate }}\n </a>\n</p>\n</ng-container>\n\n<ng-container *ngIf=\"viewCompStatus === 'overpaymentcheckandanswer'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDREFUNDFORREMISSION'> \n <div class=\"govuk-warning-text\">\n \n <h1 class=\"heading-large\"> {{ \"Check your answers\" | rpxTranslate }}</h1>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Payment reference\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\"> {{paymentGroup.payments[0].reference}} </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Payment amount\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{paymentGroup.payments[0].amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Fee amount\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{paymentGroup?.fees[0]?.net_amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Refund amount\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{getOverPaymentValue() | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Refund reason\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{ \"Over payment\" | rpxTranslate }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Send to\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{orderParty}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Send via\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell whitespace-inherit\">\n <div *ngIf=\"contactDetailsObj?.notification_type === 'EMAIL'\" class=\"contactDetails-width\">\n <strong>{{ \"Email\" | rpxTranslate }}</strong>\n <br/>\n {{contactDetailsObj?.email?.trim()}}\n </div>\n <div *ngIf=\"contactDetailsObj?.notification_type === 'LETTER'\" class=\"contactDetails-width\">\n <strong>{{ \"Post\" | rpxTranslate }}</strong>\n <br/>\n {{contactDetailsObj?.address_line?.trim()}} {{contactDetailsObj?.city?.trim()}} {{contactDetailsObj?.county?.trim()}} {{contactDetailsObj?.country?.trim()}} {{contactDetailsObj?.postal_code?.trim()}}\n </div>\n <a (click)=\"gotoAddressPage(contactDetailsObj)\" class=\"govuk-link right\" >{{ \"Change\" | rpxTranslate }}</a>\n </td>\n </tr>\n\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Notification\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{templateInstructionType}}\n <a *ngIf=\"!notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"showNotificationPreview()\">\n {{ \"Preview\" | rpxTranslate }}\n </a>\n <a *ngIf=\"notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"hideNotificationPreview()\">\n {{ \"Hide Preview\" | rpxTranslate }}\n </a>\n </td>\n </tr>\n </table>\n\n <app-notification-preview *ngIf=\"notificationPreview\" \n [payment]=\"paymentGroup.payments[0]\" \n [contactDetails]=\"contactDetailsObj\"\n [refundReason]=\"'RR037'\"\n [refundAmount]=\"getOverPaymentValue()\"></app-notification-preview>\n\n <button type=\"submit\" class=\"button govuk-button--secondary over-payment-alignment govuk-font19px\" (click)=\"gotoAddressPage(contactDetailsObj)\">{{ \"Previous\" | rpxTranslate }}</button>\n <button type=\"submit\"\n [ngClass]='isContinueBtnDisabled ? \"button button--disabled govuk-!-margin-right-1 govuk-font19px\" : \"button govuk-!-margin-right-1 govuk-font19px\"'\n (click)=\"processRefund()\">\n {{ \"Submit refund\" | rpxTranslate }}\n </button>\n <p>\n <a href=\"javascript:void(0)\" (click)=\"goToCaseTransationPage($event)\" class=\"govuk-link govuk-font19px\" data-module=\"govuk-button\">\n {{ \"Cancel\" | rpxTranslate }}\n </a>\n </p>\n\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'refundconfirmationpage' && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='RETROREMISSIONREFUNDCONFIRMATIONPAGE'> \n <div class=\"govuk-grid-row pagesize\">\n <div >\n <div class=\"govuk-panel govuk-panel--confirmation\">\n <h1 class=\"govuk-panel_view_title\">\n {{ \"Refund submitted\" | rpxTranslate }}\n </h1>\n \n <div class=\"govuk-panel__body\">\n <p class=\"govuk-body white\"><strong class=\"white\">{{ \"Refund reference\" | rpxTranslate}}: {{refundReference}}</strong></p>\n </div>\n \n </div>\n <h2 class=\"govuk-heading-l\">{{\"What happens next\" | rpxTranslate }}</h2>\n <p class=\"govuk-body\">\n {{\"A refund request for\" | rpxTranslate }} {{refundAmount | currency:'GBP':'symbol-narrow':'1.2-2' }} {{ \"has been created and will be passed to a team leader to approve.\" | rpxTranslate }}\n </p>\n <p class=\"govuk-body\">\n <a href=\"javascript:void(0)\" (click)=\"goToCaseTransationPage($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">\n {{ \"Return to case\" | rpxTranslate }}\n </a>\n </p>\n </div>\n </div>\n\n</ng-container>\n</div>\n\n<ng-container *ngIf=\"viewStatus === 'payment-failure'\">\n <div class=\"payment-failure-alignment\">\n <div class=\"govuk-breadcrumbs\">\n <ol class=\"govuk-breadcrumbs__list\">\n <li class=\"govuk-breadcrumbs__list-item\">\n <a href=\"javascript:void(0)\" (click)=\"goBackToPaymentView($event)\" class=\"govuk-back-link\">{{ \"Back\" | rpxTranslate }}</a>\n </li>\n </ol>\n </div>\n <div class=\"govuk-grid-row\">\n <div class=\"column\">\n <h1 class=\"heading-large govuk-!-margin-top-0\">{{ \"Failure event details\" | rpxTranslate }}</h1>\n </div>\n </div>\n <table>\n <tbody>\n\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Failure reference\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.failure_reference}}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Failure reason\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.failure_reason | rpxTranslate}}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Payment reference\" | rpxTranslate }}</td>\n <td>{{ selectedPaymentsStatus.payment_reference }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Payment amount\" | rpxTranslate }}</td>\n <td> \u00A3{{ paymentGroup?.payments[0]?.amount | number:'.2' }}</td>\n\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Disputed amount\" | rpxTranslate }}</td>\n <td>\t\u00A3{{selectedPaymentsStatus.disputed_amount | number:'.2'}}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Additional information\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.additional_reference }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Failure type\" | rpxTranslate }}</td>\n <td>\t{{ selectedPaymentsStatus.failure_type }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Failure event date and time\" | rpxTranslate }}</td>\n <td> {{ selectedPaymentsStatus.failure_event_date_time | date:'dd MMM yyyy HH:mm:ss' }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"selectedPaymentsStatus.has_amount_debited\">\n <td class=\"bold\">{{ \"Has disputed amount debited\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.has_amount_debited}}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"selectedPaymentsStatus.representment_status\">\n <td class=\"bold\">{{ \"Status following representation of payment\" | rpxTranslate }}</td>\n <td>\t{{(selectedPaymentsStatus.representment_status === 'Yes' || selectedPaymentsStatus.representment_status === 'yes') ? 'Success' : 'Failure'}}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"selectedPaymentsStatus.representment_date\">\n <td class=\"bold\">{{ \"Date payment represented\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.representment_date | date:'dd MMM yyyy HH:mm:ss'}}</td>\n </tr>\n </tbody>\n </table>\n\n <div>\n </div>\n </div>\n</ng-container>\n", styles: [".payment-view-section .tb-col-w{width:330px}.payment-view-section .tr-border{border-bottom:2px solid}.payment-view-section .payment-view-alignment{margin-left:30px}.payment-view-section .govuk-button{font-size:19px;float:left;margin-top:2em}.payment-view-section .remission{margin-bottom:7em}.payment-view-section .govuk-error-summary__title{font-size:24px!important}.payment-view-section .govuk-table__cell,.payment-view-section .govuk-table__header{padding:0;line-height:1.3;vertical-align:middle}.payment-view-section .govuk-table__row{line-height:1.3}.payment-view-section .govuk-table__cell:last-child{text-align:right}.payment-view-section .text-transform:first-letter{text-transform:capitalize}.payment-view-section .govuk-link{cursor:pointer}.payment-view-section .mar-17{font-size:19px!important}.over-payment .pagesize{margin:2em;width:97%}.over-payment .contactDetails-width{width:70%}.over-payment .margin-top10px{margin-top:20px}.over-payment .govuk-font19px{font-size:19px!important}.over-payment .margin-top--size{margin-top:-30px}.over-payment .over-payment-alignment{margin-right:10px}.over-payment .govuk-button{font-size:19px;float:left;margin-top:2em}.over-payment td.govuk-table__cell{width:50%}.over-payment .govuk-warning-text__text,.over-payment .govuk-label--s,.over-payment .label_payment__symbol{font-size:19px;font-weight:400}.over-payment .inline-error-class{outline:3px solid #a71414;outline-offset:0;border-color:#a71414}.over-payment .inline-error-message{color:#a71414;border-color:#a71414;font-weight:700;margin-top:10px;font-size:20px}.over-payment .govuk-button-group{padding-top:2em}.over-payment .heading-medium{margin-top:.875em}.over-payment .heading-large{margin-top:.25em}.over-payment .govuk-panel--confirmation{color:#fff;background:#00703c}.over-payment .govuk-panel__title{font-size:5rem}.over-payment .govuk-body-m,.over-payment .govuk-body{font-size:2.1875rem}.over-payment .govuk-link{cursor:pointer}.over-payment .govuk-radios__conditional{padding-top:12px!important}.over-payment .right{float:right;cursor:pointer}.over-payment .radio{float:right}.over-payment .white{color:#fff}.whitespace-inherit{white-space:inherit!important}.govuk-panel_view_title{margin-top:0;margin-bottom:30px;color:#fff;font-family:nta,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-weight:700}.white{color:#fff}.hmcts-currency-input__symbol{font-family:nta,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;line-height:initial;position:absolute;font-weight:200;padding:8px 10px;height:40px;box-sizing:border-box;background-color:#dee0e2;border:2px solid #0b0c0c}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i4.NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => i4.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i4.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i0.forwardRef(() => i4.DecimalPipe), name: "number" }, { kind: "pipe", type: i0.forwardRef(() => i4.CurrencyPipe), name: "currency" }, { kind: "pipe", type: i0.forwardRef(() => i4.DatePipe), name: "date" }, { kind: "component", type: i0.forwardRef(() => AddRemissionComponent), selector: "ccpay-add-remission", inputs: ["fee", "fees", "payment", "remission", "ccdCaseNumber", "caseType", "viewCompStatus", "paymentGroupRef", "isTurnOff", "isRefundRemission", "isStrategicFixEnable", "paidAmount", "isFromRefundListPage", "isFromPaymentDetailPage", "isFromServiceRequestPage", "isFullyRefund", "feeamount", "refundPaymentReference", "isFromRefundStatusPage", "changeRefundReason", "isServiceRequest", "LOGGEDINUSERROLES", "orderDetail", "orderRef", "orderStatus", "orderParty", "orderCreated", "orderCCDEvent", "takepayment", "orderFeesTotal", "orderTotalPayments", "orderRemissionTotal"], outputs: ["cancelRemission", "refundListReason", "refundListAmount", "refundFees"] }, { kind: "component", type: i0.forwardRef(() => StatusHistoryComponent), selector: "ccpay-payment-statuses", inputs: ["isTakePayment"] }, { kind: "component", type: i0.forwardRef(() => ServiceRequestComponent), selector: "ccpay-service-request", inputs: ["LOGGEDINUSERROLES", "viewStatus", "orderDetail", "orderRef", "orderStatus", "orderParty", "orderCreated", "orderCCDEvent", "orderFeesTotal", "orderTotalPayments", "orderRemissionTotal", "paymentGroupList", "takePayment", "ccdCaseNumber", "isServiceRequest"], outputs: ["goToServiceRquestComponent"] }, { kind: "component", type: i0.forwardRef(() => ContactDetailsComponent), selector: "ccpay-contact-details", inputs: ["isEditOperation", "isEditOperationInRefundList", "addressObj"], outputs: ["assignContactDetails", "assignContactDetailsInFefundsList", "redirectToIssueRefund"] }, { kind: "component", type: i0.forwardRef(() => NotificationPreviewComponent), selector: "app-notification-preview", inputs: ["payment", "contactDetails", "refundReason", "refundAmount", "paymentReference", "refundReference", "previewJourney", "notificationSent"], outputs: ["notificationPreviewEvent"] }, { kind: "pipe", type: i0.forwardRef(() => CcdHyphensPipe), name: "ccdHyphens" }, { kind: "pipe", type: i0.forwardRef(() => CapitalizePipe), name: "capitalize" }, { kind: "ngmodule", type: i0.forwardRef(() => RpxTranslationModule) }, { kind: "pipe", type: i0.forwardRef(() => i5.RpxTranslatePipe), name: "rpxTranslate" }] });
|
|
418
|
+
}
|
|
419
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentViewComponent, decorators: [{
|
|
420
|
+
type: Component,
|
|
421
|
+
args: [{ selector: 'ccpay-payment-view', providers: [{ provide: 'PAYMENT_VIEW', useExisting: forwardRef(() => PaymentViewComponent) }], imports: [
|
|
422
|
+
CommonModule, forwardRef(() => AddRemissionComponent),
|
|
423
|
+
StatusHistoryComponent, forwardRef(() => ServiceRequestComponent),
|
|
424
|
+
ContactDetailsComponent,
|
|
425
|
+
NotificationPreviewComponent,
|
|
426
|
+
CcdHyphensPipe,
|
|
427
|
+
CapitalizePipe,
|
|
428
|
+
RpxTranslationModule
|
|
429
|
+
], standalone: true, template: "<div class=\"payment-view-section\">\n<ng-container *ngIf=\"viewStatus === 'paymentview' && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n<div class=\"govuk-width-container\">\n\n <div class=\"govuk-breadcrumbs\">\n <ol class=\"govuk-breadcrumbs__list\">\n <li class=\"govuk-breadcrumbs__list-item\">\n <a href=\"javascript:void(0)\" (click)=\"goToCaseTransationPage($event)\" class=\"govuk-back-link\">{{ \"Back\" | rpxTranslate }}</a>\n </li>\n </ol>\n </div>\n\n <main class=\"govuk-main-wrapper govuk-!-padding-top-0\" id=\"main-content\" role=\"main\">\n\n <div *ngIf=\"errorMessage\">\n <div class=\"error-summary\" role=\"group\" aria-labelledby=\"failure-error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-medium error-summary-heading\" id=\"failure-error-summary-heading\">\n {{ \"Payment details could not be retrieved\" | rpxTranslate }}\n </h2>\n <div class=\"govuk-error-summary__body\">\n {{ errorMessage | rpxTranslate }}\n </div>\n </div>\n </div>\n\n <div class=\"payment-view-alignment\" *ngIf=\"!errorMessage && paymentGroup?.payments[0]\">\n\n <input #myInput type='hidden' class='iFrameDrivenImageValue' value='PAYMENTDETAILS'>\n <div class=\"govuk-grid-row\">\n <div class=\"column\">\n <h1 class=\"heading-large govuk-!-margin-top-0\">{{ \"Payment details\" | rpxTranslate }}</h1>\n </div>\n </div>\n <table>\n <tbody>\n\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Service request reference\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ serviceReference }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Payment reference\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.reference }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Payment amount\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">\u00A3{{ paymentGroup?.payments[0]?.amount | number:'.2' }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0]?.over_payment > 0\">\n <td class=\"bold tb-col-w\">{{ \"Over payment\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">\u00A3{{ getOverPaymentValue() | number:'.2' }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0] && paymentGroup?.payments[0]?.document_control_number && !paymentGroup?.payments[0]?.external_reference\">\n <td class=\"bold tb-col-w\">{{ \"Payment asset number\" | rpxTranslate}}(DCN)</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.document_control_number }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0] && paymentGroup?.payments[0]?.document_control_number && !paymentGroup?.payments[0]?.external_reference\">\n <td class=\"bold tb-col-w\">{{ \"Banked date\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.banked_date | date:'dd MMM yyyy' }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0] && paymentGroup?.payments[0]?.external_reference\">\n <td class=\"bold tb-col-w\">{{ \"GovPay Transaction ID\" | rpxTranslate: {gov: \"GovPay\", id: \"ID\"} }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.external_reference }}</td>\n </tr>\n <tr class=\"section\" >\n <td class=\"bold tb-col-w\">{{ \"Payment method\" | rpxTranslate }}</td>\n <td class=\"tb-col-w text-transform\">{{ paymentGroup?.payments[0]?.method | rpxTranslate }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0]?.method === 'payment by account'\" >\n <td class=\"bold tb-col-w\">{{ \"Type\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\" *ngIf=\"paymentGroup?.payments[0]?.method !== 'card'\">{{ \"Credit\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\" *ngIf=\"paymentGroup?.payments[0]?.method === 'card'\">{{ \"Card\" | rpxTranslate }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Channel\" | rpxTranslate }}</td>\n <td class=\"tb-col-w text-transform\">{{ paymentGroup?.payments[0]?.channel | rpxTranslate }}</td>\n </tr>\n <!-- <tr class=\"section\">\n <td class=\"bold tb-col-w\">Method</td>\n <td *ngIf=\"paymentGroup?.payments[0]?.method !== 'card'\">{{ paymentGroup?.payments[0]?.method }}</td>\n <td *ngIf=\"paymentGroup?.payments[0]?.method === 'card'\">CARD</td>\n </tr> -->\n <!-- <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0]?.channel !== 'telephony'\">\n <td class=\"bold tb-col-w\">Status</td>\n <td>{{ paymentGroup?.payments[0]?.status }}</td>\n </tr> -->\n <tr class=\"section\" *ngIf=\"paymentGroup?.payments[0]?.payment_allocation[0] !== undefined\">\n <td class=\"bold tb-col-w\">{{ \"Allocaton status\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.payment_allocation[0]?.allocation_status | rpxTranslate }}</td>\n </tr>\n\n <tr *ngIf=\"paymentGroup?.payments[0].organisation_name\">\n <td class=\"bold tb-col-w\">{{ \"PBA account name\" | rpxTranslate: {pba: \"PBA\"} }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.organisation_name }}</td>\n </tr>\n\n <tr *ngIf=\"paymentGroup?.payments[0].account_number\">\n <td class=\"bold tb-col-w\">PBA {{ \"number\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.account_number }}</td>\n </tr>\n\n <tr *ngIf=\"paymentGroup?.payments[0].customer_reference\">\n <td class=\"bold tb-col-w\">{{ \"Customer internal reference\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ paymentGroup?.payments[0]?.customer_reference }}</td>\n </tr>\n\n </tbody>\n </table>\n\n <div>\n <!-- Status histories -->\n <ccpay-payment-statuses *ngIf=\"isStatusAllocated\" [isTakePayment]=\"isTakePayment\"></ccpay-payment-statuses>\n </div>\n <div class=\"remission\">\n <button [disabled]=\"!chkIsIssueRefundBtnEnable(paymentGroup?.payments[0])\" (click)=\"issueRefund(paymentGroup)\" class=\"govuk-button govuk-button--secondary\">{{ \"Issue refund\" | rpxTranslate }}</button>\n </div>\n<div *ngIf=\"ISPAYMENTSTATUSENABLED\">\n <div class=\"column\">\n <h2 class=\"heading-medium\">{{ \"Disputed payment history\" | rpxTranslate }}</h2>\n </div>\n \n <div>\n <table>\n <thead>\n <tr>\n <th>{{ \"Status\" | rpxTranslate }}</th>\n <th>{{ \"Amount\" | rpxTranslate }}</th>\n <th>{{ \"Date\" | rpxTranslate }}</th>\n <th>{{ \"Payment reference\" | rpxTranslate }}</th>\n <th>{{ \"Event\" | rpxTranslate }}</th>\n <th></th>\n </tr>\n </thead> \n <tbody *ngIf=\"!errorMsg && allPaymentsFailure.length > 0\">\n <tr *ngFor=\"let payment of allPaymentsFailure\">\n <td>{{ payment.status | capitalize | rpxTranslate }}</td>\n <td>\u00A3{{ payment.disputed_amount | number:'.2' }}</td>\n <td>{{(payment.representment_date ? payment.representment_date : payment.failure_event_date_time) | date:'dd MMM yyyy'}}</td>\n <td>{{ payment.payment_reference }}</td>\n <td >{{ payment.failure_type | rpxTranslate }}</td>\n <td>\n \n <a href=\"javascript:void(0)\" (click)=\"goToPaymentFailuePage(payment)\">{{ \"Show detail\" | rpxTranslate }}</a>\n\n </td>\n </tr>\n </tbody>\n <tbody *ngIf=\"errorMsg || allPaymentsFailure.length === 0\">\n <tr>\n <td colspan=\"6\"> {{ \"No disputed payment history available.\" | rpxTranslate }} </td>\n </tr>\n </tbody>\n </table>\n </div>\n <br/>\n <br/>\n </div>\n \n <div *ngIf=\"checkForFees(paymentGroup)\">\n <div *ngIf=\"paymentGroup.fees.length > 0\">\n <div class=\"column\">\n <br/>\n <br/>\n <h2 class=\"heading-large\">{{ \"Fee and remission details\" | rpxTranslate }}</h2>\n\n </div>\n </div>\n\n <div *ngFor=\"let fee of paymentGroup.fees\">\n <table class=\"table\">\n <tbody>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Description\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ \"Application for\" | rpxTranslate }} {{ fee.description | rpxTranslate }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\">{{ \"Fee code\" | rpxTranslate }}</td>\n <td class=\"tb-col-w\">{{ fee?.code }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold tb-col-w\" [ngClass]=\"{'tr-border': !fee.apportion_amount && !fee.remissions && !isTurnOff }\">{{ \"Fee amount\" | rpxTranslate }}</td>\n <td [ngClass]=\"{'tr-border': !fee.apportion_amount && !fee.remissions && !isTurnOff}\">\u00A3{{ fee?.calculated_amount | number:'.2' }}</td>\n </tr>\n\n <tr *ngIf=\"fee.apportion_amount\">\n <td class=\"bold tb-col-w tr-border\" [ngClass]=\"{'tr-border': !fee.remissions}\">{{ \"Allocated amount\" | rpxTranslate }}</td>\n <td [ngClass]=\"{'tr-border': !fee.remissions}\">\u00A3{{ fee?.apportion_amount | number:'.2' }}</td>\n </tr>\n\n </tbody>\n </table>\n <button [disabled]=\"!chkIsAddRemissionBtnEnable(fee)\" (click)=\"addRemission(fee)\" class=\"govuk-button govuk-button--secondary\"> {{ \"Add remission\" | rpxTranslate }}</button>\n </div>\n\n <!-- remissions -->\n <div class=\"order-class\">\n <div class=\"column\">\n <table class=\"govuk-table\">\n <thead class=\"govuk-table__head\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__header col-24 whitespace-inherit\" scope=\"col\">{{ \"Help with fees or remission code\" | rpxTranslate }}</td>\n <td class=\"govuk-table__header col-27 whitespace-inherit\" scope=\"col\">{{ \"Reference\" | rpxTranslate }}</td>\n <td class=\"govuk-table__header whitespace-inherit\" scope=\"col\">{{ \"Fee\" | rpxTranslate }}</td>\n <td class=\"govuk-table__header whitespace-inherit\" scope=\"col\">{{ \"Remission Amount\" | rpxTranslate }}</td>\n <td class=\"govuk-table__header whitespace-inherit refundBtn\" scope=\"col\"></td>\n </tr>\n </thead>\n <tbody class=\"govuk-table__body\" *ngFor=\"let remission of paymentGroup.remissions\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell whitespace-inherit\">{{ remission?.hwf_reference }}</td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{ remission?.remission_reference }}</td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{ remission?.fee_code }}</td>\n <td class=\"govuk-table__cell whitespace-inherit\">{{ remission?.hwf_amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n <td class=\"govuk-table__cell refundBtn whitespace-inherit\" >\n <button [disabled]=\"!canItBeRefunded(remission)\" (click)=\"addRefundForRemission(paymentGroup.payments[0],remission,paymentGroup.fees)\" class=\"govuk-button govuk-button--secondary\"> Add refund</button>\n </td>\n </tr>\n </tbody>\n\n\n </table>\n </div></div>\n\n <div *ngIf=\"paymentGroup.remissions?.length === 0\">\n <span class=\"mar-17\" >{{ \"No help with fees or remissions.\" | rpxTranslate }}</span>\n </div>\n\n </div>\n </div>\n </main>\n</div>\n\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'addremission' && feeId && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n<ccpay-add-remission \n[isTurnOff]=\"isTurnOff\"\n[isStrategicFixEnable]=\"isStrategicFixEnable\"\n[viewCompStatus]= \"viewStatus\"\n[fee]=\"feeId\"\n[payment] = \"payment\"\n[orderStatus] =\"paymentGroup.payments[0].status\"\n[paidAmount]= \"paymentGroup.payments[0].amount\"\n[isRefundRemission]=\"isRefundRemission\"\n[caseType]=\"caseType\"\n[paymentGroupRef]=\"paymentGroup.payment_group_reference\"\n[isFromPaymentDetailPage] = \"true\"\n[ccdCaseNumber]=\"ccdCaseNumber\"\n[orderFeesTotal] = \"orderFeesTotal\"\n[orderTotalPayments] = \"orderTotalPayments\"\n[orderRemissionTotal] = \"orderRemissionTotal\"\n[orderRef] = \"orderRef\"\n[orderCreated] = \"orderCreated\"\n[orderParty] = \"orderParty\"\n[orderCCDEvent] = \"orderCCDEvent\"\n[orderDetail] = \"orderDetail\"\n[LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"></ccpay-add-remission>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'addrefundforremission' && payment && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n\n<ccpay-add-remission\n[isTurnOff]=\"isTurnOff\"\n[isStrategicFixEnable]=\"isStrategicFixEnable\"\n[viewCompStatus]= \"viewStatus\"\n[payment]=\"payment\"\n[orderStatus] =\"orderStatus\"\n[paidAmount]= \"orderTotalPayments\"\n[isRefundRemission]=\"isRefundRemission\"\n[caseType]=\"caseType\"\n[feeamount]=\"remissionFeeAmt\"\n[remission] = \"remissions\"\n[isFromServiceRequestPage]=\"false\"\n[paymentGroupRef]=\"paymentGroup.payment_group_reference\"\n[ccdCaseNumber]=\"ccdCaseNumber\"\n[orderFeesTotal] = \"orderFeesTotal\"\n[orderTotalPayments] = \"orderTotalPayments\"\n[orderRemissionTotal] = \"orderRemissionTotal\"\n[orderRef] = \"orderRef\"\n[orderCreated] = \"orderCreated\"\n[orderParty] = \"orderParty\"\n[orderCCDEvent] = \"orderCCDEvent\"\n[orderDetail] = \"orderDetail\"\n[LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"></ccpay-add-remission>\n</ng-container>\n\n<ng-container *ngIf=\"viewStatus === 'issuerefund' && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n <ccpay-add-remission \n [isTurnOff]=\"isTurnOff\"\n [isStrategicFixEnable]=\"isStrategicFixEnable\"\n [payment] = 'paymentGroup.payments[0]'\n [viewCompStatus]= \"viewStatus\"\n [orderStatus] =\"paymentGroup.payments[0].status\"\n [paidAmount]= \"paymentGroup.payments[0].amount\"\n [isRefundRemission]=\"isRefundRemission\"\n [caseType]=\"caseType\"\n [isFromServiceRequestPage]=\"isFromServiceRequestPage\"\n [isFromPaymentDetailPage] = \"isFromPaymentDetailPage\"\n [paymentGroupRef]=\"paymentGroup.payment_group_reference\"\n [ccdCaseNumber]=\"ccdCaseNumber\"\n [orderFeesTotal] = \"orderFeesTotal\"\n [orderTotalPayments] = \"orderTotalPayments\"\n [orderRemissionTotal] = \"orderRemissionTotal\"\n [orderRef] = \"orderRef\"\n [orderCreated] = \"orderCreated\"\n [orderParty] = \"orderParty\"\n [orderCCDEvent] = \"orderCCDEvent\"\n [orderDetail] = \"orderDetail\"\n [fees] =\"paymentFees\"\n [isFullyRefund] = \"isFullyRefund\"\n [LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\">\n \n ></ccpay-add-remission>\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'order-full-view' && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n <ccpay-service-request\n [viewStatus] = \"viewStatus\"\n [orderRef] = \"orderRef\"\n [orderStatus] = \"orderStatus\"\n [orderCreated] = \"orderCreated\"\n [orderParty] = \"orderParty\"\n [orderCCDEvent] = \"orderCCDEvent\"\n [orderDetail] = \"orderDetail\"\n [LOGGEDINUSERROLES] = \"LOGGEDINUSERROLES\"\n [takePayment] = \"isTakePayment\"\n [ccdCaseNumber] = \"ccdCaseNumber\"\n [orderFeesTotal] = \"orderFeesTotal\"\n [orderTotalPayments] = \"orderTotalPayments\"\n [orderRemissionTotal] = \"orderRemissionTotal\"\n [isServiceRequest] = \"isServiceRequest\"\n (goToServiceRquestComponent) = \"goToServiceRequestPage()\"\n>\n</ccpay-service-request>\n\n</ng-container>\n</div>\n<div class=\"over-payment\">\n<ng-container *ngIf=\"viewCompStatus === 'overpayment'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='OVERPAYMENTPAGE'> \n <h1 class=\"heading-large\">{{ \"Issue refund\" | rpxTranslate }}</h1>\n <h1 class=\"heading-medium\">{{ \"Case reference\" | rpxTranslate}}: {{ccdCaseNumber | ccdHyphens }}</h1>\n <span id=\"how-contacted-conditional-hint govuk-font19px\" class=\"form-hint\">\n {{ \"Payment reference\" | rpxTranslate }}: {{paymentGroup?.payments[0]?.reference}}\n </span>\n<div class=\"govuk-form-group\">\n <fieldset class=\"govuk-fieldset\">\n <legend class=\"govuk-fieldset__legend govuk-fieldset__legend--l\">\n <h1 class=\"heading-medium\">{{ \"Select payment to refund\" | rpxTranslate }}</h1>\n </legend>\n <div class=\"govuk-radios\" data-module=\"govuk-radios\">\n <div class=\"govuk-radios__item\">\n <input class=\"govuk-radios__input\" id=\"over-payment\" name=\"over-payment\" type=\"radio\" (click)=\"selectPymentOption('op')\" value=\"op\">\n <label class=\"govuk-label govuk-radios__label govuk-font19px\" for=\"where-do-you-live\">\n {{ \"Over payment\" | rpxTranslate }} \u00A3{{getOverPaymentValue() | number:'.2'}}\n </label>\n </div>\n <div class=\"govuk-radios__item\">\n <input class=\"govuk-radios__input\" id=\"full-payment\" name=\"over-payment\" type=\"radio\" (click)=\"selectPymentOption('fp')\" value=\"fp\">\n <label class=\"govuk-label govuk-radios__label govuk-font19px\" for=\"where-do-you-live-2\">\n {{ \"Full payment\" | rpxTranslate }} \u00A3{{paymentGroup?.payments[0]?.amount | number:'.2'}}\n </label>\n </div>\n </div>\n <button class=\"govuk-button govuk-button--secondary over-payment-alignment govuk-font19px\"\n (click)=\"goToPaymentViewComponent()\"> {{ \"Previous\" | rpxTranslate }}</button>\n <button \n (click)=\"continuePayment(paymentGroup)\"\n [disabled]=\"isContinueBtnDisabled\"\n [ngClass]='isContinueBtnDisabled ? \"button button--disabled govuk-!-margin-right-1 govuk-font19px\" : \"button govuk-!-margin-right-1 govuk-font19px\"'\n class=\"govuk-button\"> {{ \"Continue\" | rpxTranslate }}</button>\n </fieldset>\n</div>\n</ng-container>\n\n<ng-container *ngIf=\"viewCompStatus === 'overPaymentAddressCapture'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='OVERPAYMENTADDRESSCAPTUREPAGE'> \n <h1 class=\"govuk-heading-l\">{{ \"Issue refund\" | rpxTranslate }}</h1>\n <h2 class=\"govuk-heading-m govuk-font19px\">{{ \"Case reference\" | rpxTranslate }}: {{ccdCaseNumber | ccdHyphens }}</h2>\n <span id=\"how-contacted-conditional-hint\" class=\"govuk-hint govuk-font19px\">\n {{ \"Payment reference\" | rpxTranslate }}: {{paymentGroup?.payments[0]?.reference}}\n </span>\n<ccpay-contact-details \n[addressObj] = notification\n(assignContactDetails)=\"getContactDetails($event)\"\n(redirectToIssueRefund)=\"gotoPaymentSelectPage($event)\" ></ccpay-contact-details>\n<p>\n <a (click)=\"goToCaseTransationPage($event)\" class=\"govuk-link\" data-module=\"govuk-button\">\n {{ \"Cancel\" | rpxTranslate }}\n </a>\n</p>\n</ng-container>\n\n<ng-container *ngIf=\"viewCompStatus === 'overpaymentcheckandanswer'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='ADDREFUNDFORREMISSION'> \n <div class=\"govuk-warning-text\">\n \n <h1 class=\"heading-large\"> {{ \"Check your answers\" | rpxTranslate }}</h1>\n </div>\n <table class=\"govuk-table\">\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Payment reference\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\"> {{paymentGroup.payments[0].reference}} </td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Payment amount\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{paymentGroup.payments[0].amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Fee amount\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{paymentGroup?.fees[0]?.net_amount | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Refund amount\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{getOverPaymentValue() | currency:'GBP':'symbol-narrow':'1.2-2'}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Refund reason\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{ \"Over payment\" | rpxTranslate }}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Send to\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{orderParty}}</td>\n </tr>\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Send via\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell whitespace-inherit\">\n <div *ngIf=\"contactDetailsObj?.notification_type === 'EMAIL'\" class=\"contactDetails-width\">\n <strong>{{ \"Email\" | rpxTranslate }}</strong>\n <br/>\n {{contactDetailsObj?.email?.trim()}}\n </div>\n <div *ngIf=\"contactDetailsObj?.notification_type === 'LETTER'\" class=\"contactDetails-width\">\n <strong>{{ \"Post\" | rpxTranslate }}</strong>\n <br/>\n {{contactDetailsObj?.address_line?.trim()}} {{contactDetailsObj?.city?.trim()}} {{contactDetailsObj?.county?.trim()}} {{contactDetailsObj?.country?.trim()}} {{contactDetailsObj?.postal_code?.trim()}}\n </div>\n <a (click)=\"gotoAddressPage(contactDetailsObj)\" class=\"govuk-link right\" >{{ \"Change\" | rpxTranslate }}</a>\n </td>\n </tr>\n\n <tr class=\"govuk-table__row\">\n <td class=\"govuk-table__cell govuk-!-font-weight-bold\">{{ \"Notification\" | rpxTranslate }}</td>\n <td class=\"govuk-table__cell\">{{templateInstructionType}}\n <a *ngIf=\"!notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"showNotificationPreview()\">\n {{ \"Preview\" | rpxTranslate }}\n </a>\n <a *ngIf=\"notificationPreview\" href=\"Javascript:void(0)\" class=\"govuk-link right\" (click)=\"hideNotificationPreview()\">\n {{ \"Hide Preview\" | rpxTranslate }}\n </a>\n </td>\n </tr>\n </table>\n\n <app-notification-preview *ngIf=\"notificationPreview\" \n [payment]=\"paymentGroup.payments[0]\" \n [contactDetails]=\"contactDetailsObj\"\n [refundReason]=\"'RR037'\"\n [refundAmount]=\"getOverPaymentValue()\"></app-notification-preview>\n\n <button type=\"submit\" class=\"button govuk-button--secondary over-payment-alignment govuk-font19px\" (click)=\"gotoAddressPage(contactDetailsObj)\">{{ \"Previous\" | rpxTranslate }}</button>\n <button type=\"submit\"\n [ngClass]='isContinueBtnDisabled ? \"button button--disabled govuk-!-margin-right-1 govuk-font19px\" : \"button govuk-!-margin-right-1 govuk-font19px\"'\n (click)=\"processRefund()\">\n {{ \"Submit refund\" | rpxTranslate }}\n </button>\n <p>\n <a href=\"javascript:void(0)\" (click)=\"goToCaseTransationPage($event)\" class=\"govuk-link govuk-font19px\" data-module=\"govuk-button\">\n {{ \"Cancel\" | rpxTranslate }}\n </a>\n </p>\n\n</ng-container>\n<ng-container *ngIf=\"viewStatus === 'refundconfirmationpage' && viewCompStatus !== 'overpayment' && viewCompStatus !== 'overPaymentAddressCapture' && viewCompStatus !== 'overpaymentcheckandanswer'\">\n <input #myInput type='hidden' id='iFrameDrivenImageValue' value='RETROREMISSIONREFUNDCONFIRMATIONPAGE'> \n <div class=\"govuk-grid-row pagesize\">\n <div >\n <div class=\"govuk-panel govuk-panel--confirmation\">\n <h1 class=\"govuk-panel_view_title\">\n {{ \"Refund submitted\" | rpxTranslate }}\n </h1>\n \n <div class=\"govuk-panel__body\">\n <p class=\"govuk-body white\"><strong class=\"white\">{{ \"Refund reference\" | rpxTranslate}}: {{refundReference}}</strong></p>\n </div>\n \n </div>\n <h2 class=\"govuk-heading-l\">{{\"What happens next\" | rpxTranslate }}</h2>\n <p class=\"govuk-body\">\n {{\"A refund request for\" | rpxTranslate }} {{refundAmount | currency:'GBP':'symbol-narrow':'1.2-2' }} {{ \"has been created and will be passed to a team leader to approve.\" | rpxTranslate }}\n </p>\n <p class=\"govuk-body\">\n <a href=\"javascript:void(0)\" (click)=\"goToCaseTransationPage($event)\" class=\"govuk-link pointer\" data-module=\"govuk-button\">\n {{ \"Return to case\" | rpxTranslate }}\n </a>\n </p>\n </div>\n </div>\n\n</ng-container>\n</div>\n\n<ng-container *ngIf=\"viewStatus === 'payment-failure'\">\n <div class=\"payment-failure-alignment\">\n <div class=\"govuk-breadcrumbs\">\n <ol class=\"govuk-breadcrumbs__list\">\n <li class=\"govuk-breadcrumbs__list-item\">\n <a href=\"javascript:void(0)\" (click)=\"goBackToPaymentView($event)\" class=\"govuk-back-link\">{{ \"Back\" | rpxTranslate }}</a>\n </li>\n </ol>\n </div>\n <div class=\"govuk-grid-row\">\n <div class=\"column\">\n <h1 class=\"heading-large govuk-!-margin-top-0\">{{ \"Failure event details\" | rpxTranslate }}</h1>\n </div>\n </div>\n <table>\n <tbody>\n\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Failure reference\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.failure_reference}}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Failure reason\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.failure_reason | rpxTranslate}}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Payment reference\" | rpxTranslate }}</td>\n <td>{{ selectedPaymentsStatus.payment_reference }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Payment amount\" | rpxTranslate }}</td>\n <td> \u00A3{{ paymentGroup?.payments[0]?.amount | number:'.2' }}</td>\n\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Disputed amount\" | rpxTranslate }}</td>\n <td>\t\u00A3{{selectedPaymentsStatus.disputed_amount | number:'.2'}}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Additional information\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.additional_reference }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Failure type\" | rpxTranslate }}</td>\n <td>\t{{ selectedPaymentsStatus.failure_type }}</td>\n </tr>\n <tr class=\"section\">\n <td class=\"bold\">{{ \"Failure event date and time\" | rpxTranslate }}</td>\n <td> {{ selectedPaymentsStatus.failure_event_date_time | date:'dd MMM yyyy HH:mm:ss' }}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"selectedPaymentsStatus.has_amount_debited\">\n <td class=\"bold\">{{ \"Has disputed amount debited\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.has_amount_debited}}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"selectedPaymentsStatus.representment_status\">\n <td class=\"bold\">{{ \"Status following representation of payment\" | rpxTranslate }}</td>\n <td>\t{{(selectedPaymentsStatus.representment_status === 'Yes' || selectedPaymentsStatus.representment_status === 'yes') ? 'Success' : 'Failure'}}</td>\n </tr>\n <tr class=\"section\" *ngIf=\"selectedPaymentsStatus.representment_date\">\n <td class=\"bold\">{{ \"Date payment represented\" | rpxTranslate }}</td>\n <td>\t{{selectedPaymentsStatus.representment_date | date:'dd MMM yyyy HH:mm:ss'}}</td>\n </tr>\n </tbody>\n </table>\n\n <div>\n </div>\n </div>\n</ng-container>\n", styles: [".payment-view-section .tb-col-w{width:330px}.payment-view-section .tr-border{border-bottom:2px solid}.payment-view-section .payment-view-alignment{margin-left:30px}.payment-view-section .govuk-button{font-size:19px;float:left;margin-top:2em}.payment-view-section .remission{margin-bottom:7em}.payment-view-section .govuk-error-summary__title{font-size:24px!important}.payment-view-section .govuk-table__cell,.payment-view-section .govuk-table__header{padding:0;line-height:1.3;vertical-align:middle}.payment-view-section .govuk-table__row{line-height:1.3}.payment-view-section .govuk-table__cell:last-child{text-align:right}.payment-view-section .text-transform:first-letter{text-transform:capitalize}.payment-view-section .govuk-link{cursor:pointer}.payment-view-section .mar-17{font-size:19px!important}.over-payment .pagesize{margin:2em;width:97%}.over-payment .contactDetails-width{width:70%}.over-payment .margin-top10px{margin-top:20px}.over-payment .govuk-font19px{font-size:19px!important}.over-payment .margin-top--size{margin-top:-30px}.over-payment .over-payment-alignment{margin-right:10px}.over-payment .govuk-button{font-size:19px;float:left;margin-top:2em}.over-payment td.govuk-table__cell{width:50%}.over-payment .govuk-warning-text__text,.over-payment .govuk-label--s,.over-payment .label_payment__symbol{font-size:19px;font-weight:400}.over-payment .inline-error-class{outline:3px solid #a71414;outline-offset:0;border-color:#a71414}.over-payment .inline-error-message{color:#a71414;border-color:#a71414;font-weight:700;margin-top:10px;font-size:20px}.over-payment .govuk-button-group{padding-top:2em}.over-payment .heading-medium{margin-top:.875em}.over-payment .heading-large{margin-top:.25em}.over-payment .govuk-panel--confirmation{color:#fff;background:#00703c}.over-payment .govuk-panel__title{font-size:5rem}.over-payment .govuk-body-m,.over-payment .govuk-body{font-size:2.1875rem}.over-payment .govuk-link{cursor:pointer}.over-payment .govuk-radios__conditional{padding-top:12px!important}.over-payment .right{float:right;cursor:pointer}.over-payment .radio{float:right}.over-payment .white{color:#fff}.whitespace-inherit{white-space:inherit!important}.govuk-panel_view_title{margin-top:0;margin-bottom:30px;color:#fff;font-family:nta,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-weight:700}.white{color:#fff}.hmcts-currency-input__symbol{font-family:nta,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;line-height:initial;position:absolute;font-weight:200;padding:8px 10px;height:40px;box-sizing:border-box;background-color:#dee0e2;border:2px solid #0b0c0c}\n"] }]
|
|
430
|
+
}], ctorParameters: () => [{ type: i1.PaymentViewService }, { type: i2.NotificationService }, { type: undefined, decorators: [{
|
|
431
|
+
type: Inject,
|
|
432
|
+
args: ['PAYMENT_LIB']
|
|
433
|
+
}] }, { type: i0.ChangeDetectorRef }, { type: i3.OrderslistService }], propDecorators: { isTurnOff: [{
|
|
434
|
+
type: Input
|
|
435
|
+
}], isTakePayment: [{
|
|
436
|
+
type: Input
|
|
437
|
+
}], caseType: [{
|
|
438
|
+
type: Input
|
|
439
|
+
}], orderRef: [{
|
|
440
|
+
type: Input
|
|
441
|
+
}], orderStatus: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], orderTotalPayments: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], payment: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], LOGGEDINUSERROLES: [{
|
|
448
|
+
type: Input
|
|
449
|
+
}], ISPAYMENTSTATUSENABLED: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], orderParty: [{
|
|
452
|
+
type: Input
|
|
453
|
+
}], orderCreated: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}], orderCCDEvent: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], orderFeesTotal: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], orderRemissionTotal: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], orderDetail: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], isServiceRequest: [{
|
|
464
|
+
type: Input,
|
|
465
|
+
args: ["isServiceRequest"]
|
|
466
|
+
}] } });
|
|
467
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BheW1lbnQtbGliL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LXZpZXcvcGF5bWVudC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BheW1lbnQtbGliL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LXZpZXcvcGF5bWVudC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0RBQWtELENBQUM7QUFDcEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sa0RBQWtELENBQUM7QUFLckYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFbkYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFFcEUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ2xGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3JGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3JGLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQ3BHLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1B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Z1JBQzVCLGNBQWMsbUVBQ2QsY0FBYyx1RUFDZCxvQkFBb0I7OzRGQUtYLG9CQUFvQjtrQkFqQmhDLFNBQVM7K0JBQ0Usb0JBQW9CLGFBR25CLENBQUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxXQUNwRjt3QkFDUCxZQUFZLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO3dCQUNyRCxzQkFBc0IsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7d0JBQ2pFLHVCQUF1Qjt3QkFDdkIsNEJBQTRCO3dCQUM1QixjQUFjO3dCQUNkLGNBQWM7d0JBQ2Qsb0JBQW9CO3FCQUNyQixjQUNXLElBQUk7OzBCQTBEYixNQUFNOzJCQUFDLGFBQWE7eUdBdERkLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHcUIsZ0JBQWdCO3NCQUExQyxLQUFLO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5qZWN0LCBJbnB1dCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UGF5bWVudFZpZXdTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wYXltZW50LXZpZXcvcGF5bWVudC12aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHtOb3RpZmljYXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtJUGF5bWVudEdyb3VwfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lQYXltZW50R3JvdXAnO1xuaW1wb3J0IHtJRmVlfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lGZWUnO1xuaW1wb3J0IHtJUGF5bWVudH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUGF5bWVudCc7XG5pbXBvcnQge0lSZW1pc3Npb259IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVJlbWlzc2lvbic7XG5pbXBvcnQge1Bvc3RSZWZ1bmRSZXRyb1JlbWlzc2lvbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Qb3N0UmVmdW5kUmV0cm9SZW1pc3Npb24nO1xuaW1wb3J0IHtJUGF5bWVudEZhaWx1cmV9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVBheW1lbnRGYWlsdXJlJztcbmltcG9ydCB7T3JkZXJzbGlzdFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL29yZGVyc2xpc3Quc2VydmljZSc7XG5pbXBvcnQge0lSZWZ1bmRDb250YWN0RGV0YWlsc30gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JUmVmdW5kQ29udGFjdERldGFpbHMnO1xuaW1wb3J0IHtBZGRSZW1pc3Npb25Db21wb25lbnR9IGZyb20gJy4uL2FkZC1yZW1pc3Npb24vYWRkLXJlbWlzc2lvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1N0YXR1c0hpc3RvcnlDb21wb25lbnR9IGZyb20gJy4uL3N0YXR1cy1oaXN0b3J5L3N0YXR1cy1oaXN0b3J5LmNvbXBvbmVudCc7XG5pbXBvcnQge1NlcnZpY2VSZXF1ZXN0Q29tcG9uZW50fSBmcm9tICcuLi9zZXJ2aWNlLXJlcXVlc3Qvc2VydmljZS1yZXF1ZXN0LmNvbXBvbmVudCc7XG5pbXBvcnQge0NvbnRhY3REZXRhaWxzQ29tcG9uZW50fSBmcm9tICcuLi9jb250YWN0LWRldGFpbHMvY29udGFjdC1kZXRhaWxzLmNvbXBvbmVudCc7XG5pbXBvcnQge05vdGlmaWNhdGlvblByZXZpZXdDb21wb25lbnR9IGZyb20gJy4uL25vdGlmaWNhdGlvbi1wcmV2aWV3L25vdGlmaWNhdGlvbi1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQge0NjZEh5cGhlbnNQaXBlfSBmcm9tICcuLi8uLi9waXBlcy9jY2QtaHlwaGVucy5waXBlJztcbmltcG9ydCB7Q2FwaXRhbGl6ZVBpcGV9IGZyb20gJy4uLy4uL3BpcGVzL2NhcGl0YWxpemUucGlwZSc7XG5pbXBvcnQge1JweFRyYW5zbGF0aW9uTW9kdWxlfSBmcm9tICdycHgteHVpLXRyYW5zbGF0aW9uJztcbmltcG9ydCB0eXBlIHtQYXltZW50TGliQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcGF5bWVudC1saWIuY29tcG9uZW50JztcblxudHlwZSBQYXltZW50TGliQWxpYXMgPSBQYXltZW50TGliQ29tcG9uZW50O1xuXG5jb25zdCBCU19FTkFCTEVfRkxBRyA9ICdidWxrLXNjYW4tZW5hYmxpbmctZmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjY3BheS1wYXltZW50LXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGF5bWVudC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGF5bWVudC12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogJ1BBWU1FTlRfVklFVycsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBheW1lbnRWaWV3Q29tcG9uZW50KSB9XSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSwgZm9yd2FyZFJlZigoKSA9PiBBZGRSZW1pc3Npb25Db21wb25lbnQpLFxuICAgIFN0YXR1c0hpc3RvcnlDb21wb25lbnQsIGZvcndhcmRSZWYoKCkgPT4gU2VydmljZVJlcXVlc3RDb21wb25lbnQpLFxuICAgIENvbnRhY3REZXRhaWxzQ29tcG9uZW50LFxuICAgIE5vdGlmaWNhdGlvblByZXZpZXdDb21wb25lbnQsXG4gICAgQ2NkSHlwaGVuc1BpcGUsXG4gICAgQ2FwaXRhbGl6ZVBpcGUsXG4gICAgUnB4VHJhbnNsYXRpb25Nb2R1bGVcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcblxuZXhwb3J0IGNsYXNzIFBheW1lbnRWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgaXNUdXJuT2ZmOiBib29sZWFuO1xuICBASW5wdXQoKSBpc1Rha2VQYXltZW50OiBib29sZWFuO1xuICBASW5wdXQoKSBjYXNlVHlwZTogYm9vbGVhbjtcbiAgQElucHV0KCkgb3JkZXJSZWY6IHN0cmluZztcbiAgQElucHV0KCkgb3JkZXJTdGF0dXM6IHN0cmluZztcbiAgQElucHV0KCkgb3JkZXJUb3RhbFBheW1lbnRzOiBudW1iZXI7XG4gIEBJbnB1dCgpIHBheW1lbnQ6IElQYXltZW50O1xuICBASW5wdXQoKSBMT0dHRURJTlVTRVJST0xFUzogc3RyaW5nW107XG4gIEBJbnB1dCgpIElTUEFZTUVOVFNUQVRVU0VOQUJMRUQ6IHN0cmluZztcbiAgQElucHV0KCkgb3JkZXJQYXJ0eTogc3RyaW5nO1xuICBASW5wdXQoKSBvcmRlckNyZWF0ZWQ6IERhdGU7XG4gIEBJbnB1dCgpIG9yZGVyQ0NERXZlbnQ6IHN0cmluZztcbiAgQElucHV0KCkgb3JkZXJGZWVzVG90YWw6IG51bWJlcjtcbiAgQElucHV0KCkgb3JkZXJSZW1pc3Npb25Ub3RhbDogbnVtYmVyO1xuICBASW5wdXQoKSBvcmRlckRldGFpbDogYW55W107XG4gIGZlZXM6IGFueTtcbiAgaXNGdWxseVJlZnVuZDogYm9vbGVhbjtcbiAgQElucHV0KFwiaXNTZXJ2aWNlUmVxdWVzdFwiKSBpc1NlcnZpY2VSZXF1ZXN0OiBzdHJpbmc7XG4gIGVycm9yTXNnOiBzdHJpbmc7XG4gIHBheW1lbnRHcm91cDogSVBheW1lbnRHcm91cDtcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XG4gIGNjZENhc2VOdW1iZXI6IHN0cmluZztcbiAgc2VsZWN0ZWRPcHRpb246IHN0cmluZztcbiAgZGNuTnVtYmVyOiBzdHJpbmc7XG4gIGlzU3RhdHVzQWxsb2NhdGVkOiBib29sZWFuO1xuICBpc1JlbWlzc2lvbnNNYXRjaDogYm9vbGVhbjtcbiAgZmVlSWQ6IElGZWU7XG4gIHZpZXdTdGF0dXM6IHN0cmluZztcbiAgaXNSZWZ1bmRSZW1pc3Npb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTdHJhdGVnaWNGaXhFbmFibGU6IGJvb2xlYW47XG4gIGlzQWRkRmVlQnRuRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0lzc3VlUmVmdW5mQnRuRW5hYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIGFsbG93ZWRSb2xlc1RvQWNjZXNzUmVmdW5kID0gWydwYXltZW50cy1yZWZ1bmQtYXBwcm92ZXInLCAncGF5bWVudHMtcmVmdW5kJ107XG4gIHJlbWlzc2lvbnM6IElSZW1pc3Npb25bXSA9IFtdO1xuICBhbGxQYXltZW50c0ZhaWx1cmU6IElQYXltZW50RmFpbHVyZVtdID0gW107XG4gIHNlbGVjdGVkUGF5bWVudHNTdGF0dXM6IElQYXltZW50RmFpbHVyZTtcbiAgcmVtaXNzaW9uRmVlQW10OiBudW1iZXI7XG4gIGlzUmVmdW5kUmVtaXNzaW9uQnRuRW5hYmxlOiBib29sZWFuO1xuICBzZXJ2aWNlUmVmZXJlbmNlOiBzdHJpbmc7XG4gIGlzRnJvbVNlcnZpY2VSZXF1ZXN0UGFnZTogYm9vbGVhbjtcbiAgaXNGcm9tUGF5bWVudERldGFpbFBhZ2U6IGJvb2xlYW47XG4gIHBheW1lbnRGZWVzOiBJRmVlW107XG4gIHBheW1lbnRUeXBlOiBzdHJpbmc7XG4gIGlzQ29udGludWVCdG5EaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XG4gIHZpZXdDb21wU3RhdHVzOiBzdHJpbmc7XG4gIGNvbnRhY3REZXRhaWxzT2JqOiBJUmVmdW5kQ29udGFjdERldGFpbHNcbiAgbm90aWZpY2F0aW9uOiBhbnk7XG4gIGlzQ29uZmlybWF0aW9uQnRuRGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlZnVuZFJlZmVyZW5jZTogc3RyaW5nO1xuICByZWZ1bmRBbW91bnQ6IHN0cmluZztcbiAgdGVtcGxhdGVJbnN0cnVjdGlvblR5cGU6IHN0cmluZztcbiAgbm90aWZpY2F0aW9uUHJldmlldzogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYXltZW50Vmlld1NlcnZpY2U6IFBheW1lbnRWaWV3U2VydmljZSxcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgQEluamVjdCgnUEFZTUVOVF9MSUInKSBwcml2YXRlIHBheW1lbnRMaWJDb21wb25lbnQ6IFBheW1lbnRMaWJBbGlhcyxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIE9yZGVyc2xpc3RTZXJ2aWNlOiBPcmRlcnNsaXN0U2VydmljZSkge1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jY2RDYXNlTnVtYmVyID0gdGhpcy5wYXltZW50TGliQ29tcG9uZW50LkNDRF9DQVNFX05VTUJFUjtcbiAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gdGhpcy5wYXltZW50TGliQ29tcG9uZW50LlNFTEVDVEVEX09QVElPTjtcbiAgICB0aGlzLmRjbk51bWJlciA9IHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5EQ05fTlVNQkVSO1xuICAgIHRoaXMuaXNUdXJuT2ZmID0gdGhpcy5wYXltZW50TGliQ29tcG9uZW50LklTVFVSTk9GRjtcbiAgICB0aGlzLnNlcnZpY2VSZWZlcmVuY2UgPSB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudEdyb3VwUmVmZXJlbmNlO1xuICAgIHRoaXMudmlld1N0YXR1cyA9ICdwYXltZW50dmlldyc7XG4gICAgdGhpcy5wYXltZW50Vmlld1NlcnZpY2UuZ2V0QXBwb3J0aW9uUGF5bWVudERldGFpbHModGhpcy5wYXltZW50TGliQ29tcG9uZW50LnBheW1lbnRSZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgIHBheW1lbnRHcm91cCA9PiB7XG4gICAgICAgIGxldCBmZWVzID0gW107XG4gICAgICAgIHBheW1lbnRHcm91cC5mZWVzLmZvckVhY2goZmVlID0+IHtcbiAgICAgICAgICB0aGlzLmlzUmVtaXNzaW9uc01hdGNoID0gZmFsc2U7XG5cbiAgICAgICAgICBwYXltZW50R3JvdXAucmVtaXNzaW9ucy5mb3JFYWNoKHJlbSA9PiB7XG4gICAgICAgICAgICBpZiAocmVtLmZlZV9jb2RlID09PSBmZWUuY29kZSkge1xuICAgICAgICAgICAgICB0aGlzLmlzUmVtaXNzaW9uc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZmVlWydyZW1pc3Npb25zJ10gPSByZW07XG4gICAgICAgICAgICAgIGZlZXMucHVzaChmZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghdGhpcy5pc1JlbWlzc2lvbnNNYXRjaCkge1xuICAgICAgICAgICAgZmVlcy5wdXNoKGZlZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGF5bWVudEdyb3VwLmZlZXMgPSBmZWVzXG4gICAgICAgIHRoaXMucGF5bWVudEZlZXMgPSBmZWVzO1xuICAgICAgICB0aGlzLnBheW1lbnRHcm91cCA9IHBheW1lbnRHcm91cDtcblxuICAgICAgICB0aGlzLnBheW1lbnRHcm91cC5wYXltZW50cyA9IHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzLmZpbHRlclxuICAgICAgICAgIChwYXltZW50R3JvdXBPYmogPT4gcGF5bWVudEdyb3VwT2JqWydyZWZlcmVuY2UnXS5pbmNsdWRlcyh0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucGF5bWVudFJlZmVyZW5jZSkpO1xuICAgICAgICBjb25zdCBwYXltZW50QWxsb2NhdGlvbiA9IHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzWzBdLnBheW1lbnRfYWxsb2NhdGlvbjtcbiAgICAgICAgdGhpcy5pc1N0YXR1c0FsbG9jYXRlZCA9IHBheW1lbnRBbGxvY2F0aW9uLmxlbmd0aCA+IDAgJiYgcGF5bWVudEFsbG9jYXRpb25bMF0uYWxsb2NhdGlvbl9zdGF0dXMgPT09ICdBbGxvY2F0ZWQnIHx8IHBheW1lbnRBbGxvY2F0aW9uLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmFkZFBheW1lbnRHcm91cCh0aGlzLnBheW1lbnRHcm91cCk7XG4gICAgICB9LFxuICAgICAgKGVycm9yOiBhbnkpID0+IHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JcbiAgICApO1xuICAgIHRoaXMucGF5bWVudFZpZXdTZXJ2aWNlLmdldFBheW1lbnRGYWlsdXJlKHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5wYXltZW50UmVmZXJlbmNlKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICBKU09OLnBhcnNlKHJlcykucGF5bWVudF9mYWlsdXJlX2xpc3QucmV2ZXJzZSgpLmZvckVhY2gocGF5bWVudHMgPT4ge1xuXG4gICAgICAgICAgdGhpcy5hbGxQYXltZW50c0ZhaWx1cmUucHVzaChwYXltZW50cy5wYXltZW50X2ZhaWx1cmVfaW5pdGlhdGVkKTtcbiAgICAgICAgICBpZiAocGF5bWVudHMucGF5bWVudF9mYWlsdXJlX2Nsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5hbGxQYXltZW50c0ZhaWx1cmUucHVzaChwYXltZW50cy5wYXltZW50X2ZhaWx1cmVfY2xvc2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFsbFBheW1lbnRzRmFpbHVyZSA9IHRoaXMuYWxsUGF5bWVudHNGYWlsdXJlLnJldmVyc2UoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgdGhpcy5hbGxQYXltZW50c0ZhaWx1cmUgPSBbXTtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9IFwiU2VydmVyIGVycm9yXCJcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0IGlzQ2FyZFBheW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzWzBdLm1ldGhvZCA9PT0gJ2NhcmQnO1xuICB9XG5cbiAgZ2V0IGlzVGVsZXBob255UGF5bWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYXltZW50R3JvdXAucGF5bWVudHNbMF0uY2hhbm5lbCA9PT0gJ3RlbGVwaG9ueSc7XG4gIH1cblxuICBwdWJsaWMgZ29Ub1BheW1lbnRMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC52aWV3TmFtZSA9ICdwYXltZW50LWxpc3QnO1xuICB9XG4gIGdldE92ZXJQYXltZW50VmFsdWUoKSB7XG4gICAgbGV0IGZlZXNPdmVyUGF5bWVudCA9IDA7XG4gICAgdGhpcy5wYXltZW50R3JvdXAuZmVlcy5mb3JFYWNoKGZlZSA9PiB7XG4gICAgICBmZWVzT3ZlclBheW1lbnQgKz0gZmVlLm92ZXJfcGF5bWVudDtcbiAgICB9KTtcbiAgICByZXR1cm4gZmVlc092ZXJQYXltZW50ID4gMCA/IGZlZXNPdmVyUGF5bWVudCA6IHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5vdmVyUGF5bWVudEFtb3VudFxuXG4gIH1cbiAgZ29Ub1NlcnZpY2VSZXF1ZXN0UGFnZSgpIHtcbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQudmlld05hbWUgPSAnY2FzZS10cmFuc2FjdGlvbnMnO1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5UQUtFUEFZTUVOVCA9IGZhbHNlO1xuICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5TRVJWSUNFUkVRVUVTVCA9ICd0cnVlJztcbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNGcm9tU2VydmljZVJlcXVlc3RQYWdlID0gdHJ1ZTtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cbiAgZ29Ub0Nhc2VUcmFuc2F0aW9uUGFnZShldmVudDogYW55KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2UpIHtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0bmF2aWdhdGlvblBhZ2UoJ2Nhc2V0cmFuc2FjdGlvbnMnKTtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0aXNGcm9tU2VydmljZVJlcXVlc3RQYWdlKGZhbHNlKTtcbiAgICAgIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC52aWV3TmFtZSA9ICdjYXNlLXRyYW5zYWN0aW9ucyc7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuSVNCU0VOQUJMRSA9IHRydWU7XG4gICAgICB0aGlzLnJlc2V0T3JkZXJEYXRhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2UuZ2V0b3JkZXJSZWZzKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB0aGlzLm9yZGVyUmVmID0gZGF0YSk7XG4gICAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLmdldG9yZGVyQ0NERXZlbnRzKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB0aGlzLm9yZGVyQ0NERXZlbnQgPSBkYXRhKTtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2UuZ2V0b3JkZXJDcmVhdGVkcygpLnN1YnNjcmliZSgoZGF0YSkgPT4gdGhpcy5vcmRlckNyZWF0ZWQgPSBkYXRhKTtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2UuZ2V0b3JkZXJEZXRhaWwoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHRoaXMub3JkZXJEZXRhaWwgPSBkYXRhKTtcbiAgICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2UuZ2V0b3JkZXJQYXJ0eXMoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHRoaXMub3JkZXJQYXJ0eSA9IGRhdGEpO1xuICAgICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5nZXRvcmRlclJlbWlzc2lvblRvdGFscygpLnN1YnNjcmliZSgoZGF0YSkgPT4gdGhpcy5vcmRlclJlbWlzc2lvblRvdGFsID0gZGF0YSk7XG4gICAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLmdldG9yZGVyRmVlc1RvdGFscygpLnN1YnNjcmliZSgoZGF0YSkgPT4gdGhpcy5vcmRlckZlZXNUb3RhbCA9IGRhdGEpO1xuICAgICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5nZXRvb3JkZXJUb3RhbFBheW1lbnRzcygpLnN1YnNjcmliZSgoZGF0YSkgPT4gdGhpcy5vcmRlclRvdGFsUGF5bWVudHMgPSBkYXRhKTtcbiAgICAgIHRoaXMudmlld1N0YXR1cyA9ICdvcmRlci1mdWxsLXZpZXcnO1xuICAgIH1cblxuICB9XG5cbiAgYWRkUmVtaXNzaW9uKGZlZTogSUZlZSkge1xuICAgIGlmICh0aGlzLmNoa0lzQWRkUmVtaXNzaW9uQnRuRW5hYmxlKGZlZSkpIHtcbiAgICAgIHRoaXMuZmVlSWQgPSBmZWU7XG4gICAgICB0aGlzLnBheW1lbnRWaWV3U2VydmljZS5nZXRBcHBvcnRpb25QYXltZW50RGV0YWlscyh0aGlzLnBheW1lbnRHcm91cC5wYXltZW50c1swXS5yZWZlcmVuY2UpLnN1YnNjcmliZShcbiAgICAgICAgcGF5bWVudEdyb3VwID0+IHtcbiAgICAgICAgICB0aGlzLnBheW1lbnRHcm91cCA9IHBheW1lbnRHcm91cDtcblxuICAgICAgICAgIHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzID0gdGhpcy5wYXltZW50R3JvdXAucGF5bWVudHMuZmlsdGVyXG4gICAgICAgICAgICAocGF5bWVudEdyb3VwT2JqID0+IHBheW1lbnRHcm91cE9ialsncmVmZXJlbmNlJ10uaW5jbHVkZXModGhpcy5wYXltZW50TGliQ29tcG9uZW50LnBheW1lbnRSZWZlcmVuY2UpKTtcbiAgICAgICAgICB0aGlzLnBheW1lbnQgPSB0aGlzLnBheW1lbnRHcm91cC5wYXltZW50c1swXTtcbiAgICAgICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNGcm9tUGF5bWVudERldGFpbFBhZ2UgPSB0cnVlO1xuICAgICAgICAgIHRoaXMudmlld1N0YXR1cyA9ICdhZGRyZW1pc3Npb24nO1xuICAgICAgICAgIHRoaXMuaXNSZWZ1bmRSZW1pc3Npb24gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4gdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0ZvckZlZXMocGF5bWVudEdyb3VwOiBhbnkpIHtcbiAgICBpZiAocGF5bWVudEdyb3VwICE9PSBudWxsICYmIHBheW1lbnRHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocGF5bWVudEdyb3VwLmZlZXMgIT09IG51bGwgJiYgcGF5bWVudEdyb3VwLmZlZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvY2Vzc1JlZnVuZCgpIHtcbiAgICB0aGlzLmlzQ29uZmlybWF0aW9uQnRuRGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgY29uc3Qgb2JqID0gdGhpcy5wYXltZW50R3JvdXAuZmVlc1swXTtcbiAgICB0aGlzLmZlZXMgPSBbe1xuICAgICAgaWQ6IG9iai5pZCxcbiAgICAgIGNvZGU6IG9iai5jb2RlLFxuICAgICAgdmVyc2lvbjogb2JqLnZlcnNpb24sXG4gICAgICBhcHBvcnRpb25fYW1vdW50OiBvYmouYXBwb3J0aW9uX2Ftb3VudCxcbiAgICAgIGNhbGN1bGF0ZWRfYW1vdW50OiBvYmouY2FsY3VsYXRlZF9hbW91bnQsXG4gICAgICB1cGRhdGVkX3ZvbHVtZTogb2JqLnVwZGF0ZWRfdm9sdW1lID8gb2JqLnVwZGF0ZWRfdm9sdW1lIDogb2JqLnZvbHVtZSxcbiAgICAgIHZvbHVtZTogb2JqLnZvbHVtZSxcbiAgICAgIHJlZnVuZF9hbW91bnQ6IHRoaXMuZ2V0T3ZlclBheW1lbnRWYWx1ZSgpXG4gICAgfV07XG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSBuZXcgUG9zdFJlZnVuZFJldHJvUmVtaXNzaW9uKHRoaXMuY29udGFjdERldGFpbHNPYmosIHRoaXMuZmVlcywgdGhpcy5wYXltZW50R3JvdXAucGF5bWVudHNbMF0ucmVmZXJlbmNlLCAnUlIwMzcnLFxuICAgICAgdGhpcy5nZXRPdmVyUGF5bWVudFZhbHVlKCksICdvcCcpO1xuICAgIHRoaXMucGF5bWVudFZpZXdTZXJ2aWNlLnBvc3RSZWZ1bmRzUmVhc29uKHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoXG4gICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgIGlmIChKU09OLnBhcnNlKHJlc3BvbnNlKSkge1xuICAgICAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnJztcbiAgICAgICAgICB0aGlzLnZpZXdTdGF0dXMgPSAncmVmdW5kY29uZmlybWF0aW9ucGFnZSc7XG4gICAgICAgICAgdGhpcy5yZWZ1bmRSZWZlcmVuY2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKS5yZWZ1bmRfcmVmZXJlbmNlO1xuICAgICAgICAgIHRoaXMucmVmdW5kQW1vdW50ID0gSlNPTi5wYXJzZShyZXNwb25zZSkucmVmdW5kX2Ftb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3I7XG4gICAgICAgIHRoaXMuaXNDb25maXJtYXRpb25CdG5EaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pXG4gIH1cbiAgZ290b0FkZHJlc3NQYWdlKG5vdGU/OiBJUmVmdW5kQ29udGFjdERldGFpbHMpIHtcbiAgICBpZiAobm90ZSkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSB7IGNvbnRhY3RfZGV0YWlsczogbm90ZSwgbm90aWZpY2F0aW9uX3R5cGU6IG5vdGUubm90aWZpY2F0aW9uX3R5cGUgfTtcbiAgICB9XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJ292ZXJQYXltZW50QWRkcmVzc0NhcHR1cmUnO1xuICB9XG4gIGFkZFJlZnVuZEZvclJlbWlzc2lvbihwYXltZW50OiBJUGF5bWVudCwgcmVtaXNzaW9uOiBJUmVtaXNzaW9uW10sIGZlZXM6IGFueSkge1xuICAgIC8vaWYoIXRoaXMuY2hrSXNJc3N1ZVJlZnVuZEJ0bkVuYWJsZShwYXltZW50KSkge1xuICAgIHRoaXMucGF5bWVudFZpZXdTZXJ2aWNlLmdldEFwcG9ydGlvblBheW1lbnREZXRhaWxzKHBheW1lbnQucmVmZXJlbmNlKS5zdWJzY3JpYmUoXG4gICAgICBwYXltZW50R3JvdXAgPT4ge1xuICAgICAgICB0aGlzLnBheW1lbnRHcm91cCA9IHBheW1lbnRHcm91cDtcblxuICAgICAgICB0aGlzLnBheW1lbnRHcm91cC5wYXltZW50cyA9IHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzLmZpbHRlclxuICAgICAgICAgIChwYXltZW50R3JvdXBPYmogPT4gcGF5bWVudEdyb3VwT2JqWydyZWZlcmVuY2UnXS5pbmNsdWRlcyhwYXltZW50LnJlZmVyZW5jZSkpO1xuICAgICAgICB0aGlzLnBheW1lbnQgPSB0aGlzLnBheW1lbnRHcm91cC5wYXltZW50c1swXTtcbiAgICAgICAgdGhpcy5yZW1pc3Npb25zID0gcmVtaXNzaW9uO1xuICAgICAgICB0aGlzLnJlbWlzc2lvbkZlZUFtdCA9IGZlZXMuZmlsdGVyKGRhdGEgPT4gZGF0YS5jb2RlID09PSB0aGlzLnJlbWlzc2lvbnNbJ2ZlZV9jb2RlJ10pWzBdLm5ldF9hbW91bnQ7XG4gICAgICAgIHRoaXMudmlld1N0YXR1cyA9ICdhZGRyZWZ1bmRmb3JyZW1pc3Npb24nO1xuICAgICAgICAvLyBjb25zdCBwYXltZW50QWxsb2NhdGlvbiA9IHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzWzBdLnBheW1lbnRfYWxsb2NhdGlvbjtcbiAgICAgICAgLy8gdGhpcy5pc1N0YXR1c0FsbG9jYXRlZCA9IHBheW1lbnRBbGxvY2F0aW9uLmxlbmd0aCA+IDAgJiYgcGF5bWVudEFsbG9jYXRpb25bMF0uYWxsb2NhdGlvbl9zdGF0dXMgPT09ICdBbGxvY2F0ZWQnIHx8IHBheW1lbnRBbGxvY2F0aW9uLmxlbmd0aCA9PT0gMDtcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4gdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvclxuICAgICk7XG4gICAgLy99XG4gIH1cblxuICBnb1RvUGF5bWVudFZpZXdDb21wb25lbnQoKSB7XG4gICAgdGhpcy52aWV3Q29tcFN0YXR1cyA9ICcnO1xuICAgIHRoaXMudmlld1N0YXR1cyA9ICdwYXltZW50dmlldyc7XG4gIH1cblxuICBpc3N1ZVJlZnVuZChwYXltZW50Z3JwOiBJUGF5bWVudEdyb3VwKSB7XG5cbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuYWRkUGF5bWVudEdyb3VwKHRoaXMucGF5bWVudEdyb3VwKTtcblxuICAgIGlmIChwYXltZW50Z3JwICE9PSBudWxsICYmIHBheW1lbnRncnAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuY2hrSXNJc3N1ZVJlZnVuZEJ0bkVuYWJsZShwYXltZW50Z3JwLnBheW1lbnRzWzBdKSkge1xuXG4gICAgICAgIC8vIE5vIHJlZnVuZCBhbmQgbm8gb3ZlciBwYXltZW50IC0tPiBzaG93SXNzdWVSZWZ1bmRQYWdlKClcbiAgICAgICAgaWYgKCF0aGlzLmlzQW55UmVmdW5kc0ZvclRoaXNDYXNlKCkgJiYgdGhpcy5nZXRCYWxhbmNlVG9CZVBhaWQoKSA9PSAwKSB7XG4gICAgICAgICAgdGhpcy5zaG93SXNzdWVSZWZ1bmRQYWdlKHBheW1lbnRncnApO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIE5vIHJlZnVuZCBhbmQgb3ZlciBwYXltZW50IC0tPiBzaG93T3ZlclBheW1lbnQoKVxuICAgICAgICBpZiAoIXRoaXMuaXNBbnlSZWZ1bmRzRm9yVGhpc0Nhc2UoKSAmJiB0aGlzLmdldEJhbGFuY2VUb0JlUGFpZCgpID4gMCkge1xuICAgICAgICAgIHRoaXMuc2hvd092ZXJQYXltZW50KCk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVmdW5kcyA+IDAgIGFuZCBvdmVyUGF5bWVudCA9PSAwIC0tLT4gcmVmdW5kcyBhY2NlcHRlZC4gc2hvd0lzc3VlUmVmdW5kUGFnZShzKVxuICAgICAgICBpZiAodGhpcy5pc0FueVJlZnVuZHNGb3JUaGlzQ2FzZSgpICYmIHRoaXMuZ2V0QmFsYW5jZVRvQmVQYWlkKCkgPT0gMCkge1xuICAgICAgICAgIHRoaXMuc2hvd0lzc3VlUmVmdW5kUGFnZShwYXltZW50Z3JwKTtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyBSZWZ1bmRzID4gMCBhbmQgb3ZlclBheW1lbnQgPiAwIC0tPiByZWZ1bmRzIGluIHByb2Nlc3Mgb3IgUmVqZWN0ZWQuXG4gICAgICAgIGlmICh0aGlzLmlzQW55UmVmdW5kc0ZvclRoaXNDYXNlKCkgJiYgdGhpcy5nZXRCYWxhbmNlVG9CZVBhaWQoKSA+IDApIHtcblxuICAgICAgICAgIC8vIHJlamVjdGVkIGJ5IGZlZSByZWZ1bmRzID09PSByZWZ1bmRzIGJ5IGZlZSBpdCBtZWFucyB0aGF0IHJlZnVuZCBmb3IgdGhlIGN1cnJlbnQgZmVlIGlzIHJlamVjdGVkLlxuICAgICAgICAgIGlmICh0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNUaGVDdXJyZW50UmVmdW5kUmVqZWN0ZWRGb3JUaGVGZWUodGhpcy5wYXltZW50RmVlcy5hdCgwKS5pZC50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93T3ZlclBheW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByZWZ1bmRzIGluIHByb2Nlc3MgU2VudCBmb3IgYXBwcm92YWwsQXBwcm92ZWRcbiAgICAgICAgICB0aGlzLnNob3dJc3N1ZVJlZnVuZFBhZ2UocGF5bWVudGdycCk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIGlzQW55UmVmdW5kc0ZvclRoaXNDYXNlKCl7XG4gICAgcmV0dXJuICh0aGlzLnBheW1lbnRMaWJDb21wb25lbnQucmVmdW5kcyAhPSBudWxsKSAmJiAodGhpcy5wYXltZW50TGliQ29tcG9uZW50LnJlZnVuZHMubGVuZ3RoID4gMCk7XG4gIH1cbiAgc2hvd092ZXJQYXltZW50KCkge1xuICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnb3ZlcnBheW1lbnQnO1xuICB9XG5cbiAgc2hvd0lzc3VlUmVmdW5kUGFnZShwYXltZW50Z3JwOiBJUGF5bWVudEdyb3VwKSB7XG5cbiAgICB0aGlzLnBheW1lbnRHcm91cCA9IHBheW1lbnRncnA7XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJ2lzc3VlcmVmdW5kJztcbiAgICB0aGlzLmlzUmVmdW5kUmVtaXNzaW9uID0gdHJ1ZTtcbiAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNGcm9tUGF5bWVudERldGFpbFBhZ2UgPSB0cnVlO1xuICAgIHRoaXMuaXNGcm9tUGF5bWVudERldGFpbFBhZ2UgPSB0cnVlO1xuICAgIHRoaXMuaXNGcm9tU2VydmljZVJlcXVlc3RQYWdlID0gZmFsc2U7XG4gIH1cblxuICBnZXRCYWxhbmNlVG9CZVBhaWQoKXtcbiAgICByZXR1cm4gdGhpcy5wYXltZW50TGliQ29tcG9uZW50Lm92ZXJQYXltZW50QW1vdW50XG4gIH1cblxuXG5cbiAgZ2V0UmVtaXNzaW9uQnlGZWVDb2RlKGZlZUNvZGU6IHN0cmluZywgcmVtaXNzaW9uczogSVJlbWlzc2lvbltdKTogSVJlbWlzc2lvbiB7XG4gICAgaWYgKHJlbWlzc2lvbnMgJiYgcmVtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlbWlzc2lvbiBvZiByZW1pc3Npb25zKSB7XG4gICAgICAgIGlmIChyZW1pc3Npb24uZmVlX2NvZGUgPT09IGZlZUNvZGUpIHtcbiAgICAgICAgICByZXR1cm4gcmVtaXNzaW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY2hrSXNJc3N1ZVJlZnVuZEJ0bkVuYWJsZShwYXltZW50OiBJUGF5bWVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChwYXltZW50ICE9PSBudWxsICYmIHBheW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBheW1lbnQuaXNzdWVfcmVmdW5kICYmIHBheW1lbnQucmVmdW5kX2VuYWJsZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY2hrSXNBZGRSZWZ1bmRCdG5FbmFibGUocmVtaXNzaW9uOiBJUmVtaXNzaW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHJlbWlzc2lvbiAhPT0gbnVsbCAmJiByZW1pc3Npb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlbWlzc2lvbi5hZGRfcmVmdW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cblxuICBjYW5JdEJlUmVmdW5kZWQocmVtaXNzaW9uOiBJUmVtaXNzaW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHJlbWlzc2lvbiAhPT0gbnVsbCAmJiByZW1pc3Npb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHJlbWlzc2lvbi5hZGRfcmVmdW5kID09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1pc3Npb24ub3ZlcmFsbF9iYWxhbmNlID4gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hrSXNBZGRSZW1pc3Npb25CdG5FbmFibGUoZmVlOiBJRmVlKTogYm9vbGVhbiB7XG4gICAgdGhpcy5wYXltZW50TGliQ29tcG9uZW50LmFkZFBheW1lbnRHcm91cCh0aGlzLnBheW1lbnRHcm91cCk7XG4gICAgaWYgKGZlZSAhPT0gbnVsbCAmJiBmZWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5nZXRSb3VuZGVkT3ZlclBheW1lbnQoKSA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZlZS5hZGRfcmVtaXNzaW9uICYmIGZlZS5yZW1pc3Npb25fZW5hYmxlICYmIHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc1RoZUN1cnJlbnRSZWZ1bmRJblByb2Nlc3NGb3JUaGlzRmVlKGZlZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmVlLmFkZF9yZW1pc3Npb24gJiYgZmVlLnJlbWlzc2lvbl9lbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG5cbiAgc2VsZWN0UHltZW50T3B0aW9uKHBheW1lbnRUeXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBheW1lbnRUeXBlID0gcGF5bWVudFR5cGU7XG4gICAgdGhpcy5pc0NvbnRpbnVlQnRuRGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxuICBjb250aW51ZVBheW1lbnQocGF5bWVudGdycDogSVBheW1lbnRHcm91cCkge1xuXG4gICAgaWYgKHRoaXMucGF5bWVudFR5cGUgPT09ICdvcCcpIHtcbiAgICAgIHRoaXMuaXNGdWxseVJlZnVuZCA9IGZhbHNlXG4gICAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJ292ZXJQYXltZW50QWRkcmVzc0NhcHR1cmUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYXltZW50VHlwZSA9PT0gJ2ZwJykge1xuICAgICAgdGhpcy5pc0Z1bGx5UmVmdW5kID0gdHJ1ZVxuICAgICAgdGhpcy5wYXltZW50R3JvdXAgPSBwYXltZW50Z3JwO1xuICAgICAgdGhpcy52aWV3U3RhdHVzID0gJ2lzc3VlcmVmdW5kJztcbiAgICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSBcIlwiO1xuICAgICAgdGhpcy5pc1JlZnVuZFJlbWlzc2lvbiA9IHRydWU7XG4gICAgICB0aGlzLnBheW1lbnRMaWJDb21wb25lbnQuaXNGcm9tUGF5bWVudERldGFpbFBhZ2UgPSB0cnVlO1xuICAgICAgdGhpcy5pc0Zyb21QYXltZW50RGV0YWlsUGFnZSA9IHRydWU7XG4gICAgICB0aGlzLmlzRnJvbVNlcnZpY2VSZXF1ZXN0UGFnZSA9IHRoaXMucGF5bWVudExpYkNvbXBvbmVudC5pc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2U7XG4gICAgfVxuICB9XG4gIGdvdG9QYXltZW50U2VsZWN0UGFnZShldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMudmlld0NvbXBTdGF0dXMgPSAnb3ZlcnBheW1lbnQnO1xuICB9XG4gIGdldENvbnRhY3REZXRhaWxzKG9iajogSVJlZnVuZENvbnRhY3REZXRhaWxzKSB7XG4gICAgdGhpcy5jb250YWN0RGV0YWlsc09iaiA9IG9iajtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblByZXZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmdldFRlbXBsYXRlSW5zdHJ1Y3Rpb25UeXBlKHRoaXMucGF5bWVudEdyb3VwLnBheW1lbnRzWzBdKTtcbiAgICB0aGlzLnZpZXdDb21wU3RhdHVzID0gJ292ZXJwYXltZW50Y2hlY2thbmRhbnN3ZXInO1xuXG4gIH1cblxuICByZXNldE9yZGVyRGF0YSgpIHtcbiAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldE9yZGVyUmVmKG51bGwpO1xuICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0b3JkZXJDQ0RFdmVudChudWxsKTtcbiAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyQ3JlYXRlZChudWxsKTtcbiAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyRGV0YWlsKG51bGwpO1xuICAgIHRoaXMuT3JkZXJzbGlzdFNlcnZpY2Uuc2V0b3JkZXJQYXJ0eShudWxsKTtcbiAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyVG90YWxQYXltZW50cyhudWxsKTtcbiAgICB0aGlzLk9yZGVyc2xpc3RTZXJ2aWNlLnNldG9yZGVyUmVtaXNzaW9uVG90YWwobnVsbCk7XG4gICAgdGhpcy5PcmRlcnNsaXN0U2VydmljZS5zZXRvcmRlckZlZXNUb3RhbChudWxsKTtcbiAgfVxuXG4gIGdvVG9QYXltZW50RmFpbHVlUGFnZShwYXltZW50OiBhbnkpIHtcbiAgICB0aGlzLnZpZXdTdGF0dXMgPSAncGF5bWVudC1mYWlsdXJlJztcbiAgICB0aGlzLnNlbGVjdGVkUGF5bWVudHNTdGF0dXMgPSBwYXltZW50O1xuICB9XG4gIGdvQmFja1RvUGF5bWVudFZpZXcoZXZlbnQ6IGFueSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy52aWV3U3RhdHVzID0gJ3BheW1lbnR2aWV3JztcbiAgfVxuXG4gIGdldFRlbXBsYXRlSW5zdHJ1Y3Rpb25UeXBlKHBheW1lbnQ6IElQYXltZW50KTogdm9pZCB7XG5cbiAgICBpZiAocGF5bWVudCA9PSB1bmRlZmluZWQgfHwgcGF5bWVudCA9PSBudWxsKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlSW5zdHJ1Y3Rpb25UeXBlID0gJ1RlbXBsYXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wbGF0ZUluc3RydWN0aW9uVHlwZSA9IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5nZXROb3RpZmljYXRpb25JbnN0cnVjdGlvblR5cGUocGF5bWVudC5jaGFubmVsLCBwYXltZW50Lm1ldGhvZCk7XG4gICAgfVxuXG4gIH1cblxuICBzaG93Tm90aWZpY2F0aW9uUHJldmlldygpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblByZXZpZXcgPSB0cnVlO1xuICB9XG5cbiAgaGlkZU5vdGlmaWNhdGlvblByZXZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25QcmV2aWV3ID0gZmFsc2U7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwYXltZW50LXZpZXctc2VjdGlvblwiPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdwYXltZW50dmlldycgJiYgdmlld0NvbXBTdGF0dXMgIT09ICdvdmVycGF5bWVudCcgJiYgdmlld0NvbXBTdGF0dXMgIT09ICdvdmVyUGF5bWVudEFkZHJlc3NDYXB0dXJlJyAmJiB2aWV3Q29tcFN0YXR1cyAhPT0gJ292ZXJwYXltZW50Y2hlY2thbmRhbnN3ZXInXCI+XG48ZGl2IGNsYXNzPVwiZ292dWstd2lkdGgtY29udGFpbmVyXCI+XG5cbiAgPGRpdiAgY2xhc3M9XCJnb3Z1ay1icmVhZGNydW1ic1wiPlxuICAgIDxvbCBjbGFzcz1cImdvdnVrLWJyZWFkY3J1bWJzX19saXN0XCI+XG4gICAgICA8bGkgY2xhc3M9XCJnb3Z1ay1icmVhZGNydW1ic19fbGlzdC1pdGVtXCI+XG4gICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwiZ29Ub0Nhc2VUcmFuc2F0aW9uUGFnZSgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1iYWNrLWxpbmtcIj57eyBcIkJhY2tcIiB8IHJweFRyYW5zbGF0ZSB9fTwvYT5cbiAgICAgIDwvbGk+XG4gICAgPC9vbD5cbiAgPC9kaXY+XG5cbiAgPG1haW4gY2xhc3M9XCJnb3Z1ay1tYWluLXdyYXBwZXIgZ292dWstIS1wYWRkaW5nLXRvcC0wXCIgaWQ9XCJtYWluLWNvbnRlbnRcIiByb2xlPVwibWFpblwiPlxuXG4gICAgPGRpdiAqbmdJZj1cImVycm9yTWVzc2FnZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImVycm9yLXN1bW1hcnlcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsbGVkYnk9XCJmYWlsdXJlLWVycm9yLXN1bW1hcnktaGVhZGluZ1wiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwiaGVhZGluZy1tZWRpdW0gZXJyb3Itc3VtbWFyeS1oZWFkaW5nXCIgaWQ9XCJmYWlsdXJlLWVycm9yLXN1bW1hcnktaGVhZGluZ1wiPlxuICAgICAgICAgIHt7IFwiUGF5bWVudCBkZXRhaWxzIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWRcIiB8IHJweFRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2gyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstZXJyb3Itc3VtbWFyeV9fYm9keVwiPlxuICAgICAgICAgIHt7IGVycm9yTWVzc2FnZSB8IHJweFRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInBheW1lbnQtdmlldy1hbGlnbm1lbnRcIiAqbmdJZj1cIiFlcnJvck1lc3NhZ2UgJiYgcGF5bWVudEdyb3VwPy5wYXltZW50c1swXVwiPlxuXG4gICAgICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J1BBWU1FTlRERVRBSUxTJz5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1ncmlkLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uXCI+XG4gICAgICAgICAgPGgxIGNsYXNzPVwiaGVhZGluZy1sYXJnZSBnb3Z1ay0hLW1hcmdpbi10b3AtMFwiPnt7IFwiUGF5bWVudCBkZXRhaWxzXCIgfCBycHhUcmFuc2xhdGUgfX08L2gxPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dGJvZHk+XG5cbiAgICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImJvbGQgdGItY29sLXdcIj57eyBcIlNlcnZpY2UgcmVxdWVzdCByZWZlcmVuY2VcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwidGItY29sLXdcIj57eyBzZXJ2aWNlUmVmZXJlbmNlICB9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJib2xkIHRiLWNvbC13XCI+e3sgXCJQYXltZW50IHJlZmVyZW5jZVwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJ0Yi1jb2wtd1wiPnt7IHBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0/LnJlZmVyZW5jZSB9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJib2xkIHRiLWNvbC13XCI+e3sgXCJQYXltZW50IGFtb3VudFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJ0Yi1jb2wtd1wiPsKje3sgcGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8uYW1vdW50IHwgbnVtYmVyOicuMicgfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJzZWN0aW9uXCIgKm5nSWY9XCJwYXltZW50R3JvdXA/LnBheW1lbnRzWzBdPy5vdmVyX3BheW1lbnQgPiAwXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiYm9sZCB0Yi1jb2wtd1wiPnt7IFwiT3ZlciBwYXltZW50XCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInRiLWNvbC13XCI+wqN7eyBnZXRPdmVyUGF5bWVudFZhbHVlKCkgfCBudW1iZXI6Jy4yJyB9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIiAqbmdJZj1cInBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0gJiYgcGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8uZG9jdW1lbnRfY29udHJvbF9udW1iZXIgJiYgIXBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0/LmV4dGVybmFsX3JlZmVyZW5jZVwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImJvbGQgdGItY29sLXdcIj57eyBcIlBheW1lbnQgYXNzZXQgbnVtYmVyXCIgfCBycHhUcmFuc2xhdGV9fShEQ04pPC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJ0Yi1jb2wtd1wiPnt7IHBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0/LmRvY3VtZW50X2NvbnRyb2xfbnVtYmVyIH19PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiICpuZ0lmPVwicGF5bWVudEdyb3VwPy5wYXltZW50c1swXSAmJiBwYXltZW50R3JvdXA/LnBheW1lbnRzWzBdPy5kb2N1bWVudF9jb250cm9sX251bWJlciAmJiAhcGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8uZXh0ZXJuYWxfcmVmZXJlbmNlXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiYm9sZCB0Yi1jb2wtd1wiPnt7IFwiQmFua2VkIGRhdGVcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwidGItY29sLXdcIj57eyBwYXltZW50R3JvdXA/LnBheW1lbnRzWzBdPy5iYW5rZWRfZGF0ZSB8IGRhdGU6J2RkIE1NTSB5eXl5JyB9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIiAqbmdJZj1cInBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0gJiYgcGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8uZXh0ZXJuYWxfcmVmZXJlbmNlXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiYm9sZCB0Yi1jb2wtd1wiPnt7IFwiR292UGF5IFRyYW5zYWN0aW9uIElEXCIgfCBycHhUcmFuc2xhdGU6IHtnb3Y6IFwiR292UGF5XCIsIGlkOiBcIklEXCJ9IH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJ0Yi1jb2wtd1wiPnt7IHBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0/LmV4dGVybmFsX3JlZmVyZW5jZSB9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIiA+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJib2xkIHRiLWNvbC13XCI+e3sgXCJQYXltZW50IG1ldGhvZFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRiLWNvbC13IHRleHQtdHJhbnNmb3JtXCI+e3sgcGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8ubWV0aG9kIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiICpuZ0lmPVwicGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8ubWV0aG9kID09PSAncGF5bWVudCBieSBhY2NvdW50J1wiID5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvbGQgdGItY29sLXdcIj57eyBcIlR5cGVcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0Yi1jb2wtd1wiICpuZ0lmPVwicGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8ubWV0aG9kICE9PSAnY2FyZCdcIj57eyBcIkNyZWRpdFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRiLWNvbC13XCIgKm5nSWY9XCJwYXltZW50R3JvdXA/LnBheW1lbnRzWzBdPy5tZXRob2QgPT09ICdjYXJkJ1wiPnt7IFwiQ2FyZFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYm9sZCB0Yi1jb2wtd1wiPnt7IFwiQ2hhbm5lbFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRiLWNvbC13IHRleHQtdHJhbnNmb3JtXCI+e3sgcGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8uY2hhbm5lbCB8IHJweFRyYW5zbGF0ZSAgfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvbGQgdGItY29sLXdcIj5NZXRob2Q8L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwicGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8ubWV0aG9kICE9PSAnY2FyZCdcIj57eyBwYXltZW50R3JvdXA/LnBheW1lbnRzWzBdPy5tZXRob2QgfX08L3RkPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwicGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8ubWV0aG9kID09PSAnY2FyZCdcIj5DQVJEPC90ZD5cbiAgICAgICAgPC90cj4gLS0+XG4gICAgICAgIDwhLS0gPHRyIGNsYXNzPVwic2VjdGlvblwiICpuZ0lmPVwicGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8uY2hhbm5lbCAhPT0gJ3RlbGVwaG9ueSdcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvbGQgdGItY29sLXdcIj5TdGF0dXM8L3RkPlxuICAgICAgICAgICAgPHRkPnt7IHBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0/LnN0YXR1cyB9fTwvdGQ+XG4gICAgICAgICA8L3RyPiAtLT5cbiAgICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiICpuZ0lmPVwicGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8ucGF5bWVudF9hbGxvY2F0aW9uWzBdICE9PSB1bmRlZmluZWRcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvbGQgdGItY29sLXdcIj57eyBcIkFsbG9jYXRvbiBzdGF0dXNcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0Yi1jb2wtd1wiPnt7IHBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0/LnBheW1lbnRfYWxsb2NhdGlvblswXT8uYWxsb2NhdGlvbl9zdGF0dXMgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICA8dHIgKm5nSWY9XCJwYXltZW50R3JvdXA/LnBheW1lbnRzWzBdLm9yZ2FuaXNhdGlvbl9uYW1lXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJib2xkIHRiLWNvbC13XCI+e3sgXCJQQkEgYWNjb3VudCBuYW1lXCIgfCBycHhUcmFuc2xhdGU6IHtwYmE6IFwiUEJBXCJ9IH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRiLWNvbC13XCI+e3sgcGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8ub3JnYW5pc2F0aW9uX25hbWUgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICA8dHIgKm5nSWY9XCJwYXltZW50R3JvdXA/LnBheW1lbnRzWzBdLmFjY291bnRfbnVtYmVyXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJib2xkIHRiLWNvbC13XCI+UEJBIHt7IFwibnVtYmVyXCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGItY29sLXdcIj57eyBwYXltZW50R3JvdXA/LnBheW1lbnRzWzBdPy5hY2NvdW50X251bWJlciB9fTwvdGQ+XG4gICAgICAgICAgPC90cj5cblxuICAgICAgICAgIDx0ciAqbmdJZj1cInBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0uY3VzdG9tZXJfcmVmZXJlbmNlXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJib2xkIHRiLWNvbC13XCI+e3sgXCJDdXN0b21lciBpbnRlcm5hbCByZWZlcmVuY2VcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0Yi1jb2wtd1wiPnt7IHBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0/LmN1c3RvbWVyX3JlZmVyZW5jZSB9fTwvdGQ+XG4gICAgICAgICAgPC90cj5cblxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cblxuICAgICAgPGRpdj5cbiAgICAgICAgICAgIDwhLS0gU3RhdHVzIGhpc3RvcmllcyAtLT5cbiAgICAgIDxjY3BheS1wYXltZW50LXN0YXR1c2VzICpuZ0lmPVwiaXNTdGF0dXNBbGxvY2F0ZWRcIiBbaXNUYWtlUGF5bWVudF09XCJpc1Rha2VQYXltZW50XCI+PC9jY3BheS1wYXltZW50LXN0YXR1c2VzPlxuICAgICAgPC9kaXY+XG4gICAgIDxkaXYgY2xhc3M9XCJyZW1pc3Npb25cIj5cbiAgICAgICAgPGJ1dHRvbiAgW2Rpc2FibGVkXT1cIiFjaGtJc0lzc3VlUmVmdW5kQnRuRW5hYmxlKHBheW1lbnRHcm91cD8ucGF5bWVudHNbMF0pXCIgIChjbGljayk9XCJpc3N1ZVJlZnVuZChwYXltZW50R3JvdXApXCIgY2xhc3M9XCJnb3Z1ay1idXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIj57eyBcIklzc3VlIHJlZnVuZFwiIHwgcnB4VHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgIDwvZGl2PlxuPGRpdiAqbmdJZj1cIklTUEFZTUVOVFNUQVRVU0VOQUJMRURcIj5cbiAgICAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgICAgPGgyIGNsYXNzPVwiaGVhZGluZy1tZWRpdW1cIj57eyBcIkRpc3B1dGVkIHBheW1lbnQgaGlzdG9yeVwiIHwgcnB4VHJhbnNsYXRlIH19PC9oMj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2PlxuICAgICAgPHRhYmxlPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoPnt7IFwiU3RhdHVzXCIgfCBycHhUcmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICA8dGg+e3sgXCJBbW91bnRcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aD57eyBcIkRhdGVcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGg+XG4gICAgICAgICAgICAgIDx0aD57eyBcIlBheW1lbnQgcmVmZXJlbmNlXCIgfCBycHhUcmFuc2xhdGUgfX08L3RoPlxuICAgICAgICAgICAgICA8dGg+e3sgXCJFdmVudFwiIHwgcnB4VHJhbnNsYXRlIH19PC90aD5cbiAgICAgICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvdGhlYWQ+IFxuICAgICAgICAgIDx0Ym9keSAqbmdJZj1cIiFlcnJvck1zZyAmJiBhbGxQYXltZW50c0ZhaWx1cmUubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwYXltZW50IG9mIGFsbFBheW1lbnRzRmFpbHVyZVwiPlxuICAgICAgICAgICAgICA8dGQ+e3sgcGF5bWVudC5zdGF0dXMgfCBjYXBpdGFsaXplIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICAgICAgPHRkPsKje3sgcGF5bWVudC5kaXNwdXRlZF9hbW91bnQgfCBudW1iZXI6Jy4yJyB9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57eyhwYXltZW50LnJlcHJlc2VudG1lbnRfZGF0ZSA/IHBheW1lbnQucmVwcmVzZW50bWVudF9kYXRlIDogcGF5bWVudC5mYWlsdXJlX2V2ZW50X2RhdGVfdGltZSkgfCBkYXRlOidkZCBNTU0geXl5eSd9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD57eyBwYXltZW50LnBheW1lbnRfcmVmZXJlbmNlIH19PC90ZD5cbiAgICAgICAgICAgICAgPHRkID57eyBwYXltZW50LmZhaWx1cmVfdHlwZSB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cImdvVG9QYXltZW50RmFpbHVlUGFnZShwYXltZW50KVwiPnt7IFwiU2hvdyBkZXRhaWxcIiB8IHJweFRyYW5zbGF0ZSB9fTwvYT5cblxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDx0Ym9keSAgKm5nSWY9XCJlcnJvck1zZyB8fCBhbGxQYXltZW50c0ZhaWx1cmUubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNlwiPiB7eyBcIk5vIGRpc3B1dGVkIHBheW1lbnQgaGlzdG9yeSBhdmFpbGFibGUuXCIgfCBycHhUcmFuc2xhdGUgfX0gPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICAgIDxici8+XG4gICAgPGJyLz5cbiAgPC9kaXY+XG4gICAgICBcbiAgICAgPGRpdiAgKm5nSWY9XCJjaGVja0ZvckZlZXMocGF5bWVudEdyb3VwKVwiPlxuICAgICAgPGRpdiAgKm5nSWY9XCJwYXltZW50R3JvdXAuZmVlcy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cbiAgICAgICAgICA8YnIvPlxuICAgICAgICAgIDxici8+XG4gICAgICAgICAgPGgyIGNsYXNzPVwiaGVhZGluZy1sYXJnZVwiPnt7IFwiRmVlIGFuZCByZW1pc3Npb24gZGV0YWlsc1wiIHwgcnB4VHJhbnNsYXRlIH19PC9oMj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmZWUgb2YgcGF5bWVudEdyb3VwLmZlZXNcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGVcIj5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYm9sZCB0Yi1jb2wtd1wiPnt7IFwiRGVzY3JpcHRpb25cIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0Yi1jb2wtd1wiPnt7IFwiQXBwbGljYXRpb24gZm9yXCIgfCBycHhUcmFuc2xhdGUgfX0ge3sgZmVlLmRlc2NyaXB0aW9uIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImJvbGQgdGItY29sLXdcIj57eyBcIkZlZSBjb2RlXCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidGItY29sLXdcIj57eyBmZWU/LmNvZGUgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYm9sZCB0Yi1jb2wtd1wiIFtuZ0NsYXNzXT1cInsndHItYm9yZGVyJzogIWZlZS5hcHBvcnRpb25fYW1vdW50ICYmICFmZWUucmVtaXNzaW9ucyAmJiAhaXNUdXJuT2ZmIH1cIj57eyBcIkZlZSBhbW91bnRcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgW25nQ2xhc3NdPVwieyd0ci1ib3JkZXInOiAhZmVlLmFwcG9ydGlvbl9hbW91bnQgJiYgIWZlZS5yZW1pc3Npb25zICYmICFpc1R1cm5PZmZ9XCI+wqN7eyBmZWU/LmNhbGN1bGF0ZWRfYW1vdW50IHwgbnVtYmVyOicuMicgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICA8dHIgKm5nSWY9XCJmZWUuYXBwb3J0aW9uX2Ftb3VudFwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYm9sZCB0Yi1jb2wtdyB0ci1ib3JkZXJcIiBbbmdDbGFzc109XCJ7J3RyLWJvcmRlcic6ICFmZWUucmVtaXNzaW9uc31cIj57eyBcIkFsbG9jYXRlZCBhbW91bnRcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgW25nQ2xhc3NdPVwieyd0ci1ib3JkZXInOiAhZmVlLnJlbWlzc2lvbnN9XCI+wqN7eyBmZWU/LmFwcG9ydGlvbl9hbW91bnQgfCBudW1iZXI6Jy4yJyB9fTwvdGQ+XG4gICAgICAgICAgPC90cj5cblxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cIiFjaGtJc0FkZFJlbWlzc2lvbkJ0bkVuYWJsZShmZWUpXCIgKGNsaWNrKT1cImFkZFJlbWlzc2lvbihmZWUpXCIgY2xhc3M9XCJnb3Z1ay1idXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIj4ge3sgXCJBZGQgcmVtaXNzaW9uXCIgfCBycHhUcmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSByZW1pc3Npb25zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcmRlci1jbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIDx0YWJsZSBjbGFzcz1cImdvdnVrLXRhYmxlXCI+XG4gICAgICA8dGhlYWQgY2xhc3M9XCJnb3Z1ay10YWJsZV9faGVhZFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXIgY29sLTI0IHdoaXRlc3BhY2UtaW5oZXJpdFwiIHNjb3BlPVwiY29sXCI+e3sgXCJIZWxwIHdpdGggZmVlcyBvciByZW1pc3Npb24gY29kZVwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXIgY29sLTI3IHdoaXRlc3BhY2UtaW5oZXJpdFwiIHNjb3BlPVwiY29sXCI+e3sgXCJSZWZlcmVuY2VcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9faGVhZGVyIHdoaXRlc3BhY2UtaW5oZXJpdFwiIHNjb3BlPVwiY29sXCI+e3sgXCJGZWVcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9faGVhZGVyIHdoaXRlc3BhY2UtaW5oZXJpdFwiIHNjb3BlPVwiY29sXCI+e3sgXCJSZW1pc3Npb24gQW1vdW50XCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICAgICAgPHRkICBjbGFzcz1cImdvdnVrLXRhYmxlX19oZWFkZXIgd2hpdGVzcGFjZS1pbmhlcml0IHJlZnVuZEJ0blwiIHNjb3BlPVwiY29sXCI+PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSBjbGFzcz1cImdvdnVrLXRhYmxlX19ib2R5XCIgICpuZ0Zvcj1cImxldCByZW1pc3Npb24gb2YgcGF5bWVudEdyb3VwLnJlbWlzc2lvbnNcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCB3aGl0ZXNwYWNlLWluaGVyaXRcIj57eyByZW1pc3Npb24/Lmh3Zl9yZWZlcmVuY2UgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgd2hpdGVzcGFjZS1pbmhlcml0XCI+e3sgcmVtaXNzaW9uPy5yZW1pc3Npb25fcmVmZXJlbmNlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIHdoaXRlc3BhY2UtaW5oZXJpdFwiPnt7IHJlbWlzc2lvbj8uZmVlX2NvZGUgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgd2hpdGVzcGFjZS1pbmhlcml0XCI+e3sgcmVtaXNzaW9uPy5od2ZfYW1vdW50IHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMid9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCByZWZ1bmRCdG4gd2hpdGVzcGFjZS1pbmhlcml0XCIgID5cbiAgICAgICAgICAgICAgIDxidXR0b24gIFtkaXNhYmxlZF09XCIhY2FuSXRCZVJlZnVuZGVkKHJlbWlzc2lvbilcIiAoY2xpY2spPVwiYWRkUmVmdW5kRm9yUmVtaXNzaW9uKHBheW1lbnRHcm91cC5wYXltZW50c1swXSxyZW1pc3Npb24scGF5bWVudEdyb3VwLmZlZXMpXCIgY2xhc3M9XCJnb3Z1ay1idXR0b24gZ292dWstYnV0dG9uLS1zZWNvbmRhcnlcIj4gQWRkIHJlZnVuZDwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgPC90Ym9keT5cblxuXG4gICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PjwvZGl2PlxuXG4gICA8ZGl2ICpuZ0lmPVwicGF5bWVudEdyb3VwLnJlbWlzc2lvbnM/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXItMTdcIiA+e3sgXCJObyBoZWxwIHdpdGggZmVlcyBvciByZW1pc3Npb25zLlwiIHwgcnB4VHJhbnNsYXRlIH19PC9zcGFuPlxuICAgPC9kaXY+XG5cbiAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbWFpbj5cbjwvZGl2PlxuXG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3U3RhdHVzID09PSAnYWRkcmVtaXNzaW9uJyAmJiBmZWVJZCAmJiB2aWV3Q29tcFN0YXR1cyAhPT0gJ292ZXJwYXltZW50JyAmJiB2aWV3Q29tcFN0YXR1cyAhPT0gJ292ZXJQYXltZW50QWRkcmVzc0NhcHR1cmUnICYmIHZpZXdDb21wU3RhdHVzICE9PSAnb3ZlcnBheW1lbnRjaGVja2FuZGFuc3dlcidcIj5cbjxjY3BheS1hZGQtcmVtaXNzaW9uIFxuW2lzVHVybk9mZl09XCJpc1R1cm5PZmZcIlxuW2lzU3RyYXRlZ2ljRml4RW5hYmxlXT1cImlzU3RyYXRlZ2ljRml4RW5hYmxlXCJcblt2aWV3Q29tcFN0YXR1c109IFwidmlld1N0YXR1c1wiXG5bZmVlXT1cImZlZUlkXCJcbltwYXltZW50XSA9IFwicGF5bWVudFwiXG5bb3JkZXJTdGF0dXNdID1cInBheW1lbnRHcm91cC5wYXltZW50c1swXS5zdGF0dXNcIlxuW3BhaWRBbW91bnRdPSBcInBheW1lbnRHcm91cC5wYXltZW50c1swXS5hbW91bnRcIlxuW2lzUmVmdW5kUmVtaXNzaW9uXT1cImlzUmVmdW5kUmVtaXNzaW9uXCJcbltjYXNlVHlwZV09XCJjYXNlVHlwZVwiXG5bcGF5bWVudEdyb3VwUmVmXT1cInBheW1lbnRHcm91cC5wYXltZW50X2dyb3VwX3JlZmVyZW5jZVwiXG5baXNGcm9tUGF5bWVudERldGFpbFBhZ2VdID0gXCJ0cnVlXCJcbltjY2RDYXNlTnVtYmVyXT1cImNjZENhc2VOdW1iZXJcIlxuW29yZGVyRmVlc1RvdGFsXSA9IFwib3JkZXJGZWVzVG90YWxcIlxuW29yZGVyVG90YWxQYXltZW50c10gPSBcIm9yZGVyVG90YWxQYXltZW50c1wiXG5bb3JkZXJSZW1pc3Npb25Ub3RhbF0gPSBcIm9yZGVyUmVtaXNzaW9uVG90YWxcIlxuW29yZGVyUmVmXSA9IFwib3JkZXJSZWZcIlxuW29yZGVyQ3JlYXRlZF0gPSBcIm9yZGVyQ3JlYXRlZFwiXG5bb3JkZXJQYXJ0eV0gPSBcIm9yZGVyUGFydHlcIlxuW29yZGVyQ0NERXZlbnRdID0gXCJvcmRlckNDREV2ZW50XCJcbltvcmRlckRldGFpbF0gPSBcIm9yZGVyRGV0YWlsXCJcbltMT0dHRURJTlVTRVJST0xFU10gPSBcIkxPR0dFRElOVVNFUlJPTEVTXCI+PC9jY3BheS1hZGQtcmVtaXNzaW9uPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3U3RhdHVzID09PSAnYWRkcmVmdW5kZm9ycmVtaXNzaW9uJyAmJiBwYXltZW50ICYmIHZpZXdDb21wU3RhdHVzICE9PSAnb3ZlcnBheW1lbnQnICYmIHZpZXdDb21wU3RhdHVzICE9PSAnb3ZlclBheW1lbnRBZGRyZXNzQ2FwdHVyZScgJiYgdmlld0NvbXBTdGF0dXMgIT09ICdvdmVycGF5bWVudGNoZWNrYW5kYW5zd2VyJ1wiPlxuXG48Y2NwYXktYWRkLXJlbWlzc2lvblxuW2lzVHVybk9mZl09XCJpc1R1cm5PZmZcIlxuW2lzU3RyYXRlZ2ljRml4RW5hYmxlXT1cImlzU3RyYXRlZ2ljRml4RW5hYmxlXCJcblt2aWV3Q29tcFN0YXR1c109IFwidmlld1N0YXR1c1wiXG5bcGF5bWVudF09XCJwYXltZW50XCJcbltvcmRlclN0YXR1c10gPVwib3JkZXJTdGF0dXNcIlxuW3BhaWRBbW91bnRdPSBcIm9yZGVyVG90YWxQYXltZW50c1wiXG5baXNSZWZ1bmRSZW1pc3Npb25dPVwiaXNSZWZ1bmRSZW1pc3Npb25cIlxuW2Nhc2VUeXBlXT1cImNhc2VUeXBlXCJcbltmZWVhbW91bnRdPVwicmVtaXNzaW9uRmVlQW10XCJcbltyZW1pc3Npb25dID0gXCJyZW1pc3Npb25zXCJcbltpc0Zyb21TZXJ2aWNlUmVxdWVzdFBhZ2VdPVwiZmFsc2VcIlxuW3BheW1lbnRHcm91cFJlZl09XCJwYXltZW50R3JvdXAucGF5bWVudF9ncm91cF9yZWZlcmVuY2VcIlxuW2NjZENhc2VOdW1iZXJdPVwiY2NkQ2FzZU51bWJlclwiXG5bb3JkZXJGZWVzVG90YWxdID0gXCJvcmRlckZlZXNUb3RhbFwiXG5bb3JkZXJUb3RhbFBheW1lbnRzXSA9IFwib3JkZXJUb3RhbFBheW1lbnRzXCJcbltvcmRlclJlbWlzc2lvblRvdGFsXSA9IFwib3JkZXJSZW1pc3Npb25Ub3RhbFwiXG5bb3JkZXJSZWZdID0gXCJvcmRlclJlZlwiXG5bb3JkZXJDcmVhdGVkXSA9IFwib3JkZXJDcmVhdGVkXCJcbltvcmRlclBhcnR5XSA9IFwib3JkZXJQYXJ0eVwiXG5bb3JkZXJDQ0RFdmVudF0gPSBcIm9yZGVyQ0NERXZlbnRcIlxuW29yZGVyRGV0YWlsXSA9IFwib3JkZXJEZXRhaWxcIlxuW0xPR0dFRElOVVNFUlJPTEVTXSA9IFwiTE9HR0VESU5VU0VSUk9MRVNcIj48L2NjcGF5LWFkZC1yZW1pc3Npb24+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdpc3N1ZXJlZnVuZCcgJiYgdmlld0NvbXBTdGF0dXMgIT09ICdvdmVycGF5bWVudCcgJiYgdmlld0NvbXBTdGF0dXMgIT09ICdvdmVyUGF5bWVudEFkZHJlc3NDYXB0dXJlJyAmJiB2aWV3Q29tcFN0YXR1cyAhPT0gJ292ZXJwYXltZW50Y2hlY2thbmRhbnN3ZXInXCI+XG4gICAgPGNjcGF5LWFkZC1yZW1pc3Npb24gXG4gICAgW2lzVHVybk9mZl09XCJpc1R1cm5PZmZcIlxuICAgIFtpc1N0cmF0ZWdpY0ZpeEVuYWJsZV09XCJpc1N0cmF0ZWdpY0ZpeEVuYWJsZVwiXG4gICAgW3BheW1lbnRdID0gJ3BheW1lbnRHcm91cC5wYXltZW50c1swXSdcbiAgICBbdmlld0NvbXBTdGF0dXNdPSBcInZpZXdTdGF0dXNcIlxuICAgIFtvcmRlclN0YXR1c10gPVwicGF5bWVudEdyb3VwLnBheW1lbnRzWzBdLnN0YXR1c1wiXG4gICAgW3BhaWRBbW91bnRdPSBcInBheW1lbnRHcm91cC5wYXltZW50c1swXS5hbW91bnRcIlxuICAgIFtpc1JlZnVuZFJlbWlzc2lvbl09XCJpc1JlZnVuZFJlbWlzc2lvblwiXG4gICAgW2Nhc2VUeXBlXT1cImNhc2VUeXBlXCJcbiAgICBbaXNGcm9tU2VydmljZVJlcXVlc3RQYWdlXT1cImlzRnJvbVNlcnZpY2VSZXF1ZXN0UGFnZVwiXG4gICAgW2lzRnJvbVBheW1lbnREZXRhaWxQYWdlXSA9IFwiaXNGcm9tUGF5bWVudERldGFpbFBhZ2VcIlxuICAgIFtwYXltZW50R3JvdXBSZWZdPVwicGF5bWVudEdyb3VwLnBheW1lbnRfZ3JvdXBfcmVmZXJlbmNlXCJcbiAgICBbY2NkQ2FzZU51bWJlcl09XCJjY2RDYXNlTnVtYmVyXCJcbiAgICBbb3JkZXJGZWVzVG90YWxdID0gXCJvcmRlckZlZXNUb3RhbFwiXG4gICAgW29yZGVyVG90YWxQYXltZW50c10gPSBcIm9yZGVyVG90YWxQYXltZW50c1wiXG4gICAgW29yZGVyUmVtaXNzaW9uVG90YWxdID0gXCJvcmRlclJlbWlzc2lvblRvdGFsXCJcbiAgICBbb3JkZXJSZWZdID0gXCJvcmRlclJlZlwiXG4gICAgW29yZGVyQ3JlYXRlZF0gPSBcIm9yZGVyQ3JlYXRlZFwiXG4gICAgW29yZGVyUGFydHldID0gXCJvcmRlclBhcnR5XCJcbiAgICBbb3JkZXJDQ0RFdmVudF0gPSBcIm9yZGVyQ0NERXZlbnRcIlxuICAgIFtvcmRlckRldGFpbF0gPSBcIm9yZGVyRGV0YWlsXCJcbiAgICBbZmVlc10gPVwicGF5bWVudEZlZXNcIlxuICAgIFtpc0Z1bGx5UmVmdW5kXSA9IFwiaXNGdWxseVJlZnVuZFwiXG4gICAgW0xPR0dFRElOVVNFUlJPTEVTXSA9IFwiTE9HR0VESU5VU0VSUk9MRVNcIj5cbiAgICBcbiAgPjwvY2NwYXktYWRkLXJlbWlzc2lvbj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdvcmRlci1mdWxsLXZpZXcnICYmIHZpZXdDb21wU3RhdHVzICE9PSAnb3ZlcnBheW1lbnQnICYmIHZpZXdDb21wU3RhdHVzICE9PSAnb3ZlclBheW1lbnRBZGRyZXNzQ2FwdHVyZScgJiYgdmlld0NvbXBTdGF0dXMgIT09ICdvdmVycGF5bWVudGNoZWNrYW5kYW5zd2VyJ1wiPlxuICA8Y2NwYXktc2VydmljZS1yZXF1ZXN0XG4gIFt2aWV3U3RhdHVzXSA9IFwidmlld1N0YXR1c1wiXG4gIFtvcmRlclJlZl0gPSBcIm9yZGVyUmVmXCJcbiAgW29yZGVyU3RhdHVzXSA9IFwib3JkZXJTdGF0dXNcIlxuICBbb3JkZXJDcmVhdGVkXSA9IFwib3JkZXJDcmVhdGVkXCJcbiAgW29yZGVyUGFydHldID0gXCJvcmRlclBhcnR5XCJcbiAgW29yZGVyQ0NERXZlbnRdID0gXCJvcmRlckNDREV2ZW50XCJcbiAgW29yZGVyRGV0YWlsXSA9IFwib3JkZXJEZXRhaWxcIlxuICBbTE9HR0VESU5VU0VSUk9MRVNdID0gXCJMT0dHRURJTlVTRVJST0xFU1wiXG4gIFt0YWtlUGF5bWVudF0gPSBcImlzVGFrZVBheW1lbnRcIlxuICBbY2NkQ2FzZU51bWJlcl0gPSBcImNjZENhc2VOdW1iZXJcIlxuICBbb3JkZXJGZWVzVG90YWxdID0gXCJvcmRlckZlZXNUb3RhbFwiXG4gIFtvcmRlclRvdGFsUGF5bWVudHNdID0gXCJvcmRlclRvdGFsUGF5bWVudHNcIlxuICBbb3JkZXJSZW1pc3Npb25Ub3RhbF0gPSBcIm9yZGVyUmVtaXNzaW9uVG90YWxcIlxuICBbaXNTZXJ2aWNlUmVxdWVzdF0gPSBcImlzU2VydmljZVJlcXVlc3RcIlxuICAoZ29Ub1NlcnZpY2VScXVlc3RDb21wb25lbnQpID0gXCJnb1RvU2VydmljZVJlcXVlc3RQYWdlKClcIlxuPlxuPC9jY3BheS1zZXJ2aWNlLXJlcXVlc3Q+XG5cbjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwib3Zlci1wYXltZW50XCI+XG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld0NvbXBTdGF0dXMgPT09ICdvdmVycGF5bWVudCdcIj5cbiAgPGlucHV0ICNteUlucHV0IHR5cGU9J2hpZGRlbicgaWQ9J2lGcmFtZURyaXZlbkltYWdlVmFsdWUnIHZhbHVlPSdPVkVSUEFZTUVOVFBBR0UnPiBcbiAgPGgxIGNsYXNzPVwiaGVhZGluZy1sYXJnZVwiPnt7IFwiSXNzdWUgcmVmdW5kXCIgfCBycHhUcmFuc2xhdGUgfX08L2gxPlxuICA8aDEgY2xhc3M9XCJoZWFkaW5nLW1lZGl1bVwiPnt7IFwiQ2FzZSByZWZlcmVuY2VcIiB8IHJweFRyYW5zbGF0ZX19OiB7e2NjZENhc2VOdW1iZXIgfCBjY2RIeXBoZW5zIH19PC9oMT5cbiAgPHNwYW4gaWQ9XCJob3ctY29udGFjdGVkLWNvbmRpdGlvbmFsLWhpbnQgZ292dWstZm9udDE5cHhcIiBjbGFzcz1cImZvcm0taGludFwiPlxuICAgIHt7IFwiUGF5bWVudCByZWZlcmVuY2VcIiB8IHJweFRyYW5zbGF0ZSB9fToge3twYXltZW50R3JvdXA/LnBheW1lbnRzWzBdPy5yZWZlcmVuY2V9fVxuICA8L3NwYW4+XG48ZGl2IGNsYXNzPVwiZ292dWstZm9ybS1ncm91cFwiPlxuICA8ZmllbGRzZXQgY2xhc3M9XCJnb3Z1ay1maWVsZHNldFwiPlxuICAgIDxsZWdlbmQgY2xhc3M9XCJnb3Z1ay1maWVsZHNldF9fbGVnZW5kIGdvdnVrLWZpZWxkc2V0X19sZWdlbmQtLWxcIj5cbiAgICAgIDxoMSBjbGFzcz1cImhlYWRpbmctbWVkaXVtXCI+e3sgXCJTZWxlY3QgcGF5bWVudCB0byByZWZ1bmRcIiB8IHJweFRyYW5zbGF0ZSB9fTwvaDE+XG4gICAgPC9sZWdlbmQ+XG4gICAgPGRpdiBjbGFzcz1cImdvdnVrLXJhZGlvc1wiIGRhdGEtbW9kdWxlPVwiZ292dWstcmFkaW9zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ292dWstcmFkaW9zX19pdGVtXCI+XG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImdvdnVrLXJhZGlvc19faW5wdXRcIiBpZD1cIm92ZXItcGF5bWVudFwiIG5hbWU9XCJvdmVyLXBheW1lbnRcIiB0eXBlPVwicmFkaW9cIiAoY2xpY2spPVwic2VsZWN0UHltZW50T3B0aW9uKCdvcCcpXCIgdmFsdWU9XCJvcFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJnb3Z1ay1sYWJlbCBnb3Z1ay1yYWRpb3NfX2xhYmVsIGdvdnVrLWZvbnQxOXB4XCIgZm9yPVwid2hlcmUtZG8teW91LWxpdmVcIj5cbiAgICAgICAgICB7eyBcIk92ZXIgcGF5bWVudFwiIHwgcnB4VHJhbnNsYXRlIH19IMKje3tnZXRPdmVyUGF5bWVudFZhbHVlKCkgfCBudW1iZXI6Jy4yJ319XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1yYWRpb3NfX2l0ZW1cIj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZ292dWstcmFkaW9zX19pbnB1dFwiIGlkPVwiZnVsbC1wYXltZW50XCIgbmFtZT1cIm92ZXItcGF5bWVudFwiIHR5cGU9XCJyYWRpb1wiIChjbGljayk9XCJzZWxlY3RQeW1lbnRPcHRpb24oJ2ZwJylcIiB2YWx1ZT1cImZwXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImdvdnVrLWxhYmVsIGdvdnVrLXJhZGlvc19fbGFiZWwgZ292dWstZm9udDE5cHhcIiBmb3I9XCJ3aGVyZS1kby15b3UtbGl2ZS0yXCI+XG4gICAgICAgICAge3sgXCJGdWxsIHBheW1lbnRcIiB8IHJweFRyYW5zbGF0ZSB9fSDCo3t7cGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8uYW1vdW50IHwgbnVtYmVyOicuMid9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZ292dWstYnV0dG9uIGdvdnVrLWJ1dHRvbi0tc2Vjb25kYXJ5IG92ZXItcGF5bWVudC1hbGlnbm1lbnQgZ292dWstZm9udDE5cHhcIlxuICAgICAgKGNsaWNrKT1cImdvVG9QYXltZW50Vmlld0NvbXBvbmVudCgpXCI+IHt7IFwiUHJldmlvdXNcIiB8IHJweFRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBcbiAgICAgIChjbGljayk9XCJjb250aW51ZVBheW1lbnQocGF5bWVudEdyb3VwKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiaXNDb250aW51ZUJ0bkRpc2FibGVkXCJcbiAgICAgIFtuZ0NsYXNzXT0naXNDb250aW51ZUJ0bkRpc2FibGVkID8gXCJidXR0b24gYnV0dG9uLS1kaXNhYmxlZCBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xIGdvdnVrLWZvbnQxOXB4XCIgOiBcImJ1dHRvbiBnb3Z1ay0hLW1hcmdpbi1yaWdodC0xIGdvdnVrLWZvbnQxOXB4XCInXG4gICAgICBjbGFzcz1cImdvdnVrLWJ1dHRvblwiPiB7eyBcIkNvbnRpbnVlXCIgfCBycHhUcmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgPC9maWVsZHNldD5cbjwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3Q29tcFN0YXR1cyA9PT0gJ292ZXJQYXltZW50QWRkcmVzc0NhcHR1cmUnXCI+XG4gIDxpbnB1dCAjbXlJbnB1dCB0eXBlPSdoaWRkZW4nIGlkPSdpRnJhbWVEcml2ZW5JbWFnZVZhbHVlJyB2YWx1ZT0nT1ZFUlBBWU1FTlRBRERSRVNTQ0FQVFVSRVBBR0UnPiAgICAgIFxuICA8aDEgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj57eyBcIklzc3VlIHJlZnVuZFwiIHwgcnB4VHJhbnNsYXRlIH19PC9oMT5cbiAgPGgyIGNsYXNzPVwiZ292dWstaGVhZGluZy1tIGdvdnVrLWZvbnQxOXB4XCI+e3sgXCJDYXNlIHJlZmVyZW5jZVwiIHwgcnB4VHJhbnNsYXRlIH19OiB7e2NjZENhc2VOdW1iZXIgfCBjY2RIeXBoZW5zIH19PC9oMj5cbiAgPHNwYW4gaWQ9XCJob3ctY29udGFjdGVkLWNvbmRpdGlvbmFsLWhpbnRcIiBjbGFzcz1cImdvdnVrLWhpbnQgZ292dWstZm9udDE5cHhcIj5cbiAgICB7eyBcIlBheW1lbnQgcmVmZXJlbmNlXCIgfCBycHhUcmFuc2xhdGUgfX06IHt7cGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8ucmVmZXJlbmNlfX1cbiAgPC9zcGFuPlxuPGNjcGF5LWNvbnRhY3QtZGV0YWlscyBcblthZGRyZXNzT2JqXSA9IG5vdGlmaWNhdGlvblxuKGFzc2lnbkNvbnRhY3REZXRhaWxzKT1cImdldENvbnRhY3REZXRhaWxzKCRldmVudClcIlxuKHJlZGlyZWN0VG9Jc3N1ZVJlZnVuZCk9XCJnb3RvUGF5bWVudFNlbGVjdFBhZ2UoJGV2ZW50KVwiID48L2NjcGF5LWNvbnRhY3QtZGV0YWlscz5cbjxwPlxuICAgIDxhIChjbGljayk9XCJnb1RvQ2FzZVRyYW5zYXRpb25QYWdlKCRldmVudClcIiBjbGFzcz1cImdvdnVrLWxpbmtcIiBkYXRhLW1vZHVsZT1cImdvdnVrLWJ1dHRvblwiPlxuICAgICAgICB7eyBcIkNhbmNlbFwiIHwgcnB4VHJhbnNsYXRlIH19XG4gICAgPC9hPlxuPC9wPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3Q29tcFN0YXR1cyA9PT0gJ292ZXJwYXltZW50Y2hlY2thbmRhbnN3ZXInXCI+XG4gIDxpbnB1dCAjbXlJbnB1dCB0eXBlPSdoaWRkZW4nIGlkPSdpRnJhbWVEcml2ZW5JbWFnZVZhbHVlJyB2YWx1ZT0nQUREUkVGVU5ERk9SUkVNSVNTSU9OJz4gXG4gIDxkaXYgY2xhc3M9XCJnb3Z1ay13YXJuaW5nLXRleHRcIj5cbiAgIFxuICAgICAgPGgxIGNsYXNzPVwiaGVhZGluZy1sYXJnZVwiPiB7eyBcIkNoZWNrIHlvdXIgYW5zd2Vyc1wiIHwgcnB4VHJhbnNsYXRlIH19PC9oMT5cbiAgPC9kaXY+XG4gIDx0YWJsZSBjbGFzcz1cImdvdnVrLXRhYmxlXCI+XG4gICAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+e3sgXCJQYXltZW50IHJlZmVyZW5jZVwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPiB7e3BheW1lbnRHcm91cC5wYXltZW50c1swXS5yZWZlcmVuY2V9fSA8L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj57eyBcIlBheW1lbnQgYW1vdW50XCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3twYXltZW50R3JvdXAucGF5bWVudHNbMF0uYW1vdW50IHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMid9fTwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPnt7IFwiRmVlIGFtb3VudFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7cGF5bWVudEdyb3VwPy5mZWVzWzBdPy5uZXRfYW1vdW50IHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMid9fTwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPnt7IFwiUmVmdW5kIGFtb3VudFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7Z2V0T3ZlclBheW1lbnRWYWx1ZSgpIHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMid9fTwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwiZ292dWstdGFibGVfX3Jvd1wiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPnt7IFwiUmVmdW5kIHJlYXNvblwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7IFwiT3ZlciBwYXltZW50XCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgICAgPHRkIGNsYXNzPVwiZ292dWstdGFibGVfX2NlbGwgZ292dWstIS1mb250LXdlaWdodC1ib2xkXCI+e3sgXCJTZW5kIHRvXCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbFwiPnt7b3JkZXJQYXJ0eX19PC90ZD5cbiAgICA8L3RyPlxuICAgIDx0ciBjbGFzcz1cImdvdnVrLXRhYmxlX19yb3dcIj5cbiAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsIGdvdnVrLSEtZm9udC13ZWlnaHQtYm9sZFwiPnt7IFwiU2VuZCB2aWFcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCB3aGl0ZXNwYWNlLWluaGVyaXRcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRhY3REZXRhaWxzT2JqPy5ub3RpZmljYXRpb25fdHlwZSA9PT0gJ0VNQUlMJ1wiIGNsYXNzPVwiY29udGFjdERldGFpbHMtd2lkdGhcIj5cbiAgICAgICAgICA8c3Ryb25nPnt7IFwiRW1haWxcIiB8IHJweFRyYW5zbGF0ZSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDxici8+XG4gICAgICAgICAge3tjb250YWN0RGV0YWlsc09iaj8uZW1haWw/LnRyaW0oKX19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGFjdERldGFpbHNPYmo/Lm5vdGlmaWNhdGlvbl90eXBlID09PSAnTEVUVEVSJ1wiIGNsYXNzPVwiY29udGFjdERldGFpbHMtd2lkdGhcIj5cbiAgICAgICAgICA8c3Ryb25nPnt7IFwiUG9zdFwiIHwgcnB4VHJhbnNsYXRlIH19PC9zdHJvbmc+XG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgICB7e2NvbnRhY3REZXRhaWxzT2JqPy5hZGRyZXNzX2xpbmU/LnRyaW0oKX19Jm5ic3A7e3tjb250YWN0RGV0YWlsc09iaj8uY2l0eT8udHJpbSgpfX0mbmJzcDt7e2NvbnRhY3REZXRhaWxzT2JqPy5jb3VudHk/LnRyaW0oKX19Jm5ic3A7e3tjb250YWN0RGV0YWlsc09iaj8uY291bnRyeT8udHJpbSgpfX0mbmJzcDt7e2NvbnRhY3REZXRhaWxzT2JqPy5wb3N0YWxfY29kZT8udHJpbSgpfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxhIChjbGljayk9XCJnb3RvQWRkcmVzc1BhZ2UoY29udGFjdERldGFpbHNPYmopXCIgY2xhc3M9XCJnb3Z1ay1saW5rIHJpZ2h0XCIgPnt7IFwiQ2hhbmdlXCIgfCBycHhUcmFuc2xhdGUgfX08L2E+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG5cbiAgICA8dHIgY2xhc3M9XCJnb3Z1ay10YWJsZV9fcm93XCI+XG4gICAgICA8dGQgY2xhc3M9XCJnb3Z1ay10YWJsZV9fY2VsbCBnb3Z1ay0hLWZvbnQtd2VpZ2h0LWJvbGRcIj57eyBcIk5vdGlmaWNhdGlvblwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgIDx0ZCBjbGFzcz1cImdvdnVrLXRhYmxlX19jZWxsXCI+e3t0ZW1wbGF0ZUluc3RydWN0aW9uVHlwZX19XG4gICAgICAgICAgPGEgKm5nSWY9XCIhbm90aWZpY2F0aW9uUHJldmlld1wiIGhyZWY9XCJKYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cImdvdnVrLWxpbmsgcmlnaHRcIiAoY2xpY2spPVwic2hvd05vdGlmaWNhdGlvblByZXZpZXcoKVwiPlxuICAgICAgICAgICAge3sgXCJQcmV2aWV3XCIgfCBycHhUcmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgPGEgKm5nSWY9XCJub3RpZmljYXRpb25QcmV2aWV3XCIgaHJlZj1cIkphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwiZ292dWstbGluayByaWdodFwiIChjbGljayk9XCJoaWRlTm90aWZpY2F0aW9uUHJldmlldygpXCI+XG4gICAgICAgICAgICB7eyBcIkhpZGUgUHJldmlld1wiIHwgcnB4VHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9hPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3RhYmxlPlxuXG4gIDxhcHAtbm90aWZpY2F0aW9uLXByZXZpZXcgKm5nSWY9XCJub3RpZmljYXRpb25QcmV2aWV3XCIgXG4gIFtwYXltZW50XT1cInBheW1lbnRHcm91cC5wYXltZW50c1swXVwiIFxuICBbY29udGFjdERldGFpbHNdPVwiY29udGFjdERldGFpbHNPYmpcIlxuICBbcmVmdW5kUmVhc29uXT1cIidSUjAzNydcIlxuICBbcmVmdW5kQW1vdW50XT1cImdldE92ZXJQYXltZW50VmFsdWUoKVwiPjwvYXBwLW5vdGlmaWNhdGlvbi1wcmV2aWV3PlxuXG4gIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnV0dG9uIGdvdnVrLWJ1dHRvbi0tc2Vjb25kYXJ5IG92ZXItcGF5bWVudC1hbGlnbm1lbnQgZ292dWstZm9udDE5cHhcIiAoY2xpY2spPVwiZ290b0FkZHJlc3NQYWdlKGNvbnRhY3REZXRhaWxzT2JqKVwiPnt7IFwiUHJldmlvdXNcIiB8IHJweFRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIlxuICBbbmdDbGFzc109J2lzQ29udGludWVCdG5EaXNhYmxlZCA/IFwiYnV0dG9uIGJ1dHRvbi0tZGlzYWJsZWQgZ292dWstIS1tYXJnaW4tcmlnaHQtMSBnb3Z1ay1mb250MTlweFwiIDogXCJidXR0b24gZ292dWstIS1tYXJnaW4tcmlnaHQtMSBnb3Z1ay1mb250MTlweFwiJ1xuICAoY2xpY2spPVwicHJvY2Vzc1JlZnVuZCgpXCI+XG4gICAge3sgXCJTdWJtaXQgcmVmdW5kXCIgfCBycHhUcmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG4gIDxwPlxuICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiICAoY2xpY2spPVwiZ29Ub0Nhc2VUcmFuc2F0aW9uUGFnZSgkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1saW5rIGdvdnVrLWZvbnQxOXB4XCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5cbiAgICAgICAgICB7eyBcIkNhbmNlbFwiIHwgcnB4VHJhbnNsYXRlIH19XG4gICAgICA8L2E+XG4gIDwvcD5cblxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwidmlld1N0YXR1cyA9PT0gJ3JlZnVuZGNvbmZpcm1hdGlvbnBhZ2UnICYmIHZpZXdDb21wU3RhdHVzICE9PSAnb3ZlcnBheW1lbnQnICYmIHZpZXdDb21wU3RhdHVzICE9PSAnb3ZlclBheW1lbnRBZGRyZXNzQ2FwdHVyZScgJiYgdmlld0NvbXBTdGF0dXMgIT09ICdvdmVycGF5bWVudGNoZWNrYW5kYW5zd2VyJ1wiPlxuICA8aW5wdXQgI215SW5wdXQgdHlwZT0naGlkZGVuJyBpZD0naUZyYW1lRHJpdmVuSW1hZ2VWYWx1ZScgdmFsdWU9J1JFVFJPUkVNSVNTSU9OUkVGVU5EQ09ORklSTUFUSU9OUEFHRSc+IFxuICA8ZGl2IGNsYXNzPVwiZ292dWstZ3JpZC1yb3cgcGFnZXNpemVcIj5cbiAgICA8ZGl2ID5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1wYW5lbCBnb3Z1ay1wYW5lbC0tY29uZmlybWF0aW9uXCI+XG4gICAgICAgIDxoMSBjbGFzcz1cImdvdnVrLXBhbmVsX3ZpZXdfdGl0bGVcIj5cbiAgICAgICAgICB7eyBcIlJlZnVuZCBzdWJtaXR0ZWRcIiB8IHJweFRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2gxPlxuICAgICAgICBcbiAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXBhbmVsX19ib2R5XCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJnb3Z1ay1ib2R5IHdoaXRlXCI+PHN0cm9uZyBjbGFzcz1cIndoaXRlXCI+e3sgXCJSZWZ1bmQgcmVmZXJlbmNlXCIgfCBycHhUcmFuc2xhdGV9fToge3tyZWZ1bmRSZWZlcmVuY2V9fTwvc3Ryb25nPjwvcD5cbiAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgPC9kaXY+XG4gICAgICA8aDIgY2xhc3M9XCJnb3Z1ay1oZWFkaW5nLWxcIj57e1wiV2hhdCBoYXBwZW5zIG5leHRcIiB8IHJweFRyYW5zbGF0ZSB9fTwvaDI+XG4gICAgICA8cCBjbGFzcz1cImdvdnVrLWJvZHlcIj5cbiAgICAgICAge3tcIkEgcmVmdW5kIHJlcXVlc3QgZm9yXCIgfCBycHhUcmFuc2xhdGUgfX0ge3tyZWZ1bmRBbW91bnQgIHwgY3VycmVuY3k6J0dCUCc6J3N5bWJvbC1uYXJyb3cnOicxLjItMicgfX0ge3sgXCJoYXMgYmVlbiBjcmVhdGVkIGFuZCB3aWxsIGJlIHBhc3NlZCB0byBhIHRlYW0gbGVhZGVyIHRvIGFwcHJvdmUuXCIgfCBycHhUcmFuc2xhdGUgfX1cbiAgICAgIDwvcD5cbiAgICA8cCBjbGFzcz1cImdvdnVrLWJvZHlcIj5cbiAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cImdvVG9DYXNlVHJhbnNhdGlvblBhZ2UoJGV2ZW50KVwiIGNsYXNzPVwiZ292dWstbGluayBwb2ludGVyXCIgZGF0YS1tb2R1bGU9XCJnb3Z1ay1idXR0b25cIj5cbiAgICAgIHt7IFwiUmV0dXJuIHRvIGNhc2VcIiB8IHJweFRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gICAgPC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdTdGF0dXMgPT09ICdwYXltZW50LWZhaWx1cmUnXCI+XG4gIDxkaXYgY2xhc3M9XCJwYXltZW50LWZhaWx1cmUtYWxpZ25tZW50XCI+XG4gICAgPGRpdiAgY2xhc3M9XCJnb3Z1ay1icmVhZGNydW1ic1wiPlxuICAgICAgPG9sIGNsYXNzPVwiZ292dWstYnJlYWRjcnVtYnNfX2xpc3RcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwiZ292dWstYnJlYWRjcnVtYnNfX2xpc3QtaXRlbVwiPlxuICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwiZ29CYWNrVG9QYXltZW50VmlldygkZXZlbnQpXCIgY2xhc3M9XCJnb3Z1ay1iYWNrLWxpbmtcIj57eyBcIkJhY2tcIiB8IHJweFRyYW5zbGF0ZSB9fTwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvb2w+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImdvdnVrLWdyaWQtcm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uXCI+XG4gICAgICAgIDxoMSBjbGFzcz1cImhlYWRpbmctbGFyZ2UgZ292dWstIS1tYXJnaW4tdG9wLTBcIj57eyBcIkZhaWx1cmUgZXZlbnQgZGV0YWlsc1wiIHwgcnB4VHJhbnNsYXRlIH19PC9oMT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDx0YWJsZT5cbiAgICAgIDx0Ym9keT5cblxuICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICA8dGQgY2xhc3M9XCJib2xkXCI+e3sgXCJGYWlsdXJlIHJlZmVyZW5jZVwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgPHRkPlx0e3tzZWxlY3RlZFBheW1lbnRzU3RhdHVzLmZhaWx1cmVfcmVmZXJlbmNlfX08L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgPHRkIGNsYXNzPVwiYm9sZFwiPnt7IFwiRmFpbHVyZSByZWFzb25cIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgIDx0ZD5cdHt7c2VsZWN0ZWRQYXltZW50c1N0YXR1cy5mYWlsdXJlX3JlYXNvbiB8IHJweFRyYW5zbGF0ZX19PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8dHIgY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgICAgPHRkIGNsYXNzPVwiYm9sZFwiPnt7IFwiUGF5bWVudCByZWZlcmVuY2VcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgICAgPHRkPnt7IHNlbGVjdGVkUGF5bWVudHNTdGF0dXMucGF5bWVudF9yZWZlcmVuY2UgfX08L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJib2xkXCI+e3sgXCJQYXltZW50IGFtb3VudFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8dGQ+IMKje3sgcGF5bWVudEdyb3VwPy5wYXltZW50c1swXT8uYW1vdW50IHwgbnVtYmVyOicuMicgfX08L3RkPlxuXG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImJvbGRcIj57eyBcIkRpc3B1dGVkIGFtb3VudFwiIHwgcnB4VHJhbnNsYXRlIH19PC90ZD5cbiAgICAgICAgICA8dGQ+XHTCo3t7c2VsZWN0ZWRQYXltZW50c1N0YXR1cy5kaXNwdXRlZF9hbW91bnQgIHwgbnVtYmVyOicuMid9fTwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICA8dGQgY2xhc3M9XCJib2xkXCI+e3sgXCJBZGRpdGlvbmFsIGluZm9ybWF0aW9uXCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICA8dGQ+XHR7e3NlbGVjdGVkUGF5bWVudHNTdGF0dXMuYWRkaXRpb25hbF9yZWZlcmVuY2UgfX08L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgPHRkIGNsYXNzPVwiYm9sZFwiPnt7IFwiRmFpbHVyZSB0eXBlXCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICA8dGQ+XHR7eyBzZWxlY3RlZFBheW1lbnRzU3RhdHVzLmZhaWx1cmVfdHlwZSB9fTwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICA8dGQgY2xhc3M9XCJib2xkXCI+e3sgXCJGYWlsdXJlIGV2ZW50IGRhdGUgYW5kIHRpbWVcIiB8IHJweFRyYW5zbGF0ZSB9fTwvdGQ+XG4gICAgICAgIDx0ZD4ge3sgc2VsZWN0ZWRQYXltZW50c1N0YXR1cy5mYWlsdXJlX2V2ZW50X2RhdGVfdGltZSB8IGRhdGU6J2RkIE1NTSB5eXl5IEhIOm1tOnNzJyB9fTwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiICpuZ0lmPVwic2VsZWN0ZWRQYXltZW50c1N0YXR1cy5oYXNfYW1vdW50X2RlYml0ZWRcIj5cbiAgICAgICAgPHRkIGNsYXNzPVwiYm9sZFwiPnt7IFwiSGFzIGRpc3B1dGVkIGFtb3VudCBkZWJpdGVkXCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICA8dGQ+XHR7e3NlbGVjdGVkUGF5bWVudHNTdGF0dXMuaGFzX2Ftb3VudF9kZWJpdGVkfX08L3RkPlxuICAgICAgPC90cj5cbiAgICAgIDx0ciBjbGFzcz1cInNlY3Rpb25cIiAqbmdJZj1cInNlbGVjdGVkUGF5bWVudHNTdGF0dXMucmVwcmVzZW50bWVudF9zdGF0dXNcIj5cbiAgICAgICAgPHRkIGNsYXNzPVwiYm9sZFwiPnt7IFwiU3RhdHVzIGZvbGxvd2luZyByZXByZXNlbnRhdGlvbiBvZiBwYXltZW50XCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICA8dGQ+XHR7eyhzZWxlY3RlZFBheW1lbnRzU3RhdHVzLnJlcHJlc2VudG1lbnRfc3RhdHVzID09PSAnWWVzJyB8fCBzZWxlY3RlZFBheW1lbnRzU3RhdHVzLnJlcHJlc2VudG1lbnRfc3RhdHVzID09PSAneWVzJykgPyAnU3VjY2VzcycgOiAnRmFpbHVyZSd9fTwvdGQ+XG4gICAgICA8L3RyPlxuICAgICAgPHRyIGNsYXNzPVwic2VjdGlvblwiICpuZ0lmPVwic2VsZWN0ZWRQYXltZW50c1N0YXR1cy5yZXByZXNlbnRtZW50X2RhdGVcIj5cbiAgICAgICAgPHRkIGNsYXNzPVwiYm9sZFwiPnt7IFwiRGF0ZSBwYXltZW50IHJlcHJlc2VudGVkXCIgfCBycHhUcmFuc2xhdGUgfX08L3RkPlxuICAgICAgICA8dGQ+XHR7e3NlbGVjdGVkUGF5bWVudHNTdGF0dXMucmVwcmVzZW50bWVudF9kYXRlICB8IGRhdGU6J2RkIE1NTSB5eXl5IEhIOm1tOnNzJ319PC90ZD5cbiAgICAgIDwvdHI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG5cbiAgICA8ZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
|