/
index.js
320 lines (319 loc) · 44.7 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
var Promise = require("bluebird");
var pathExists = require("path-exists");
var child_process = require("child_process");
var lsDisks = require("ls-disks");
var exec = child_process.exec;
var spawn = child_process.spawn;
function shacheck(path, bs, count) {
return new Promise(function (resolve, reject) {
if (bs && count) {
exec("dd if=" + path + " bs=" + bs + " count=" + count + " | sha1sum |awk '{print($1)}' ", function (err, stdout, stderr) {
if (err) {
reject(err);
}
else {
resolve(stdout.toString("utf-8"));
}
});
}
else {
exec("sha1sum " + path + " |awk '{print($1)}'", function (err, stdout, stderr) {
if (err) {
reject(err);
}
else if (stderr) {
reject(stderr);
}
else {
resolve(stdout.toString("utf-8"));
}
});
}
});
}
function filesize(file) {
return new Promise(function (resolve, reject) {
exec("du -b " + file, function (err, stdout, stderr) {
if (err) {
reject(err);
}
else if (stderr) {
reject(stderr);
}
else {
resolve(parseInt(stdout.toString("utf-8")));
}
});
});
}
function freespace(file) {
return new Promise(function (resolve, reject) {
var folder = file.replace("/" + file.split("/")[file.split("/").length - 1], "");
exec("df -k " + folder + "| tail -1 | awk {'print$(4)'}", function (err, stdout, stderr) {
if (err) {
reject(err);
}
else if (stderr) {
reject(stderr);
}
else {
console.log(stdout);
resolve(parseInt(stdout.toString("utf-8")) * 1024);
}
});
});
}
function checkspace(source, dest) {
var lsdisks = lsDisks.all();
var diskdest;
var disksource;
for (var i = 0; i < lsdisks.length; i++) {
if (source === lsdisks[i].disk) {
disksource = lsdisks[i];
}
else if (dest === lsdisks[i].disk) {
diskdest = lsdisks[i];
}
}
return new Promise(function (resolve, reject) {
if (source.split("dev/").length === 2) {
if (dest.split("dev/").length === 2) {
if (disksource.used_blocks < diskdest.sectors) {
console.log("size ok");
resolve(true);
}
else {
reject("insufficient space on " + dest);
}
}
else {
freespace(dest).then(function (sizedest) {
console.log("free space is " + sizedest);
if (disksource.used_blocks * disksource.block < sizedest) {
resolve(true);
}
else {
reject("insufficient space on " + dest);
}
}).catch(function (err) {
reject(err);
});
}
}
else {
filesize(source).then(function (sizesource) {
if (dest.split("dev/").length === 2) {
if (sizesource < diskdest.size) {
resolve(true);
}
else {
reject("insufficient space on " + dest);
}
}
else {
freespace(dest).then(function (sizedest) {
if (sizesource < sizedest) {
resolve(true);
}
else {
reject("insufficient space on " + dest);
}
}).catch(function (err) {
reject(err);
});
}
}).catch(function (err) {
reject(err);
});
}
});
}
function umount_drive(disk) {
return new Promise(function (resolve, reject) {
exec("cat /proc/mounts | grep " + disk + " | awk {'print$(1)'}", function (err, stdout, stderr) {
if (err) {
reject(err);
}
else if (stderr) {
reject(stderr);
}
else {
var drives = "";
var fdiskstring = stdout.toString("utf-8");
var fdisklines = fdiskstring.split("\n");
for (var i = 0; i < fdisklines.length; i++) {
drives = drives + fdisklines[i] + " ";
}
if (fdisklines[0] !== "") {
console.log("umount partitions: " + drives);
exec("umount " + drives, function (err, stdout, stderr) {
if (err) {
reject(err);
}
else if (stderr) {
reject(stderr);
}
else {
resolve(true);
}
});
}
else {
resolve(true);
}
}
});
});
}
function umountall(source, dest) {
return new Promise(function (resolve, reject) {
if (source.split("dev/").length === 2) {
umount_drive(source).then(function () {
if (dest.split("dev/").length === 2) {
umount_drive(dest).then(function () {
resolve(true);
}).catch(function (err) {
reject(err);
});
}
else {
resolve(true);
}
}).catch(function (err) {
reject(err);
});
}
else {
if (dest.split("dev/").length === 2) {
umount_drive(dest).then(function () {
resolve(true);
}).catch(function (err) {
reject(err);
});
}
else {
resolve(true);
}
}
});
}
module.exports = function (source, dest, progress) {
console.log("starting");
return new Promise(function (resolve, reject) {
if (!source || !pathExists.sync(source)) {
reject("missing source");
}
else if (!dest) {
reject("missing dest");
}
else if (dest.split("dev/").length === 2 && !pathExists.sync(dest)) {
reject("missing dest");
}
else {
var lsdisks = lsDisks.all();
var diskdest;
var disksource;
for (var i = 0; i < lsdisks.length; i++) {
if (source === lsdisks[i].disk) {
disksource = lsdisks[i];
}
else if (dest === lsdisks[i].disk) {
diskdest = lsdisks[i];
}
}
umountall(source, dest).then(function () {
console.log("checking space...");
checkspace(source, dest).then(function () {
console.log("cloning...");
if (source.split("dev/").length === 2) {
var CloneCmd = "dd if=" + source + " bs=" + disksource.block + " count=" + disksource.used_blocks + " of=" + dest;
console.log(CloneCmd);
shacheck(source, disksource.block, disksource.used_blocks).then(function (sha1) {
exec(CloneCmd, function (err, stdout, stderr) {
if (err) {
reject(err);
}
else {
shacheck(dest, disksource.block, disksource.used_blocks).then(function (sha2) {
if (sha1 === sha2) {
resolve(true);
}
else {
reject("shasum don't match");
}
}).catch(function (err) {
reject(err);
});
}
});
}).catch(function (err) {
reject(err);
});
}
else {
var CloneCmd = "dd if=" + source + " of=" + dest;
console.log(CloneCmd);
shacheck(source).then(function (sha1) {
console.log("shasum " + source + ": " + sha1);
exec(CloneCmd, function (err, stdout, stderr) {
if (err) {
reject(err);
}
else {
if (dest.split("dev/").length === 2) {
filesize(source).then(function (sizesource) {
lsdisks = lsDisks.all();
for (var i = 0; i < lsdisks.length; i++) {
if (source === lsdisks[i].disk) {
disksource = lsdisks[i];
}
else if (dest === lsdisks[i].disk) {
diskdest = lsdisks[i];
}
}
console.log("bs= " + diskdest.block);
console.log("count= " + diskdest.used_blocks);
shacheck(dest, diskdest.block, diskdest.used_blocks).then(function (sha2) {
console.log("shasum " + dest + ": " + sha2);
if (sha1 === sha2) {
resolve(true);
}
else {
reject("shasum don't match");
}
}).catch(function (err) {
reject(err);
});
}).catch(function (err) {
reject(err);
});
}
else {
shacheck(dest).then(function (sha2) {
console.log("shasum " + dest + ": " + sha2);
if (sha1 === sha2) {
resolve(true);
}
else {
reject("shasum don't match");
}
}).catch(function (err) {
reject(err);
});
}
}
});
}).catch(function (err) {
reject(err);
});
}
}).catch(function (err) {
reject(err);
});
}).catch(function (err) {
reject(err);
});
}
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbInNoYWNoZWNrIiwiZmlsZXNpemUiLCJmcmVlc3BhY2UiLCJjaGVja3NwYWNlIiwidW1vdW50X2RyaXZlIiwidW1vdW50YWxsIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFZLE9BQU8sV0FBTSxVQUFVLENBQUMsQ0FBQTtBQUNwQyxJQUFZLFVBQVUsV0FBTSxhQUFhLENBQUMsQ0FBQTtBQUMxQyxJQUFZLGFBQWEsV0FBTSxlQUFlLENBQUMsQ0FBQTtBQUUvQyxJQUFPLE9BQU8sV0FBVyxVQUFVLENBQUMsQ0FBQztBQUVyQyxJQUFJLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO0FBQzlCLElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7QUFFaEMsa0JBQWtCLElBQVksRUFBRSxFQUFXLEVBQUUsS0FBYztJQUN2REEsTUFBTUEsQ0FBQ0EsSUFBSUEsT0FBT0EsQ0FBU0EsVUFBU0EsT0FBT0EsRUFBRUEsTUFBTUE7UUFFL0MsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLFNBQVMsR0FBRyxLQUFLLEdBQUcsZ0NBQWdDLEVBQUUsVUFBUyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU07Z0JBRW5ILEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUVoQixDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUVKLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxHQUFHLHFCQUFxQixFQUFFLFVBQVMs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bGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFByb21pc2UgZnJvbSBcImJsdWViaXJkXCI7XG5pbXBvcnQgKiBhcyBwYXRoRXhpc3RzIGZyb20gXCJwYXRoLWV4aXN0c1wiO1xuaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuXG5pbXBvcnQgbHNEaXNrcyA9IHJlcXVpcmUoXCJscy1kaXNrc1wiKTtcblxubGV0IGV4ZWMgPSBjaGlsZF9wcm9jZXNzLmV4ZWM7XG5sZXQgc3Bhd24gPSBjaGlsZF9wcm9jZXNzLnNwYXduO1xuXG5mdW5jdGlvbiBzaGFjaGVjayhwYXRoOiBzdHJpbmcsIGJzPzogbnVtYmVyLCBjb3VudD86IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAgIGlmIChicyAmJiBjb3VudCkge1xuICAgICAgICAgICAgZXhlYyhcImRkIGlmPVwiICsgcGF0aCArIFwiIGJzPVwiICsgYnMgKyBcIiBjb3VudD1cIiArIGNvdW50ICsgXCIgfCBzaGExc3VtIHxhd2sgJ3twcmludCgkMSl9JyBcIiwgZnVuY3Rpb24oZXJyLCBzdGRvdXQsIHN0ZGVycikge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudG9TdHJpbmcoXCJ1dGYtOFwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGVjKFwic2hhMXN1bSBcIiArIHBhdGggKyBcIiB8YXdrICd7cHJpbnQoJDEpfSdcIiwgZnVuY3Rpb24oZXJyLCBzdGRvdXQsIHN0ZGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHN0ZGVycik7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRvU3RyaW5nKFwidXRmLThcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpbGVzaXplKGZpbGU6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxudW1iZXI+KGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBleGVjKFwiZHUgLWIgXCIgKyBmaWxlLCBmdW5jdGlvbihlcnIsIHN0ZG91dCwgc3RkZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChzdGRlcnIpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocGFyc2VJbnQoc3Rkb3V0LnRvU3RyaW5nKFwidXRmLThcIikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cblxuXG5cblxuZnVuY3Rpb24gZnJlZXNwYWNlKGZpbGU6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxudW1iZXI+KGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBsZXQgZm9sZGVyID0gZmlsZS5yZXBsYWNlKFwiL1wiICsgZmlsZS5zcGxpdChcIi9cIilbZmlsZS5zcGxpdChcIi9cIikubGVuZ3RoIC0gMV0sIFwiXCIpO1xuICAgICAgICBleGVjKFwiZGYgLWsgXCIgKyBmb2xkZXIgKyBcInwgdGFpbCAtMSB8IGF3ayB7J3ByaW50JCg0KSd9XCIsIGZ1bmN0aW9uKGVyciwgc3Rkb3V0LCBzdGRlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHN0ZGVycik7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coc3Rkb3V0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHBhcnNlSW50KHN0ZG91dC50b1N0cmluZyhcInV0Zi04XCIpKSAqIDEwMjQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBjaGVja3NwYWNlKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgICBsZXQgbHNkaXNrcyA9IGxzRGlza3MuYWxsKCk7XG4gICAgbGV0IGRpc2tkZXN0OiBJRGlzaztcbiAgICBsZXQgZGlza3NvdXJjZTogSURpc2s7XG5cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbHNkaXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc291cmNlID09PSBsc2Rpc2tzW2ldLmRpc2spIHtcbiAgICAgICAgICAgIGRpc2tzb3VyY2UgPSBsc2Rpc2tzW2ldO1xuICAgICAgICB9IGVsc2UgaWYgKGRlc3QgPT09IGxzZGlza3NbaV0uZGlzaykge1xuICAgICAgICAgICAgZGlza2Rlc3QgPSBsc2Rpc2tzW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmIChzb3VyY2Uuc3BsaXQoXCJkZXYvXCIpLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgaWYgKGRlc3Quc3BsaXQoXCJkZXYvXCIpLmxlbmd0aCA9PT0gMikge1xuXG5cblxuICAgICAgICAgICAgICAgIGlmIChkaXNrc291cmNlLnVzZWRfYmxvY2tzIDwgZGlza2Rlc3Quc2VjdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInNpemUgb2tcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwiaW5zdWZmaWNpZW50IHNwYWNlIG9uIFwiICsgZGVzdCk7XG4gICAgICAgICAgICAgICAgfVxuXG5cblxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgZnJlZXNwYWNlKGRlc3QpLnRoZW4oZnVuY3Rpb24oc2l6ZWRlc3QpIHtcblxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImZyZWUgc3BhY2UgaXMgXCIgKyBzaXplZGVzdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2tzb3VyY2UudXNlZF9ibG9ja3MgKiBkaXNrc291cmNlLmJsb2NrIDwgc2l6ZWRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJpbnN1ZmZpY2llbnQgc3BhY2Ugb24gXCIgKyBkZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsZXNpemUoc291cmNlKS50aGVuKGZ1bmN0aW9uKHNpemVzb3VyY2UpIHtcblxuICAgICAgICAgICAgICAgIGlmIChkZXN0LnNwbGl0KFwiZGV2L1wiKS5sZW5ndGggPT09IDIpIHtcblxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplc291cmNlIDwgZGlza2Rlc3Quc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChcImluc3VmZmljaWVudCBzcGFjZSBvbiBcIiArIGRlc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgZnJlZXNwYWNlKGRlc3QpLnRoZW4oZnVuY3Rpb24oc2l6ZWRlc3QpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVzb3VyY2UgPCBzaXplZGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChcImluc3VmZmljaWVudCBzcGFjZSBvbiBcIiArIGRlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHVtb3VudF9kcml2ZShkaXNrKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBleGVjKFwiY2F0IC9wcm9jL21vdW50cyB8IGdyZXAgXCIgKyBkaXNrICsgXCIgfCBhd2sgeydwcmludCQoMSknfVwiLCBmdW5jdGlvbihlcnIsIHN0ZG91dCwgc3RkZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChzdGRlcnIpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBkcml2ZXMgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGxldCBmZGlza3N0cmluZyA9IHN0ZG91dC50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgICAgICAgICAgICAgIGxldCBmZGlza2xpbmVzID0gZmRpc2tzdHJpbmcuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZGlza2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyaXZlcyA9IGRyaXZlcyArIGZkaXNrbGluZXNbaV0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmRpc2tsaW5lc1swXSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInVtb3VudCBwYXJ0aXRpb25zOiBcIiArIGRyaXZlcyk7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWMoXCJ1bW91bnQgXCIgKyBkcml2ZXMsIGZ1bmN0aW9uKGVyciwgc3Rkb3V0LCBzdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHN0ZGVycik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiB1bW91bnRhbGwoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5zcGxpdChcImRldi9cIikubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB1bW91bnRfZHJpdmUoc291cmNlKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmIChkZXN0LnNwbGl0KFwiZGV2L1wiKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgdW1vdW50X2RyaXZlKGRlc3QpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGVzdC5zcGxpdChcImRldi9cIikubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgdW1vdW50X2RyaXZlKGRlc3QpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuXG5cbiAgICB9KTtcbn1cblxuaW50ZXJmYWNlIElQYXJ0aXRpb24ge1xuICAgIHBhcnRpdGlvbjogc3RyaW5nO1xuICAgIHNlY3RvcnM6IG51bWJlcjtcbiAgICBzZWN0b3JzX3N0YXJ0OiBudW1iZXI7XG4gICAgc2VjdG9yc19zdG9wOiBudW1iZXI7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIGJvb3Q6IGJvb2xlYW47XG4gICAgc2l6ZTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSURpc2sge1xuICAgIGRpc2s6IHN0cmluZztcbiAgICBzZWN0b3JzOiBudW1iZXI7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIHBhcnRpdGlvbnM6IElQYXJ0aXRpb25bXTtcbiAgICBibG9jazogbnVtYmVyO1xuICAgIHVzZWRfYmxvY2tzOiBudW1iZXI7XG59XG5cbmV4cG9ydCA9IGZ1bmN0aW9uKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcsIHByb2dyZXNzPzogRnVuY3Rpb24pIHtcbiAgICBjb25zb2xlLmxvZyhcInN0YXJ0aW5nXCIpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXBhdGhFeGlzdHMuc3luYyhzb3VyY2UpKSB7XG4gICAgICAgICAgICByZWplY3QoXCJtaXNzaW5nIHNvdXJjZVwiKTtcbiAgICAgICAgfSBlbHNlIGlmICghZGVzdCkge1xuICAgICAgICAgICAgcmVqZWN0KFwibWlzc2luZyBkZXN0XCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGRlc3Quc3BsaXQoXCJkZXYvXCIpLmxlbmd0aCA9PT0gMiAmJiAhcGF0aEV4aXN0cy5zeW5jKGRlc3QpKSB7XG4gICAgICAgICAgICByZWplY3QoXCJtaXNzaW5nIGRlc3RcIik7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIGxldCBsc2Rpc2tzOiBJRGlza1tdID0gbHNEaXNrcy5hbGwoKTtcbiAgICAgICAgICAgIGxldCBkaXNrZGVzdDogSURpc2s7XG4gICAgICAgICAgICBsZXQgZGlza3NvdXJjZTogSURpc2s7XG5cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsc2Rpc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gbHNkaXNrc1tpXS5kaXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc2tzb3VyY2UgPSBsc2Rpc2tzW2ldO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdCA9PT0gbHNkaXNrc1tpXS5kaXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc2tkZXN0ID0gbHNkaXNrc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuXG5cbiAgICAgICAgICAgIHVtb3VudGFsbChzb3VyY2UsIGRlc3QpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjaGVja2luZyBzcGFjZS4uLlwiKTtcbiAgICAgICAgICAgICAgICBjaGVja3NwYWNlKHNvdXJjZSwgZGVzdCkudGhlbihmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNsb25pbmcuLi5cIik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5zcGxpdChcImRldi9cIikubGVuZ3RoID09PSAyKSB7XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IENsb25lQ21kID0gXCJkZCBpZj1cIiArIHNvdXJjZSArIFwiIGJzPVwiICsgZGlza3NvdXJjZS5ibG9jayArIFwiIGNvdW50PVwiICsgZGlza3NvdXJjZS51c2VkX2Jsb2NrcyArIFwiIG9mPVwiICsgZGVzdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coQ2xvbmVDbWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFjaGVjayhzb3VyY2UsIGRpc2tzb3VyY2UuYmxvY2ssIGRpc2tzb3VyY2UudXNlZF9ibG9ja3MpLnRoZW4oZnVuY3Rpb24oc2hhMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoQ2xvbmVDbWQsIGZ1bmN0aW9uKGVyciwgc3Rkb3V0LCBzdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWNoZWNrKGRlc3QsIGRpc2tzb3VyY2UuYmxvY2ssIGRpc2tzb3VyY2UudXNlZF9ibG9ja3MpLnRoZW4oZnVuY3Rpb24oc2hhMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGExID09PSBzaGEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwic2hhc3VtIGRvbid0IG1hdGNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IENsb25lQ21kID0gXCJkZCBpZj1cIiArIHNvdXJjZSArIFwiIG9mPVwiICsgZGVzdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coQ2xvbmVDbWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFjaGVjayhzb3VyY2UpLnRoZW4oZnVuY3Rpb24oc2hhMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2hhc3VtIFwiICsgc291cmNlICsgXCI6IFwiICsgc2hhMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYyhDbG9uZUNtZCwgZnVuY3Rpb24oZXJyLCBzdGRvdXQsIHN0ZGVycikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdC5zcGxpdChcImRldi9cIikubGVuZ3RoID09PSAyKSB7XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzaXplKHNvdXJjZSkudGhlbihmdW5jdGlvbihzaXplc291cmNlKSB7XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc2Rpc2tzID0gbHNEaXNrcy5hbGwoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxzZGlza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IGxzZGlza3NbaV0uZGlzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2tzb3VyY2UgPSBsc2Rpc2tzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0ID09PSBsc2Rpc2tzW2ldLmRpc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrZGVzdCA9IGxzZGlza3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXG5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJicz0gXCIgKyBkaXNrZGVzdC5ibG9jayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY291bnQ9IFwiICsgZGlza2Rlc3QudXNlZF9ibG9ja3MpO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhY2hlY2soZGVzdCwgZGlza2Rlc3QuYmxvY2ssIGRpc2tkZXN0LnVzZWRfYmxvY2tzKS50aGVuKGZ1bmN0aW9uKHNoYTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2hhc3VtIFwiICsgZGVzdCArIFwiOiBcIiArIHNoYTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYTEgPT09IHNoYTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCJzaGFzdW0gZG9uJ3QgbWF0Y2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG5cblxuXG5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhY2hlY2soZGVzdCkudGhlbihmdW5jdGlvbihzaGEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2hhc3VtIFwiICsgZGVzdCArIFwiOiBcIiArIHNoYTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhMSA9PT0gc2hhMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChcInNoYXN1bSBkb24ndCBtYXRjaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICB9XG4gICAgfSk7XG5cblxuXG59XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=