UNPKG

21.1 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const client_common_1 = require("@neo-one/client-common");
5const bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js"));
6const bn_js_1 = require("bn.js");
7const crypto_1 = require("crypto");
8const lodash_1 = tslib_1.__importDefault(require("lodash"));
9const toASCII = (bytes) => {
10 let result = '';
11 lodash_1.default.range(bytes.length).forEach((i) => {
12 result += String.fromCharCode(bytes.readUInt8(i));
13 });
14 return result;
15};
16const toUTF8 = (bytes) => bytes.toString('utf8');
17const calculateClaimAmount = async ({ coins, decrementInterval, generationAmount, getSystemFee, }) => {
18 const grouped = Object.values(lodash_1.default.groupBy(coins, (coin) => `${coin.startHeight}:${coin.endHeight}`));
19 const claimed = await Promise.all(grouped.map(async (coinsGroup) => {
20 const { startHeight, endHeight } = coinsGroup[0];
21 let amount = client_common_1.utils.ZERO;
22 let ustart = Math.floor(startHeight / decrementInterval);
23 if (ustart < generationAmount.length) {
24 let istart = startHeight % decrementInterval;
25 let uend = Math.floor(endHeight / decrementInterval);
26 let iend = endHeight % decrementInterval;
27 if (uend >= generationAmount.length) {
28 uend = generationAmount.length;
29 iend = 0;
30 }
31 if (iend === 0) {
32 uend -= 1;
33 iend = decrementInterval;
34 }
35 while (ustart < uend) {
36 amount = amount.addn((decrementInterval - istart) * generationAmount[ustart]);
37 ustart += 1;
38 istart = 0;
39 }
40 amount = amount.addn((iend - istart) * generationAmount[ustart]);
41 }
42 const [sysFeeEnd, sysFeeStart] = await Promise.all([
43 getSystemFee(endHeight - 1),
44 startHeight === 0 ? Promise.resolve(client_common_1.utils.ZERO) : getSystemFee(startHeight - 1),
45 ]);
46 amount = amount.add(sysFeeEnd.sub(sysFeeStart).div(client_common_1.utils.ONE_HUNDRED_MILLION));
47 const totalValue = coinsGroup.reduce((acc, { value }) => acc.add(value), client_common_1.utils.ZERO);
48 return [totalValue, amount];
49 }));
50 return claimed.reduce((acc, [value, amount]) => acc.add(value.div(client_common_1.utils.ONE_HUNDRED_MILLION).mul(amount)), client_common_1.utils.ZERO);
51};
52const randomUInt64 = () => new bn_js_1.BN(crypto_1.randomBytes(8).toString('hex'), 16);
53const toKeyString = (clazz, toKey) => () => `${clazz.name}:${toKey()}`;
54function lazyAsync(getValue) {
55 let valuePromise;
56 return async (input) => {
57 if (valuePromise === undefined) {
58 valuePromise = getValue(input);
59 }
60 return valuePromise;
61 };
62}
63function lazyOrValue(getValue) {
64 let settings = typeof getValue === 'function' ? { type: 'lazy', getValue } : { type: 'evaluated', value: getValue };
65 return () => {
66 if (settings.type === 'lazy') {
67 settings = { type: 'evaluated', value: settings.getValue() };
68 }
69 return settings.value;
70 };
71}
72function weightedAverage(input) {
73 let sumWeight = new bignumber_js_1.default(0);
74 let sumValue = new bignumber_js_1.default(0);
75 input.forEach((value) => {
76 sumWeight = sumWeight.plus(value.weight);
77 sumValue = sumValue.plus(value.weight.times(value.value));
78 });
79 if (sumValue.isEqualTo(0) || sumWeight.isEqualTo(0)) {
80 return 0;
81 }
82 return sumValue
83 .div(sumWeight)
84 .integerValue(bignumber_js_1.default.ROUND_FLOOR)
85 .toNumber();
86}
87function weightedFilter(input, startIn, endIn, getValueIn) {
88 const start = new bignumber_js_1.default(startIn);
89 const end = new bignumber_js_1.default(endIn);
90 const getValue = (value) => new bignumber_js_1.default(getValueIn(value).toString(10));
91 const amount = input.reduce((acc, value) => acc.plus(getValue(value)), new bignumber_js_1.default(0));
92 let sum = new bignumber_js_1.default(0);
93 let current = new bignumber_js_1.default(0);
94 const mutableResult = [];
95 for (const value of input) {
96 if (current.gte(end)) {
97 break;
98 }
99 let weight = getValue(value);
100 sum = sum.plus(weight);
101 const old = current;
102 current = sum.div(amount);
103 if (current.lte(start)) {
104 continue;
105 }
106 if (old.lt(start)) {
107 weight = current.gt(end) ? end.minus(start).times(amount) : current.minus(start).times(amount);
108 }
109 else if (current.gt(end)) {
110 weight = end.minus(old).times(amount);
111 }
112 mutableResult.push([
113 value,
114 weight.gte(0) ? weight.integerValue(bignumber_js_1.default.ROUND_FLOOR) : weight.integerValue(bignumber_js_1.default.ROUND_CEIL),
115 ]);
116 }
117 return mutableResult;
118}
119function equals(clazz, thiz, equalsFunc) {
120 return (other) => other != undefined && (thiz === other || (other instanceof clazz && equalsFunc(other)));
121}
122exports.utils = Object.assign({}, client_common_1.utils, { toASCII,
123 toUTF8,
124 calculateClaimAmount,
125 randomUInt64,
126 toKeyString,
127 equals,
128 lazyAsync,
129 lazyOrValue,
130 weightedAverage,
131 weightedFilter });
132
133//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBEQUE4RDtBQUM5RCx3RUFBcUM7QUFDckMsaUNBQTJCO0FBQzNCLG1DQUFxQztBQUNyQyw0REFBdUI7QUFFdkIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUNoQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsZ0JBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXpELE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUFFLEVBQ2xDLEtBQUssRUFDTCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLFlBQVksR0FVYixFQUFlLEVBQUU7SUFDaEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRW5HLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7UUFDL0IsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakQsSUFBSSxNQUFNLEdBQUcscUJBQVcsQ0FBQyxJQUFJLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxJQUFJLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7WUFDcEMsSUFBSSxNQUFNLEdBQUcsV0FBVyxHQUFHLGlCQUFpQixDQUFDO1lBQzdDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLENBQUM7WUFDckQsSUFBSSxJQUFJLEdBQUcsU0FBUyxHQUFHLGlCQUFpQixDQUFDO1lBQ3pDLElBQUksSUFBSSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtnQkFDbkMsSUFBSSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztnQkFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQzthQUNWO1lBRUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxHQUFHLGlCQUFpQixDQUFDO2FBQzFCO1lBR0QsT0FBTyxNQUFNLEdBQUcsSUFBSSxFQUFFO2dCQUNwQixNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBRTlFLE1BQU0sSUFBSSxDQUFDLENBQUM7Z0JBQ1osTUFBTSxHQUFHLENBQUMsQ0FBQzthQUNaO1lBRUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNsRTtRQUVELE1BQU0sQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2pELFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMscUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7U0FDdEYsQ0FBQyxDQUFDO1FBRUgsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMscUJBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLHFCQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0YsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBRUYsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUNuQixDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDekYscUJBQVcsQ0FBQyxJQUFJLENBQ2pCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxHQUFPLEVBQUUsQ0FBQyxJQUFJLFVBQUUsQ0FBQyxvQkFBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUUxRSxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWdDLEVBQUUsS0FBbUIsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFLENBQUM7QUFFaEgsU0FBUyxTQUFTLENBQWUsUUFBMEM7SUFDekUsSUFBSSxZQUF3QyxDQUFDO0lBRTdDLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ3JCLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUM5QixZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFRLFFBQStCO0lBRXpELElBQUksUUFBUSxHQUNWLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBRXZHLE9BQU8sR0FBRyxFQUFFO1FBQ1YsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUM1QixRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztTQUM5RDtRQUVELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQztJQUN4QixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLEtBR0U7SUFFRixJQUFJLFNBQVMsR0FBRyxJQUFJLHNCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsSUFBSSxRQUFRLEdBQUcsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUN0QixTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNuRCxPQUFPLENBQUMsQ0FBQztLQUNWO0lBRUQsT0FBTyxRQUFRO1NBQ1osR0FBRyxDQUFDLFNBQVMsQ0FBQztTQUNkLFlBQVksQ0FBQyxzQkFBUyxDQUFDLFdBQVcsQ0FBQztTQUNuQyxRQUFRLEVBQUUsQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQ3JCLEtBQW1CLEVBQ25CLE9BQWUsRUFDZixLQUFhLEVBQ2IsVUFBNEI7SUFFNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxzQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxzQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLHNCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV6RixJQUFJLEdBQUcsR0FBRyxJQUFJLHNCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sYUFBYSxHQUFtQyxFQUFFLENBQUM7SUFFekQsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUU7UUFDekIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLE1BQU07U0FDUDtRQUNELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUM7UUFDcEIsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBRXRCLFNBQVM7U0FDVjtRQUNELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hHO2FBQU0sSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzFCLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2QztRQUVELGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDakIsS0FBSztZQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsc0JBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxzQkFBUyxDQUFDLFVBQVUsQ0FBQztTQUM5RixDQUFDLENBQUM7S0FDYjtJQUVELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FFYixLQUFnQyxFQUNoQyxJQUFPLEVBQ1AsVUFBaUM7SUFHakMsT0FBTyxDQUFDLEtBQUssRUFBVyxFQUFFLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckgsQ0FBQztBQUVZLFFBQUEsS0FBSyxxQkFDYixxQkFBVyxJQUNkLE9BQU87SUFDUCxNQUFNO0lBQ04sb0JBQW9CO0lBQ3BCLFlBQVk7SUFDWixXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxXQUFXO0lBQ1gsZUFBZTtJQUNmLGNBQWMsSUFDZCIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvdXRpbHMvdXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlscyBhcyBjbGllbnRVdGlscyB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQk4gfSBmcm9tICdibi5qcyc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCB0b0FTQ0lJID0gKGJ5dGVzOiBCdWZmZXIpID0+IHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBfLnJhbmdlKGJ5dGVzLmxlbmd0aCkuZm9yRWFjaCgoaSkgPT4ge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzLnJlYWRVSW50OChpKSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0b1VURjggPSAoYnl0ZXM6IEJ1ZmZlcikgPT4gYnl0ZXMudG9TdHJpbmcoJ3V0ZjgnKTtcblxuY29uc3QgY2FsY3VsYXRlQ2xhaW1BbW91bnQgPSBhc3luYyAoe1xuICBjb2lucyxcbiAgZGVjcmVtZW50SW50ZXJ2YWwsXG4gIGdlbmVyYXRpb25BbW91bnQsXG4gIGdldFN5c3RlbUZlZSxcbn06IHtcbiAgcmVhZG9ubHkgY29pbnM6IFJlYWRvbmx5QXJyYXk8e1xuICAgIHJlYWRvbmx5IHZhbHVlOiBCTjtcbiAgICByZWFkb25seSBzdGFydEhlaWdodDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGVuZEhlaWdodDogbnVtYmVyO1xuICB9PjtcbiAgcmVhZG9ubHkgZGVjcmVtZW50SW50ZXJ2YWw6IG51bWJlcjtcbiAgcmVhZG9ubHkgZ2VuZXJhdGlvbkFtb3VudDogcmVhZG9ubHkgbnVtYmVyW107XG4gIHJlYWRvbmx5IGdldFN5c3RlbUZlZTogKGluZGV4OiBudW1iZXIpID0+IFByb21pc2U8Qk4+O1xufSk6IFByb21pc2U8Qk4+ID0+IHtcbiAgY29uc3QgZ3JvdXBlZCA9IE9iamVjdC52YWx1ZXMoXy5ncm91cEJ5KGNvaW5zLCAoY29pbikgPT4gYCR7Y29pbi5zdGFydEhlaWdodH06JHtjb2luLmVuZEhlaWdodH1gKSk7XG5cbiAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGdyb3VwZWQubWFwKGFzeW5jIChjb2luc0dyb3VwKSA9PiB7XG4gICAgICBjb25zdCB7IHN0YXJ0SGVpZ2h0LCBlbmRIZWlnaHQgfSA9IGNvaW5zR3JvdXBbMF07XG5cbiAgICAgIGxldCBhbW91bnQgPSBjbGllbnRVdGlscy5aRVJPO1xuICAgICAgbGV0IHVzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnRIZWlnaHQgLyBkZWNyZW1lbnRJbnRlcnZhbCk7XG4gICAgICBpZiAodXN0YXJ0IDwgZ2VuZXJhdGlvbkFtb3VudC5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGlzdGFydCA9IHN0YXJ0SGVpZ2h0ICUgZGVjcmVtZW50SW50ZXJ2YWw7XG4gICAgICAgIGxldCB1ZW5kID0gTWF0aC5mbG9vcihlbmRIZWlnaHQgLyBkZWNyZW1lbnRJbnRlcnZhbCk7XG4gICAgICAgIGxldCBpZW5kID0gZW5kSGVpZ2h0ICUgZGVjcmVtZW50SW50ZXJ2YWw7XG4gICAgICAgIGlmICh1ZW5kID49IGdlbmVyYXRpb25BbW91bnQubGVuZ3RoKSB7XG4gICAgICAgICAgdWVuZCA9IGdlbmVyYXRpb25BbW91bnQubGVuZ3RoO1xuICAgICAgICAgIGllbmQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGllbmQgPT09IDApIHtcbiAgICAgICAgICB1ZW5kIC09IDE7XG4gICAgICAgICAgaWVuZCA9IGRlY3JlbWVudEludGVydmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgICAgIHdoaWxlICh1c3RhcnQgPCB1ZW5kKSB7XG4gICAgICAgICAgYW1vdW50ID0gYW1vdW50LmFkZG4oKGRlY3JlbWVudEludGVydmFsIC0gaXN0YXJ0KSAqIGdlbmVyYXRpb25BbW91bnRbdXN0YXJ0XSk7XG5cbiAgICAgICAgICB1c3RhcnQgKz0gMTtcbiAgICAgICAgICBpc3RhcnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgYW1vdW50ID0gYW1vdW50LmFkZG4oKGllbmQgLSBpc3RhcnQpICogZ2VuZXJhdGlvbkFtb3VudFt1c3RhcnRdKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgW3N5c0ZlZUVuZCwgc3lzRmVlU3RhcnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRTeXN0ZW1GZWUoZW5kSGVpZ2h0IC0gMSksXG4gICAgICAgIHN0YXJ0SGVpZ2h0ID09PSAwID8gUHJvbWlzZS5yZXNvbHZlKGNsaWVudFV0aWxzLlpFUk8pIDogZ2V0U3lzdGVtRmVlKHN0YXJ0SGVpZ2h0IC0gMSksXG4gICAgICBdKTtcblxuICAgICAgYW1vdW50ID0gYW1vdW50LmFkZChzeXNGZWVFbmQuc3ViKHN5c0ZlZVN0YXJ0KS5kaXYoY2xpZW50VXRpbHMuT05FX0hVTkRSRURfTUlMTElPTikpO1xuICAgICAgY29uc3QgdG90YWxWYWx1ZSA9IGNvaW5zR3JvdXAucmVkdWNlKChhY2MsIHsgdmFsdWUgfSkgPT4gYWNjLmFkZCh2YWx1ZSksIGNsaWVudFV0aWxzLlpFUk8pO1xuXG4gICAgICByZXR1cm4gW3RvdGFsVmFsdWUsIGFtb3VudF07XG4gICAgfSksXG4gICk7XG5cbiAgcmV0dXJuIGNsYWltZWQucmVkdWNlKFxuICAgIChhY2MsIFt2YWx1ZSwgYW1vdW50XSkgPT4gYWNjLmFkZCh2YWx1ZS5kaXYoY2xpZW50VXRpbHMuT05FX0hVTkRSRURfTUlMTElPTikubXVsKGFtb3VudCkpLFxuICAgIGNsaWVudFV0aWxzLlpFUk8sXG4gICk7XG59O1xuXG5jb25zdCByYW5kb21VSW50NjQgPSAoKTogQk4gPT4gbmV3IEJOKHJhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKCdoZXgnKSwgMTYpO1xuXG5jb25zdCB0b0tleVN0cmluZyA9IChjbGF6ejogeyByZWFkb25seSBuYW1lOiBzdHJpbmcgfSwgdG9LZXk6ICgpID0+IHN0cmluZykgPT4gKCkgPT4gYCR7Y2xhenoubmFtZX06JHt0b0tleSgpfWA7XG5cbmZ1bmN0aW9uIGxhenlBc3luYzxJbnB1dCwgVmFsdWU+KGdldFZhbHVlOiAoaW5wdXQ6IElucHV0KSA9PiBQcm9taXNlPFZhbHVlPik6IChpbnB1dDogSW5wdXQpID0+IFByb21pc2U8VmFsdWU+IHtcbiAgbGV0IHZhbHVlUHJvbWlzZTogUHJvbWlzZTxWYWx1ZT4gfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGFzeW5jIChpbnB1dCkgPT4ge1xuICAgIGlmICh2YWx1ZVByb21pc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWVQcm9taXNlID0gZ2V0VmFsdWUoaW5wdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVByb21pc2U7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGxhenlPclZhbHVlPFZhbHVlPihnZXRWYWx1ZTogKCgpID0+IFZhbHVlKSB8IFZhbHVlKTogKCkgPT4gVmFsdWUge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIGxldCBzZXR0aW5nczogYW55ID1cbiAgICB0eXBlb2YgZ2V0VmFsdWUgPT09ICdmdW5jdGlvbicgPyB7IHR5cGU6ICdsYXp5JywgZ2V0VmFsdWUgfSA6IHsgdHlwZTogJ2V2YWx1YXRlZCcsIHZhbHVlOiBnZXRWYWx1ZSB9O1xuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKHNldHRpbmdzLnR5cGUgPT09ICdsYXp5Jykge1xuICAgICAgc2V0dGluZ3MgPSB7IHR5cGU6ICdldmFsdWF0ZWQnLCB2YWx1ZTogc2V0dGluZ3MuZ2V0VmFsdWUoKSB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZXR0aW5ncy52YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2VpZ2h0ZWRBdmVyYWdlKFxuICBpbnB1dDogUmVhZG9ubHlBcnJheTx7XG4gICAgcmVhZG9ubHkgdmFsdWU6IG51bWJlcjtcbiAgICByZWFkb25seSB3ZWlnaHQ6IEJpZ051bWJlcjtcbiAgfT4sXG4pOiBudW1iZXIge1xuICBsZXQgc3VtV2VpZ2h0ID0gbmV3IEJpZ051bWJlcigwKTtcbiAgbGV0IHN1bVZhbHVlID0gbmV3IEJpZ051bWJlcigwKTtcbiAgaW5wdXQuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICBzdW1XZWlnaHQgPSBzdW1XZWlnaHQucGx1cyh2YWx1ZS53ZWlnaHQpO1xuICAgIHN1bVZhbHVlID0gc3VtVmFsdWUucGx1cyh2YWx1ZS53ZWlnaHQudGltZXModmFsdWUudmFsdWUpKTtcbiAgfSk7XG5cbiAgaWYgKHN1bVZhbHVlLmlzRXF1YWxUbygwKSB8fCBzdW1XZWlnaHQuaXNFcXVhbFRvKDApKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gc3VtVmFsdWVcbiAgICAuZGl2KHN1bVdlaWdodClcbiAgICAuaW50ZWdlclZhbHVlKEJpZ051bWJlci5ST1VORF9GTE9PUilcbiAgICAudG9OdW1iZXIoKTtcbn1cblxuZnVuY3Rpb24gd2VpZ2h0ZWRGaWx0ZXI8VD4oXG4gIGlucHV0OiByZWFkb25seSBUW10sXG4gIHN0YXJ0SW46IG51bWJlcixcbiAgZW5kSW46IG51bWJlcixcbiAgZ2V0VmFsdWVJbjogKHZhbHVlOiBUKSA9PiBCTixcbik6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW1QsIEJpZ051bWJlcl0+IHtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgQmlnTnVtYmVyKHN0YXJ0SW4pO1xuICBjb25zdCBlbmQgPSBuZXcgQmlnTnVtYmVyKGVuZEluKTtcbiAgY29uc3QgZ2V0VmFsdWUgPSAodmFsdWU6IFQpID0+IG5ldyBCaWdOdW1iZXIoZ2V0VmFsdWVJbih2YWx1ZSkudG9TdHJpbmcoMTApKTtcbiAgY29uc3QgYW1vdW50ID0gaW5wdXQucmVkdWNlKChhY2MsIHZhbHVlKSA9PiBhY2MucGx1cyhnZXRWYWx1ZSh2YWx1ZSkpLCBuZXcgQmlnTnVtYmVyKDApKTtcblxuICBsZXQgc3VtID0gbmV3IEJpZ051bWJlcigwKTtcbiAgbGV0IGN1cnJlbnQgPSBuZXcgQmlnTnVtYmVyKDApO1xuICBjb25zdCBtdXRhYmxlUmVzdWx0OiBBcnJheTxyZWFkb25seSBbVCwgQmlnTnVtYmVyXT4gPSBbXTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgaW5wdXQpIHtcbiAgICBpZiAoY3VycmVudC5ndGUoZW5kKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCB3ZWlnaHQgPSBnZXRWYWx1ZSh2YWx1ZSk7XG4gICAgc3VtID0gc3VtLnBsdXMod2VpZ2h0KTtcbiAgICBjb25zdCBvbGQgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQgPSBzdW0uZGl2KGFtb3VudCk7XG4gICAgaWYgKGN1cnJlbnQubHRlKHN0YXJ0KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG9sZC5sdChzdGFydCkpIHtcbiAgICAgIHdlaWdodCA9IGN1cnJlbnQuZ3QoZW5kKSA/IGVuZC5taW51cyhzdGFydCkudGltZXMoYW1vdW50KSA6IGN1cnJlbnQubWludXMoc3RhcnQpLnRpbWVzKGFtb3VudCk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Lmd0KGVuZCkpIHtcbiAgICAgIHdlaWdodCA9IGVuZC5taW51cyhvbGQpLnRpbWVzKGFtb3VudCk7XG4gICAgfVxuXG4gICAgbXV0YWJsZVJlc3VsdC5wdXNoKFtcbiAgICAgIHZhbHVlLFxuICAgICAgd2VpZ2h0Lmd0ZSgwKSA/IHdlaWdodC5pbnRlZ2VyVmFsdWUoQmlnTnVtYmVyLlJPVU5EX0ZMT09SKSA6IHdlaWdodC5pbnRlZ2VyVmFsdWUoQmlnTnVtYmVyLlJPVU5EX0NFSUwpLFxuICAgIF0gYXMgY29uc3QpO1xuICB9XG5cbiAgcmV0dXJuIG11dGFibGVSZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGVxdWFsczxUPihcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueSByZWFkb25seS1hcnJheVxuICBjbGF6ejogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCxcbiAgdGhpejogVCxcbiAgZXF1YWxzRnVuYzogKG90aGVyOiBUKSA9PiBib29sZWFuLFxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4pOiAob3RoZXI6IGFueSkgPT4gYm9vbGVhbiB7XG4gIHJldHVybiAob3RoZXIpOiBib29sZWFuID0+IG90aGVyICE9IHVuZGVmaW5lZCAmJiAodGhpeiA9PT0gb3RoZXIgfHwgKG90aGVyIGluc3RhbmNlb2YgY2xhenogJiYgZXF1YWxzRnVuYyhvdGhlcikpKTtcbn1cblxuZXhwb3J0IGNvbnN0IHV0aWxzID0ge1xuICAuLi5jbGllbnRVdGlscyxcbiAgdG9BU0NJSSxcbiAgdG9VVEY4LFxuICBjYWxjdWxhdGVDbGFpbUFtb3VudCxcbiAgcmFuZG9tVUludDY0LFxuICB0b0tleVN0cmluZyxcbiAgZXF1YWxzLFxuICBsYXp5QXN5bmMsXG4gIGxhenlPclZhbHVlLFxuICB3ZWlnaHRlZEF2ZXJhZ2UsXG4gIHdlaWdodGVkRmlsdGVyLFxufTtcbiJdfQ==