faastjs
Version:
Serverless batch computing made simple.
244 lines • 31.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ava_1 = tslib_1.__importDefault(require("ava"));
const serialize_1 = require("../src/serialize");
const shared_1 = require("../src/shared");
const util_1 = require("./fixtures/util");
(0, ava_1.default)("deepCopyUndefined copies undefined properties", t => {
const obj = { prop: undefined };
const obj2 = {};
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deepCopyUndefined copies nested undefined properties", t => {
const obj = { outer: { inner: undefined } };
const obj2 = { outer: {} };
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deepCopyUndefined should not hang on cyclical references", t => {
const obj = { ref: {} };
obj.ref = obj;
const obj2 = { ref: {} };
obj2.ref = obj2;
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deepCopyUndefined copies symbol properties", t => {
const obj = { [Symbol()]: "value" };
const obj2 = {};
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deepCopyUndefined copies symbol values", t => {
const obj = { symbolValuedKey: Symbol() };
const obj2 = {};
(0, serialize_1.deepCopyUndefined)(obj2, obj);
t.deepEqual(obj2, obj);
});
(0, ava_1.default)("deep copy should not fail when objects are not shaped similarly", t => {
const obj = { geometry: { theorem: { name: "Pythagorean" } } };
const obj2 = { hypothesis: "Riemann" };
t.notThrows(() => (0, serialize_1.deepCopyUndefined)(obj2, obj));
});
function check(t, values) {
const stat = new shared_1.Statistics();
values.forEach(value => stat.update(value));
t.true(Math.abs(stat.mean - (0, util_1.avg)(values)) < 0.000000001);
t.true(Math.abs(stat.stdev - (0, util_1.stdev)(values)) < 0.000000001);
t.is(stat.samples, values.length);
}
(0, ava_1.default)("statistics empty values", t => {
const emptyStat = new shared_1.Statistics();
t.is(emptyStat.mean, NaN);
t.is(emptyStat.stdev, 0);
t.is(emptyStat.samples, 0);
});
(0, ava_1.default)("statistics single values", t => {
check(t, [0]);
check(t, [1]);
check(t, [-1]);
check(t, [0.5]);
check(t, [-0.5]);
check(t, [0.1]);
check(t, [-0.1]);
});
(0, ava_1.default)("statistics multiple values", t => {
check(t, [0, 1]);
check(t, [0, 1, 2]);
check(t, [42, 100, 1000]);
check(t, [1, 0.1]);
check(t, [-0.5, 0.5]);
check(t, [-1, 1]);
check(t, [3.14159, 2.717]);
});
(0, ava_1.default)("statistics random values", t => {
const a = [];
const b = [];
const c = [];
for (let i = 0; i < 1000; i++) {
a.push(Math.random());
b.push(Math.random() * 10);
c.push(Math.random() * 100);
}
check(t, a);
check(t, b);
check(t, c);
});
(0, ava_1.default)(`statistics clone`, t => {
const stats = new shared_1.Statistics();
stats.update(10);
stats.update(100);
stats.update(5);
const cloned = stats.clone();
t.deepEqual(cloned, stats);
t.is(cloned.toString(), stats.toString());
cloned.update(42);
t.true(cloned.mean !== stats.mean);
t.true(cloned.stdev !== stats.stdev);
t.is(stats.samples, 3);
t.is(cloned.samples, 4);
});
(0, ava_1.default)("MaxHeap basics", t => {
const h = new shared_1.MaxHeap();
h.insert(5);
h.insert(10);
h.insert(100);
h.insert(1);
t.is(h.extractMax(), 100);
t.is(h.extractMax(), 10);
t.is(h.extractMax(), 5);
t.is(h.extractMax(), 1);
t.throws(() => h.extractMax(), { message: /empty/ });
});
(0, ava_1.default)("MaxHeap empty", t => {
const h = new shared_1.MaxHeap();
t.throws(() => h.extractMax(), { message: /empty/ });
});
(0, ava_1.default)("MaxHeap sorting", t => {
const h = new shared_1.MaxHeap();
const N = 10000;
const size = 100;
for (let attempt = 0; attempt < N; attempt++) {
let orig = [];
const a = [];
for (let i = 0; i < size; i++) {
const value = Math.round(Math.random() * 1000);
a.push(value);
h.insert(value);
}
orig = a.slice();
a.sort((x, y) => y - x);
const b = [];
while (h.size > 0) {
b.push(h.extractMax());
}
t.deepEqual(a, b, `difference sorting ${orig}`);
}
});
(0, ava_1.default)("MaxHeap specific ordering", t => {
const h = new shared_1.MaxHeap();
h.insert(7);
h.insert(2);
h.insert(0);
h.insert(3);
h.insert(4);
h.insert(1);
h.insert(6);
h.insert(5);
t.is(h.extractMax(), 7);
t.is(h.extractMax(), 6);
t.is(h.extractMax(), 5);
t.is(h.extractMax(), 4);
t.is(h.extractMax(), 3);
t.is(h.extractMax(), 2);
t.is(h.extractMax(), 1);
t.is(h.extractMax(), 0);
});
(0, ava_1.default)("MaxHeap iterator", t => {
const h = new shared_1.MaxHeap();
h.insert(10);
h.insert(42);
h.insert(12);
t.deepEqual([...h], [42, 10, 12]);
});
(0, ava_1.default)("SmallestN saves smallest N keys", t => {
const s = new shared_1.SmallestN(3);
s.update(100);
s.update(42);
s.update(-1);
s.update(0);
s.update(4);
s.update(1000);
t.deepEqual(s.keys().sort(), [-1, 0, 4].sort());
});
(0, ava_1.default)("SmallestN saves smallest N values", t => {
const N = 3;
const s = new shared_1.SmallestN(N);
s.update(100, "100");
s.update(42, "42");
s.update(-1, "-1");
s.update(0, "0");
s.update(4, "4");
s.update(1000, "1000");
t.deepEqual([...s], [
[-1, "-1"],
[0, "0"],
[4, "4"]
]);
});
(0, ava_1.default)("SmallestN duplicate values", t => {
const N = 5;
const s = new shared_1.SmallestN(N);
s.update(88, "88.1");
s.update(88, "88.2");
s.update(88, "88.3");
s.update(42, "42");
s.update(88, "88.4");
s.update(88, "88.5");
s.update(88, "88.6");
s.update(10, "10.1");
s.update(10, "10.2");
s.update(88, "88.7");
s.update(88, "88.8");
t.deepEqual([...s], [
[88, "88.1"],
[88, "88.2"],
[42, "42"],
[10, "10.1"],
[10, "10.2"]
]);
});
function vals(a) {
return a.map(i => [i, undefined]);
}
(0, ava_1.default)("SmallestN can reduce size", t => {
const N = 5;
const s = new shared_1.SmallestN(N);
s.update(1);
s.update(2);
s.update(3);
s.update(4);
s.update(5);
s.update(6);
s.update(7);
s.setSize(3);
t.deepEqual([...s], vals([1, 2, 3]));
});
(0, ava_1.default)("SmallestN can increase size", t => {
const N = 3;
const s = new shared_1.SmallestN(N);
s.update(1);
s.update(2);
s.update(3);
s.update(4);
s.update(5);
t.deepEqual([...s], vals([1, 2, 3]));
s.setSize(5);
s.update(6);
s.update(7);
s.update(8);
t.deepEqual([...s], vals([1, 2, 3, 6, 7]));
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC1zaGFyZWQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdW5pdC1zaGFyZWQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBdUM7QUFDdkMsZ0RBQXFEO0FBQ3JELDBDQUErRDtBQUMvRCwwQ0FBNkM7QUFFN0MsSUFBQSxhQUFJLEVBQUMsK0NBQStDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDdEQsTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUEsNkJBQWlCLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsc0RBQXNELEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDN0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMzQixJQUFBLDZCQUFpQixFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDBEQUEwRCxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ2pFLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3hCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRWQsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENB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QUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ25DLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25CLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENB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LGFBQUksRUFBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixNQUFNLENBQUMsR0FBRyxJQUFJLGtCQUFTLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLFNBQVMsQ0FDUCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ047UUFDSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7UUFDWixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7UUFDWixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUM7UUFDVixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7UUFDWixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7S0FDZixDQUNKLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsSUFBSSxDQUFDLENBQVc7SUFDckIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUF3QixDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELElBQUEsYUFBSSxFQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLE1BQU0sQ0FBQyxHQUFHLElBQUksa0JBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRVosQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsNkJBQTZCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osTUFBTSxDQUFDLEdBQUcsSUFBSSxrQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFckMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGVzdCwgeyBBc3NlcnRpb25zIH0gZnJvbSBcImF2YVwiO1xuaW1wb3J0IHsgZGVlcENvcHlVbmRlZmluZWQgfSBmcm9tIFwiLi4vc3JjL3NlcmlhbGl6ZVwiO1xuaW1wb3J0IHsgTWF4SGVhcCwgU21hbGxlc3ROLCBTdGF0aXN0aWNzIH0gZnJvbSBcIi4uL3NyYy9zaGFyZWRcIjtcbmltcG9ydCB7IGF2Zywgc3RkZXYgfSBmcm9tIFwiLi9maXh0dXJlcy91dGlsXCI7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBjb3BpZXMgdW5kZWZpbmVkIHByb3BlcnRpZXNcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBwcm9wOiB1bmRlZmluZWQgfTtcbiAgICBjb25zdCBvYmoyID0ge307XG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBjb3BpZXMgbmVzdGVkIHVuZGVmaW5lZCBwcm9wZXJ0aWVzXCIsIHQgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHsgb3V0ZXI6IHsgaW5uZXI6IHVuZGVmaW5lZCB9IH07XG4gICAgY29uc3Qgb2JqMiA9IHsgb3V0ZXI6IHt9IH07XG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBzaG91bGQgbm90IGhhbmcgb24gY3ljbGljYWwgcmVmZXJlbmNlc1wiLCB0ID0+IHtcbiAgICBjb25zdCBvYmogPSB7IHJlZjoge30gfTtcbiAgICBvYmoucmVmID0gb2JqO1xuXG4gICAgY29uc3Qgb2JqMiA9IHsgcmVmOiB7fSB9O1xuICAgIG9iajIucmVmID0gb2JqMjtcblxuICAgIGRlZXBDb3B5VW5kZWZpbmVkKG9iajIsIG9iaik7XG4gICAgdC5kZWVwRXF1YWwob2JqMiwgb2JqKTtcbn0pO1xuXG50ZXN0KFwiZGVlcENvcHlVbmRlZmluZWQgY29waWVzIHN5bWJvbCBwcm9wZXJ0aWVzXCIsIHQgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHsgW1N5bWJvbCgpXTogXCJ2YWx1ZVwiIH07XG4gICAgY29uc3Qgb2JqMiA9IHt9O1xuICAgIGRlZXBDb3B5VW5kZWZpbmVkKG9iajIsIG9iaik7XG4gICAgdC5kZWVwRXF1YWwob2JqMiwgb2JqKTtcbn0pO1xuXG50ZXN0KFwiZGVlcENvcHlVbmRlZmluZWQgY29waWVzIHN5bWJvbCB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBzeW1ib2xWYWx1ZWRLZXk6IFN5bWJvbCgpIH07XG4gICAgY29uc3Qgb2JqMiA9IHt9O1xuICAgIGRlZXBDb3B5VW5kZWZpbmVkKG9iajIsIG9iaik7XG4gICAgdC5kZWVwRXF1YWwob2JqMiwgb2JqKTtcbn0pO1xuXG50ZXN0KFwiZGVlcCBjb3B5IHNob3VsZCBub3QgZmFpbCB3aGVuIG9iamVjdHMgYXJlIG5vdCBzaGFwZWQgc2ltaWxhcmx5XCIsIHQgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHsgZ2VvbWV0cnk6IHsgdGhlb3JlbTogeyBuYW1lOiBcIlB5dGhhZ29yZWFuXCIgfSB9IH07XG4gICAgY29uc3Qgb2JqMiA9IHsgaHlwb3RoZXNpczogXCJSaWVtYW5uXCIgfTtcbiAgICB0Lm5vdFRocm93cygoKSA9PiBkZWVwQ29weVVuZGVmaW5lZChvYmoyLCBvYmopKTtcbn0pO1xuXG5mdW5jdGlvbiBjaGVjayh0OiBBc3NlcnRpb25zLCB2YWx1ZXM6IG51bWJlcltdKSB7XG4gICAgY29uc3Qgc3RhdCA9IG5ldyBTdGF0aXN0aWNzKCk7XG4gICAgdmFsdWVzLmZvckVhY2godmFsdWUgPT4gc3RhdC51cGRhdGUodmFsdWUpKTtcbiAgICB0LnRydWUoTWF0aC5hYnMoc3RhdC5tZWFuIC0gYXZnKHZhbHVlcykpIDwgMC4wMDAwMDAwMDEpO1xuICAgIHQudHJ1ZShNYXRoLmFicyhzdGF0LnN0ZGV2IC0gc3RkZXYodmFsdWVzKSkgPCAwLjAwMDAwMDAwMSk7XG4gICAgdC5pcyhzdGF0LnNhbXBsZXMsIHZhbHVlcy5sZW5ndGgpO1xufVxuXG50ZXN0KFwic3RhdGlzdGljcyBlbXB0eSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3QgZW1wdHlTdGF0ID0gbmV3IFN0YXRpc3RpY3MoKTtcbiAgICB0LmlzKGVtcHR5U3RhdC5tZWFuLCBOYU4pO1xuICAgIHQuaXMoZW1wdHlTdGF0LnN0ZGV2LCAwKTtcbiAgICB0LmlzKGVtcHR5U3RhdC5zYW1wbGVzLCAwKTtcbn0pO1xuXG50ZXN0KFwic3RhdGlzdGljcyBzaW5nbGUgdmFsdWVzXCIsIHQgPT4ge1xuICAgIGNoZWNrKHQsIFswXSk7XG4gICAgY2hlY2sodCwgWzFdKTtcbiAgICBjaGVjayh0LCBbLTFdKTtcbiAgICBjaGVjayh0LCBbMC41XSk7XG4gICAgY2hlY2sodCwgWy0wLjVdKTtcbiAgICBjaGVjayh0LCBbMC4xXSk7XG4gICAgY2hlY2sodCwgWy0wLjFdKTtcbn0pO1xuXG50ZXN0KFwic3RhdGlzdGljcyBtdWx0aXBsZSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY2hlY2sodCwgWzAsIDFdKTtcbiAgICBjaGVjayh0LCBbMCwgMSwgMl0pO1xuICAgIGNoZWNrKHQsIFs0MiwgMTAwLCAxMDAwXSk7XG4gICAgY2hlY2sodCwgWzEsIDAuMV0pO1xuICAgIGNoZWNrKHQsIFstMC41LCAwLjVdKTtcbiAgICBjaGVjayh0LCBbLTEsIDFdKTtcbiAgICBjaGVjayh0LCBbMy4xNDE1OSwgMi43MTddKTtcbn0pO1xuXG50ZXN0KFwic3RhdGlzdGljcyByYW5kb20gdmFsdWVzXCIsIHQgPT4ge1xuICAgIGNvbnN0IGEgPSBbXTtcbiAgICBjb25zdCBiID0gW107XG4gICAgY29uc3QgYyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7XG4gICAgICAgIGEucHVzaChNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgYi5wdXNoKE1hdGgucmFuZG9tKCkgKiAxMCk7XG4gICAgICAgIGMucHVzaChNYXRoLnJhbmRvbSgpICogMTAwKTtcbiAgICB9XG4gICAgY2hlY2sodCwgYSk7XG4gICAgY2hlY2sodCwgYik7XG4gICAgY2hlY2sodCwgYyk7XG59KTtcblxudGVzdChgc3RhdGlzdGljcyBjbG9uZWAsIHQgPT4ge1xuICAgIGNvbnN0IHN0YXRzID0gbmV3IFN0YXRpc3RpY3MoKTtcbiAgICBzdGF0cy51cGRhdGUoMTApO1xuICAgIHN0YXRzLnVwZGF0ZSgxMDApO1xuICAgIHN0YXRzLnVwZGF0ZSg1KTtcblxuICAgIGNvbnN0IGNsb25lZCA9IHN0YXRzLmNsb25lKCk7XG4gICAgdC5kZWVwRXF1YWwoY2xvbmVkLCBzdGF0cyk7XG4gICAgdC5pcyhjbG9uZWQudG9TdHJpbmcoKSwgc3RhdHMudG9TdHJpbmcoKSk7XG4gICAgY2xvbmVkLnVwZGF0ZSg0Mik7XG4gICAgdC50cnVlKGNsb25lZC5tZWFuICE9PSBzdGF0cy5tZWFuKTtcbiAgICB0LnRydWUoY2xvbmVkLnN0ZGV2ICE9PSBzdGF0cy5zdGRldik7XG4gICAgdC5pcyhzdGF0cy5zYW1wbGVzLCAzKTtcbiAgICB0LmlzKGNsb25lZC5zYW1wbGVzLCA0KTtcbn0pO1xuXG50ZXN0KFwiTWF4SGVhcCBiYXNpY3NcIiwgdCA9PiB7XG4gICAgY29uc3QgaCA9IG5ldyBNYXhIZWFwKCk7XG4gICAgaC5pbnNlcnQoNSk7XG4gICAgaC5pbnNlcnQoMTApO1xuICAgIGguaW5zZXJ0KDEwMCk7XG4gICAgaC5pbnNlcnQoMSk7XG5cbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAxMDApO1xuICAgIHQuaXMoaC5leHRyYWN0TWF4KCksIDEwKTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA1KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAxKTtcbiAgICB0LnRocm93cygoKSA9PiBoLmV4dHJhY3RNYXgoKSwgeyBtZXNzYWdlOiAvZW1wdHkvIH0pO1xufSk7XG5cbnRlc3QoXCJNYXhIZWFwIGVtcHR5XCIsIHQgPT4ge1xuICAgIGNvbnN0IGggPSBuZXcgTWF4SGVhcCgpO1xuICAgIHQudGhyb3dzKCgpID0+IGguZXh0cmFjdE1heCgpLCB7IG1lc3NhZ2U6IC9lbXB0eS8gfSk7XG59KTtcblxudGVzdChcIk1heEhlYXAgc29ydGluZ1wiLCB0ID0+IHtcbiAgICBjb25zdCBoID0gbmV3IE1heEhlYXAoKTtcbiAgICBjb25zdCBOID0gMTAwMDA7XG4gICAgY29uc3Qgc2l6ZSA9IDEwMDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgTjsgYXR0ZW1wdCsrKSB7XG4gICAgICAgIGxldCBvcmlnOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBjb25zdCBhOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMDAwKTtcbiAgICAgICAgICAgIGEucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBoLmluc2VydCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgb3JpZyA9IGEuc2xpY2UoKTtcbiAgICAgICAgYS5zb3J0KCh4LCB5KSA9PiB5IC0geCk7XG4gICAgICAgIGNvbnN0IGIgPSBbXTtcbiAgICAgICAgd2hpbGUgKGguc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGIucHVzaChoLmV4dHJhY3RNYXgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdC5kZWVwRXF1YWwoYSwgYiwgYGRpZmZlcmVuY2Ugc29ydGluZyAke29yaWd9YCk7XG4gICAgfVxufSk7XG5cbnRlc3QoXCJNYXhIZWFwIHNwZWNpZmljIG9yZGVyaW5nXCIsIHQgPT4ge1xuICAgIGNvbnN0IGggPSBuZXcgTWF4SGVhcCgpO1xuICAgIGguaW5zZXJ0KDcpO1xuICAgIGguaW5zZXJ0KDIpO1xuICAgIGguaW5zZXJ0KDApO1xuICAgIGguaW5zZXJ0KDMpO1xuICAgIGguaW5zZXJ0KDQpO1xuICAgIGguaW5zZXJ0KDEpO1xuICAgIGguaW5zZXJ0KDYpO1xuICAgIGguaW5zZXJ0KDUpO1xuXG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgNyk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgNik7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgNSk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgNCk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMyk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMik7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMSk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMCk7XG59KTtcblxudGVzdChcIk1heEhlYXAgaXRlcmF0b3JcIiwgdCA9PiB7XG4gICAgY29uc3QgaCA9IG5ldyBNYXhIZWFwKCk7XG4gICAgaC5pbnNlcnQoMTApO1xuICAgIGguaW5zZXJ0KDQyKTtcbiAgICBoLmluc2VydCgxMik7XG4gICAgdC5kZWVwRXF1YWwoWy4uLmhdLCBbNDIsIDEwLCAxMl0pO1xufSk7XG5cbnRlc3QoXCJTbWFsbGVzdE4gc2F2ZXMgc21hbGxlc3QgTiBrZXlzXCIsIHQgPT4ge1xuICAgIGNvbnN0IHMgPSBuZXcgU21hbGxlc3ROKDMpO1xuICAgIHMudXBkYXRlKDEwMCk7XG4gICAgcy51cGRhdGUoNDIpO1xuICAgIHMudXBkYXRlKC0xKTtcbiAgICBzLnVwZGF0ZSgwKTtcbiAgICBzLnVwZGF0ZSg0KTtcbiAgICBzLnVwZGF0ZSgxMDAwKTtcbiAgICB0LmRlZXBFcXVhbChzLmtleXMoKS5zb3J0KCksIFstMSwgMCwgNF0uc29ydCgpKTtcbn0pO1xuXG50ZXN0KFwiU21hbGxlc3ROIHNhdmVzIHNtYWxsZXN0IE4gdmFsdWVzXCIsIHQgPT4ge1xuICAgIGNvbnN0IE4gPSAzO1xuICAgIGNvbnN0IHMgPSBuZXcgU21hbGxlc3ROPHN0cmluZz4oTik7XG4gICAgcy51cGRhdGUoMTAwLCBcIjEwMFwiKTtcbiAgICBzLnVwZGF0ZSg0MiwgXCI0MlwiKTtcbiAgICBzLnVwZGF0ZSgtMSwgXCItMVwiKTtcbiAgICBzLnVwZGF0ZSgwLCBcIjBcIik7XG4gICAgcy51cGRhdGUoNCwgXCI0XCIpO1xuICAgIHMudXBkYXRlKDEwMDAsIFwiMTAwMFwiKTtcbiAgICB0LmRlZXBFcXVhbChcbiAgICAgICAgWy4uLnNdLFxuICAgICAgICBbXG4gICAgICAgICAgICBbLTEsIFwiLTFcIl0sXG4gICAgICAgICAgICBbMCwgXCIwXCJdLFxuICAgICAgICAgICAgWzQsIFwiNFwiXVxuICAgICAgICBdXG4gICAgKTtcbn0pO1xuXG50ZXN0KFwiU21hbGxlc3ROIGR1cGxpY2F0ZSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3QgTiA9IDU7XG4gICAgY29uc3QgcyA9IG5ldyBTbWFsbGVzdE48c3RyaW5nPihOKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC4xXCIpO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjJcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguM1wiKTtcbiAgICBzLnVwZGF0ZSg0MiwgXCI0MlwiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC40XCIpO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjVcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguNlwiKTtcbiAgICBzLnVwZGF0ZSgxMCwgXCIxMC4xXCIpO1xuICAgIHMudXBkYXRlKDEwLCBcIjEwLjJcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguN1wiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC44XCIpO1xuICAgIHQuZGVlcEVxdWFsKFxuICAgICAgICBbLi4uc10sXG4gICAgICAgIFtcbiAgICAgICAgICAgIFs4OCwgXCI4OC4xXCJdLFxuICAgICAgICAgICAgWzg4LCBcIjg4LjJcIl0sXG4gICAgICAgICAgICBbNDIsIFwiNDJcIl0sXG4gICAgICAgICAgICBbMTAsIFwiMTAuMVwiXSxcbiAgICAgICAgICAgIFsxMCwgXCIxMC4yXCJdXG4gICAgICAgIF1cbiAgICApO1xufSk7XG5cbmZ1bmN0aW9uIHZhbHMoYTogbnVtYmVyW10pOiBbbnVtYmVyLCB1bmRlZmluZWRdW10ge1xuICAgIHJldHVybiBhLm1hcChpID0+IFtpLCB1bmRlZmluZWRdIGFzIFtudW1iZXIsIHVuZGVmaW5lZF0pO1xufVxuXG50ZXN0KFwiU21hbGxlc3ROIGNhbiByZWR1Y2Ugc2l6ZVwiLCB0ID0+IHtcbiAgICBjb25zdCBOID0gNTtcbiAgICBjb25zdCBzID0gbmV3IFNtYWxsZXN0TihOKTtcbiAgICBzLnVwZGF0ZSgxKTtcbiAgICBzLnVwZGF0ZSgyKTtcbiAgICBzLnVwZGF0ZSgzKTtcbiAgICBzLnVwZGF0ZSg0KTtcbiAgICBzLnVwZGF0ZSg1KTtcbiAgICBzLnVwZGF0ZSg2KTtcbiAgICBzLnVwZGF0ZSg3KTtcblxuICAgIHMuc2V0U2l6ZSgzKTtcbiAgICB0LmRlZXBFcXVhbChbLi4uc10sIHZhbHMoWzEsIDIsIDNdKSk7XG59KTtcblxudGVzdChcIlNtYWxsZXN0TiBjYW4gaW5jcmVhc2Ugc2l6ZVwiLCB0ID0+IHtcbiAgICBjb25zdCBOID0gMztcbiAgICBjb25zdCBzID0gbmV3IFNtYWxsZXN0TihOKTtcbiAgICBzLnVwZGF0ZSgxKTtcbiAgICBzLnVwZGF0ZSgyKTtcbiAgICBzLnVwZGF0ZSgzKTtcbiAgICBzLnVwZGF0ZSg0KTtcbiAgICBzLnVwZGF0ZSg1KTtcbiAgICB0LmRlZXBFcXVhbChbLi4uc10sIHZhbHMoWzEsIDIsIDNdKSk7XG5cbiAgICBzLnNldFNpemUoNSk7XG4gICAgcy51cGRhdGUoNik7XG4gICAgcy51cGRhdGUoNyk7XG4gICAgcy51cGRhdGUoOCk7XG4gICAgdC5kZWVwRXF1YWwoWy4uLnNdLCB2YWxzKFsxLCAyLCAzLCA2LCA3XSkpO1xufSk7XG4iXX0=