ynkap-payment
Version:
Module de paiement Y-Nkap pour Angular - Intégration simple des paiements mobiles (Orange Money, MTN Mobile Money)
79 lines • 18.5 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../shared/logo.service";
import * as i2 from "../shared/modal-stability.service";
import * as i3 from "@angular/common";
import * as i4 from "../payment/payment/payment.component";
export class YnkapPayButtonComponent {
constructor(logoService, cdr, ngZone, modalStability) {
this.logoService = logoService;
this.cdr = cdr;
this.ngZone = ngZone;
this.modalStability = modalStability;
this.currency = 'XAF';
this.theme = 'light';
this.paymentSuccess = new EventEmitter();
this.paymentError = new EventEmitter();
this.paymentCancel = new EventEmitter();
this.isModalOpen = false;
}
openModal() {
this.modalStability.openModalStable(() => {
this.isModalOpen = true;
}, this.cdr);
}
closeModal() {
this.modalStability.closeModalStable(() => {
this.isModalOpen = false;
}, this.cdr);
}
onPaymentSuccess(event) {
this.modalStability.executeModalAction(() => {
this.paymentSuccess.emit(event);
this.closeModal();
}, this.cdr);
}
onPaymentError(event) {
this.modalStability.executeModalAction(() => {
this.paymentError.emit(event);
// On ne ferme pas la modale en cas d'erreur pour permettre de réessayer
}, this.cdr);
}
onPaymentCancel() {
this.modalStability.executeModalAction(() => {
this.paymentCancel.emit();
this.closeModal();
}, this.cdr);
}
/**
* Get Y-Nkap logo URL
*/
getYnkapLogoUrl() {
return this.logoService.getOperatorLogoUrl('ynkap');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: YnkapPayButtonComponent, deps: [{ token: i1.LogoService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i2.ModalStabilityService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: YnkapPayButtonComponent, selector: "ynkap-pay-button", inputs: { amount: "amount", currency: "currency", description: "description", merchantReference: "merchantReference", primaryColor: "primaryColor", theme: "theme" }, outputs: { paymentSuccess: "paymentSuccess", paymentError: "paymentError", paymentCancel: "paymentCancel" }, ngImport: i0, template: "<!-- Le bouton qui sera visible par l'utilisateur -->\r\n<button (click)=\"openModal()\" class=\"ynkap-entry-button\" [class.dark-theme]=\"theme === 'dark'\">\r\n <!-- Le logo et le texte du bouton sont fixes -->\r\n <img [src]=\"getYnkapLogoUrl()\" alt=\"Y-Nkap\" class=\"ynkap-logo\">\r\n Payer avec Y-Nkap\r\n</button>\r\n\r\n<!-- La modale qui contient le formulaire de paiement -->\r\n<div *ngIf=\"isModalOpen\" class=\"ynkap-modal-overlay\" [class.dark-modal]=\"theme === 'dark'\" (click)=\"closeModal()\">\r\n <div class=\"ynkap-modal-content\" (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- Le composant de paiement existant est maintenant \u00E0 l'int\u00E9rieur de la modale -->\r\n <lib-ynkap-payment\r\n [amount]=\"amount\"\r\n [currency]=\"currency\"\r\n [description]=\"description\"\r\n [merchantReference]=\"merchantReference\"\r\n [primaryColor]=\"primaryColor\"\r\n [theme]=\"theme\"\r\n (paymentSuccess)=\"onPaymentSuccess($event)\"\r\n (paymentError)=\"onPaymentError($event)\"\r\n (cancelled)=\"onPaymentCancel()\">\r\n </lib-ynkap-payment>\r\n\r\n </div>\r\n</div> ", styles: [".ynkap-entry-button{background-color:#007bff;color:#fff;padding:12px 24px;border:none;border-radius:8px;font-size:16px;font-weight:700;cursor:pointer;transition:background-color .3s ease,transform .2s ease;display:inline-flex;align-items:center;gap:8px;box-shadow:0 4px 12px #007bff33}.ynkap-entry-button:hover{background-color:#0056b3;transform:translateY(-2px)}.ynkap-entry-button:active{transform:translateY(0)}.ynkap-logo{height:20px;width:auto;margin-right:8px;border-radius:3px}.ynkap-entry-button.dark-theme{background-color:#4caf50;box-shadow:0 4px 12px #4caf5033}.ynkap-entry-button.dark-theme:hover{background-color:#45a049}.ynkap-modal-overlay{position:fixed!important;top:0!important;left:0!important;width:100vw!important;height:100vh!important;background-color:#0009!important;display:flex!important;justify-content:center!important;align-items:center!important;z-index:9999!important;-webkit-backdrop-filter:blur(5px)!important;backdrop-filter:blur(5px)!important;padding:1rem!important;opacity:1!important;visibility:visible!important;pointer-events:auto!important;transform:translateZ(0)!important;will-change:opacity!important;transition:opacity .2s ease-in-out!important;isolation:isolate!important}.ynkap-modal-content{position:relative!important;z-index:10000!important;background:#fff!important;border-radius:12px!important;box-shadow:0 20px 60px #0006!important;max-width:90vw!important;max-height:90vh!important;overflow-y:auto!important;width:100%!important;max-width:500px!important;transform:translateZ(0) scale(1)!important;backface-visibility:hidden!important;perspective:1000px!important;animation:modalFadeIn .2s ease-out!important}@keyframes modalFadeIn{0%{opacity:0;transform:translateZ(0) scale(.95) translateY(-20px)}to{opacity:1;transform:translateZ(0) scale(1) translateY(0)}}.dark-modal{background-color:#15151fb3!important}.dark-modal .ynkap-modal-content{background:#1a1a1a!important;color:#fff!important}.ynkap-modal-content>*{position:relative!important;z-index:1!important}body .ynkap-modal-overlay.ynkap-modal-overlay{position:fixed!important;inset:0!important;width:100vw!important;height:100vh!important;z-index:999999!important;display:flex!important;justify-content:center!important;align-items:center!important}body .ynkap-modal-content.ynkap-modal-content{position:relative!important;z-index:1000000!important;transform:none!important;margin:auto!important}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PaymentComponent, selector: "lib-ynkap-payment", inputs: ["amount", "currency", "merchantReference", "theme", "description", "successUrl", "cancelUrl", "webhookUrl", "logoUrl", "primaryColor", "payButtonText"], outputs: ["paymentSuccess", "paymentError", "cancelled"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: YnkapPayButtonComponent, decorators: [{
type: Component,
args: [{ selector: 'ynkap-pay-button', template: "<!-- Le bouton qui sera visible par l'utilisateur -->\r\n<button (click)=\"openModal()\" class=\"ynkap-entry-button\" [class.dark-theme]=\"theme === 'dark'\">\r\n <!-- Le logo et le texte du bouton sont fixes -->\r\n <img [src]=\"getYnkapLogoUrl()\" alt=\"Y-Nkap\" class=\"ynkap-logo\">\r\n Payer avec Y-Nkap\r\n</button>\r\n\r\n<!-- La modale qui contient le formulaire de paiement -->\r\n<div *ngIf=\"isModalOpen\" class=\"ynkap-modal-overlay\" [class.dark-modal]=\"theme === 'dark'\" (click)=\"closeModal()\">\r\n <div class=\"ynkap-modal-content\" (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- Le composant de paiement existant est maintenant \u00E0 l'int\u00E9rieur de la modale -->\r\n <lib-ynkap-payment\r\n [amount]=\"amount\"\r\n [currency]=\"currency\"\r\n [description]=\"description\"\r\n [merchantReference]=\"merchantReference\"\r\n [primaryColor]=\"primaryColor\"\r\n [theme]=\"theme\"\r\n (paymentSuccess)=\"onPaymentSuccess($event)\"\r\n (paymentError)=\"onPaymentError($event)\"\r\n (cancelled)=\"onPaymentCancel()\">\r\n </lib-ynkap-payment>\r\n\r\n </div>\r\n</div> ", styles: [".ynkap-entry-button{background-color:#007bff;color:#fff;padding:12px 24px;border:none;border-radius:8px;font-size:16px;font-weight:700;cursor:pointer;transition:background-color .3s ease,transform .2s ease;display:inline-flex;align-items:center;gap:8px;box-shadow:0 4px 12px #007bff33}.ynkap-entry-button:hover{background-color:#0056b3;transform:translateY(-2px)}.ynkap-entry-button:active{transform:translateY(0)}.ynkap-logo{height:20px;width:auto;margin-right:8px;border-radius:3px}.ynkap-entry-button.dark-theme{background-color:#4caf50;box-shadow:0 4px 12px #4caf5033}.ynkap-entry-button.dark-theme:hover{background-color:#45a049}.ynkap-modal-overlay{position:fixed!important;top:0!important;left:0!important;width:100vw!important;height:100vh!important;background-color:#0009!important;display:flex!important;justify-content:center!important;align-items:center!important;z-index:9999!important;-webkit-backdrop-filter:blur(5px)!important;backdrop-filter:blur(5px)!important;padding:1rem!important;opacity:1!important;visibility:visible!important;pointer-events:auto!important;transform:translateZ(0)!important;will-change:opacity!important;transition:opacity .2s ease-in-out!important;isolation:isolate!important}.ynkap-modal-content{position:relative!important;z-index:10000!important;background:#fff!important;border-radius:12px!important;box-shadow:0 20px 60px #0006!important;max-width:90vw!important;max-height:90vh!important;overflow-y:auto!important;width:100%!important;max-width:500px!important;transform:translateZ(0) scale(1)!important;backface-visibility:hidden!important;perspective:1000px!important;animation:modalFadeIn .2s ease-out!important}@keyframes modalFadeIn{0%{opacity:0;transform:translateZ(0) scale(.95) translateY(-20px)}to{opacity:1;transform:translateZ(0) scale(1) translateY(0)}}.dark-modal{background-color:#15151fb3!important}.dark-modal .ynkap-modal-content{background:#1a1a1a!important;color:#fff!important}.ynkap-modal-content>*{position:relative!important;z-index:1!important}body .ynkap-modal-overlay.ynkap-modal-overlay{position:fixed!important;inset:0!important;width:100vw!important;height:100vh!important;z-index:999999!important;display:flex!important;justify-content:center!important;align-items:center!important}body .ynkap-modal-content.ynkap-modal-content{position:relative!important;z-index:1000000!important;transform:none!important;margin:auto!important}\n"] }]
}], ctorParameters: function () { return [{ type: i1.LogoService }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i2.ModalStabilityService }]; }, propDecorators: { amount: [{
type: Input
}], currency: [{
type: Input
}], description: [{
type: Input
}], merchantReference: [{
type: Input
}], primaryColor: [{
type: Input
}], theme: [{
type: Input
}], paymentSuccess: [{
type: Output
}], paymentError: [{
type: Output
}], paymentCancel: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy95bmthcC9zcmMvbGliL3BheS1idXR0b24vcGF5LWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy95bmthcC9zcmMvbGliL3BheS1idXR0b24vcGF5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUE2QixNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBVWxHLE1BQU0sT0FBTyx1QkFBdUI7SUFjbEMsWUFDVSxXQUF3QixFQUN4QixHQUFzQixFQUN0QixNQUFjLEVBQ2QsY0FBcUM7UUFIckMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQWhCdEMsYUFBUSxHQUFXLEtBQUssQ0FBQztRQUl6QixVQUFLLEdBQXFCLE9BQU8sQ0FBQztRQUVqQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQzlDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVuRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztJQU9qQixDQUFDO0lBRUosU0FBUztRQUNQLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtZQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVU7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWlCO1FBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFO1lBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLHdFQUF3RTtRQUMxRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRTtZQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDOytHQTNEVSx1QkFBdUI7bUdBQXZCLHVCQUF1QiwyVUNWcEMsNHNDQXlCTzs7NEZEZk0sdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLGtCQUFrQjsyTEFLbkIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBZbmthcEVycm9yIH0gZnJvbSAnLi4vZXJyb3ItaGFuZGxpbmcvbW9kZWxzL2Vycm9yLm1vZGVsJztcclxuaW1wb3J0IHsgTG9nb1NlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvbG9nby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kYWxTdGFiaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL21vZGFsLXN0YWJpbGl0eS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAneW5rYXAtcGF5LWJ1dHRvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BheS1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3BheS1idXR0b24uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBZbmthcFBheUJ1dHRvbkNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgYW1vdW50ITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGN1cnJlbmN5OiBzdHJpbmcgPSAnWEFGJztcclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbiE6IHN0cmluZztcclxuICBASW5wdXQoKSBtZXJjaGFudFJlZmVyZW5jZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBwcmltYXJ5Q29sb3I/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdGhlbWU6ICdsaWdodCcgfCAnZGFyaycgPSAnbGlnaHQnO1xyXG5cclxuICBAT3V0cHV0KCkgcGF5bWVudFN1Y2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcGF5bWVudEVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxZbmthcEVycm9yPigpO1xyXG4gIEBPdXRwdXQoKSBwYXltZW50Q2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBpc01vZGFsT3BlbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbG9nb1NlcnZpY2U6IExvZ29TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgIHByaXZhdGUgbW9kYWxTdGFiaWxpdHk6IE1vZGFsU3RhYmlsaXR5U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RhbFN0YWJpbGl0eS5vcGVuTW9kYWxTdGFibGUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzTW9kYWxPcGVuID0gdHJ1ZTtcclxuICAgIH0sIHRoaXMuY2RyKTtcclxuICB9XHJcblxyXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vZGFsU3RhYmlsaXR5LmNsb3NlTW9kYWxTdGFibGUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzTW9kYWxPcGVuID0gZmFsc2U7XHJcbiAgICB9LCB0aGlzLmNkcik7XHJcbiAgfVxyXG5cclxuICBvblBheW1lbnRTdWNjZXNzKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kYWxTdGFiaWxpdHkuZXhlY3V0ZU1vZGFsQWN0aW9uKCgpID0+IHtcclxuICAgICAgdGhpcy5wYXltZW50U3VjY2Vzcy5lbWl0KGV2ZW50KTtcclxuICAgICAgdGhpcy5jbG9zZU1vZGFsKCk7XHJcbiAgICB9LCB0aGlzLmNkcik7XHJcbiAgfVxyXG5cclxuICBvblBheW1lbnRFcnJvcihldmVudDogWW5rYXBFcnJvcik6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RhbFN0YWJpbGl0eS5leGVjdXRlTW9kYWxBY3Rpb24oKCkgPT4ge1xyXG4gICAgICB0aGlzLnBheW1lbnRFcnJvci5lbWl0KGV2ZW50KTtcclxuICAgICAgLy8gT24gbmUgZmVybWUgcGFzIGxhIG1vZGFsZSBlbiBjYXMgZCdlcnJldXIgcG91ciBwZXJtZXR0cmUgZGUgcsOpZXNzYXllclxyXG4gICAgfSwgdGhpcy5jZHIpO1xyXG4gIH1cclxuXHJcbiAgb25QYXltZW50Q2FuY2VsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RhbFN0YWJpbGl0eS5leGVjdXRlTW9kYWxBY3Rpb24oKCkgPT4ge1xyXG4gICAgICB0aGlzLnBheW1lbnRDYW5jZWwuZW1pdCgpO1xyXG4gICAgICB0aGlzLmNsb3NlTW9kYWwoKTtcclxuICAgIH0sIHRoaXMuY2RyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBZLU5rYXAgbG9nbyBVUkxcclxuICAgKi9cclxuICBnZXRZbmthcExvZ29VcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxvZ29TZXJ2aWNlLmdldE9wZXJhdG9yTG9nb1VybCgneW5rYXAnKTtcclxuICB9XHJcbn0iLCI8IS0tIExlIGJvdXRvbiBxdWkgc2VyYSB2aXNpYmxlIHBhciBsJ3V0aWxpc2F0ZXVyIC0tPlxyXG48YnV0dG9uIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIGNsYXNzPVwieW5rYXAtZW50cnktYnV0dG9uXCIgW2NsYXNzLmRhcmstdGhlbWVdPVwidGhlbWUgPT09ICdkYXJrJ1wiPlxyXG4gICAgPCEtLSBMZSBsb2dvIGV0IGxlIHRleHRlIGR1IGJvdXRvbiBzb250IGZpeGVzIC0tPlxyXG4gICAgPGltZyBbc3JjXT1cImdldFlua2FwTG9nb1VybCgpXCIgYWx0PVwiWS1Oa2FwXCIgY2xhc3M9XCJ5bmthcC1sb2dvXCI+XHJcbiAgICBQYXllciBhdmVjIFktTmthcFxyXG48L2J1dHRvbj5cclxuXHJcbjwhLS0gTGEgbW9kYWxlIHF1aSBjb250aWVudCBsZSBmb3JtdWxhaXJlIGRlIHBhaWVtZW50IC0tPlxyXG48ZGl2ICpuZ0lmPVwiaXNNb2RhbE9wZW5cIiBjbGFzcz1cInlua2FwLW1vZGFsLW92ZXJsYXlcIiBbY2xhc3MuZGFyay1tb2RhbF09XCJ0aGVtZSA9PT0gJ2RhcmsnXCIgKGNsaWNrKT1cImNsb3NlTW9kYWwoKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInlua2FwLW1vZGFsLWNvbnRlbnRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcblxyXG4gICAgICAgIDwhLS0gTGUgY29tcG9zYW50IGRlIHBhaWVtZW50IGV4aXN0YW50IGVzdCBtYWludGVuYW50IMOgIGwnaW50w6lyaWV1ciBkZSBsYSBtb2RhbGUgLS0+XHJcbiAgICAgICAgPGxpYi15bmthcC1wYXltZW50XHJcbiAgICAgICAgICAgIFthbW91bnRdPVwiYW1vdW50XCJcclxuICAgICAgICAgICAgW2N1cnJlbmN5XT1cImN1cnJlbmN5XCJcclxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgW21lcmNoYW50UmVmZXJlbmNlXT1cIm1lcmNoYW50UmVmZXJlbmNlXCJcclxuICAgICAgICAgICAgW3ByaW1hcnlDb2xvcl09XCJwcmltYXJ5Q29sb3JcIlxyXG4gICAgICAgICAgICBbdGhlbWVdPVwidGhlbWVcIlxyXG4gICAgICAgICAgICAocGF5bWVudFN1Y2Nlc3MpPVwib25QYXltZW50U3VjY2VzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHBheW1lbnRFcnJvcik9XCJvblBheW1lbnRFcnJvcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNhbmNlbGxlZCk9XCJvblBheW1lbnRDYW5jZWwoKVwiPlxyXG4gICAgICAgIDwvbGliLXlua2FwLXBheW1lbnQ+XHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiAiXX0=