@bitgo-beta/key-card 0.0.1-beta.76 → 0.0.1-beta.760
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/dist/src/drawKeycard.d.ts +5 -0
- package/dist/src/drawKeycard.d.ts.map +1 -0
- package/dist/src/drawKeycard.js +244 -0
- package/dist/src/faq.d.ts +3 -0
- package/dist/src/faq.d.ts.map +1 -0
- package/dist/src/faq.js +75 -0
- package/dist/src/generateParamsForKeyCreation.d.ts +3 -0
- package/dist/src/generateParamsForKeyCreation.d.ts.map +1 -0
- package/dist/src/generateParamsForKeyCreation.js +39 -0
- package/dist/src/generateQrData.d.ts +3 -0
- package/dist/src/generateQrData.d.ts.map +1 -0
- package/dist/src/generateQrData.js +129 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +43 -0
- package/dist/src/types.d.ts +60 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/src/utils.d.ts +2 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +16 -0
- package/package.json +5 -5
- package/.mocharc.js +0 -9
- package/CHANGELOG.md +0 -32
- package/src/drawKeycard.ts +0 -240
- package/src/faq.ts +0 -82
- package/src/generateQrData.ts +0 -167
- package/src/index.ts +0 -22
- package/src/utils.ts +0 -15
- package/test/unit/faq.ts +0 -14
- package/test/unit/generateQrData.ts +0 -213
- package/test/unit/utils.ts +0 -30
- package/tsconfig.json +0 -20
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { jsPDF } from 'jspdf';
|
|
2
|
+
import { IDrawKeyCard } from './types';
|
|
3
|
+
export declare const QRBinaryMaxLength = 1500;
|
|
4
|
+
export declare function drawKeycard({ activationCode, questions, keyCardImage, qrData, walletLabel, curve, }: IDrawKeyCard): Promise<jsPDF>;
|
|
5
|
+
//# sourceMappingURL=drawKeycard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawKeycard.d.ts","sourceRoot":"","sources":["../../src/drawKeycard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA2BvC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AA4EtC,wBAAsB,WAAW,CAAC,EAChC,cAAc,EACd,SAAS,EACT,YAAY,EACZ,MAAM,EACN,WAAW,EACX,KAAK,GACN,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAoL/B"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QRBinaryMaxLength = void 0;
|
|
4
|
+
exports.drawKeycard = drawKeycard;
|
|
5
|
+
const QRCode = require("qrcode");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
async function loadJSPDF() {
|
|
8
|
+
let jsPDF;
|
|
9
|
+
if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
|
|
10
|
+
// We are in the browser
|
|
11
|
+
jsPDF = await Promise.resolve().then(() => require('jspdf'));
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
// We are in Node.js
|
|
15
|
+
jsPDF = require('jspdf');
|
|
16
|
+
}
|
|
17
|
+
return jsPDF;
|
|
18
|
+
}
|
|
19
|
+
var KeyCurveName;
|
|
20
|
+
(function (KeyCurveName) {
|
|
21
|
+
KeyCurveName["ed25519"] = "EDDSA";
|
|
22
|
+
KeyCurveName["secp256k1"] = "ECDSA";
|
|
23
|
+
KeyCurveName["bls"] = "BLS";
|
|
24
|
+
})(KeyCurveName || (KeyCurveName = {}));
|
|
25
|
+
// Max for Binary/Byte Data https://github.com/soldair/node-qrcode#qr-code-capacity
|
|
26
|
+
// the largest theoretically possible value is actually 2953 but the QR codes get so dense that scanning them with a
|
|
27
|
+
// phone (off of a printed page) doesn't work anymore
|
|
28
|
+
// this limitation was chosen by trial and error
|
|
29
|
+
exports.QRBinaryMaxLength = 1500;
|
|
30
|
+
const font = {
|
|
31
|
+
header: 24,
|
|
32
|
+
subheader: 15,
|
|
33
|
+
body: 12,
|
|
34
|
+
};
|
|
35
|
+
const color = {
|
|
36
|
+
black: '#000000',
|
|
37
|
+
darkgray: '#4c4c4c',
|
|
38
|
+
gray: '#9b9b9b',
|
|
39
|
+
red: '#e21e1e',
|
|
40
|
+
};
|
|
41
|
+
const margin = 30;
|
|
42
|
+
// Helpers for data formatting / positioning on the paper
|
|
43
|
+
function left(x) {
|
|
44
|
+
return margin + x;
|
|
45
|
+
}
|
|
46
|
+
function moveDown(y, ydelta) {
|
|
47
|
+
return y + ydelta;
|
|
48
|
+
}
|
|
49
|
+
function drawOnePageOfQrCodes(qrImages, doc, y, qrSize, startIndex) {
|
|
50
|
+
doc.setFont('helvetica');
|
|
51
|
+
let qrIndex = startIndex;
|
|
52
|
+
for (; qrIndex < qrImages.length; qrIndex++) {
|
|
53
|
+
const image = qrImages[qrIndex];
|
|
54
|
+
const textBuffer = 15;
|
|
55
|
+
if (y + qrSize + textBuffer >= doc.internal.pageSize.getHeight()) {
|
|
56
|
+
return qrIndex;
|
|
57
|
+
}
|
|
58
|
+
doc.addImage(image, left(0), y, qrSize, qrSize);
|
|
59
|
+
if (qrImages.length === 1) {
|
|
60
|
+
return qrIndex + 1;
|
|
61
|
+
}
|
|
62
|
+
y = moveDown(y, qrSize + textBuffer);
|
|
63
|
+
doc.setFontSize(font.body).setTextColor(color.black);
|
|
64
|
+
doc.text('Part ' + (qrIndex + 1).toString(), left(0), y);
|
|
65
|
+
y = moveDown(y, 20);
|
|
66
|
+
}
|
|
67
|
+
return qrIndex + 1;
|
|
68
|
+
}
|
|
69
|
+
function computeKeyCardImageDimensions(keyCardImage) {
|
|
70
|
+
// Max dimensions stablished by fixed available PDF space
|
|
71
|
+
const KEY_CARD_IMAGE_MAX_DIMENSIONS = {
|
|
72
|
+
width: 303,
|
|
73
|
+
height: 40,
|
|
74
|
+
};
|
|
75
|
+
const { width: imgWidth, height: imgHeight } = keyCardImage;
|
|
76
|
+
const { width: maxWidth, height: maxHeight } = KEY_CARD_IMAGE_MAX_DIMENSIONS;
|
|
77
|
+
// Try scaling ratio based on width
|
|
78
|
+
const wRatio = imgWidth / maxWidth;
|
|
79
|
+
let finalRatio = wRatio;
|
|
80
|
+
// If resized height exceeds the available height space, base ratio also on height
|
|
81
|
+
if (imgHeight / finalRatio > maxHeight) {
|
|
82
|
+
finalRatio = imgHeight / maxHeight;
|
|
83
|
+
}
|
|
84
|
+
return [imgWidth / finalRatio, imgHeight / finalRatio];
|
|
85
|
+
}
|
|
86
|
+
async function drawKeycard({ activationCode, questions, keyCardImage, qrData, walletLabel, curve, }) {
|
|
87
|
+
const jsPDFModule = await loadJSPDF();
|
|
88
|
+
// document details
|
|
89
|
+
const width = 8.5 * 72;
|
|
90
|
+
let y = 0;
|
|
91
|
+
// Create the PDF instance
|
|
92
|
+
const doc = new jsPDFModule.jsPDF('portrait', 'pt', 'letter'); // jshint ignore:line
|
|
93
|
+
doc.setFont('helvetica');
|
|
94
|
+
// PDF Header Area - includes the logo and company name
|
|
95
|
+
// This is data for the BitGo logo in the top left of the PDF
|
|
96
|
+
y = moveDown(y, 30);
|
|
97
|
+
if (keyCardImage) {
|
|
98
|
+
const [imgWidth, imgHeight] = computeKeyCardImageDimensions(keyCardImage);
|
|
99
|
+
doc.addImage(keyCardImage, left(0), y, imgWidth, imgHeight);
|
|
100
|
+
}
|
|
101
|
+
// Activation Code
|
|
102
|
+
if (activationCode) {
|
|
103
|
+
y = moveDown(y, 8);
|
|
104
|
+
doc.setFontSize(font.body).setTextColor(color.gray);
|
|
105
|
+
doc.text('Activation Code', left(460), y);
|
|
106
|
+
}
|
|
107
|
+
doc.setFontSize(font.header).setTextColor(color.black);
|
|
108
|
+
y = moveDown(y, 25);
|
|
109
|
+
doc.text('KeyCard', left(curve && !activationCode ? 460 : 325), y - 1);
|
|
110
|
+
if (activationCode) {
|
|
111
|
+
doc.setFontSize(font.header).setTextColor(color.gray);
|
|
112
|
+
doc.text(activationCode, left(460), y);
|
|
113
|
+
}
|
|
114
|
+
// Subheader
|
|
115
|
+
// titles
|
|
116
|
+
const date = new Date().toDateString();
|
|
117
|
+
y = moveDown(y, margin);
|
|
118
|
+
doc.setFontSize(font.body).setTextColor(color.gray);
|
|
119
|
+
const title = curve ? KeyCurveName[curve] + ' key:' : 'wallet named:';
|
|
120
|
+
doc.text('Created on ' + date + ' for ' + title, left(0), y);
|
|
121
|
+
// copy
|
|
122
|
+
y = moveDown(y, 25);
|
|
123
|
+
doc.setFontSize(font.subheader).setTextColor(color.black);
|
|
124
|
+
doc.text(walletLabel, left(0), y);
|
|
125
|
+
if (!curve) {
|
|
126
|
+
// Red Bar
|
|
127
|
+
y = moveDown(y, 20);
|
|
128
|
+
doc.setFillColor(255, 230, 230);
|
|
129
|
+
doc.rect(left(0), y, width - 2 * margin, 32, 'F');
|
|
130
|
+
// warning message
|
|
131
|
+
y = moveDown(y, 20);
|
|
132
|
+
doc.setFontSize(font.body).setTextColor(color.red);
|
|
133
|
+
doc.text('Print this document, or keep it securely offline. See below for FAQ.', left(75), y);
|
|
134
|
+
}
|
|
135
|
+
// Generate the first page's data for the backup PDF
|
|
136
|
+
y = moveDown(y, 35);
|
|
137
|
+
const qrSize = 130;
|
|
138
|
+
const qrKeys = ['user', 'userMasterPublicKey', 'backup', 'backupMasterPublicKey', 'bitgo', 'passcode'].filter((key) => !!qrData[key]);
|
|
139
|
+
for (let index = 0; index < qrKeys.length; index++) {
|
|
140
|
+
const name = qrKeys[index];
|
|
141
|
+
if (index === 2) {
|
|
142
|
+
// Add 2nd Page
|
|
143
|
+
doc.addPage();
|
|
144
|
+
// 2nd page title
|
|
145
|
+
y = 30;
|
|
146
|
+
}
|
|
147
|
+
const qr = qrData[name];
|
|
148
|
+
let topY = y;
|
|
149
|
+
const textLeft = left(qrSize + 15);
|
|
150
|
+
let textHeight = 0;
|
|
151
|
+
const qrImages = [];
|
|
152
|
+
const keys = (0, utils_1.splitKeys)(qr.data, exports.QRBinaryMaxLength);
|
|
153
|
+
for (const key of keys) {
|
|
154
|
+
qrImages.push(await QRCode.toCanvas(key, { errorCorrectionLevel: 'L' }));
|
|
155
|
+
}
|
|
156
|
+
let nextQrIndex = drawOnePageOfQrCodes(qrImages, doc, y, qrSize, 0);
|
|
157
|
+
doc.setFontSize(font.subheader).setTextColor(color.black);
|
|
158
|
+
y = moveDown(y, 10);
|
|
159
|
+
textHeight += 10;
|
|
160
|
+
doc.text(qr.title, textLeft, y);
|
|
161
|
+
textHeight += doc.getLineHeight();
|
|
162
|
+
y = moveDown(y, 15);
|
|
163
|
+
textHeight += 15;
|
|
164
|
+
doc.setFontSize(font.body).setTextColor(color.darkgray);
|
|
165
|
+
doc.text(qr.description, textLeft, y);
|
|
166
|
+
textHeight += doc.getLineHeight();
|
|
167
|
+
doc.setFontSize(font.body - 2);
|
|
168
|
+
if (qr?.data?.length > exports.QRBinaryMaxLength) {
|
|
169
|
+
y = moveDown(y, 30);
|
|
170
|
+
textHeight += 30;
|
|
171
|
+
doc.text('Note: you will need to put all Parts together for the full key', textLeft, y);
|
|
172
|
+
}
|
|
173
|
+
y = moveDown(y, 30);
|
|
174
|
+
textHeight += 30;
|
|
175
|
+
doc.text('Data:', textLeft, y);
|
|
176
|
+
textHeight += doc.getLineHeight();
|
|
177
|
+
y = moveDown(y, 15);
|
|
178
|
+
textHeight += 15;
|
|
179
|
+
const width = 72 * 8.5 - textLeft - 30;
|
|
180
|
+
doc.setFont('courier').setFontSize(9).setTextColor(color.black);
|
|
181
|
+
const lines = doc.splitTextToSize(qr.data, width);
|
|
182
|
+
const buffer = 10;
|
|
183
|
+
for (let line = 0; line < lines.length; line++) {
|
|
184
|
+
// add new page if data does not fit on one page
|
|
185
|
+
if (y + buffer >= doc.internal.pageSize.getHeight()) {
|
|
186
|
+
doc.addPage();
|
|
187
|
+
textHeight = 0;
|
|
188
|
+
y = 30;
|
|
189
|
+
topY = y;
|
|
190
|
+
nextQrIndex = drawOnePageOfQrCodes(qrImages, doc, y, qrSize, nextQrIndex);
|
|
191
|
+
doc.setFont('courier').setFontSize(9).setTextColor(color.black);
|
|
192
|
+
}
|
|
193
|
+
doc.text(lines[line], textLeft, y);
|
|
194
|
+
if (line !== lines.length - 1) {
|
|
195
|
+
y = moveDown(y, buffer);
|
|
196
|
+
textHeight += buffer;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Add public key if exists
|
|
200
|
+
if (qr.publicMasterKey) {
|
|
201
|
+
const text = 'Key Id: ' + qr.publicMasterKey;
|
|
202
|
+
// Gray bar
|
|
203
|
+
y = moveDown(y, 20);
|
|
204
|
+
textHeight += 20;
|
|
205
|
+
doc.setFillColor(247, 249, 249); // Gray background
|
|
206
|
+
doc.setDrawColor(0, 0, 0); // Border
|
|
207
|
+
// Leave a bit of space for the side of the rectangle.
|
|
208
|
+
const splitKeyId = doc.splitTextToSize(text, width - 10);
|
|
209
|
+
// The height of the box must be at least 15 px (for single line case), or
|
|
210
|
+
// a multiple of 13 for each line. This allows for proper padding.
|
|
211
|
+
doc.rect(textLeft, y, width, Math.max(12 * splitKeyId.length, 15), 'FD');
|
|
212
|
+
textHeight += splitKeyId.length * doc.getLineHeight();
|
|
213
|
+
doc.text(splitKeyId, textLeft + 5, y + 10);
|
|
214
|
+
}
|
|
215
|
+
doc.setFont('helvetica');
|
|
216
|
+
// Move down the size of the QR code minus accumulated height on the right side, plus margin
|
|
217
|
+
// if we have a key that spans multiple pages, then exclude QR code size
|
|
218
|
+
const rowHeight = Math.max(qr.data.length > exports.QRBinaryMaxLength ? qrSize + 20 : qrSize, textHeight);
|
|
219
|
+
const marginBottom = 15;
|
|
220
|
+
y = moveDown(y, rowHeight - (y - topY) + marginBottom);
|
|
221
|
+
}
|
|
222
|
+
// Add next Page
|
|
223
|
+
doc.addPage();
|
|
224
|
+
// next pages title
|
|
225
|
+
y = 0;
|
|
226
|
+
y = moveDown(y, 55);
|
|
227
|
+
doc.setFontSize(font.header).setTextColor(color.black);
|
|
228
|
+
doc.text('BitGo KeyCard FAQ', left(0), y);
|
|
229
|
+
// Generate the second page's data for the backup PDF
|
|
230
|
+
y = moveDown(y, 30);
|
|
231
|
+
questions.forEach(function (q) {
|
|
232
|
+
doc.setFontSize(font.subheader).setTextColor(color.black);
|
|
233
|
+
doc.text(q.question, left(0), y);
|
|
234
|
+
y = moveDown(y, 20);
|
|
235
|
+
doc.setFontSize(font.body).setTextColor(color.darkgray);
|
|
236
|
+
q.answer.forEach(function (line) {
|
|
237
|
+
doc.text(line, left(0), y);
|
|
238
|
+
y = moveDown(y, font.body + 3);
|
|
239
|
+
});
|
|
240
|
+
y = moveDown(y, 22);
|
|
241
|
+
});
|
|
242
|
+
return doc;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd0tleWNhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZHJhd0tleWNhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBeUdBLGtDQTJMQztBQW5TRCxpQ0FBaUM7QUFFakMsbUNBQW9DO0FBR3BDLEtBQUssVUFBVSxTQUFTO0lBQ3RCLElBQUksS0FBa0IsQ0FBQztJQUV2QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDNUUsd0JBQXdCO1FBQ3hCLEtBQUssR0FBRywyQ0FBYSxPQUFPLEVBQUMsQ0FBQztJQUNoQyxDQUFDO1NBQU0sQ0FBQztRQUNOLG9CQUFvQjtRQUNwQixLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxJQUFLLFlBSUo7QUFKRCxXQUFLLFlBQVk7SUFDZixpQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBbUIsQ0FBQTtJQUNuQiwyQkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQUpJLFlBQVksS0FBWixZQUFZLFFBSWhCO0FBRUQsbUZBQW1GO0FBQ25GLG9IQUFvSDtBQUNwSCxxREFBcUQ7QUFDckQsZ0RBQWdEO0FBQ25DLFFBQUEsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBRXRDLE1BQU0sSUFBSSxHQUFHO0lBQ1gsTUFBTSxFQUFFLEVBQUU7SUFDVixTQUFTLEVBQUUsRUFBRTtJQUNiLElBQUksRUFBRSxFQUFFO0NBQ1QsQ0FBQztBQUVGLE1BQU0sS0FBSyxHQUFHO0lBQ1osS0FBSyxFQUFFLFNBQVM7SUFDaEIsUUFBUSxFQUFFLFNBQVM7SUFDbkIsSUFBSSxFQUFFLFNBQVM7SUFDZixHQUFHLEVBQUUsU0FBUztDQUNmLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFFbEIseURBQXlEO0FBQ3pELFNBQVMs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LENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUk7WUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFDSCxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsganNQREYgfSBmcm9tICdqc3BkZic7XG5pbXBvcnQgKiBhcyBRUkNvZGUgZnJvbSAncXJjb2RlJztcbmltcG9ydCB7IElEcmF3S2V5Q2FyZCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgc3BsaXRLZXlzIH0gZnJvbSAnLi91dGlscyc7XG50eXBlIGpzUERGTW9kdWxlID0gdHlwZW9mIGltcG9ydCgnanNwZGYnKTtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZEpTUERGKCk6IFByb21pc2U8anNQREZNb2R1bGU+IHtcbiAgbGV0IGpzUERGOiBqc1BERk1vZHVsZTtcblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBXZSBhcmUgaW4gdGhlIGJyb3dzZXJcbiAgICBqc1BERiA9IGF3YWl0IGltcG9ydCgnanNwZGYnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBhcmUgaW4gTm9kZS5qc1xuICAgIGpzUERGID0gcmVxdWlyZSgnanNwZGYnKTtcbiAgfVxuICByZXR1cm4ganNQREY7XG59XG5cbmVudW0gS2V5Q3VydmVOYW1lIHtcbiAgZWQyNTUxOSA9ICdFRERTQScsXG4gIHNlY3AyNTZrMSA9ICdFQ0RTQScsXG4gIGJscyA9ICdCTFMnLFxufVxuXG4vLyBNYXggZm9yIEJpbmFyeS9CeXRlIERhdGEgaHR0cHM6Ly9naXRodWIuY29tL3NvbGRhaXIvbm9kZS1xcmNvZGUjcXItY29kZS1jYXBhY2l0eVxuLy8gdGhlIGxhcmdlc3QgdGhlb3JldGljYWxseSBwb3NzaWJsZSB2YWx1ZSBpcyBhY3R1YWxseSAyOTUzIGJ1dCB0aGUgUVIgY29kZXMgZ2V0IHNvIGRlbnNlIHRoYXQgc2Nhbm5pbmcgdGhlbSB3aXRoIGFcbi8vIHBob25lIChvZmYgb2YgYSBwcmludGVkIHBhZ2UpIGRvZXNuJ3Qgd29yayBhbnltb3JlXG4vLyB0aGlzIGxpbWl0YXRpb24gd2FzIGNob3NlbiBieSB0cmlhbCBhbmQgZXJyb3JcbmV4cG9ydCBjb25zdCBRUkJpbmFyeU1heExlbmd0aCA9IDE1MDA7XG5cbmNvbnN0IGZvbnQgPSB7XG4gIGhlYWRlcjogMjQsXG4gIHN1YmhlYWRlcjogMTUsXG4gIGJvZHk6IDEyLFxufTtcblxuY29uc3QgY29sb3IgPSB7XG4gIGJsYWNrOiAnIzAwMDAwMCcsXG4gIGRhcmtncmF5OiAnIzRjNGM0YycsXG4gIGdyYXk6ICcjOWI5YjliJyxcbiAgcmVkOiAnI2UyMWUxZScsXG59O1xuXG5jb25zdCBtYXJnaW4gPSAzMDtcblxuLy8gSGVscGVycyBmb3IgZGF0YSBmb3JtYXR0aW5nIC8gcG9zaXRpb25pbmcgb24gdGhlIHBhcGVyXG5mdW5jdGlvbiBsZWZ0KHg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBtYXJnaW4gKyB4O1xufVxuZnVuY3Rpb24gbW92ZURvd24oeTogbnVtYmVyLCB5ZGVsdGE6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB5ICsgeWRlbHRhO1xufVxuXG5mdW5jdGlvbiBkcmF3T25lUGFnZU9mUXJDb2RlcyhcbiAgcXJJbWFnZXM6IEhUTUxDYW52YXNFbGVtZW50W10sXG4gIGRvYzoganNQREYsXG4gIHk6IG51bWJlcixcbiAgcXJTaXplOiBudW1iZXIsXG4gIHN0YXJ0SW5kZXhcbik6IG51bWJlciB7XG4gIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnKTtcbiAgbGV0IHFySW5kZXg6IG51bWJlciA9IHN0YXJ0SW5kZXg7XG4gIGZvciAoOyBxckluZGV4IDwgcXJJbWFnZXMubGVuZ3RoOyBxckluZGV4KyspIHtcbiAgICBjb25zdCBpbWFnZSA9IHFySW1hZ2VzW3FySW5kZXhdO1xuICAgIGNvbnN0IHRleHRCdWZmZXIgPSAxNTtcbiAgICBpZiAoeSArIHFyU2l6ZSArIHRleHRCdWZmZXIgPj0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpKSB7XG4gICAgICByZXR1cm4gcXJJbmRleDtcbiAgICB9XG5cbiAgICBkb2MuYWRkSW1hZ2UoaW1hZ2UsIGxlZnQoMCksIHksIHFyU2l6ZSwgcXJTaXplKTtcblxuICAgIGlmIChxckltYWdlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBxckluZGV4ICsgMTtcbiAgICB9XG5cbiAgICB5ID0gbW92ZURvd24oeSwgcXJTaXplICsgdGV4dEJ1ZmZlcik7XG4gICAgZG9jLnNldEZvbnRTaXplKGZvbnQuYm9keSkuc2V0VGV4dENvbG9yKGNvbG9yLmJsYWNrKTtcbiAgICBkb2MudGV4dCgnUGFydCAnICsgKHFySW5kZXggKyAxKS50b1N0cmluZygpLCBsZWZ0KDApLCB5KTtcbiAgICB5ID0gbW92ZURvd24oeSwgMjApO1xuICB9XG4gIHJldHVybiBxckluZGV4ICsgMTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUtleUNhcmRJbWFnZURpbWVuc2lvbnMoa2V5Q2FyZEltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gIC8vIE1heCBkaW1lbnNpb25zIHN0YWJsaXNoZWQgYnkgZml4ZWQgYXZhaWxhYmxlIFBERiBzcGFjZVxuICBjb25zdCBLRVlfQ0FSRF9JTUFHRV9NQVhfRElNRU5TSU9OUyA9IHtcbiAgICB3aWR0aDogMzAzLFxuICAgIGhlaWdodDogNDAsXG4gIH07XG5cbiAgY29uc3QgeyB3aWR0aDogaW1nV2lkdGgsIGhlaWdodDogaW1nSGVpZ2h0IH0gPSBrZXlDYXJkSW1hZ2U7XG4gIGNvbnN0IHsgd2lkdGg6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9ID0gS0VZX0NBUkRfSU1BR0VfTUFYX0RJTUVOU0lPTlM7XG5cbiAgLy8gVHJ5IHNjYWxpbmcgcmF0aW8gYmFzZWQgb24gd2lkdGhcbiAgY29uc3Qgd1JhdGlvID0gaW1nV2lkdGggLyBtYXhXaWR0aDtcbiAgbGV0IGZpbmFsUmF0aW8gPSB3UmF0aW87XG5cbiAgLy8gSWYgcmVzaXplZCBoZWlnaHQgZXhjZWVkcyB0aGUgYXZhaWxhYmxlIGhlaWdodCBzcGFjZSwgYmFzZSByYXRpbyBhbHNvIG9uIGhlaWdodFxuICBpZiAoaW1nSGVpZ2h0IC8gZmluYWxSYXRpbyA+IG1heEhlaWdodCkge1xuICAgIGZpbmFsUmF0aW8gPSBpbWdIZWlnaHQgLyBtYXhIZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIFtpbWdXaWR0aCAvIGZpbmFsUmF0aW8sIGltZ0hlaWdodCAvIGZpbmFsUmF0aW9dO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZHJhd0tleWNhcmQoe1xuICBhY3RpdmF0aW9uQ29kZSxcbiAgcXVlc3Rpb25zLFxuICBrZXlDYXJkSW1hZ2UsXG4gIHFyRGF0YSxcbiAgd2FsbGV0TGFiZWwsXG4gIGN1cnZlLFxufTogSURyYXdLZXlDYXJkKTogUHJvbWlzZTxqc1BERj4ge1xuICBjb25zdCBqc1BERk1vZHVsZSA9IGF3YWl0IGxvYWRKU1BERigpO1xuXG4gIC8vIGRvY3VtZW50IGRldGFpbHNcbiAgY29uc3Qgd2lkdGggPSA4LjUgKiA3MjtcbiAgbGV0IHkgPSAwO1xuXG4gIC8vIENyZWF0ZSB0aGUgUERGIGluc3RhbmNlXG4gIGNvbnN0IGRvYyA9IG5ldyBqc1BERk1vZHVsZS5qc1BERigncG9ydHJhaXQnLCAncHQnLCAnbGV0dGVyJyk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJyk7XG5cbiAgLy8gUERGIEhlYWRlciBBcmVhIC0gaW5jbHVkZXMgdGhlIGxvZ28gYW5kIGNvbXBhbnkgbmFtZVxuICAvLyBUaGlzIGlzIGRhdGEgZm9yIHRoZSBCaXRHbyBsb2dvIGluIHRoZSB0b3AgbGVmdCBvZiB0aGUgUERGXG4gIHkgPSBtb3ZlRG93bih5LCAzMCk7XG5cbiAgaWYgKGtleUNhcmRJbWFnZSkge1xuICAgIGNvbnN0IFtpbWdXaWR0aCwgaW1nSGVpZ2h0XSA9IGNvbXB1dGVLZXlDYXJkSW1hZ2VEaW1lbnNpb25zKGtleUNhcmRJbWFnZSk7XG4gICAgZG9jLmFkZEltYWdlKGtleUNhcmRJbWFnZSwgbGVmdCgwKSwgeSwgaW1nV2lkdGgsIGltZ0hlaWdodCk7XG4gIH1cblxuICAvLyBBY3RpdmF0aW9uIENvZGVcbiAgaWYgKGFjdGl2YXRpb25Db2RlKSB7XG4gICAgeSA9IG1vdmVEb3duKHksIDgpO1xuICAgIGRvYy5zZXRGb250U2l6ZShmb250LmJvZHkpLnNldFRleHRDb2xvcihjb2xvci5ncmF5KTtcbiAgICBkb2MudGV4dCgnQWN0aXZhdGlvbiBDb2RlJywgbGVmdCg0NjApLCB5KTtcbiAgfVxuICBkb2Muc2V0Rm9udFNpemUoZm9udC5oZWFkZXIpLnNldFRleHRDb2xvcihjb2xvci5ibGFjayk7XG4gIHkgPSBtb3ZlRG93bih5LCAyNSk7XG4gIGRvYy50ZXh0KCdLZXlDYXJkJywgbGVmdChjdXJ2ZSAmJiAhYWN0aXZhdGlvbkNvZGUgPyA0NjAgOiAzMjUpLCB5IC0gMSk7XG4gIGlmIChhY3RpdmF0aW9uQ29kZSkge1xuICAgIGRvYy5zZXRGb250U2l6ZShmb250LmhlYWRlcikuc2V0VGV4dENvbG9yKGNvbG9yLmdyYXkpO1xuICAgIGRvYy50ZXh0KGFjdGl2YXRpb25Db2RlLCBsZWZ0KDQ2MCksIHkpO1xuICB9XG5cbiAgLy8gU3ViaGVhZGVyXG4gIC8vIHRpdGxlc1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKTtcbiAgeSA9IG1vdmVEb3duKHksIG1hcmdpbik7XG4gIGRvYy5zZXRGb250U2l6ZShmb250LmJvZHkpLnNldFRleHRDb2xvcihjb2xvci5ncmF5KTtcbiAgY29uc3QgdGl0bGUgPSBjdXJ2ZSA/IEtleUN1cnZlTmFtZVtjdXJ2ZV0gKyAnIGtleTonIDogJ3dhbGxldCBuYW1lZDonO1xuICBkb2MudGV4dCgnQ3JlYXRlZCBvbiAnICsgZGF0ZSArICcgZm9yICcgKyB0aXRsZSwgbGVmdCgwKSwgeSk7XG4gIC8vIGNvcHlcbiAgeSA9IG1vdmVEb3duKHksIDI1KTtcbiAgZG9jLnNldEZvbnRTaXplKGZvbnQuc3ViaGVhZGVyKS5zZXRUZXh0Q29sb3IoY29sb3IuYmxhY2spO1xuICBkb2MudGV4dCh3YWxsZXRMYWJlbCwgbGVmdCgwKSwgeSk7XG4gIGlmICghY3VydmUpIHtcbiAgICAvLyBSZWQgQmFyXG4gICAgeSA9IG1vdmVEb3duKHksIDIwKTtcbiAgICBkb2Muc2V0RmlsbENvbG9yKDI1NSwgMjMwLCAyMzApO1xuICAgIGRvYy5yZWN0KGxlZnQoMCksIHksIHdpZHRoIC0gMiAqIG1hcmdpbiwgMzIsICdGJyk7XG5cbiAgICAvLyB3YXJuaW5nIG1lc3NhZ2VcbiAgICB5ID0gbW92ZURvd24oeSwgMjApO1xuICAgIGRvYy5zZXRGb250U2l6ZShmb250LmJvZHkpLnNldFRleHRDb2xvcihjb2xvci5yZWQpO1xuICAgIGRvYy50ZXh0KCdQcmludCB0aGlzIGRvY3VtZW50LCBvciBrZWVwIGl0IHNlY3VyZWx5IG9mZmxpbmUuIFNlZSBiZWxvdyBmb3IgRkFRLicsIGxlZnQoNzUpLCB5KTtcbiAgfVxuICAvLyBHZW5lcmF0ZSB0aGUgZmlyc3QgcGFnZSdzIGRhdGEgZm9yIHRoZSBiYWNrdXAgUERGXG4gIHkgPSBtb3ZlRG93bih5LCAzNSk7XG4gIGNvbnN0IHFyU2l6ZSA9IDEzMDtcbiAgY29uc3QgcXJLZXlzID0gWyd1c2VyJywgJ3VzZXJNYXN0ZXJQdWJsaWNLZXknLCAnYmFja3VwJywgJ2JhY2t1cE1hc3RlclB1YmxpY0tleScsICdiaXRnbycsICdwYXNzY29kZSddLmZpbHRlcihcbiAgICAoa2V5KSA9PiAhIXFyRGF0YVtrZXldXG4gICk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBxcktleXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgbmFtZSA9IHFyS2V5c1tpbmRleF07XG4gICAgaWYgKGluZGV4ID09PSAyKSB7XG4gICAgICAvLyBBZGQgMm5kIFBhZ2VcbiAgICAgIGRvYy5hZGRQYWdlKCk7XG5cbiAgICAgIC8vIDJuZCBwYWdlIHRpdGxlXG4gICAgICB5ID0gMzA7XG4gICAgfVxuXG4gICAgY29uc3QgcXIgPSBxckRhdGFbbmFtZV07XG4gICAgbGV0IHRvcFkgPSB5O1xuICAgIGNvbnN0IHRleHRMZWZ0ID0gbGVmdChxclNpemUgKyAxNSk7XG4gICAgbGV0IHRleHRIZWlnaHQgPSAwO1xuXG4gICAgY29uc3QgcXJJbWFnZXM6IEhUTUxDYW52YXNFbGVtZW50W10gPSBbXTtcbiAgICBjb25zdCBrZXlzID0gc3BsaXRLZXlzKHFyLmRhdGEsIFFSQmluYXJ5TWF4TGVuZ3RoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBxckltYWdlcy5wdXNoKGF3YWl0IFFSQ29kZS50b0NhbnZhcyhrZXksIHsgZXJyb3JDb3JyZWN0aW9uTGV2ZWw6ICdMJyB9KSk7XG4gICAgfVxuXG4gICAgbGV0IG5leHRRckluZGV4ID0gZHJhd09uZVBhZ2VPZlFyQ29kZXMocXJJbWFnZXMsIGRvYywgeSwgcXJTaXplLCAwKTtcblxuICAgIGRvYy5zZXRGb250U2l6ZShmb250LnN1YmhlYWRlcikuc2V0VGV4dENvbG9yKGNvbG9yLmJsYWNrKTtcbiAgICB5ID0gbW92ZURvd24oeSwgMTApO1xuICAgIHRleHRIZWlnaHQgKz0gMTA7XG4gICAgZG9jLnRleHQocXIudGl0bGUsIHRleHRMZWZ0LCB5KTtcbiAgICB0ZXh0SGVpZ2h0ICs9IGRvYy5nZXRMaW5lSGVpZ2h0KCk7XG4gICAgeSA9IG1vdmVEb3duKHksIDE1KTtcbiAgICB0ZXh0SGVpZ2h0ICs9IDE1O1xuICAgIGRvYy5zZXRGb250U2l6ZShmb250LmJvZHkpLnNldFRleHRDb2xvcihjb2xvci5kYXJrZ3JheSk7XG4gICAgZG9jLnRleHQocXIuZGVzY3JpcHRpb24sIHRleHRMZWZ0LCB5KTtcbiAgICB0ZXh0SGVpZ2h0ICs9IGRvYy5nZXRMaW5lSGVpZ2h0KCk7XG4gICAgZG9jLnNldEZvbnRTaXplKGZvbnQuYm9keSAtIDIpO1xuICAgIGlmIChxcj8uZGF0YT8ubGVuZ3RoID4gUVJCaW5hcnlNYXhMZW5ndGgpIHtcbiAgICAgIHkgPSBtb3ZlRG93bih5LCAzMCk7XG4gICAgICB0ZXh0SGVpZ2h0ICs9IDMwO1xuICAgICAgZG9jLnRleHQoJ05vdGU6IHlvdSB3aWxsIG5lZWQgdG8gcHV0IGFsbCBQYXJ0cyB0b2dldGhlciBmb3IgdGhlIGZ1bGwga2V5JywgdGV4dExlZnQsIHkpO1xuICAgIH1cbiAgICB5ID0gbW92ZURvd24oeSwgMzApO1xuICAgIHRleHRIZWlnaHQgKz0gMzA7XG4gICAgZG9jLnRleHQoJ0RhdGE6JywgdGV4dExlZnQsIHkpO1xuICAgIHRleHRIZWlnaHQgKz0gZG9jLmdldExpbmVIZWlnaHQoKTtcbiAgICB5ID0gbW92ZURvd24oeSwgMTUpO1xuICAgIHRleHRIZWlnaHQgKz0gMTU7XG4gICAgY29uc3Qgd2lkdGggPSA3MiAqIDguNSAtIHRleHRMZWZ0IC0gMzA7XG4gICAgZG9jLnNldEZvbnQoJ2NvdXJpZXInKS5zZXRGb250U2l6ZSg5KS5zZXRUZXh0Q29sb3IoY29sb3IuYmxhY2spO1xuICAgIGNvbnN0IGxpbmVzID0gZG9jLnNwbGl0VGV4dFRvU2l6ZShxci5kYXRhLCB3aWR0aCk7XG4gICAgY29uc3QgYnVmZmVyID0gMTA7XG4gICAgZm9yIChsZXQgbGluZSA9IDA7IGxpbmUgPCBsaW5lcy5sZW5ndGg7IGxpbmUrKykge1xuICAgICAgLy8gYWRkIG5ldyBwYWdlIGlmIGRhdGEgZG9lcyBub3QgZml0IG9uIG9uZSBwYWdlXG4gICAgICBpZiAoeSArIGJ1ZmZlciA+PSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkpIHtcbiAgICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgICAgdGV4dEhlaWdodCA9IDA7XG4gICAgICAgIHkgPSAzMDtcbiAgICAgICAgdG9wWSA9IHk7XG4gICAgICAgIG5leHRRckluZGV4ID0gZHJhd09uZVBhZ2VPZlFyQ29kZXMocXJJbWFnZXMsIGRvYywgeSwgcXJTaXplLCBuZXh0UXJJbmRleCk7XG4gICAgICAgIGRvYy5zZXRGb250KCdjb3VyaWVyJykuc2V0Rm9udFNpemUoOSkuc2V0VGV4dENvbG9yKGNvbG9yLmJsYWNrKTtcbiAgICAgIH1cbiAgICAgIGRvYy50ZXh0KGxpbmVzW2xpbmVdLCB0ZXh0TGVmdCwgeSk7XG4gICAgICBpZiAobGluZSAhPT0gbGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB5ID0gbW92ZURvd24oeSwgYnVmZmVyKTtcbiAgICAgICAgdGV4dEhlaWdodCArPSBidWZmZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHB1YmxpYyBrZXkgaWYgZXhpc3RzXG4gICAgaWYgKHFyLnB1YmxpY01hc3RlcktleSkge1xuICAgICAgY29uc3QgdGV4dCA9ICdLZXkgSWQ6ICcgKyBxci5wdWJsaWNNYXN0ZXJLZXk7XG5cbiAgICAgIC8vIEdyYXkgYmFyXG4gICAgICB5ID0gbW92ZURvd24oeSwgMjApO1xuICAgICAgdGV4dEhlaWdodCArPSAyMDtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IoMjQ3LCAyNDksIDI0OSk7IC8vIEdyYXkgYmFja2dyb3VuZFxuICAgICAgZG9jLnNldERyYXdDb2xvcigwLCAwLCAwKTsgLy8gQm9yZGVyXG5cbiAgICAgIC8vIExlYXZlIGEgYml0IG9mIHNwYWNlIGZvciB0aGUgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgICAgY29uc3Qgc3BsaXRLZXlJZCA9IGRvYy5zcGxpdFRleHRUb1NpemUodGV4dCwgd2lkdGggLSAxMCk7XG5cbiAgICAgIC8vIFRoZSBoZWlnaHQgb2YgdGhlIGJveCBtdXN0IGJlIGF0IGxlYXN0IDE1IHB4IChmb3Igc2luZ2xlIGxpbmUgY2FzZSksIG9yXG4gICAgICAvLyBhIG11bHRpcGxlIG9mIDEzIGZvciBlYWNoIGxpbmUuICBUaGlzIGFsbG93cyBmb3IgcHJvcGVyIHBhZGRpbmcuXG4gICAgICBkb2MucmVjdCh0ZXh0TGVmdCwgeSwgd2lkdGgsIE1hdGgubWF4KDEyICogc3BsaXRLZXlJZC5sZW5ndGgsIDE1KSwgJ0ZEJyk7XG4gICAgICB0ZXh0SGVpZ2h0ICs9IHNwbGl0S2V5SWQubGVuZ3RoICogZG9jLmdldExpbmVIZWlnaHQoKTtcbiAgICAgIGRvYy50ZXh0KHNwbGl0S2V5SWQsIHRleHRMZWZ0ICsgNSwgeSArIDEwKTtcbiAgICB9XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJyk7XG4gICAgLy8gTW92ZSBkb3duIHRoZSBzaXplIG9mIHRoZSBRUiBjb2RlIG1pbnVzIGFjY3VtdWxhdGVkIGhlaWdodCBvbiB0aGUgcmlnaHQgc2lkZSwgcGx1cyBtYXJnaW5cbiAgICAvLyBpZiB3ZSBoYXZlIGEga2V5IHRoYXQgc3BhbnMgbXVsdGlwbGUgcGFnZXMsIHRoZW4gZXhjbHVkZSBRUiBjb2RlIHNpemVcbiAgICBjb25zdCByb3dIZWlnaHQgPSBNYXRoLm1heChxci5kYXRhLmxlbmd0aCA+IFFSQmluYXJ5TWF4TGVuZ3RoID8gcXJTaXplICsgMjAgOiBxclNpemUsIHRleHRIZWlnaHQpO1xuICAgIGNvbnN0IG1hcmdpbkJvdHRvbSA9IDE1O1xuICAgIHkgPSBtb3ZlRG93bih5LCByb3dIZWlnaHQgLSAoeSAtIHRvcFkpICsgbWFyZ2luQm90dG9tKTtcbiAgfVxuXG4gIC8vIEFkZCBuZXh0IFBhZ2VcbiAgZG9jLmFkZFBhZ2UoKTtcblxuICAvLyBuZXh0IHBhZ2VzIHRpdGxlXG4gIHkgPSAwO1xuICB5ID0gbW92ZURvd24oeSwgNTUpO1xuICBkb2Muc2V0Rm9udFNpemUoZm9udC5oZWFkZXIpLnNldFRleHRDb2xvcihjb2xvci5ibGFjayk7XG4gIGRvYy50ZXh0KCdCaXRHbyBLZXlDYXJkIEZBUScsIGxlZnQoMCksIHkpO1xuXG4gIC8vIEdlbmVyYXRlIHRoZSBzZWNvbmQgcGFnZSdzIGRhdGEgZm9yIHRoZSBiYWNrdXAgUERGXG4gIHkgPSBtb3ZlRG93bih5LCAzMCk7XG4gIHF1ZXN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChxKSB7XG4gICAgZG9jLnNldEZvbnRTaXplKGZvbnQuc3ViaGVhZGVyKS5zZXRUZXh0Q29sb3IoY29sb3IuYmxhY2spO1xuICAgIGRvYy50ZXh0KHEucXVlc3Rpb24sIGxlZnQoMCksIHkpO1xuICAgIHkgPSBtb3ZlRG93bih5LCAyMCk7XG4gICAgZG9jLnNldEZvbnRTaXplKGZvbnQuYm9keSkuc2V0VGV4dENvbG9yKGNvbG9yLmRhcmtncmF5KTtcbiAgICBxLmFuc3dlci5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICBkb2MudGV4dChsaW5lLCBsZWZ0KDApLCB5KTtcbiAgICAgIHkgPSBtb3ZlRG93bih5LCBmb250LmJvZHkgKyAzKTtcbiAgICB9KTtcbiAgICB5ID0gbW92ZURvd24oeSwgMjIpO1xuICB9KTtcblxuICByZXR1cm4gZG9jO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faq.d.ts","sourceRoot":"","sources":["../../src/faq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE9B,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,EAAE,CAuEnD"}
|
package/dist/src/faq.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateFaq = generateFaq;
|
|
4
|
+
function generateFaq(coinName) {
|
|
5
|
+
const sectionACoinSpecific = `The KeyCard contains important information which can be used to recover the ${coinName} `;
|
|
6
|
+
const sectionBCoinSpecific = `If you have lost or damaged all copies of your KeyCard, your ${coinName} is still safe, but this `;
|
|
7
|
+
const sectionCCoinSpecific = `source tools at https://github.com/bitgo to recover your ${coinName}. Note: You should never enter `;
|
|
8
|
+
const sectionDCoinSpecific = `your KeyCard will be able to steal your ${coinName}. We recommend keeping your wallet password `;
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
question: 'What is the KeyCard?',
|
|
12
|
+
answer: [
|
|
13
|
+
sectionACoinSpecific,
|
|
14
|
+
'from your wallet in several situations. Each BitGo wallet has its own, unique KeyCard. ',
|
|
15
|
+
'If you have created multiple wallets, you should retain the KeyCard for each of them.',
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'What should I do with it?',
|
|
20
|
+
answer: [
|
|
21
|
+
'You should print the KeyCard and/or save the PDF to an offline storage device. The print-out ',
|
|
22
|
+
"or USB stick should be kept in a safe place, such as a bank vault or home safe. It's a good idea ",
|
|
23
|
+
'to keep a second copy in a different location.',
|
|
24
|
+
'',
|
|
25
|
+
"Important: If you haven't provided an external backup key, then the original PDF should be ",
|
|
26
|
+
'deleted from any machine where the wallet will be regularly accessed to prevent malware from ',
|
|
27
|
+
'capturing both the KeyCard and your wallet passcode.',
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
question: 'What should I do if I lose it?',
|
|
32
|
+
answer: [
|
|
33
|
+
sectionBCoinSpecific,
|
|
34
|
+
'Wallet should be considered at risk for loss. As soon as is convenient, you should use BitGo ',
|
|
35
|
+
'to empty the wallet into a new wallet and discontinue use of the old wallet.',
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'What if someone sees my KeyCard?',
|
|
40
|
+
answer: [
|
|
41
|
+
"Don't panic! All sensitive information on the KeyCard is encrypted with your passcode, or with a",
|
|
42
|
+
'key which only BitGo has. But, in general, you should make best efforts to keep your ',
|
|
43
|
+
'KeyCard private. If your KeyCard does get exposed or copied in a way that makes you ',
|
|
44
|
+
'uncomfortable, the best course of action is to empty the corresponding wallet into another ',
|
|
45
|
+
'wallet and discontinue use of the old wallet.',
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
question: 'What if I forget or lose my wallet password?',
|
|
50
|
+
answer: [
|
|
51
|
+
'BitGo can use the information in QR Code D to help you recover access to your wallet. ',
|
|
52
|
+
'Without the KeyCard, BitGo is not able to recover funds from a wallet with a lost password.',
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
question: 'What if BitGo becomes inaccessible for an extended period?',
|
|
57
|
+
answer: [
|
|
58
|
+
"Your KeyCard and wallet passcode can be used together with BitGo's published open ",
|
|
59
|
+
sectionCCoinSpecific,
|
|
60
|
+
'information from your KeyCard into tools other than the tools BitGo has published, or your ',
|
|
61
|
+
'funds may be at risk for theft.',
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
question: 'Should I write my wallet password on my KeyCard?',
|
|
66
|
+
answer: [
|
|
67
|
+
"No! BitGo's signature scheme approach to security depends on there not being a single point ",
|
|
68
|
+
'of attack. But if your wallet password is on your KeyCard, then anyone who gains access to ',
|
|
69
|
+
sectionDCoinSpecific,
|
|
70
|
+
'safe in a secure password manager such as LastPass, 1Password or KeePass.',
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZhcS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGtDQXVFQztBQXZFRCxTQUFnQixXQUFXLENBQUMsUUFBZ0I7SUFDMUMsTUFBTSxvQkFBb0IsR0FBRywrRUFBK0UsUUFBUSxHQUFHLENBQUM7SUFDeEgsTUFBTSxvQkFBb0IsR0FBRyxnRUFBZ0UsUUFBUSwyQkFBMkIsQ0FBQztJQUNqSSxNQUFNLG9CQUFvQixHQUFHLDREQUE0RCxRQUFRLGlDQUFpQyxDQUFDO0lBQ25JLE1BQU0sb0JBQW9CLEdBQUcsMkNBQTJDLFFBQVEsOENBQThDLENBQUM7SUFFL0gsT0FBTztRQUNMO1lBQ0UsUUFBUSxFQUFFLHNCQUFzQjtZQUNoQyxNQUFNLEVBQUU7Z0JBQ04sb0JBQW9CO2dCQUNwQix5RkFBeUY7Z0JBQ3pGLHVGQUF1RjthQUN4RjtTQUNGO1FBQ0Q7WUFDRSxRQUFRLEVBQUUsMkJBQTJCO1lBQ3JDLE1BQU0sRUFBRTtnQkFDTiwrRkFBK0Y7Z0JBQy9GLG1HQUFtRztnQkFDbkcsZ0RBQWdEO2dCQUNoRCxFQUFFO2dCQUNGLDZGQUE2RjtnQkFDN0YsK0ZBQStGO2dCQUMvRixzREFBc0Q7YUFDdkQ7U0FDRjtRQUNEO1lBQ0UsUUFBUSxFQUFFLGdDQUFnQztZQUMxQyxNQUFNLEVBQUU7Z0JBQ04sb0JBQW9CO2dCQUNwQiwrRkFBK0Y7Z0JBQy9GLDhFQUE4RTthQUMvRTtTQUNGO1FBQ0Q7WUFDRSxRQUFRLEVBQUUsa0NBQWtDO1lBQzVDLE1BQU0sRUFBRTtnQkFDTixrR0FBa0c7Z0JBQ2xHLHVGQUF1RjtnQkFDdkYsc0ZBQXNGO2dCQUN0Riw2RkFBNkY7Z0JBQzdGLCtDQUErQzthQUNoRDtTQUNGO1FBQ0Q7WUFDRSxRQUFRLEVBQUUsOENBQThDO1lBQ3hELE1BQU0sRUFBRTtnQkFDTix3RkFBd0Y7Z0JBQ3hGLDZGQUE2RjthQUM5RjtTQUNGO1FBQ0Q7WUFDRSxRQUFRLEVBQUUsNERBQTREO1lBQ3RFLE1BQU0sRUFBRTtnQkFDTixvRkFBb0Y7Z0JBQ3BGLG9CQUFvQjtnQkFDcEIsNkZBQTZGO2dCQUM3RixpQ0FBaUM7YUFDbEM7U0FDRjtRQUNEO1lBQ0UsUUFBUSxFQUFFLGtEQUFrRDtZQUM1RCxNQUFNLEVBQUU7Z0JBQ04sOEZBQThGO2dCQUM5Riw2RkFBNkY7Z0JBQzdGLG9CQUFvQjtnQkFDcEIsMkVBQTJFO2FBQzVFO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZBUSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVGYXEoY29pbk5hbWU6IHN0cmluZyk6IEZBUVtdIHtcbiAgY29uc3Qgc2VjdGlvbkFDb2luU3BlY2lmaWMgPSBgVGhlIEtleUNhcmQgY29udGFpbnMgaW1wb3J0YW50IGluZm9ybWF0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlY292ZXIgdGhlICR7Y29pbk5hbWV9IGA7XG4gIGNvbnN0IHNlY3Rpb25CQ29pblNwZWNpZmljID0gYElmIHlvdSBoYXZlIGxvc3Qgb3IgZGFtYWdlZCBhbGwgY29waWVzIG9mIHlvdXIgS2V5Q2FyZCwgeW91ciAke2NvaW5OYW1lfSBpcyBzdGlsbCBzYWZlLCBidXQgdGhpcyBgO1xuICBjb25zdCBzZWN0aW9uQ0NvaW5TcGVjaWZpYyA9IGBzb3VyY2UgdG9vbHMgYXQgaHR0cHM6Ly9naXRodWIuY29tL2JpdGdvIHRvIHJlY292ZXIgeW91ciAke2NvaW5OYW1lfS4gTm90ZTogWW91IHNob3VsZCBuZXZlciBlbnRlciBgO1xuICBjb25zdCBzZWN0aW9uRENvaW5TcGVjaWZpYyA9IGB5b3VyIEtleUNhcmQgd2lsbCBiZSBhYmxlIHRvIHN0ZWFsIHlvdXIgJHtjb2luTmFtZX0uIFdlIHJlY29tbWVuZCBrZWVwaW5nIHlvdXIgd2FsbGV0IHBhc3N3b3JkIGA7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBxdWVzdGlvbjogJ1doYXQgaXMgdGhlIEtleUNhcmQ/JyxcbiAgICAgIGFuc3dlcjogW1xuICAgICAgICBzZWN0aW9uQUNvaW5TcGVjaWZpYyxcbiAgICAgICAgJ2Zyb20geW91ciB3YWxsZXQgaW4gc2V2ZXJhbCBzaXR1YXRpb25zLiBFYWNoIEJpdEdvIHdhbGxldCBoYXMgaXRzIG93biwgdW5pcXVlIEtleUNhcmQuICcsXG4gICAgICAgICdJZiB5b3UgaGF2ZSBjcmVhdGVkIG11bHRpcGxlIHdhbGxldHMsIHlvdSBzaG91bGQgcmV0YWluIHRoZSBLZXlDYXJkIGZvciBlYWNoIG9mIHRoZW0uJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBxdWVzdGlvbjogJ1doYXQgc2hvdWxkIEkgZG8gd2l0aCBpdD8nLFxuICAgICAgYW5zd2VyOiBbXG4gICAgICAgICdZb3Ugc2hvdWxkIHByaW50IHRoZSBLZXlDYXJkIGFuZC9vciBzYXZlIHRoZSBQREYgdG8gYW4gb2ZmbGluZSBzdG9yYWdlIGRldmljZS4gVGhlIHByaW50LW91dCAnLFxuICAgICAgICBcIm9yIFVTQiBzdGljayBzaG91bGQgYmUga2VwdCBpbiBhIHNhZmUgcGxhY2UsIHN1Y2ggYXMgYSBiYW5rIHZhdWx0IG9yIGhvbWUgc2FmZS4gSXQncyBhIGdvb2QgaWRlYSBcIixcbiAgICAgICAgJ3RvIGtlZXAgYSBzZWNvbmQgY29weSBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbi4nLFxuICAgICAgICAnJyxcbiAgICAgICAgXCJJbXBvcnRhbnQ6IElmIHlvdSBoYXZlbid0IHByb3ZpZGVkIGFuIGV4dGVybmFsIGJhY2t1cCBrZXksIHRoZW4gdGhlIG9yaWdpbmFsIFBERiBzaG91bGQgYmUgXCIsXG4gICAgICAgICdkZWxldGVkIGZyb20gYW55IG1hY2hpbmUgd2hlcmUgdGhlIHdhbGxldCB3aWxsIGJlIHJlZ3VsYXJseSBhY2Nlc3NlZCB0byBwcmV2ZW50IG1hbHdhcmUgZnJvbSAnLFxuICAgICAgICAnY2FwdHVyaW5nIGJvdGggdGhlIEtleUNhcmQgYW5kIHlvdXIgd2FsbGV0IHBhc3Njb2RlLicsXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgcXVlc3Rpb246ICdXaGF0IHNob3VsZCBJIGRvIGlmIEkgbG9zZSBpdD8nLFxuICAgICAgYW5zd2VyOiBbXG4gICAgICAgIHNlY3Rpb25CQ29pblNwZWNpZmljLFxuICAgICAgICAnV2FsbGV0IHNob3VsZCBiZSBjb25zaWRlcmVkIGF0IHJpc2sgZm9yIGxvc3MuIEFzIHNvb24gYXMgaXMgY29udmVuaWVudCwgeW91IHNob3VsZCB1c2UgQml0R28gJyxcbiAgICAgICAgJ3RvIGVtcHR5IHRoZSB3YWxsZXQgaW50byBhIG5ldyB3YWxsZXQgYW5kIGRpc2NvbnRpbnVlIHVzZSBvZiB0aGUgb2xkIHdhbGxldC4nLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHF1ZXN0aW9uOiAnV2hhdCBpZiBzb21lb25lIHNlZXMgbXkgS2V5Q2FyZD8nLFxuICAgICAgYW5zd2VyOiBbXG4gICAgICAgIFwiRG9uJ3QgcGFuaWMhIEFsbCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gb24gdGhlIEtleUNhcmQgaXMgZW5jcnlwdGVkIHdpdGggeW91ciBwYXNzY29kZSwgb3Igd2l0aCBhXCIsXG4gICAgICAgICdrZXkgd2hpY2ggb25seSBCaXRHbyBoYXMuIEJ1dCwgaW4gZ2VuZXJhbCwgeW91IHNob3VsZCBtYWtlIGJlc3QgZWZmb3J0cyB0byBrZWVwIHlvdXIgJyxcbiAgICAgICAgJ0tleUNhcmQgcHJpdmF0ZS4gSWYgeW91ciBLZXlDYXJkIGRvZXMgZ2V0IGV4cG9zZWQgb3IgY29waWVkIGluIGEgd2F5IHRoYXQgbWFrZXMgeW91ICcsXG4gICAgICAgICd1bmNvbWZvcnRhYmxlLCB0aGUgYmVzdCBjb3Vyc2Ugb2YgYWN0aW9uIGlzIHRvIGVtcHR5IHRoZSBjb3JyZXNwb25kaW5nIHdhbGxldCBpbnRvIGFub3RoZXIgJyxcbiAgICAgICAgJ3dhbGxldCBhbmQgZGlzY29udGludWUgdXNlIG9mIHRoZSBvbGQgd2FsbGV0LicsXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgcXVlc3Rpb246ICdXaGF0IGlmIEkgZm9yZ2V0IG9yIGxvc2UgbXkgd2FsbGV0IHBhc3N3b3JkPycsXG4gICAgICBhbnN3ZXI6IFtcbiAgICAgICAgJ0JpdEdvIGNhbiB1c2UgdGhlIGluZm9ybWF0aW9uIGluIFFSIENvZGUgRCB0byBoZWxwIHlvdSByZWNvdmVyIGFjY2VzcyB0byB5b3VyIHdhbGxldC4gJyxcbiAgICAgICAgJ1dpdGhvdXQgdGhlIEtleUNhcmQsIEJpdEdvIGlzIG5vdCBhYmxlIHRvIHJlY292ZXIgZnVuZHMgZnJvbSBhIHdhbGxldCB3aXRoIGEgbG9zdCBwYXNzd29yZC4nLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHF1ZXN0aW9uOiAnV2hhdCBpZiBCaXRHbyBiZWNvbWVzIGluYWNjZXNzaWJsZSBmb3IgYW4gZXh0ZW5kZWQgcGVyaW9kPycsXG4gICAgICBhbnN3ZXI6IFtcbiAgICAgICAgXCJZb3VyIEtleUNhcmQgYW5kIHdhbGxldCBwYXNzY29kZSBjYW4gYmUgdXNlZCB0b2dldGhlciB3aXRoIEJpdEdvJ3MgcHVibGlzaGVkIG9wZW4gXCIsXG4gICAgICAgIHNlY3Rpb25DQ29pblNwZWNpZmljLFxuICAgICAgICAnaW5mb3JtYXRpb24gZnJvbSB5b3VyIEtleUNhcmQgaW50byB0b29scyBvdGhlciB0aGFuIHRoZSB0b29scyBCaXRHbyBoYXMgcHVibGlzaGVkLCBvciB5b3VyICcsXG4gICAgICAgICdmdW5kcyBtYXkgYmUgYXQgcmlzayBmb3IgdGhlZnQuJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBxdWVzdGlvbjogJ1Nob3VsZCBJIHdyaXRlIG15IHdhbGxldCBwYXNzd29yZCBvbiBteSBLZXlDYXJkPycsXG4gICAgICBhbnN3ZXI6IFtcbiAgICAgICAgXCJObyEgQml0R28ncyBzaWduYXR1cmUgc2NoZW1lIGFwcHJvYWNoIHRvIHNlY3VyaXR5IGRlcGVuZHMgb24gdGhlcmUgbm90IGJlaW5nIGEgc2luZ2xlIHBvaW50IFwiLFxuICAgICAgICAnb2YgYXR0YWNrLiBCdXQgaWYgeW91ciB3YWxsZXQgcGFzc3dvcmQgaXMgb24geW91ciBLZXlDYXJkLCB0aGVuIGFueW9uZSB3aG8gZ2FpbnMgYWNjZXNzIHRvICcsXG4gICAgICAgIHNlY3Rpb25EQ29pblNwZWNpZmljLFxuICAgICAgICAnc2FmZSBpbiBhIHNlY3VyZSBwYXNzd29yZCBtYW5hZ2VyIHN1Y2ggYXMgTGFzdFBhc3MsIDFQYXNzd29yZCBvciBLZWVQYXNzLicsXG4gICAgICBdLFxuICAgIH0sXG4gIF07XG59XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { GenerateQrDataBaseParams, GenerateQrDataForKeychainParams, IDrawKeyCard } from './types';
|
|
2
|
+
export declare function generateParamsForKeyCreation({ curve, bitgoKeychain, walletLabel, keyCardImage, }: GenerateQrDataForKeychainParams & GenerateQrDataBaseParams): IDrawKeyCard;
|
|
3
|
+
//# sourceMappingURL=generateParamsForKeyCreation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateParamsForKeyCreation.d.ts","sourceRoot":"","sources":["../../src/generateParamsForKeyCreation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAElG,wBAAgB,4BAA4B,CAAC,EAC3C,KAAK,EACL,aAAa,EACb,WAAW,EACX,YAAY,GACb,EAAE,+BAA+B,GAAG,wBAAwB,GAAG,YAAY,CAkC3E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateParamsForKeyCreation = generateParamsForKeyCreation;
|
|
4
|
+
const assert = require("assert");
|
|
5
|
+
function generateParamsForKeyCreation({ curve, bitgoKeychain, walletLabel, keyCardImage, }) {
|
|
6
|
+
assert(bitgoKeychain.commonKeychain, 'bitgoKeychain.commonKeychain is required');
|
|
7
|
+
return {
|
|
8
|
+
walletLabel,
|
|
9
|
+
keyCardImage,
|
|
10
|
+
curve,
|
|
11
|
+
qrData: {
|
|
12
|
+
user: {
|
|
13
|
+
title: 'A: Common Keychain',
|
|
14
|
+
data: bitgoKeychain.commonKeychain,
|
|
15
|
+
description: 'This is the common pub which is the equivalent of xpub (public key)\r\nof the key generated',
|
|
16
|
+
},
|
|
17
|
+
bitgo: {
|
|
18
|
+
title: 'B: BitGo Key ID',
|
|
19
|
+
data: bitgoKeychain.id,
|
|
20
|
+
description: 'This is the identifier assigned to the key generated using which BitGo\r\ncan lookup BitGo key share.',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
questions: [
|
|
24
|
+
{
|
|
25
|
+
question: 'What is the KeyCard?',
|
|
26
|
+
answer: [
|
|
27
|
+
'This key card contains information about the key id for the generated key.\r\nThis id can later be used to derive wallets.',
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
question: 'What should I do with it?',
|
|
32
|
+
answer: [
|
|
33
|
+
'Store this keycard for later use. The key ID is important to communicate with BitGo\r\nto derive wallets from the key.',
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVQYXJhbXNGb3JLZXlDcmVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZVBhcmFtc0ZvcktleUNyZWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0Esb0VBdUNDO0FBMUNELGlDQUFpQztBQUdqQyxTQUFnQiw0QkFBNEIsQ0FBQyxFQUMzQyxLQUFLLEVBQ0wsYUFBYSxFQUNiLFdBQVcsRUFDWCxZQUFZLEdBQytDO0lBQzNELE1BQU0sQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLDBDQUEwQyxDQUFDLENBQUM7SUFDakYsT0FBTztRQUNMLFdBQVc7UUFDWCxZQUFZO1FBQ1osS0FBSztRQUNMLE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsb0JBQW9CO2dCQUMzQixJQUFJLEVBQUUsYUFBYSxDQUFDLGNBQWM7Z0JBQ2xDLFdBQVcsRUFBRSw2RkFBNkY7YUFDM0c7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLGlCQUFpQjtnQkFDeEIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFO2dCQUN0QixXQUFXLEVBQ1QsdUdBQXVHO2FBQzFHO1NBQ0Y7UUFDRCxTQUFTLEVBQUU7WUFDVDtnQkFDRSxRQUFRLEVBQUUsc0JBQXNCO2dCQUNoQyxNQUFNLEVBQUU7b0JBQ04sNEhBQTRIO2lCQUM3SDthQUNGO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsTUFBTSxFQUFFO29CQUNOLHdIQUF3SDtpQkFDekg7YUFDRjtTQUNGO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEdlbmVyYXRlUXJEYXRhQmFzZVBhcmFtcywgR2VuZXJhdGVRckRhdGFGb3JLZXljaGFpblBhcmFtcywgSURyYXdLZXlDYXJkIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBhcmFtc0ZvcktleUNyZWF0aW9uKHtcbiAgY3VydmUsXG4gIGJpdGdvS2V5Y2hhaW4sXG4gIHdhbGxldExhYmVsLFxuICBrZXlDYXJkSW1hZ2UsXG59OiBHZW5lcmF0ZVFyRGF0YUZvcktleWNoYWluUGFyYW1zICYgR2VuZXJhdGVRckRhdGFCYXNlUGFyYW1zKTogSURyYXdLZXlDYXJkIHtcbiAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sICdiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluIGlzIHJlcXVpcmVkJyk7XG4gIHJldHVybiB7XG4gICAgd2FsbGV0TGFiZWwsXG4gICAga2V5Q2FyZEltYWdlLFxuICAgIGN1cnZlLFxuICAgIHFyRGF0YToge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0aXRsZTogJ0E6IENvbW1vbiBLZXljaGFpbicsXG4gICAgICAgIGRhdGE6IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgY29tbW9uIHB1YiB3aGljaCBpcyB0aGUgZXF1aXZhbGVudCBvZiB4cHViIChwdWJsaWMga2V5KVxcclxcbm9mIHRoZSBrZXkgZ2VuZXJhdGVkJyxcbiAgICAgIH0sXG4gICAgICBiaXRnbzoge1xuICAgICAgICB0aXRsZTogJ0I6IEJpdEdvIEtleSBJRCcsXG4gICAgICAgIGRhdGE6IGJpdGdvS2V5Y2hhaW4uaWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdUaGlzIGlzIHRoZSBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHRoZSBrZXkgZ2VuZXJhdGVkIHVzaW5nIHdoaWNoIEJpdEdvXFxyXFxuY2FuIGxvb2t1cCBCaXRHbyBrZXkgc2hhcmUuJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVzdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgcXVlc3Rpb246ICdXaGF0IGlzIHRoZSBLZXlDYXJkPycsXG4gICAgICAgIGFuc3dlcjogW1xuICAgICAgICAgICdUaGlzIGtleSBjYXJkIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXkgaWQgZm9yIHRoZSBnZW5lcmF0ZWQga2V5LlxcclxcblRoaXMgaWQgY2FuIGxhdGVyIGJlIHVzZWQgdG8gZGVyaXZlIHdhbGxldHMuJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHF1ZXN0aW9uOiAnV2hhdCBzaG91bGQgSSBkbyB3aXRoIGl0PycsXG4gICAgICAgIGFuc3dlcjogW1xuICAgICAgICAgICdTdG9yZSB0aGlzIGtleWNhcmQgZm9yIGxhdGVyIHVzZS4gVGhlIGtleSBJRCBpcyBpbXBvcnRhbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBCaXRHb1xcclxcbnRvIGRlcml2ZSB3YWxsZXRzIGZyb20gdGhlIGtleS4nLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { GenerateQrDataParams, QrData } from './types';
|
|
2
|
+
export declare function generateQrData({ backupKeychain, backupKeyProvider, backupMasterKey, bitgoKeychain, coin, passcodeEncryptionCode, passphrase, userKeychain, userMasterKey, userMasterPublicKey, backupMasterPublicKey, }: GenerateQrDataParams): QrData;
|
|
3
|
+
//# sourceMappingURL=generateQrData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateQrData.d.ts","sourceRoot":"","sources":["../../src/generateQrData.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAA8B,MAAM,EAAe,MAAM,SAAS,CAAC;AAkIhG,wBAAgB,cAAc,CAAC,EAC7B,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,IAAI,EACJ,sBAAsB,EACtB,UAAU,EACV,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,qBAAqB,GACtB,EAAE,oBAAoB,GAAG,MAAM,CAyB/B"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateQrData = generateQrData;
|
|
4
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
5
|
+
const assert = require("assert");
|
|
6
|
+
function getPubFromKey(key) {
|
|
7
|
+
switch (key.type) {
|
|
8
|
+
case 'blsdkg':
|
|
9
|
+
return key.commonPub;
|
|
10
|
+
case 'tss':
|
|
11
|
+
return key.commonKeychain;
|
|
12
|
+
case 'independent':
|
|
13
|
+
return key.pub;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function generateUserQrData(userKeychain, userMasterKey) {
|
|
17
|
+
if (userKeychain.reducedEncryptedPrv) {
|
|
18
|
+
return {
|
|
19
|
+
title: 'A: User Key',
|
|
20
|
+
description: 'This is your private key, encrypted with your wallet password.',
|
|
21
|
+
data: userKeychain.reducedEncryptedPrv,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (userKeychain.encryptedPrv) {
|
|
25
|
+
return {
|
|
26
|
+
title: 'A: User Key',
|
|
27
|
+
description: 'This is your private key, encrypted with your wallet password.',
|
|
28
|
+
data: userKeychain.encryptedPrv,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const pub = getPubFromKey(userKeychain);
|
|
32
|
+
assert(pub);
|
|
33
|
+
return {
|
|
34
|
+
title: 'A: Provided User Key',
|
|
35
|
+
description: 'This is the public key you provided for your wallet.',
|
|
36
|
+
data: pub,
|
|
37
|
+
publicMasterKey: userMasterKey,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function generateBackupQrData(coin, backupKeychain, { backupKeyProvider, backupMasterKey, } = {}) {
|
|
41
|
+
const title = 'B: Backup Key';
|
|
42
|
+
if (backupKeychain.reducedEncryptedPrv) {
|
|
43
|
+
return {
|
|
44
|
+
title,
|
|
45
|
+
description: 'This is your backup private key, encrypted with your wallet password.',
|
|
46
|
+
data: backupKeychain.reducedEncryptedPrv,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (backupKeychain.encryptedPrv) {
|
|
50
|
+
return {
|
|
51
|
+
title,
|
|
52
|
+
description: 'This is your backup private key, encrypted with your wallet password.',
|
|
53
|
+
data: backupKeychain.encryptedPrv,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (backupKeyProvider === 'BitGo Trust' && backupKeychain.type === 'tss') {
|
|
57
|
+
const keyShares = backupKeychain.keyShares?.filter((keyShare) => keyShare.to === 'backup');
|
|
58
|
+
assert(keyShares?.length === 2);
|
|
59
|
+
return {
|
|
60
|
+
title: 'B: Backup Key Shares',
|
|
61
|
+
description: `These are the key shares for ${backupKeyProvider}. If BitGo Inc. goes out of business,\r\n` +
|
|
62
|
+
`contact ${backupKeyProvider} and they will help you recover your funds.`,
|
|
63
|
+
data: JSON.stringify(keyShares),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const pub = getPubFromKey(backupKeychain);
|
|
67
|
+
assert(pub);
|
|
68
|
+
if (backupKeyProvider) {
|
|
69
|
+
return {
|
|
70
|
+
title: 'B: Backup Key',
|
|
71
|
+
description: `This is the public key held at ${backupKeyProvider}, an ${coin.name} recovery service. ` +
|
|
72
|
+
`If you lose\r\nyour key, ${backupKeyProvider} will be able to sign transactions to recover funds.`,
|
|
73
|
+
data: pub,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
title: 'B: Provided Backup Key',
|
|
78
|
+
description: 'This is the public key you provided for your wallet.',
|
|
79
|
+
data: pub,
|
|
80
|
+
publicMasterKey: backupMasterKey,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function generateBitGoQrData(bitgoKeychain) {
|
|
84
|
+
const bitgoData = getPubFromKey(bitgoKeychain);
|
|
85
|
+
assert(bitgoData);
|
|
86
|
+
return {
|
|
87
|
+
title: 'C: BitGo Public Key',
|
|
88
|
+
description: 'This is the public part of the key that BitGo will use to ' + 'co-sign transactions\r\nwith you on your wallet.',
|
|
89
|
+
data: bitgoData,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function generateUserMasterPublicKeyQRData(publicKey) {
|
|
93
|
+
return {
|
|
94
|
+
title: 'E: Master User Public Key',
|
|
95
|
+
description: 'This is the public key used to derive the user key for the wallet. This is not stored by BitGo, and may be required for use in recovery scenarios.',
|
|
96
|
+
data: publicKey,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function generateBackupMasterPublicKeyQRData(publicKey) {
|
|
100
|
+
return {
|
|
101
|
+
title: 'F: Master Backup Public Key',
|
|
102
|
+
description: 'This is the public key used to derive the backup key for the wallet. This is not stored by BitGo, and may be required for use in recovery scenarios.',
|
|
103
|
+
data: publicKey,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function generateQrData({ backupKeychain, backupKeyProvider, backupMasterKey, bitgoKeychain, coin, passcodeEncryptionCode, passphrase, userKeychain, userMasterKey, userMasterPublicKey, backupMasterPublicKey, }) {
|
|
107
|
+
const qrData = {
|
|
108
|
+
user: generateUserQrData(userKeychain, userMasterKey),
|
|
109
|
+
userMasterPublicKey: userMasterPublicKey ? generateUserMasterPublicKeyQRData(userMasterPublicKey) : undefined,
|
|
110
|
+
backup: generateBackupQrData(coin, backupKeychain, {
|
|
111
|
+
backupKeyProvider,
|
|
112
|
+
backupMasterKey,
|
|
113
|
+
}),
|
|
114
|
+
backupMasterPublicKey: backupMasterPublicKey
|
|
115
|
+
? generateBackupMasterPublicKeyQRData(backupMasterPublicKey)
|
|
116
|
+
: undefined,
|
|
117
|
+
bitgo: generateBitGoQrData(bitgoKeychain),
|
|
118
|
+
};
|
|
119
|
+
if (passphrase && passcodeEncryptionCode) {
|
|
120
|
+
const encryptedWalletPasscode = (0, sdk_api_1.encrypt)(passcodeEncryptionCode, passphrase);
|
|
121
|
+
qrData.passcode = {
|
|
122
|
+
title: 'D: Encrypted wallet Password',
|
|
123
|
+
description: 'This is the wallet password, encrypted client-side with a key held by BitGo.',
|
|
124
|
+
data: encryptedWalletPasscode,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return qrData;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVRckRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhdGVRckRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFzSUEsd0NBcUNDO0FBektELGlEQUE4QztBQUM5QyxpQ0FBaUM7QUFHakMsU0FBUyxhQUFhLENBQUMsR0FBYTtJQUNsQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixLQUFLLFFBQVE7WUFDWCxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDdkIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQzVCLEtBQUssYUFBYTtZQUNoQixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLFlBQXNCLEVBQUUsYUFBc0I7SUFDeEUsSUFBSSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNyQyxPQUFPO1lBQ0wsS0FBSyxFQUFFLGFBQWE7WUFDcEIsV0FBVyxFQUFFLGdFQUFnRTtZQUM3RSxJQUFJLEVBQUUsWUFBWSxDQUFDLG1CQUFtQjtTQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzlCLE9BQU87WUFDTCxLQUFLLEVBQUUsYUFBYTtZQUNwQixXQUFXLEVBQUUsZ0VBQWdFO1lBQzdFLElBQUksRUFBRSxZQUFZLENBQUMsWUFBWTtTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFWixPQUFPO1FBQ0wsS0FBSyxFQUFFLHNCQUFzQjtRQUM3QixXQUFXLEVBQUUsc0RBQXNEO1FBQ25FLElBQUksRUFBRSxHQUFHO1FBQ1QsZUFBZSxFQUFFLGFBQWE7S0FDL0IsQ0FBQztBQUNKLENB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QkFBa0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBQ3JELG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdHLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ2pELGlCQUFpQjtZQUNqQixlQUFlO1NBQ2hCLENBQUM7UUFDRixxQkFBcUIsRUFBRSxxQkFBcUI7WUFDMUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLHFCQUFxQixDQUFDO1lBQzVELENBQUMsQ0FBQyxTQUFTO1FBQ2IsS0FBSyxFQUFFLG1CQUFtQixDQUFDLGFBQWEsQ0FBQztLQUMxQyxDQUFDO0lBRUYsSUFBSSxVQUFVLElBQUksc0JBQXNCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLHVCQUF1QixHQUFHLElBQUEsaUJBQU8sRUFBQyxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1RSxNQUFNLENBQUMsUUFBUSxHQUFHO1lBQ2hCLEtBQUssRUFBRSw4QkFBOEI7WUFDckMsV0FBVyxFQUFFLDhFQUE4RTtZQUMzRixJQUFJLEVBQUUsdUJBQXVCO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBLZXljaGFpbiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGVuY3J5cHQgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgR2VuZXJhdGVRckRhdGFQYXJhbXMsIE1hc3RlclB1YmxpY0tleVFyRGF0YUVudHJ5LCBRckRhdGEsIFFyRGF0YUVudHJ5IH0gZnJvbSAnLi90eXBlcyc7XG5cbmZ1bmN0aW9uIGdldFB1YkZyb21LZXkoa2V5OiBLZXljaGFpbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoa2V5LnR5cGUpIHtcbiAgICBjYXNlICdibHNka2cnOlxuICAgICAgcmV0dXJuIGtleS5jb21tb25QdWI7XG4gICAgY2FzZSAndHNzJzpcbiAgICAgIHJldHVybiBrZXkuY29tbW9uS2V5Y2hhaW47XG4gICAgY2FzZSAnaW5kZXBlbmRlbnQnOlxuICAgICAgcmV0dXJuIGtleS5wdWI7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVVc2VyUXJEYXRhKHVzZXJLZXljaGFpbjogS2V5Y2hhaW4sIHVzZXJNYXN0ZXJLZXk/OiBzdHJpbmcpOiBRckRhdGFFbnRyeSB7XG4gIGlmICh1c2VyS2V5Y2hhaW4ucmVkdWNlZEVuY3J5cHRlZFBydikge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogJ0E6IFVzZXIgS2V5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB5b3VyIHByaXZhdGUga2V5LCBlbmNyeXB0ZWQgd2l0aCB5b3VyIHdhbGxldCBwYXNzd29yZC4nLFxuICAgICAgZGF0YTogdXNlcktleWNoYWluLnJlZHVjZWRFbmNyeXB0ZWRQcnYsXG4gICAgfTtcbiAgfVxuICBpZiAodXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogJ0E6IFVzZXIgS2V5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB5b3VyIHByaXZhdGUga2V5LCBlbmNyeXB0ZWQgd2l0aCB5b3VyIHdhbGxldCBwYXNzd29yZC4nLFxuICAgICAgZGF0YTogdXNlcktleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHViID0gZ2V0UHViRnJvbUtleSh1c2VyS2V5Y2hhaW4pO1xuICBhc3NlcnQocHViKTtcblxuICByZXR1cm4ge1xuICAgIHRpdGxlOiAnQTogUHJvdmlkZWQgVXNlciBLZXknLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgcHVibGljIGtleSB5b3UgcHJvdmlkZWQgZm9yIHlvdXIgd2FsbGV0LicsXG4gICAgZGF0YTogcHViLFxuICAgIHB1YmxpY01hc3RlcktleTogdXNlck1hc3RlcktleSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVCYWNrdXBRckRhdGEoXG4gIGNvaW46IFJlYWRvbmx5PEJhc2VDb2luPixcbiAgYmFja3VwS2V5Y2hhaW46IEtleWNoYWluLFxuICB7XG4gICAgYmFja3VwS2V5UHJvdmlkZXIsXG4gICAgYmFja3VwTWFzdGVyS2V5LFxuICB9OiB7XG4gICAgYmFja3VwS2V5UHJvdmlkZXI/OiBzdHJpbmc7XG4gICAgYmFja3VwTWFzdGVyS2V5Pzogc3RyaW5nO1xuICB9ID0ge31cbik6IFFyRGF0YUVudHJ5IHtcbiAgY29uc3QgdGl0bGUgPSAnQjogQmFja3VwIEtleSc7XG4gIGlmIChiYWNrdXBLZXljaGFpbi5yZWR1Y2VkRW5jcnlwdGVkUHJ2KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHlvdXIgYmFja3VwIHByaXZhdGUga2V5LCBlbmNyeXB0ZWQgd2l0aCB5b3VyIHdhbGxldCBwYXNzd29yZC4nLFxuICAgICAgZGF0YTogYmFja3VwS2V5Y2hhaW4ucmVkdWNlZEVuY3J5cHRlZFBydixcbiAgICB9O1xuICB9XG4gIGlmIChiYWNrdXBLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgeW91ciBiYWNrdXAgcHJpdmF0ZSBrZXksIGVuY3J5cHRlZCB3aXRoIHlvdXIgd2FsbGV0IHBhc3N3b3JkLicsXG4gICAgICBkYXRhOiBiYWNrdXBLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChiYWNrdXBLZXlQcm92aWRlciA9PT0gJ0JpdEdvIFRydXN0JyAmJiBiYWNrdXBLZXljaGFpbi50eXBlID09PSAndHNzJykge1xuICAgIGNvbnN0IGtleVNoYXJlcyA9IGJhY2t1cEtleWNoYWluLmtleVNoYXJlcz8uZmlsdGVyKChrZXlTaGFyZSkgPT4ga2V5U2hhcmUudG8gPT09ICdiYWNrdXAnKTtcbiAgICBhc3NlcnQoa2V5U2hhcmVzPy5sZW5ndGggPT09IDIpO1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogJ0I6IEJhY2t1cCBLZXkgU2hhcmVzJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBgVGhlc2UgYXJlIHRoZSBrZXkgc2hhcmVzIGZvciAke2JhY2t1cEtleVByb3ZpZGVyfS4gSWYgQml0R28gSW5jLiBnb2VzIG91dCBvZiBidXNpbmVzcyxcXHJcXG5gICtcbiAgICAgICAgYGNvbnRhY3QgJHtiYWNrdXBLZXlQcm92aWRlcn0gYW5kIHRoZXkgd2lsbCBoZWxwIHlvdSByZWNvdmVyIHlvdXIgZnVuZHMuYCxcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGtleVNoYXJlcyksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHB1YiA9IGdldFB1YkZyb21LZXkoYmFja3VwS2V5Y2hhaW4pO1xuICBhc3NlcnQocHViKTtcblxuICBpZiAoYmFja3VwS2V5UHJvdmlkZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6ICdCOiBCYWNrdXAgS2V5JyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBgVGhpcyBpcyB0aGUgcHVibGljIGtleSBoZWxkIGF0ICR7YmFja3VwS2V5UHJvdmlkZXJ9LCBhbiAke2NvaW4ubmFtZX0gcmVjb3Zlcnkgc2VydmljZS4gYCArXG4gICAgICAgIGBJZiB5b3UgbG9zZVxcclxcbnlvdXIga2V5LCAke2JhY2t1cEtleVByb3ZpZGVyfSB3aWxsIGJlIGFibGUgdG8gc2lnbiB0cmFuc2FjdGlvbnMgdG8gcmVjb3ZlciBmdW5kcy5gLFxuICAgICAgZGF0YTogcHViLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRpdGxlOiAnQjogUHJvdmlkZWQgQmFja3VwIEtleScsXG4gICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSBwdWJsaWMga2V5IHlvdSBwcm92aWRlZCBmb3IgeW91ciB3YWxsZXQuJyxcbiAgICBkYXRhOiBwdWIsXG4gICAgcHVibGljTWFzdGVyS2V5OiBiYWNrdXBNYXN0ZXJLZXksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQml0R29RckRhdGEoYml0Z29LZXljaGFpbjogS2V5Y2hhaW4pOiBRckRhdGFFbnRyeSB7XG4gIGNvbnN0IGJpdGdvRGF0YSA9IGdldFB1YkZyb21LZXkoYml0Z29LZXljaGFpbik7XG4gIGFzc2VydChiaXRnb0RhdGEpO1xuXG4gIHJldHVybiB7XG4gICAgdGl0bGU6ICdDOiBCaXRHbyBQdWJsaWMgS2V5JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGlzIGlzIHRoZSBwdWJsaWMgcGFydCBvZiB0aGUga2V5IHRoYXQgQml0R28gd2lsbCB1c2UgdG8gJyArICdjby1zaWduIHRyYW5zYWN0aW9uc1xcclxcbndpdGggeW91IG9uIHlvdXIgd2FsbGV0LicsXG4gICAgZGF0YTogYml0Z29EYXRhLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVVzZXJNYXN0ZXJQdWJsaWNLZXlRUkRhdGEocHVibGljS2V5OiBzdHJpbmcpOiBNYXN0ZXJQdWJsaWNLZXlRckRhdGFFbnRyeSB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6ICdFOiBNYXN0ZXIgVXNlciBQdWJsaWMgS2V5JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGlzIGlzIHRoZSBwdWJsaWMga2V5IHVzZWQgdG8gZGVyaXZlIHRoZSB1c2VyIGtleSBmb3IgdGhlIHdhbGxldC4gVGhpcyBpcyBub3Qgc3RvcmVkIGJ5IEJpdEdvLCBhbmQgbWF5IGJlIHJlcXVpcmVkIGZvciB1c2UgaW4gcmVjb3Zlcnkgc2NlbmFyaW9zLicsXG4gICAgZGF0YTogcHVibGljS2V5LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUJhY2t1cE1hc3RlclB1YmxpY0tleVFSRGF0YShwdWJsaWNLZXk6IHN0cmluZyk6IE1hc3RlclB1YmxpY0tleVFyRGF0YUVudHJ5IHtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogJ0Y6IE1hc3RlciBCYWNrdXAgUHVibGljIEtleScsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnVGhpcyBpcyB0aGUgcHVibGljIGtleSB1c2VkIHRvIGRlcml2ZSB0aGUgYmFja3VwIGtleSBmb3IgdGhlIHdhbGxldC4gVGhpcyBpcyBub3Qgc3RvcmVkIGJ5IEJpdEdvLCBhbmQgbWF5IGJlIHJlcXVpcmVkIGZvciB1c2UgaW4gcmVjb3Zlcnkgc2NlbmFyaW9zLicsXG4gICAgZGF0YTogcHVibGljS2V5LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVRckRhdGEoe1xuICBiYWNrdXBLZXljaGFpbixcbiAgYmFja3VwS2V5UHJvdmlkZXIsXG4gIGJhY2t1cE1hc3RlcktleSxcbiAgYml0Z29LZXljaGFpbixcbiAgY29pbixcbiAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgcGFzc3BocmFzZSxcbiAgdXNlcktleWNoYWluLFxuICB1c2VyTWFzdGVyS2V5LFxuICB1c2VyTWFzdGVyUHVibGljS2V5LFxuICBiYWNrdXBNYXN0ZXJQdWJsaWNLZXksXG59OiBHZW5lcmF0ZVFyRGF0YVBhcmFtcyk6IFFyRGF0YSB7XG4gIGNvbnN0IHFyRGF0YTogUXJEYXRhID0ge1xuICAgIHVzZXI6IGdlbmVyYXRlVXNlclFyRGF0YSh1c2VyS2V5Y2hhaW4sIHVzZXJNYXN0ZXJLZXkpLFxuICAgIHVzZXJNYXN0ZXJQdWJsaWNLZXk6IHVzZXJNYXN0ZXJQdWJsaWNLZXkgPyBnZW5lcmF0ZVVzZXJNYXN0ZXJQdWJsaWNLZXlRUkRhdGEodXNlck1hc3RlclB1YmxpY0tleSkgOiB1bmRlZmluZWQsXG4gICAgYmFja3VwOiBnZW5lcmF0ZUJhY2t1cFFyRGF0YShjb2luLCBiYWNrdXBLZXljaGFpbiwge1xuICAgICAgYmFja3VwS2V5UHJvdmlkZXIsXG4gICAgICBiYWNrdXBNYXN0ZXJLZXksXG4gICAgfSksXG4gICAgYmFja3VwTWFzdGVyUHVibGljS2V5OiBiYWNrdXBNYXN0ZXJQdWJsaWNLZXlcbiAgICAgID8gZ2VuZXJhdGVCYWNrdXBNYXN0ZXJQdWJsaWNLZXlRUkRhdGEoYmFja3VwTWFzdGVyUHVibGljS2V5KVxuICAgICAgOiB1bmRlZmluZWQsXG4gICAgYml0Z286IGdlbmVyYXRlQml0R29RckRhdGEoYml0Z29LZXljaGFpbiksXG4gIH07XG5cbiAgaWYgKHBhc3NwaHJhc2UgJiYgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkge1xuICAgIGNvbnN0IGVuY3J5cHRlZFdhbGxldFBhc3Njb2RlID0gZW5jcnlwdChwYXNzY29kZUVuY3J5cHRpb25Db2RlLCBwYXNzcGhyYXNlKTtcblxuICAgIHFyRGF0YS5wYXNzY29kZSA9IHtcbiAgICAgIHRpdGxlOiAnRDogRW5jcnlwdGVkIHdhbGxldCBQYXNzd29yZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIHdhbGxldCBwYXNzd29yZCwgZW5jcnlwdGVkIGNsaWVudC1zaWRlIHdpdGggYSBrZXkgaGVsZCBieSBCaXRHby4nLFxuICAgICAgZGF0YTogZW5jcnlwdGVkV2FsbGV0UGFzc2NvZGUsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBxckRhdGE7XG59XG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GenerateKeycardParams } from './types';
|
|
2
|
+
export * from './drawKeycard';
|
|
3
|
+
export * from './faq';
|
|
4
|
+
export * from './generateQrData';
|
|
5
|
+
export * from './utils';
|
|
6
|
+
export * from './types';
|
|
7
|
+
export declare function generateKeycard(params: GenerateKeycardParams): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD,cAAc,eAAe,CAAC;AAC9B,cAAc,OAAO,CAAC;AACtB,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AAExB,wBAAsB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAalF"}
|