bry-biometric-collector 2.2.24 → 2.3.1-RC01

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.
@@ -0,0 +1,132 @@
1
+ import { u as D, $ as m, n as C, g as b, i as y, s as l, a as F, F as U, b as M, c, v as x, d as P, A as B, e as I, h as g, f as v, j as W, k as R, l as $, m as k, o as w, p as V } from "./main_72a0926e_2.3.1-RC01.js";
2
+ const f = D(m);
3
+ var X = /* @__PURE__ */ ((n) => (n.EXTENSION_MISSING = "EXTENSION_MISSING", n.USER_CANCELLED = "USER_CANCELLED", n.UNAUTHORIZED_EXTENSION = "UNAUTHORIZED_EXTENSION", n.SCANNER_NOT_FOUND = "SCANNER_NOT_FOUND", n.EXTENSION_MODULE_NOT_INSTALLED = "EXTENSION_MODULE_NOT_INSTALLED", n.FINGER_NOT_REMOVED = "FINGER_NOT_REMOVED", n.UNKNOWN_ERROR = "UNKNOWN_ERROR", n.EVALUATE_BIOMETRICS_TIMEOUT = "EVALUATE_BIOMETRICS_TIMEOUT", n.EVALUATE_BIOMETRICS_NETWORK_ISSUE = "EVALUATE_BIOMETRICS_NETWORK_ISSUE", n))(X || {});
4
+ class r extends Error {
5
+ constructor(a, d) {
6
+ super(a), this.status = d;
7
+ }
8
+ }
9
+ async function Q(n, a) {
10
+ const d = C([n])[0], T = b();
11
+ if (y(T))
12
+ throw new r(
13
+ "Attempting to capture finger but the extension apparently hasn't been properly injected. Received: " + T,
14
+ "EXTENSION_MISSING"
15
+ /* EXTENSION_MISSING */
16
+ );
17
+ if (l(!0), F())
18
+ throw l(!1), w(!1), new r(
19
+ "User cancelled",
20
+ "USER_CANCELLED"
21
+ /* USER_CANCELLED */
22
+ );
23
+ let E = null;
24
+ try {
25
+ E = await T.getFingerprint(
26
+ // @ts-ignore TODO: Alex has to fix this functions signature to accept pojo
27
+ JSON.stringify(
28
+ a ?? { outputFormat: "BASE64", imageFormat: "BMP", nonce: "webCollector", timeout: 3 }
29
+ )
30
+ );
31
+ } catch (e) {
32
+ console.error(e);
33
+ const t = e;
34
+ throw l(!1), t.key === "fingerprint.scanner.timeout" ? new r(
35
+ "Fingerprint scan timed out (didn't read a finger.)",
36
+ "USER_CANCELLED"
37
+ /* USER_CANCELLED */
38
+ ) : t.key === "extension.authorization.canceled" ? new r(
39
+ "Extension wasn't given authorization.",
40
+ "UNAUTHORIZED_EXTENSION"
41
+ /* UNAUTHORIZED_EXTENSION */
42
+ ) : t.key === "fingerprint.scanner.not.found" ? new r(
43
+ "Couldn't find fingerprint scanner.",
44
+ "SCANNER_NOT_FOUND"
45
+ /* SCANNER_NOT_FOUND */
46
+ ) : t.key === "signer.not.installed" ? new r(
47
+ "The extension module isn't installed.",
48
+ "EXTENSION_MODULE_NOT_INSTALLED"
49
+ /* EXTENSION_MODULE_NOT_INSTALLED */
50
+ ) : new r(
51
+ "Couldn't capture fingerprint: " + t.description,
52
+ "UNKNOWN_ERROR"
53
+ /* UNKNOWN_ERROR */
54
+ );
55
+ }
56
+ if (F())
57
+ throw l(!1), w(!1), new r(
58
+ "User cancelled",
59
+ "USER_CANCELLED"
60
+ /* USER_CANCELLED */
61
+ );
62
+ const i = q(d);
63
+ i.image = E?.content.image?.data, i.base64WSQ = E?.content.fingerprint.data, i.nfiqRating = (E?.content.score || 0) + 98, i.status = U.AVAILABLE;
64
+ const L = M(c());
65
+ let s, O = !1;
66
+ try {
67
+ s = await x(L, i);
68
+ } catch (e) {
69
+ if (i.nfiqRating = -1, i.base64WSQ = "", i.image = "", console.warn("caught while validating fingerprint: ", e.toString()), P(e) && "message" in e && e.message === "error.template.extraction")
70
+ O = !0;
71
+ else if (e instanceof XMLHttpRequest) {
72
+ const t = e;
73
+ "response" in t && "data" in t.response.data && t.response.data.message === "error.template.extraction" && (O = !0);
74
+ } else {
75
+ if (e instanceof B)
76
+ throw e.code === "ECONNABORTED" ? (console.log("The evaluate biometrics request took too long to answer!"), new r(
77
+ "Evaluate biometrics took too long to reply",
78
+ "EVALUATE_BIOMETRICS_TIMEOUT"
79
+ /* EVALUATE_BIOMETRICS_TIMEOUT */
80
+ )) : (console.error("Error evaluating biometrics!", e), I(c()), l(!1), new r(
81
+ "Network issue while validating biometrics, check logs",
82
+ "EVALUATE_BIOMETRICS_NETWORK_ISSUE"
83
+ /* EVALUATE_BIOMETRICS_NETWORK_ISSUE */
84
+ ));
85
+ I(c()), l(!1);
86
+ }
87
+ }
88
+ let S, N, _, A, u, o = g.LOW_QUALITY;
89
+ if (s) {
90
+ const e = s.bodyParts.find(
91
+ (t) => t.bodyPart === i.bodyPart
92
+ );
93
+ i.nfiqRating = e.quality, (e.quality > v() || e.status === "LOW_QUALITY") && (S = !0, o = g.LOW_QUALITY), s.bodyParts.find((t) => t.status === "DUPLICATE") && (N = !0, o = g.DUPLICATE), s.bodyParts.find((t) => t.status === "FORBIDDEN") && (_ = !0, o = g.FORBIDDEN), s.bodyParts.find((t) => t.status === "AGR") && (A = !0, o = g.AGR_DETECTED), s.bodyParts.find((t) => t.status === "AGR_NOT_MATCH") && (u = !0, o = g.AGR_NO_MATCH);
94
+ }
95
+ if (N || S || _ || u || A || O) {
96
+ i.nfiqRating = -1, i.base64WSQ = "", i.image = "", i.status = U.AVAILABLE;
97
+ let e = "badFingerQualitySwal";
98
+ N ? e = "unknownDuplicateFingerSwal" : _ ? e = "forbiddenFingerSwal" : A ? e = "agrFinger" : u && (e = "agrFingerNotMatched");
99
+ let t = f(`${e}.text`);
100
+ if (W(V) && N) {
101
+ e = "duplicateFingerSwal", t = f(`${e}.text`, {
102
+ values: {
103
+ finger1: f(`${e}.${s.matchingFingers?.[0]}`),
104
+ finger2: f(`${e}.${s.matchingFingers?.[1]}`)
105
+ }
106
+ });
107
+ const h = R();
108
+ return {
109
+ returnCode: o,
110
+ bodyParts: h,
111
+ matchingFingers: s.matchingFingers,
112
+ message: t
113
+ };
114
+ }
115
+ const p = R();
116
+ return { returnCode: o, bodyParts: p, message: t };
117
+ }
118
+ return I(c()), l(!1), $(), { returnCode: g.CAPTURED, bodyParts: R() };
119
+ }
120
+ function q(n) {
121
+ k();
122
+ for (const a of c())
123
+ if (a.index === n)
124
+ return a.selected = !0, a;
125
+ throw new Error(`Finger ${n} not found`);
126
+ }
127
+ export {
128
+ r as CaptureApiError,
129
+ X as CaptureErrorStatusEnum,
130
+ Q as captureSingleFinger
131
+ };
132
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZ2Vyc0FwaV9hOWNhZTBlY18yLjMuMS1SQzAxLmpzIiwic291cmNlcyI6WyIuLi9zcmMvYXBpL2ZpbmdlcnNBcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXhpb3NFcnJvciB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB0eXBlIHsgQ2FwdHVyZVBhcmFtcywgRmluZ2VycHJpbnRTY2FuIH0gZnJvbSAnLi4vaW5jbHVkZS9FeHRlbnNpb24nO1xuaW1wb3J0IHsgaXNDYW5jZWxsaW5nLCBzZXRDYW5jZWxsaW5nLCBzZXRDYXB0dXJpbmcgfSBmcm9tICcuLi9saWIvZmluZ2Vyc1RhYi9idXR0b25zL2NhcHR1cmUvY2FwdHVyZVN0b3JlJztcbmltcG9ydCB7IGdldEV4dGVuc2lvbiwgaGFzRmluZ2VyT25BbmRPZmYsIGlzRXZlcnl0aGluZ0luc3RhbGxlZCB9IGZyb20gJy4uL2xpYi9maW5nZXJzVGFiL2V4dGVuc2lvbi9leHRlbnNpb24nO1xuaW1wb3J0IHtcbiAgQm9keVBhcnROYW1lcyxcbiAgRmluZ2VyLFxuICBnZXRTZWxlY3RlZEZpbmdlcixcbiAgbm9ybWFsaXplRmluZ2VyTmFtZXNBbmRJbmRleGVzVG9JbmRleGVzLFxuICB0eXBlIEZpbmdlckluZGV4LFxuICBnZXRGaW5nZXJzLFxuICBzZWxlY3ROb3RoaW5nLFxuICBGaW5nZXJTdGF0dXMsXG4gIGdldENvbGxlY3RlZEZpbmdlcnMsXG4gIHNldEZpbmdlcnMsXG4gIGdldE1pbk5maXFBY2NlcHRhYmxlLFxufSBmcm9tICcuLi9saWIvZmluZ2Vyc1RhYi9oYW5kL2hhbmRQYXJ0cy9maW5nZXJzU3RvcmUnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzT2JqZWN0RW1wdHkgfSBmcm9tICcuLi9saWIvdXRpbC91dGlsJztcbmltcG9ydCB7XG4gIHZhbGlkYXRlRmluZ2VyQmlvbWV0cmljcyxcbiAgdHlwZSBCb2R5UGFydFJldHVyblR5cGUsXG4gIHVzZVdhc20sXG4gIHR5cGUgQm9keVBhcnQsXG59IGZyb20gJy4uL2xpYi92YWxpZGF0b3JzL2Jpb21ldHJpY3NWYWxpZGF0b3InO1xuaW1wb3J0IHtcbiAgY29sbGVjdEZpbmdlcnMsXG4gIGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMsXG4gIG5vdGlmeUZpbmdlckNvbGxlY3RlZCxcbn0gZnJvbSAnLi4vbGliL2ZpbmdlcnNUYWIvYnV0dG9ucy9idXR0b25IYW5kbGVycyc7XG5pbXBvcnQgeyBmb3JtYXQsIHVud3JhcEZ1bmN0aW9uU3RvcmUgfSBmcm9tICdzdmVsdGUtaTE4bic7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdzdmVsdGUvc3RvcmUnO1xuY29uc3QgJGZvcm1hdCA9IHVud3JhcEZ1bmN0aW9uU3RvcmUoZm9ybWF0KTtcblxuZXhwb3J0IHsgY2FwdHVyZVNpbmdsZUZpbmdlciB9O1xuXG5leHBvcnQgY29uc3QgZW51bSBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtIHtcbiAgRVhURU5TSU9OX01JU1NJTkcgPSAnRVhURU5TSU9OX01JU1NJTkcnLFxuICBVU0VSX0NBTkNFTExFRCA9ICdVU0VSX0NBTkNFTExFRCcsXG4gIFVOQVVUSE9SSVpFRF9FWFRFTlNJT04gPSAnVU5BVVRIT1JJWkVEX0VYVEVOU0lPTicsXG4gIFNDQU5ORVJfTk9UX0ZPVU5EID0gJ1NDQU5ORVJfTk9UX0ZPVU5EJyxcbiAgRVhURU5TSU9OX01PRFVMRV9OT1RfSU5TVEFMTEVEID0gJ0VYVEVOU0lPTl9NT0RVTEVfTk9UX0lOU1RBTExFRCcsXG4gIEZJTkdFUl9OT1RfUkVNT1ZFRCA9ICdGSU5HRVJfTk9UX1JFTU9WRUQnLFxuICBVTktOT1dOX0VSUk9SID0gJ1VOS05PV05fRVJST1InLFxuICBFVkFMVUFURV9CSU9NRVRSSUNTX1RJTUVPVVQgPSAnRVZBTFVBVEVfQklPTUVUUklDU19USU1FT1VUJyxcbiAgRVZBTFVBVEVfQklPTUVUUklDU19ORVRXT1JLX0lTU1VFID0gJ0VWQUxVQVRFX0JJT01FVFJJQ1NfTkVUV09SS19JU1NVRScsXG59XG5cbmV4cG9ydCBjbGFzcyBDYXB0dXJlQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHN0YXR1czogQ2FwdHVyZUVycm9yU3RhdHVzRW51bSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogUHJvZ3JhbW1hdGljYWxseSBjYXB0dXJlIHNpbmdsZSBmaW5nZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FwdHVyZVNpbmdsZUZpbmdlcihcbiAgZmluZ2VyTmFtZU9ySW5kZXg6IG51bWJlciB8IEJvZHlQYXJ0TmFtZXMsXG4gIGdldEZpbmdlcnByaW50UGFyYW1zOiBDYXB0dXJlUGFyYW1zXG4pOiBQcm9taXNlPHtcbiAgcmV0dXJuQ29kZTogaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cztcbiAgYm9keVBhcnRzOiBCb2R5UGFydFtdO1xuICBtYXRjaGluZ0ZpbmdlcnM/OiBCb2R5UGFydE5hbWVzW107XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IGZpbmdlckluZGV4ID0gbm9ybWFsaXplRmluZ2VyTmFtZXNBbmRJbmRleGVzVG9JbmRleGVzKFtmaW5nZXJOYW1lT3JJbmRleF0pWzBdO1xuICAvLyB0cnkge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oKTtcbiAgLy8gY2hlY2sgdGhhdCB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZVxuICBpZiAoaXNPYmplY3RFbXB0eShleHRlbnNpb24pKSB7XG4gICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcbiAgICAgIFwiQXR0ZW1wdGluZyB0byBjYXB0dXJlIGZpbmdlciBidXQgdGhlIGV4dGVuc2lvbiBhcHBhcmVudGx5IGhhc24ndCBiZWVuIHByb3Blcmx5IGluamVjdGVkLiBSZWNlaXZlZDogXCIgKyBleHRlbnNpb24sXG4gICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVYVEVOU0lPTl9NSVNTSU5HXG4gICAgKTtcbiAgfVxuXG4gIHNldENhcHR1cmluZyh0cnVlKTtcblxuICAvLyBpZiBzb21laG93IHRoZXkgbWFuYWdlZCB0byBhc2sgZm9yIGNhbmNlbGxhdGlvbiByaWdodCBiZWZvcmUgdGhlIHNjYW4sIHRoaXMgY2F0Y2hlcyB0aGF0XG4gIGlmIChpc0NhbmNlbGxpbmcoKSkge1xuICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgc2V0Q2FuY2VsbGluZyhmYWxzZSk7XG4gICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcignVXNlciBjYW5jZWxsZWQnLCBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLlVTRVJfQ0FOQ0VMTEVEKTtcbiAgfVxuXG4gIC8vIHByb21wdCB1c2VyIHRvIGNvbGxlY3QgdGhlIGZpbmdlclxuICBsZXQgY2FwdHVyZTogRmluZ2VycHJpbnRTY2FuIHwgbnVsbCA9IG51bGw7XG4gIHRyeSB7XG4gICAgLy8gY2FwdHVyZSB0aGUgZmluZ2VyXG4gICAgLy8gKmltcGxlbWVudGF0aW9uIGNvbnNpZGVyaW5nIHdlIG9ubHkgaGF2ZSB0aGUgZ2V0RmluZ2VycHJpbnQgbWV0aG9kIGF2YWlsYWJsZVxuICAgIGNhcHR1cmUgPSBhd2FpdCBleHRlbnNpb24uZ2V0RmluZ2VycHJpbnQoXG4gICAgICAvLyBAdHMtaWdub3JlIFRPRE86IEFsZXggaGFzIHRvIGZpeCB0aGlzIGZ1bmN0aW9ucyBzaWduYXR1cmUgdG8gYWNjZXB0IHBvam9cbiAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICBnZXRGaW5nZXJwcmludFBhcmFtcyA/PyB7IG91dHB1dEZvcm1hdDogJ0JBU0U2NCcsIGltYWdlRm9ybWF0OiAnQk1QJywgbm9uY2U6ICd3ZWJDb2xsZWN0b3InLCB0aW1lb3V0OiAzIH1cbiAgICAgIClcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgY29uc3QgZSA9IGVyciBhcyB7IGtleTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH07XG4gICAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICAvLyBUT0RPOiB0eXBlIHRoaXMgYW5kIGNyZWF0ZSBlbnVtIGZvciBlcnJvcnNcbiAgICBpZiAoZS5rZXkgPT09ICdmaW5nZXJwcmludC5zY2FubmVyLnRpbWVvdXQnKSB7XG4gICAgICAvLyBpZiB0aW1lZG91dCBqdXN0IHRyeSBhZ2FpbiwgdW5sZXNzIHRyeWluZyB0byBjYW5jZWxcbiAgICAgIC8vIFRPRE86IG1heWJlIHN0b3AgYWZ0ZXIgc28gbWFueSB0cmllc1xuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcbiAgICAgICAgXCJGaW5nZXJwcmludCBzY2FuIHRpbWVkIG91dCAoZGlkbid0IHJlYWQgYSBmaW5nZXIuKVwiLFxuICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLlVTRVJfQ0FOQ0VMTEVEXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdleHRlbnNpb24uYXV0aG9yaXphdGlvbi5jYW5jZWxlZCcpIHtcbiAgICAgIC8vIHVzZXIgZGlkbid0IGF1dGhvcml6ZSB0aGUgZG9tYWluLCB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkbyBzbyBzdG9wLlxuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcIkV4dGVuc2lvbiB3YXNuJ3QgZ2l2ZW4gYXV0aG9yaXphdGlvbi5cIiwgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VTkFVVEhPUklaRURfRVhURU5TSU9OKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnZmluZ2VycHJpbnQuc2Nhbm5lci5ub3QuZm91bmQnKSB7XG4gICAgICAvLyB1c2VyIGRvZXNuJ3QgaGF2ZSBhIHNjYW5uZXIgY29ubmVjdGVkLCB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkbyBzbyBzdG9wLlxuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcIkNvdWxkbid0IGZpbmQgZmluZ2VycHJpbnQgc2Nhbm5lci5cIiwgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5TQ0FOTkVSX05PVF9GT1VORCk7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ3NpZ25lci5ub3QuaW5zdGFsbGVkJykge1xuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcbiAgICAgICAgXCJUaGUgZXh0ZW5zaW9uIG1vZHVsZSBpc24ndCBpbnN0YWxsZWQuXCIsXG4gICAgICAgIENhcHR1cmVFcnJvclN0YXR1c0VudW0uRVhURU5TSU9OX01PRFVMRV9OT1RfSU5TVEFMTEVEXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQ2FwdHVyZUFwaUVycm9yKFwiQ291bGRuJ3QgY2FwdHVyZSBmaW5nZXJwcmludDogXCIgKyBlLmRlc2NyaXB0aW9uLCBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLlVOS05PV05fRVJST1IpO1xuICAgIH1cbiAgfVxuICAvLyBpZiBzb21laG93IHRoZXkgbWFuYWdlZCB0byBhc2sgZm9yIGNhbmNlbGxhdGlvbiByaWdodCBiZWZvcmUgdGhlIHNjYW4sIHRoaXMgY2F0Y2hlcyB0aGF0XG4gIGlmIChpc0NhbmNlbGxpbmcoKSkge1xuICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgc2V0Q2FuY2VsbGluZyhmYWxzZSk7XG4gICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcignVXNlciBjYW5jZWxsZWQnLCBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLlVTRVJfQ0FOQ0VMTEVEKTtcbiAgfVxuXG4gIC8vIHNlbGVjdCBhbmQgZ2V0IGZpbmdlclxuICBjb25zdCBmaW5nZXIgPSBzZWxlY3RGaW5nZXJBcGkoZmluZ2VySW5kZXgpO1xuICAvLyBzZXQgdGhpcyBmaW5nZXJzIGF0dHJpYnV0ZXMgdG8gdGhlIHJlY2VudGx5IGNvbGxlY3RlZCBmaW5nZXJcbiAgZmluZ2VyLmltYWdlID0gY2FwdHVyZT8uY29udGVudC5pbWFnZT8uZGF0YSBhcyBzdHJpbmc7XG4gIGZpbmdlci5iYXNlNjRXU1EgPSBjYXB0dXJlPy5jb250ZW50LmZpbmdlcnByaW50LmRhdGEgYXMgc3RyaW5nO1xuICBmaW5nZXIubmZpcVJhdGluZyA9IChjYXB0dXJlPy5jb250ZW50LnNjb3JlIHx8IDApICsgOTg7XG4gIGZpbmdlci5zdGF0dXMgPSBGaW5nZXJTdGF0dXMuQVZBSUxBQkxFO1xuICAvLyBHZXQgQUxMIHRoZSBjb2xsZWN0ZWQgZmluZ2Vyc1xuICBjb25zdCBjb2xsZWN0ZWRGaW5nZXJzID0gZ2V0Q29sbGVjdGVkRmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuXG4gIC8vIHNlbmQgdG8gcmVtb3RlXG4gIGxldCByZXNwb25zZSxcbiAgICBlcnJvclRlbXBsYXRlRXh0cmFjdGlvbiA9IGZhbHNlO1xuICB0cnkge1xuICAgIHJlc3BvbnNlID0gYXdhaXQgdmFsaWRhdGVGaW5nZXJCaW9tZXRyaWNzKGNvbGxlY3RlZEZpbmdlcnMsIGZpbmdlcik7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAvLyBjbGVhciB0aGUgZmluZ2VyXG4gICAgZmluZ2VyLm5maXFSYXRpbmcgPSAtMTtcbiAgICBmaW5nZXIuYmFzZTY0V1NRID0gJyc7XG4gICAgZmluZ2VyLmltYWdlID0gJyc7XG4gICAgLy8gd2FybiBlcnJvclxuICAgIGNvbnNvbGUud2FybignY2F1Z2h0IHdoaWxlIHZhbGlkYXRpbmcgZmluZ2VycHJpbnQ6ICcsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgIC8vIGVycm9yIHdoaWxlIGV4dHJhY3RpbmcsIHNob3cgYSBsb3cgcXVhbGl0eSBzd2FsXG4gICAgaWYgKGlzT2JqZWN0KGVycm9yKSAmJiAnbWVzc2FnZScgaW4gZXJyb3IgJiYgZXJyb3IubWVzc2FnZSA9PT0gJ2Vycm9yLnRlbXBsYXRlLmV4dHJhY3Rpb24nKSB7XG4gICAgICBlcnJvclRlbXBsYXRlRXh0cmFjdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICBjb25zdCBlID0gZXJyb3I7XG4gICAgICBpZiAoJ3Jlc3BvbnNlJyBpbiBlICYmICdkYXRhJyBpbiBlLnJlc3BvbnNlLmRhdGEgJiYgZS5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgPT09ICdlcnJvci50ZW1wbGF0ZS5leHRyYWN0aW9uJykge1xuICAgICAgICBlcnJvclRlbXBsYXRlRXh0cmFjdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEF4aW9zRXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRUNPTk5BQk9SVEVEJykge1xuICAgICAgICBjb25zb2xlLmxvZygnVGhlIGV2YWx1YXRlIGJpb21ldHJpY3MgcmVxdWVzdCB0b29rIHRvbyBsb25nIHRvIGFuc3dlciEnKTtcbiAgICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcbiAgICAgICAgICAnRXZhbHVhdGUgYmlvbWV0cmljcyB0b29rIHRvbyBsb25nIHRvIHJlcGx5JyxcbiAgICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVWQUxVQVRFX0JJT01FVFJJQ1NfVElNRU9VVFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZXZhbHVhdGluZyBiaW9tZXRyaWNzIScsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMgdXBkYXRlcyB0aGUgc3RhdXMgaW4gY2FzZSB0aGUgZmluZ2VyIGhhZCBhIHN0YXR1c1xuICAgICAgc2V0RmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuICAgICAgLy8gbm8gbG9uZ2VyIGNhcHR1cmluZ1xuICAgICAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgICdOZXR3b3JrIGlzc3VlIHdoaWxlIHZhbGlkYXRpbmcgYmlvbWV0cmljcywgY2hlY2sgbG9ncycsXG4gICAgICAgIENhcHR1cmVFcnJvclN0YXR1c0VudW0uRVZBTFVBVEVfQklPTUVUUklDU19ORVRXT1JLX0lTU1VFXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzIGNoYW5nZXMgdXBkYXRlcyB0aGUgc3RhdXMgaW4gY2FzZSB0aGUgZmluZ2VyIGhhZCBhIHN0YXR1c1xuICAgICAgc2V0RmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuICAgICAgLy8gbm8gbG9uZ2VyIGNhcHR1cmluZ1xuICAgICAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgbGV0IGlzRmluZ2VyTG93UXVhbGl0eSxcbiAgICBpc0R1cGxpY2F0ZUZpbmdlcixcbiAgICBpc0ZvcmJpZGRlbkZpbmdlcixcbiAgICBpc0FnckZpbmdlckRldGVjdGVkLFxuICAgIGlzQWdyTm90TWF0Y2hlZEZpbmdlcixcbiAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5MT1dfUVVBTElUWTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgLy8gZ2V0IHRoZSBjdXJyZW50IGZpbmdlciBmcm9tIHRoZSByZXR1cm4gbGlzdFxuICAgIGNvbnN0IHZhbGlkYXRlZEZpbmdlciA9IHJlc3BvbnNlLmJvZHlQYXJ0cy5maW5kKFxuICAgICAgKHZhbGlkYXRlZEZpbmdlcikgPT4gdmFsaWRhdGVkRmluZ2VyLmJvZHlQYXJ0ID09PSBmaW5nZXIuYm9keVBhcnRcbiAgICApIGFzIEJvZHlQYXJ0UmV0dXJuVHlwZTtcbiAgICAvLyBzZXQgdGhpcyBmaW5nZXIncyBxdWFsaXR5IGFuZCBpbWFnZVxuICAgIGZpbmdlci5uZmlxUmF0aW5nID0gdmFsaWRhdGVkRmluZ2VyLnF1YWxpdHk7XG4gICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBhbmQgbG93IHF1YWxpdHlcbiAgICBpZiAodmFsaWRhdGVkRmluZ2VyLnF1YWxpdHkgPiBnZXRNaW5OZmlxQWNjZXB0YWJsZSgpIHx8IHZhbGlkYXRlZEZpbmdlci5zdGF0dXMgPT09ICdMT1dfUVVBTElUWScpIHtcbiAgICAgIGlzRmluZ2VyTG93UXVhbGl0eSA9IHRydWU7XG4gICAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5MT1dfUVVBTElUWTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLmJvZHlQYXJ0cy5maW5kKCh2YWxpZGF0ZWRGaW5nZXIpID0+IHZhbGlkYXRlZEZpbmdlci5zdGF0dXMgPT09ICdEVVBMSUNBVEUnKSkge1xuICAgICAgaXNEdXBsaWNhdGVGaW5nZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuQ29kZSA9IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuRFVQTElDQVRFO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UuYm9keVBhcnRzLmZpbmQoKHZhbGlkYXRlZEZpbmdlcikgPT4gdmFsaWRhdGVkRmluZ2VyLnN0YXR1cyA9PT0gJ0ZPUkJJRERFTicpKSB7XG4gICAgICBpc0ZvcmJpZGRlbkZpbmdlciA9IHRydWU7XG4gICAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5GT1JCSURERU47XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS5ib2R5UGFydHMuZmluZCgodmFsaWRhdGVkRmluZ2VyKSA9PiB2YWxpZGF0ZWRGaW5nZXIuc3RhdHVzID09PSAnQUdSJykpIHtcbiAgICAgIGlzQWdyRmluZ2VyRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuQ29kZSA9IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuQUdSX0RFVEVDVEVEO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UuYm9keVBhcnRzLmZpbmQoKHZhbGlkYXRlZEZpbmdlcikgPT4gdmFsaWRhdGVkRmluZ2VyLnN0YXR1cyA9PT0gJ0FHUl9OT1RfTUFUQ0gnKSkge1xuICAgICAgaXNBZ3JOb3RNYXRjaGVkRmluZ2VyID0gdHJ1ZTtcbiAgICAgIHJldHVybkNvZGUgPSBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkFHUl9OT19NQVRDSDtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGlzIGZpbmdlciBpcyBsb3cgcXVhbGl0eSBvciBkdXBsaWNhdGVcbiAgLy8gKGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlLCBpdCBoYXMgdG8gYmUgdGhpcyBmaW5nZXIpXG4gIGlmIChcbiAgICBpc0R1cGxpY2F0ZUZpbmdlciB8fFxuICAgIGlzRmluZ2VyTG93UXVhbGl0eSB8fFxuICAgIGlzRm9yYmlkZGVuRmluZ2VyIHx8XG4gICAgaXNBZ3JOb3RNYXRjaGVkRmluZ2VyIHx8XG4gICAgaXNBZ3JGaW5nZXJEZXRlY3RlZCB8fFxuICAgIGVycm9yVGVtcGxhdGVFeHRyYWN0aW9uXG4gICkge1xuICAgIC8vIGNsZWFyIHRoaXMgZmluZ2VyXG4gICAgZmluZ2VyLm5maXFSYXRpbmcgPSAtMTtcbiAgICBmaW5nZXIuYmFzZTY0V1NRID0gJyc7XG4gICAgZmluZ2VyLmltYWdlID0gJyc7XG4gICAgZmluZ2VyLnN0YXR1cyA9IEZpbmdlclN0YXR1cy5BVkFJTEFCTEU7XG4gICAgLy8gc2V0IHRoZSBhcHByb3ByaWF0ZSBzd2FsIHByZWZpeFxuICAgIGxldCBzd2FsVHJhbnNsYXRlUHJlZml4ID0gJ2JhZEZpbmdlclF1YWxpdHlTd2FsJztcbiAgICBpZiAoaXNEdXBsaWNhdGVGaW5nZXIpIHtcbiAgICAgIHN3YWxUcmFuc2xhdGVQcmVmaXggPSAndW5rbm93bkR1cGxpY2F0ZUZpbmdlclN3YWwnO1xuICAgIH0gZWxzZSBpZiAoaXNGb3JiaWRkZW5GaW5nZXIpIHtcbiAgICAgIHN3YWxUcmFuc2xhdGVQcmVmaXggPSAnZm9yYmlkZGVuRmluZ2VyU3dhbCc7XG4gICAgfSBlbHNlIGlmIChpc0FnckZpbmdlckRldGVjdGVkKSB7XG4gICAgICBzd2FsVHJhbnNsYXRlUHJlZml4ID0gJ2FnckZpbmdlcic7XG4gICAgfSBlbHNlIGlmIChpc0Fnck5vdE1hdGNoZWRGaW5nZXIpIHtcbiAgICAgIHN3YWxUcmFuc2xhdGVQcmVmaXggPSAnYWdyRmluZ2VyTm90TWF0Y2hlZCc7XG4gICAgfVxuICAgIGxldCBodG1sID0gJGZvcm1hdChgJHtzd2FsVHJhbnNsYXRlUHJlZml4fS50ZXh0YCk7XG4gICAgLy8gaWYgd2UgYXJlIHVzaW5nIHdhc20sIHdlIGtub3cgZXhhY3RseSB3aGljaCBmaW5nZXJzIHdlcmUgdGhlIGlzc3VlXG4gICAgaWYgKGdldCh1c2VXYXNtKSAmJiBpc0R1cGxpY2F0ZUZpbmdlcikge1xuICAgICAgc3dhbFRyYW5zbGF0ZVByZWZpeCA9ICdkdXBsaWNhdGVGaW5nZXJTd2FsJztcbiAgICAgIGh0bWwgPSAkZm9ybWF0KGAke3N3YWxUcmFuc2xhdGVQcmVmaXh9LnRleHRgLCB7XG4gICAgICAgIHZhbHVlczoge1xuICAgICAgICAgIGZpbmdlcjE6ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0uJHsocmVzcG9uc2UgYXMgYW55KS5tYXRjaGluZ0ZpbmdlcnM/LlswXX1gKSxcbiAgICAgICAgICBmaW5nZXIyOiAkZm9ybWF0KGAke3N3YWxUcmFuc2xhdGVQcmVmaXh9LiR7KHJlc3BvbnNlIGFzIGFueSkubWF0Y2hpbmdGaW5nZXJzPy5bMV19YCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGNvbGxlY3RGaW5nZXJzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXR1cm5Db2RlLFxuICAgICAgICBib2R5UGFydHM6IG91dHB1dCxcbiAgICAgICAgbWF0Y2hpbmdGaW5nZXJzOiAocmVzcG9uc2UgYXMgYW55KS5tYXRjaGluZ0ZpbmdlcnMgYXMgQm9keVBhcnROYW1lc1tdLFxuICAgICAgICBtZXNzYWdlOiBodG1sLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gY29sbGVjdEZpbmdlcnMoKTtcbiAgICByZXR1cm4geyByZXR1cm5Db2RlLCBib2R5UGFydHM6IG91dHB1dCwgbWVzc2FnZTogaHRtbCB9O1xuICB9XG4gIC8vIHNob3cgdGhlIGNvbGxlY3RlZCBmaW5nZXJcbiAgc2V0RmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuXG4gIHNldENhcHR1cmluZyhmYWxzZSk7XG4gIC8vIHNlbmQgY29sbGVjdGVkIGZpbmdlciBtZXNzYWdlXG4gIG5vdGlmeUZpbmdlckNvbGxlY3RlZCgpO1xuXG4gIHJldHVybiB7IHJldHVybkNvZGU6IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuQ0FQVFVSRUQsIGJvZHlQYXJ0czogY29sbGVjdEZpbmdlcnMoKSB9O1xufVxuXG4vKipcbiAqIFNlbGVjdCBmaW5nZXIgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCB1c2VyIGNsaWNrKVxuICovXG5mdW5jdGlvbiBzZWxlY3RGaW5nZXJBcGkoaW5kZXg6IEZpbmdlckluZGV4KTogRmluZ2VyIHtcbiAgLy8gdW5zZWxlY3QgZXZlcnl0aGluZ1xuICBzZWxlY3ROb3RoaW5nKCk7XG4gIGZvciAoY29uc3QgZmluZ2VyIG9mIGdldEZpbmdlcnMoKSkge1xuICAgIGlmIChmaW5nZXIuaW5kZXggPT09IGluZGV4KSB7XG4gICAgICBmaW5nZXIuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZpbmdlcjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBGaW5nZXIgJHtpbmRleH0gbm90IGZvdW5kYCk7XG59XG4iXSwibmFtZXMiOlsiJGZvcm1hdCIsInVud3JhcEZ1bmN0aW9uU3RvcmUiLCJmb3JtYXQiLCJDYXB0dXJlRXJyb3JTdGF0dXNFbnVtIiwiQ2FwdHVyZUFwaUVycm9yIiwibWVzc2FnZSIsInN0YXR1cyIsImNhcHR1cmVTaW5nbGVGaW5nZXIiLCJmaW5nZXJOYW1lT3JJbmRleCIsImdldEZpbmdlcnByaW50UGFyYW1zIiwiZmluZ2VySW5kZXgiLCJub3JtYWxpemVGaW5nZXJOYW1lc0FuZEluZGV4ZXNUb0luZGV4ZXMiLCJleHRlbnNpb24iLCJnZXRFeHRlbnNpb24iLCJpc09iamVjdEVtcHR5Iiwic2V0Q2FwdHVyaW5nIiwiaXNDYW5jZWxsaW5nIiwic2V0Q2FuY2VsbGluZyIsImNhcHR1cmUiLCJlcnIiLCJlIiwiZmluZ2VyIiwic2VsZWN0RmluZ2VyQXBpIiwiRmluZ2VyU3RhdHVzIiwiY29sbGVjdGVkRmluZ2VycyIsImdldENvbGxlY3RlZEZpbmdlcnMiLCJnZXRGaW5nZXJzIiwicmVzcG9uc2UiLCJlcnJvclRlbXBsYXRlRXh0cmFjdGlvbiIsInZhbGlkYXRlRmluZ2VyQmlvbWV0cmljcyIsImVycm9yIiwiaXNPYmplY3QiLCJBeGlvc0Vycm9yIiwic2V0RmluZ2VycyIsImlzRmluZ2VyTG93UXVhbGl0eSIsImlzRHVwbGljYXRlRmluZ2VyIiwiaXNGb3JiaWRkZW5GaW5nZXIiLCJpc0FnckZpbmdlckRldGVjdGVkIiwiaXNBZ3JOb3RNYXRjaGVkRmluZ2VyIiwicmV0dXJuQ29kZSIsImhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMiLCJ2YWxpZGF0ZWRGaW5nZXIiLCJnZXRNaW5OZmlxQWNjZXB0YWJsZSIsInN3YWxUcmFuc2xhdGVQcmVmaXgiLCJodG1sIiwiZ2V0IiwidXNlV2FzbSIsIm91dHB1dCIsImNvbGxlY3RGaW5nZXJzIiwibm90aWZ5RmluZ2VyQ29sbGVjdGVkIiwiaW5kZXgiLCJzZWxlY3ROb3RoaW5nIl0sIm1hcHBpbmdzIjoiO0FBK0JBLE1BQU1BLElBQVVDLEVBQW9CQyxDQUFNO0FBSXhCLElBQUFDLHNCQUFBQSxPQUNoQkEsRUFBQSxvQkFBb0IscUJBQ3BCQSxFQUFBLGlCQUFpQixrQkFDakJBLEVBQUEseUJBQXlCLDBCQUN6QkEsRUFBQSxvQkFBb0IscUJBQ3BCQSxFQUFBLGlDQUFpQyxrQ0FDakNBLEVBQUEscUJBQXFCLHNCQUNyQkEsRUFBQSxnQkFBZ0IsaUJBQ2hCQSxFQUFBLDhCQUE4QiwrQkFDOUJBLEVBQUEsb0NBQW9DLHFDQVRwQkEsSUFBQUEsS0FBQSxDQUFBLENBQUE7QUFZWCxNQUFNQyxVQUF3QixNQUFNO0FBQUEsRUFDekMsWUFBWUMsR0FBd0JDLEdBQWdDO0FBQ2xFLFVBQU1ELENBQU8sR0FEcUIsS0FBQSxTQUFBQztBQUFBLEVBRXBDO0FBQ0Y7QUFLQSxlQUFlQyxFQUNiQyxHQUNBQyxHQU1DO0FBQ0QsUUFBTUMsSUFBY0MsRUFBd0MsQ0FBQ0gsQ0FBaUIsQ0FBQyxFQUFFLENB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