@webbers/pay-payments-medusa 1.0.0
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/.medusa/server/package.json +90 -0
- package/.medusa/server/src/admin/index.js +229 -0
- package/.medusa/server/src/admin/index.mjs +228 -0
- package/.medusa/server/src/api/admin/pay/clear-cache/route.js +23 -0
- package/.medusa/server/src/api/admin/pay/payment-methods/route.js +36 -0
- package/.medusa/server/src/api/store/pay/payment-methods/route.js +36 -0
- package/.medusa/server/src/providers/pay/core/constants.js +52 -0
- package/.medusa/server/src/providers/pay/core/http-client.js +107 -0
- package/.medusa/server/src/providers/pay/core/pay-base.js +561 -0
- package/.medusa/server/src/providers/pay/core/pay-client.js +118 -0
- package/.medusa/server/src/providers/pay/index.js +22 -0
- package/.medusa/server/src/providers/pay/services/index.js +17 -0
- package/.medusa/server/src/providers/pay/services/pay-bancontact.js +21 -0
- package/.medusa/server/src/providers/pay/services/pay-creditcard.js +21 -0
- package/.medusa/server/src/providers/pay/services/pay-ideal.js +21 -0
- package/.medusa/server/src/providers/pay/services/pay-provider.js +23 -0
- package/.medusa/server/src/providers/pay/services/pay-softpos.js +20 -0
- package/.medusa/server/src/providers/pay/types/common.js +3 -0
- package/.medusa/server/src/providers/pay/types/index.js +28 -0
- package/.medusa/server/src/providers/pay/types/order.js +3 -0
- package/.medusa/server/src/providers/pay/types/transaction.js +3 -0
- package/.medusa/server/src/providers/pay/utils/getExpirationForPaymentMethod.js +16 -0
- package/.medusa/server/src/providers/pay/utils/getSortedPaymentMethods.js +20 -0
- package/.medusa/server/src/providers/pay/utils/paymentMethodMap.js +133 -0
- package/.medusa/server/src/workflows/hooks/order-created.js +96 -0
- package/README.md +221 -0
- package/package.json +90 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayPaymentStatus = exports.PayApiPath = exports.PayEnvironmentPaths = exports.PAY_CACHE_KEY = void 0;
|
|
4
|
+
exports.PAY_CACHE_KEY = {
|
|
5
|
+
CONFIG: "pay_config_cache",
|
|
6
|
+
SALES_CHANNEL_OPTIONS: "pay_sales_channel_options",
|
|
7
|
+
};
|
|
8
|
+
exports.PayEnvironmentPaths = {
|
|
9
|
+
REST_API: "https://rest.pay.nl/v2",
|
|
10
|
+
TGU_API: "https://connect.pay.nl/v1",
|
|
11
|
+
REST_API_v3: "https://rest-api.pay.nl/v3",
|
|
12
|
+
};
|
|
13
|
+
exports.PayApiPath = {
|
|
14
|
+
GET_CONFIG: "/services/config?serviceId={id}",
|
|
15
|
+
ORDER_CREATE: "/orders",
|
|
16
|
+
ORDER_UPDATE: "/orders/{id}",
|
|
17
|
+
ORDER_STATUS: "/orders/{id}/status",
|
|
18
|
+
ORDER_CAPTURE: "/orders/{id}/capture",
|
|
19
|
+
ORDER_ABORT: "/orders/{id}/abort",
|
|
20
|
+
GET_TRANSACTION: "/transactions/{id}",
|
|
21
|
+
TRANSACTION_REFUND: "/transactions/{id}/refund",
|
|
22
|
+
DIRECT_DEBIT: "/DirectDebit/debitAdd/json",
|
|
23
|
+
DIRECT_DEBIT_INFO: "/DirectDebit/info/json",
|
|
24
|
+
};
|
|
25
|
+
// Transaction Statuses: https://developer.pay.nl/docs/transaction-statuses#after-processing-statuses
|
|
26
|
+
exports.PayPaymentStatus = {
|
|
27
|
+
// Pending Statuses
|
|
28
|
+
INIT: 20,
|
|
29
|
+
PENDING_20: 20,
|
|
30
|
+
PENDING_50: 50,
|
|
31
|
+
PENDING_90: 90,
|
|
32
|
+
PENDING_98: 98,
|
|
33
|
+
// Processing statuses
|
|
34
|
+
CANCEL: -90,
|
|
35
|
+
EXPIRED: -80,
|
|
36
|
+
DENIED_64: -64,
|
|
37
|
+
DENIED_63: -63,
|
|
38
|
+
CANCEL_61: -61,
|
|
39
|
+
FAILURE: -60,
|
|
40
|
+
PAID_CHECKAMOUNT: -51,
|
|
41
|
+
PARTIAL_PAYMENT: 80,
|
|
42
|
+
VERIFY: 85,
|
|
43
|
+
AUTHORIZE: 95,
|
|
44
|
+
PARTLY_CAPTURED: 97,
|
|
45
|
+
PAID: 100,
|
|
46
|
+
// After processing statuses
|
|
47
|
+
CHARGEBACK: -71,
|
|
48
|
+
REFUNDING: -72,
|
|
49
|
+
REFUND: -81,
|
|
50
|
+
PARTIAL_REFUND: -82,
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9wYXkvY29yZS9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR2EsUUFBQSxhQUFhLEdBQUc7SUFDM0IsTUFBTSxFQUFFLGtCQUFrQjtJQUMxQixxQkFBcUIsRUFBRSwyQkFBMkI7Q0FDMUMsQ0FBQTtBQUVHLFFBQUEsbUJBQW1CLEdBQUc7SUFDakMsUUFBUSxFQUFFLHdCQUF3QjtJQUNsQyxPQUFPLEVBQUUsMkJBQTJCO0lBQ3BDLFdBQVcsRUFBRSw0QkFBNEI7Q0FDMUMsQ0FBQTtBQUVZLFFBQUEsVUFBVSxHQUFHO0lBQ3hCLFVBQVUsRUFBRSxpQ0FBaUM7SUFDN0MsWUFBWSxFQUFFLFNBQVM7SUFDdkIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsWUFBWSxFQUFFLHFCQUFxQjtJQUNuQyxhQUFhLEVBQUUsc0JBQXNCO0lBQ3JDLFdBQVcsRUFBRSxvQkFBb0I7SUFDakMsZUFBZSxFQUFFLG9CQUFvQjtJQUNyQyxrQkFBa0IsRUFBRSwyQkFBMkI7SUFDL0MsWUFBWSxFQUFFLDRCQUE0QjtJQUMxQyxpQkFBaUIsRUFBRSx3QkFBd0I7Q0FDNUMsQ0FBQTtBQUVELHFHQUFxRztBQUN4RixRQUFBLGdCQUFnQixHQUFHO0lBQzlCLG1CQUFtQjtJQUNuQixJQUFJLEVBQUUsRUFBRTtJQUNSLFVBQVUsRUFBRSxFQUFFO0lBQ2QsVUFBVSxFQUFFLEVBQUU7SUFDZCxVQUFVLEVBQUUsRUFBRTtJQUNkLFVBQVUsRUFBRSxFQUFFO0lBQ2Qsc0JBQXNCO0lBQ3RCLE1BQU0sRUFBRSxDQUFDLEVBQUU7SUFDWCxPQUFPLEVBQUUsQ0FBQyxFQUFFO0lBQ1osU0FBUyxFQUFFLENBQUMsRUFBRTtJQUNkLFNBQVMsRUFBRSxDQUFDLEVBQUU7SUFDZCxTQUFTLEVBQUUsQ0FBQyxFQUFFO0lBQ2QsT0FBTyxFQUFFLENBQUMsRUFBRTtJQUNaLGdCQUFnQixFQUFFLENBQUMsRUFBRTtJQUNyQixlQUFlLEVBQUUsRUFBRTtJQUNuQixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxFQUFFO0lBQ2IsZUFBZSxFQUFFLEVBQUU7SUFDbkIsSUFBSSxFQUFFLEdBQUc7SUFDVCw0QkFBNEI7SUFDNUIsVUFBVSxFQUFFLENBQUMsRUFBRTtJQUNmLFNBQVMsRUFBRSxDQUFDLEVBQUU7SUFDZCxNQUFNLEVBQUUsQ0FBQyxFQUFFO0lBQ1gsY0FBYyxFQUFFLENBQUMsRUFBRTtDQUNYLENBQUEifQ==
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpClient = void 0;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
class HttpClient {
|
|
7
|
+
constructor({ options, logger }) {
|
|
8
|
+
this.options_ = options;
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
this.testMode = options.testMode ?? true;
|
|
11
|
+
this.restApiUrl = constants_1.PayEnvironmentPaths.REST_API;
|
|
12
|
+
this.tguApiUrl = options.tguApiUrl ?? constants_1.PayEnvironmentPaths.TGU_API;
|
|
13
|
+
this.restApiV3Url = constants_1.PayEnvironmentPaths.REST_API_v3;
|
|
14
|
+
}
|
|
15
|
+
async restApiV3Request({ endpoint, data, method, }) {
|
|
16
|
+
const body = new URLSearchParams();
|
|
17
|
+
if (data) {
|
|
18
|
+
const keys = Object.keys(data);
|
|
19
|
+
for (const key of keys) {
|
|
20
|
+
body.append(key, `${data[key]}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return this.request_({
|
|
24
|
+
url: `${this.restApiV3Url}${endpoint}`,
|
|
25
|
+
data: body.toString(),
|
|
26
|
+
method,
|
|
27
|
+
headers: {
|
|
28
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async apiRequest({ endpoint, data, method, }) {
|
|
33
|
+
return this.request_({ url: `${this.restApiUrl}${endpoint}`, data, method });
|
|
34
|
+
}
|
|
35
|
+
async tguRequest({ endpoint, data, method, }) {
|
|
36
|
+
return this.request_({ url: `${this.tguApiUrl}${endpoint}`, data, method });
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Run a request and return the result
|
|
40
|
+
* @param url
|
|
41
|
+
* @param data
|
|
42
|
+
* @param method
|
|
43
|
+
* @protected
|
|
44
|
+
*/
|
|
45
|
+
async request_({ url, data, method, headers, }) {
|
|
46
|
+
const fetchHeaders = {
|
|
47
|
+
"Content-Type": "application/json",
|
|
48
|
+
Authorization: `Basic ${Buffer.from(`${this.options_.atCode}:${this.options_.apiToken}`).toString("base64")}`,
|
|
49
|
+
...headers,
|
|
50
|
+
};
|
|
51
|
+
const response = (await fetch(url, {
|
|
52
|
+
method: method ?? "POST",
|
|
53
|
+
headers: fetchHeaders,
|
|
54
|
+
...(data
|
|
55
|
+
? {
|
|
56
|
+
body: fetchHeaders["Content-Type"] !== "application/json"
|
|
57
|
+
? data
|
|
58
|
+
: JSON.stringify({
|
|
59
|
+
...data,
|
|
60
|
+
integration: {
|
|
61
|
+
test: this.testMode,
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
}
|
|
65
|
+
: {}),
|
|
66
|
+
}).then(async (resp) => {
|
|
67
|
+
const result = resp.headers
|
|
68
|
+
.get("content-type")
|
|
69
|
+
?.includes("application/json")
|
|
70
|
+
? await resp.json()
|
|
71
|
+
: await resp.text();
|
|
72
|
+
if (!resp.ok) {
|
|
73
|
+
if (this.testMode) {
|
|
74
|
+
try {
|
|
75
|
+
this.logger.debug(JSON.stringify({
|
|
76
|
+
url,
|
|
77
|
+
method,
|
|
78
|
+
body: JSON.stringify({
|
|
79
|
+
...data,
|
|
80
|
+
integration: {
|
|
81
|
+
test: this.testMode,
|
|
82
|
+
},
|
|
83
|
+
}),
|
|
84
|
+
}));
|
|
85
|
+
this.logger.debug(JSON.stringify(result));
|
|
86
|
+
}
|
|
87
|
+
catch (e) { }
|
|
88
|
+
}
|
|
89
|
+
this.throwError(result);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}));
|
|
93
|
+
return response;
|
|
94
|
+
}
|
|
95
|
+
throwError(error) {
|
|
96
|
+
this.logger.error(error);
|
|
97
|
+
const message = error?.message ??
|
|
98
|
+
error?.detail ??
|
|
99
|
+
error?.violations?.[0]?.message ??
|
|
100
|
+
error?.title ??
|
|
101
|
+
"There was an error in the the Pay. response";
|
|
102
|
+
const code = error?.violations?.[0]?.code ?? error?.code;
|
|
103
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${code ? `[${code}]: ` : ""}${message}`, code);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.HttpClient = HttpClient;
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3BheS9jb3JlL2h0dHAtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUErQztBQUUvQyxxREFBcUQ7QUFFckQsTUFBYSxVQUFVO0lBUXJCLFlBQVksRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUE2QztRQUN2RSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFBO1FBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsK0JBQW1CLENBQUMsUUFBUSxDQUFBO1FBQzlDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSwrQkFBbUIsQ0FBQyxPQUFPLENBQUE7UUFDakUsSUFBSSxDQUFDLFlBQVksR0FBRywrQkFBbUIsQ0FBQyxXQUFXLENBQUE7SUFDckQsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBZSxFQUNuQyxRQUFRLEVBQ1IsSUFBSSxFQUNKLE1BQU0sR0FLUDtRQUNDLE1BQU0sSUFBSSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUE7UUFFbEMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDOUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2xDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ25CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxFQUFFO1lBQ3RDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JCLE1BQU07WUFDTixPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLG1DQUFtQzthQUNwRDtTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFlLEVBQzdCLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxHQUtQO1FBQ0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBZSxFQUM3QixRQUFRLEVBQ1IsSUFBSSxFQUNKLE1BQU0sR0FLUDtRQUNDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQWUsRUFDM0IsR0FBRyxFQUNILElBQUksRUFDSixNQUFNLEVBQ04sT0FBTyxHQU1SO1FBQ0MsTUFBTSxZQUFZLEdBQUc7WUFDbkIsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxhQUFhLEVBQUUsU0FBUyxNQUFNLENBQUMsSUFBSSxDQUNqQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQ3BELENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RCLEdBQUcsT0FBTztTQUNYLENBQUE7UUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNqQyxNQUFNLEVBQUUsTUFBTSxJQUFJLE1BQU07WUFDeEIsT0FBTyxFQUFFLFlBQVk7WUFDckIsR0FBRyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDO29CQUNFLElBQUksRUFDRixZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssa0JBQWtCO3dCQUNqRCxDQUFDLENBQUUsSUFBZTt3QkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ2IsR0FBRyxJQUFJOzRCQUNQLFdBQVcsRUFBRTtnQ0FDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7NkJBQ3BCO3lCQUNGLENBQUM7aUJBQ1Q7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPO2lCQUN4QixHQUFHLENBQUMsY0FBYyxDQUFDO2dCQUNwQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDbkIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1lBRXJCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQzt3QkFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUNiLEdBQUc7NEJBQ0gsTUFBTTs0QkFDTixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQ0FDbkIsR0FBRyxJQUFJO2dDQUNQLFdBQVcsRUFBRTtvQ0FDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUNBQ3BCOzZCQUNGLENBQUM7eUJBQ0gsQ0FBQyxDQUNILENBQUE7d0JBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO29CQUMzQyxDQUFDO29CQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDO2dCQUNoQixDQUFDO2dCQUVELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDekIsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFBO1FBQ2YsQ0FBQyxDQUFDLENBQWMsQ0FBQTtRQUVoQixPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRVMsVUFBVSxDQUFDLEtBQVU7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFeEIsTUFBTSxPQUFPLEdBQ1gsS0FBSyxFQUFFLE9BQU87WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPO1lBQy9CLEtBQUssRUFBRSxLQUFLO1lBQ1osNkNBQTZDLENBQUE7UUFFL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsSUFBSSxDQUFBO1FBRXhELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFDeEMsSUFBSSxDQUNMLENBQUE7SUFDSCxDQUFDO0NBQ0Y7QUFyS0QsZ0NBcUtDIn0=
|