Files
2026-09-08 20:28:54 +08:00

172 lines
21 KiB
JavaScript

"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.asyncfilter = asyncfilter;
exports.asyncify = asyncify;
exports.asyncmap = asyncmap;
exports.longSleep = longSleep;
exports.nodeify = nodeify;
exports.nodeifyAll = nodeifyAll;
exports.parallel = void 0;
exports.retry = retry;
exports.retryInterval = retryInterval;
exports.sleep = sleep;
exports.waitForCondition = waitForCondition;
require("source-map-support/register");
var _bluebird = _interopRequireDefault(require("bluebird"));
var _lodash = _interopRequireDefault(require("lodash"));
const LONG_SLEEP_THRESHOLD = 5000;
async function sleep(ms) {
return await _bluebird.default.delay(ms);
}
async function longSleep(ms, {
thresholdMs = LONG_SLEEP_THRESHOLD,
intervalMs = 1000,
progressCb = null
} = {}) {
if (ms < thresholdMs) {
return await sleep(ms);
}
const endAt = Date.now() + ms;
let timeLeft;
let elapsedMs = 0;
do {
const pre = Date.now();
await sleep(intervalMs);
const post = Date.now();
timeLeft = endAt - post;
elapsedMs = elapsedMs + (post - pre);
if (_lodash.default.isFunction(progressCb)) {
progressCb({
elapsedMs,
timeLeft,
progress: elapsedMs / ms
});
}
} while (timeLeft > 0);
}
async function retry(times, fn, ...args) {
let tries = 0;
let done = false;
let res = null;
while (!done && tries < times) {
tries++;
try {
res = await fn(...args);
done = true;
} catch (err) {
if (tries >= times) {
throw err;
}
}
}
return res;
}
async function retryInterval(times, sleepMs, fn, ...args) {
let count = 0;
let wrapped = async () => {
count++;
let res;
try {
res = await fn(...args);
} catch (e) {
if (count !== times) {
await sleep(sleepMs);
}
throw e;
}
return res;
};
return await retry(times, wrapped);
}
const parallel = _bluebird.default.all;
exports.parallel = parallel;
function nodeify(promisey, cb) {
return _bluebird.default.resolve(promisey).nodeify(cb);
}
function nodeifyAll(promiseyMap) {
let cbMap = {};
for (const [name, fn] of _lodash.default.toPairs(promiseyMap)) {
cbMap[name] = function (...args) {
const _cb = args.slice(-1)[0];
args = args.slice(0, -1);
nodeify(fn(...args), _cb);
};
}
return cbMap;
}
function asyncify(fn, ...args) {
_bluebird.default.resolve(fn(...args)).done();
}
async function asyncmap(coll, mapper, runInParallel = true) {
if (runInParallel) {
return parallel(coll.map(mapper));
}
let newColl = [];
for (let item of coll) {
newColl.push(await mapper(item));
}
return newColl;
}
async function asyncfilter(coll, filter, runInParallel = true) {
let newColl = [];
if (runInParallel) {
let bools = await parallel(coll.map(filter));
for (let i = 0; i < coll.length; i++) {
if (bools[i]) {
newColl.push(coll[i]);
}
}
} else {
for (let item of coll) {
if (await filter(item)) {
newColl.push(item);
}
}
}
return newColl;
}
async function waitForCondition(condFn, options = {}) {
const opts = _lodash.default.defaults(options, {
waitMs: 5000,
intervalMs: 500
});
const debug = opts.logger ? opts.logger.debug.bind(opts.logger) : _lodash.default.noop;
const error = opts.error;
const begunAt = Date.now();
const endAt = begunAt + opts.waitMs;
const spin = async function spin() {
const result = await condFn();
if (result) {
return result;
}
const now = Date.now();
const waited = now - begunAt;
const remainingTime = endAt - now;
if (now < endAt) {
debug(`Waited for ${waited} ms so far`);
await _bluebird.default.delay(Math.min(opts.intervalMs, remainingTime));
return await spin();
}
throw error ? _lodash.default.isString(error) ? new Error(error) : error : new Error(`Condition unmet after ${waited} ms. Timing out.`);
};
return await spin();
}require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2FzeW5jYm94LmpzIiwibmFtZXMiOlsiTE9OR19TTEVFUF9USFJFU0hPTEQiLCJzbGVlcCIsIm1zIiwiQiIsImRlbGF5IiwibG9uZ1NsZWVwIiwidGhyZXNob2xkTXMiLCJpbnRlcnZhbE1zIiwicHJvZ3Jlc3NDYiIsImVuZEF0IiwiRGF0ZSIsIm5vdyIsInRpbWVMZWZ0IiwiZWxhcHNlZE1zIiwicHJlIiwicG9zdCIsIl8iLCJpc0Z1bmN0aW9uIiwicHJvZ3Jlc3MiLCJyZXRyeSIsInRpbWVzIiwiZm4iLCJhcmdzIiwidHJpZXMiLCJkb25lIiwicmVzIiwiZXJyIiwicmV0cnlJbnRlcnZhbCIsInNsZWVwTXMiLCJjb3VudCIsIndyYXBwZWQiLCJlIiwicGFyYWxsZWwiLCJhbGwiLCJub2RlaWZ5IiwicHJvbWlzZXkiLCJjYiIsInJlc29sdmUiLCJub2RlaWZ5QWxsIiwicHJvbWlzZXlNYXAiLCJjYk1hcCIsIm5hbWUiLCJ0b1BhaXJzIiwiX2NiIiwic2xpY2UiLCJhc3luY2lmeSIsImFzeW5jbWFwIiwiY29sbCIsIm1hcHBlciIsInJ1bkluUGFyYWxsZWwiLCJtYXAiLCJuZXdDb2xsIiwiaXRlbSIsInB1c2giLCJhc3luY2ZpbHRlciIsImZpbHRlciIsImJvb2xzIiwiaSIsImxlbmd0aCIsIndhaXRGb3JDb25kaXRpb24iLCJjb25kRm4iLCJvcHRpb25zIiwib3B0cyIsImRlZmF1bHRzIiwid2FpdE1zIiwiZGVidWciLCJsb2dnZXIiLCJiaW5kIiwibm9vcCIsImVycm9yIiwiYmVndW5BdCIsInNwaW4iLCJyZXN1bHQiLCJ3YWl0ZWQiLCJyZW1haW5pbmdUaW1lIiwiTWF0aCIsIm1pbiIsImlzU3RyaW5nIiwiRXJyb3IiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvYXN5bmNib3guanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgTE9OR19TTEVFUF9USFJFU0hPTEQgPSA1MDAwOyAvLyBhbnl0aGluZyBvdmVyIDUwMDBtcyB3aWxsIHR1cm4gaW50byBhIHNwaW5cblxuLyoqXG4gKiBBbiBhc3luYy9hd2FpdCB2ZXJzaW9uIG9mIHNldFRpbWVvdXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtc1xuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwIChtcykge1xuICByZXR1cm4gYXdhaXQgQi5kZWxheShtcyk7XG59XG5cbi8qKlxuICogU29tZXRpbWVzIGBQcm9taXNlLmRlbGF5YCBvciBgc2V0VGltZW91dGAgYXJlIGluYWNjdXJhdGUgZm9yIGxhcmdlIHdhaXRcbiAqIHRpbWVzLiBUbyBzYWZlbHkgd2FpdCBmb3IgdGhlc2UgbG9uZyB0aW1lcyAoZS5nLiBpbiB0aGUgNSsgbWludXRlIHJhbmdlKSwgeW91XG4gKiBjYW4gdXNlIGBsb25nU2xlZXBgLlxuICpcbiAqIHNZb3UgY2FuIGFsc28gcGFzcyBhIGBwcm9ncmVzc0NiYCBvcHRpb24gd2hpY2ggaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0XG4gKiByZWNlaXZlcyBhbiBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydGllcyBgZWxhcHNlZE1zYCwgYHRpbWVMZWZ0YCwgYW5kXG4gKiBgcHJvZ3Jlc3NgLiBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIGV2ZXJ5IHdhaXQgaW50ZXJ2YWwgc28geW91IGNhbiBkbyB5b3VyXG4gKiB3YWl0IGxvZ2dpbmcgb3Igd2hhdGV2ZXIuXG4gKiBAcGFyYW0ge251bWJlcn0gbXNcbiAqIEBwYXJhbSB7TG9uZ1NsZWVwT3B0aW9uc30gW29wdHNdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9uZ1NsZWVwIChtcywge1xuICB0aHJlc2hvbGRNcyA9IExPTkdfU0xFRVBfVEhSRVNIT0xELFxuICBpbnRlcnZhbE1zID0gMTAwMCxcbiAgcHJvZ3Jlc3NDYiA9IG51bGwsXG59ID0ge30pIHtcbiAgaWYgKG1zIDwgdGhyZXNob2xkTXMpIHtcbiAgICByZXR1cm4gYXdhaXQgc2xlZXAobXMpO1xuICB9XG4gIGNvbnN0IGVuZEF0ID0gRGF0ZS5ub3coKSArIG1zO1xuICBsZXQgdGltZUxlZnQ7XG4gIGxldCBlbGFwc2VkTXMgPSAwO1xuICBkbyB7XG4gICAgY29uc3QgcHJlID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBzbGVlcChpbnRlcnZhbE1zKTtcbiAgICBjb25zdCBwb3N0ID0gRGF0ZS5ub3coKTtcbiAgICB0aW1lTGVmdCA9IGVuZEF0IC0gcG9zdDtcbiAgICBlbGFwc2VkTXMgPSBlbGFwc2VkTXMgKyAocG9zdCAtIHByZSk7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwcm9ncmVzc0NiKSkge1xuICAgICAgcHJvZ3Jlc3NDYih7ZWxhcHNlZE1zLCB0aW1lTGVmdCwgcHJvZ3Jlc3M6IGVsYXBzZWRNcyAvIG1zfSk7XG4gICAgfVxuICB9IHdoaWxlICh0aW1lTGVmdCA+IDApO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jL2F3YWl0IHdheSBvZiBydW5uaW5nIGEgbWV0aG9kIHVudGlsIGl0IGRvZXNuJ3QgdGhyb3cgYW4gZXJyb3JcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZXNcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5ICh0aW1lcywgZm4sIC4uLmFyZ3MpIHtcbiAgbGV0IHRyaWVzID0gMDtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgbGV0IHJlcyA9IG51bGw7XG4gIHdoaWxlICghZG9uZSAmJiB0cmllcyA8IHRpbWVzKSB7XG4gICAgdHJpZXMrKztcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0cmllcyA+PSB0aW1lcykge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogWW91IGNhbiBhbHNvIHVzZSBgcmV0cnlJbnRlcnZhbGAgdG8gYWRkIGEgc2xlZXAgaW4gYmV0d2VlbiByZXRyaWVzLiBUaGlzIGNhblxuICogYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHRocm90dGxlIGhvdyBmYXN0IHdlIHJldHJ5LlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc1xuICogQHBhcmFtIHtudW1iZXJ9IHNsZWVwTXNcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5SW50ZXJ2YWwgKHRpbWVzLCBzbGVlcE1zLCBmbiwgLi4uYXJncykge1xuICBsZXQgY291bnQgPSAwO1xuICBsZXQgd3JhcHBlZCA9IGFzeW5jICgpID0+IHtcbiAgICBjb3VudCsrO1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IGZuKC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRvIG5vdCBwYXVzZSB3aGVuIGZpbmlzaGVkIHRoZSBsYXN0IHJldHJ5XG4gICAgICBpZiAoY291bnQgIT09IHRpbWVzKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTXMpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHJldHJ5KHRpbWVzLCB3cmFwcGVkKTtcbn1cblxuY29uc3QgcGFyYWxsZWwgPSBCLmFsbDtcblxuLyoqXG4gKiBFeHBvcnQgYXN5bmMgZnVuY3Rpb25zIChQcm9taXNlcykgYW5kIGltcG9ydCB0aGlzIHdpdGggeW91ciBFUzUgY29kZSB0byB1c2VcbiAqIGl0IHdpdGggTm9kZS5cbiAqIEB0ZW1wbGF0ZSBbUj1hbnldXG4gKiBAcGFyYW0ge2FueX0gcHJvbWlzZXlcbiAqIEBwYXJhbSB7KGVycjogYW55LCB2YWx1ZT86IFIpID0+IHZvaWR9IGNiXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSPn1cbiAqL1xuZnVuY3Rpb24gbm9kZWlmeSAocHJvbWlzZXksIGNiKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzXG4gIHJldHVybiBCLnJlc29sdmUocHJvbWlzZXkpLm5vZGVpZnkoY2IpO1xufVxuXG4vKipcbiAqIE5vZGUtaWZ5IGFuIGVudGlyZSBvYmplY3Qgb2YgYFByb21pc2VgLXJldHVybmluZyBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywoLi4uYXJnczogYW55W10pID0+IGFueT59IHByb21pc2V5TWFwXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywoLi4uYXJnczogYW55W10pPT52b2lkPn1cbiAqL1xuZnVuY3Rpb24gbm9kZWlmeUFsbCAocHJvbWlzZXlNYXApIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCguLi5hcmdzOiBhbnlbXSk9PnZvaWQ+fSAqL1xuICBsZXQgY2JNYXAgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgZm5dIG9mIF8udG9QYWlycyhwcm9taXNleU1hcCkpIHtcbiAgICBjYk1hcFtuYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICBjb25zdCBfY2IgPSBhcmdzLnNsaWNlKC0xKVswXTtcbiAgICAgIGFyZ3MgPSBhcmdzLnNsaWNlKDAsIC0xKTtcbiAgICAgIG5vZGVpZnkoZm4oLi4uYXJncyksIF9jYik7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gY2JNYXA7XG59XG5cbi8qKlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueXxQcm9taXNlPGFueT59IGZuXG4gKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAqL1xuZnVuY3Rpb24gYXN5bmNpZnkgKGZuLCAuLi5hcmdzKSB7XG4gIEIucmVzb2x2ZShmbiguLi5hcmdzKSkuZG9uZSgpO1xufVxuXG4vKipcbiAqIFNpbWlsYXIgdG8gYEFycmF5LnByb3RvdHlwZS5tYXBgOyBydW5zIGluIHNlcmlhbFxuICogQHBhcmFtIHthbnlbXX0gY29sbFxuICogQHBhcmFtIHsodmFsdWU6IGFueSkgPT4gYW55fFByb21pc2U8YW55Pn0gbWFwcGVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jbWFwIChjb2xsLCBtYXBwZXIsIHJ1bkluUGFyYWxsZWwgPSB0cnVlKSB7XG4gIGlmIChydW5JblBhcmFsbGVsKSB7XG4gICAgcmV0dXJuIHBhcmFsbGVsKGNvbGwubWFwKG1hcHBlcikpO1xuICB9XG5cbiAgbGV0IG5ld0NvbGwgPSBbXTtcbiAgZm9yIChsZXQgaXRlbSBvZiBjb2xsKSB7XG4gICAgbmV3Q29sbC5wdXNoKGF3YWl0IG1hcHBlcihpdGVtKSk7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbGw7XG59XG5cbi8qKlxuICogU2ltaWxhciB0byBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmBcbiAqIEBwYXJhbSB7YW55W119IGNvbGxcbiAqIEBwYXJhbSB7KHZhbHVlOiBhbnkpID0+IGFueXxQcm9taXNlPGFueT59IGZpbHRlclxuICogQHBhcmFtIHtib29sZWFufSBydW5JblBhcmFsbGVsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jZmlsdGVyIChjb2xsLCBmaWx0ZXIsIHJ1bkluUGFyYWxsZWwgPSB0cnVlKSB7XG4gIGxldCBuZXdDb2xsID0gW107XG4gIGlmIChydW5JblBhcmFsbGVsKSB7XG4gICAgbGV0IGJvb2xzID0gYXdhaXQgcGFyYWxsZWwoY29sbC5tYXAoZmlsdGVyKSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYm9vbHNbaV0pIHtcbiAgICAgICAgbmV3Q29sbC5wdXNoKGNvbGxbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbGwpIHtcbiAgICAgIGlmIChhd2FpdCBmaWx0ZXIoaXRlbSkpIHtcbiAgICAgICAgbmV3Q29sbC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3Q29sbDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGNvbmRpdGlvbiAoYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBib29sZWFuIG9yIGJvb2xlYW4gcHJvbWlzZSksIGFuZFxuICogd2FpdHMgdW50aWwgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLlxuICpcbiAqIFRocm93cyBhIGAvQ29uZGl0aW9uIHVubWV0L2AgZXJyb3IgaWYgdGhlIGNvbmRpdGlvbiBoYXMgbm90IGJlZW4gc2F0aXNmaWVkXG4gKiB3aXRoaW4gdGhlIGFsbG9jYXRlZCB0aW1lLCB1bmxlc3MgYW4gZXJyb3IgaXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnMsIGFzIHRoZVxuICogYGVycm9yYCBwcm9wZXJ0eSwgd2hpY2ggaXMgZWl0aGVyIHRocm93biBpdHNlbGYsIG9yIHVzZWQgYXMgdGhlIG1lc3NhZ2UuXG4gKlxuICogVGhlIGNvbmRpdGlvbiByZXN1bHQgaXMgcmV0dXJuZWQgaWYgaXQgaXMgbm90IGZhbHN5LiBJZiB0aGUgY29uZGl0aW9uIHRocm93cyBhblxuICogZXJyb3IgdGhlbiB0aGlzIGV4Y2VwdGlvbiB3aWxsIGJlIGltbWVkaWF0ZWx5IHBhc3NlZCB0aHJvdWdoLlxuICpcbiAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgYXJlOiBgeyB3YWl0TXM6IDUwMDAsIGludGVydmFsTXM6IDUwMCB9YFxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPnxUfSBjb25kRm5cbiAqIEBwYXJhbSB7V2FpdEZvckNvbmRpdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDb25kaXRpb24gKGNvbmRGbiwgb3B0aW9ucyA9IHt9KSB7XG4gIC8qKiBAdHlwZSB7V2FpdEZvckNvbmRpdGlvbk9wdGlvbnMgJiB7d2FpdE1zOiBudW1iZXIsIGludGVydmFsTXM6IG51bWJlcn19ICovXG4gIGNvbnN0IG9wdHMgPSBfLmRlZmF1bHRzKG9wdGlvbnMsIHtcbiAgICB3YWl0TXM6IDUwMDAsXG4gICAgaW50ZXJ2YWxNczogNTAwLFxuICB9KTtcbiAgY29uc3QgZGVidWcgPSBvcHRzLmxvZ2dlciA/IG9wdHMubG9nZ2VyLmRlYnVnLmJpbmQob3B0cy5sb2dnZXIpIDogXy5ub29wO1xuICBjb25zdCBlcnJvciA9IG9wdHMuZXJyb3I7XG4gIGNvbnN0IGJlZ3VuQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBlbmRBdCA9IGJlZ3VuQXQgKyBvcHRzLndhaXRNcztcbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAqL1xuICBjb25zdCBzcGluID0gYXN5bmMgZnVuY3Rpb24gc3BpbiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29uZEZuKCk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3YWl0ZWQgPSBub3cgLSBiZWd1bkF0O1xuICAgIGNvbnN0IHJlbWFpbmluZ1RpbWUgPSBlbmRBdCAtIG5vdztcbiAgICBpZiAobm93IDwgZW5kQXQpIHtcbiAgICAgIGRlYnVnKGBXYWl0ZWQgZm9yICR7d2FpdGVkfSBtcyBzbyBmYXJgKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoTWF0aC5taW4ob3B0cy5pbnRlcnZhbE1zLCByZW1haW5pbmdUaW1lKSk7XG4gICAgICByZXR1cm4gYXdhaXQgc3BpbigpO1xuICAgIH1cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciBvcHRpb24sIGl0IGlzIGVpdGhlciBhIHN0cmluZyBtZXNzYWdlIG9yIGFuIGVycm9yIGl0c2VsZlxuICAgIHRocm93IGVycm9yXG4gICAgICA/IChfLmlzU3RyaW5nKGVycm9yKSA/IG5ldyBFcnJvcihlcnJvcikgOiBlcnJvcilcbiAgICAgIDogbmV3IEVycm9yKGBDb25kaXRpb24gdW5tZXQgYWZ0ZXIgJHt3YWl0ZWR9IG1zLiBUaW1pbmcgb3V0LmApO1xuICB9O1xuICByZXR1cm4gYXdhaXQgc3BpbigpO1xufVxuXG5leHBvcnQge1xuICBzbGVlcCwgcmV0cnksIG5vZGVpZnksIG5vZGVpZnlBbGwsIHJldHJ5SW50ZXJ2YWwsIGFzeW5jaWZ5LCBwYXJhbGxlbCxcbiAgYXN5bmNtYXAsIGFzeW5jZmlsdGVyLCB3YWl0Rm9yQ29uZGl0aW9uLCBsb25nU2xlZXAsXG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB3YWl0Rm9yQ29uZGl0aW9ufVxuICogQHR5cGVkZWYgV2FpdEZvckNvbmRpdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd2FpdE1zXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbnRlcnZhbE1zXVxuICogQHByb3BlcnR5IHt7ZGVidWc6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZH19IFtsb2dnZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ3xFcnJvcn0gW2Vycm9yXVxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGxvbmdTbGVlcH1cbiAqIEB0eXBlZGVmIExvbmdTbGVlcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyZXNob2xkTXNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2ludGVydmFsTXNdXG4gKiBAcHJvcGVydHkge1Byb2dyZXNzQ2FsbGJhY2s/fSBbcHJvZ3Jlc3NDYl1cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlciBwcm92aWRlZCB0byBhIHtAbGluayBQcm9ncmVzc0NhbGxiYWNrfVxuICogQHR5cGVkZWYgUHJvZ3Jlc3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbGFwc2VkTXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lTGVmdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByb2dyZXNzXG4gKi9cblxuLyoqXG4gKiBQcm9ncmVzcyBjYWxsYmFjayBmb3Ige0BsaW5rIGxvbmdTbGVlcH1cbiAqIEBjYWxsYmFjayBQcm9ncmVzc0NhbGxiYWNrXG4gKiBAcGFyYW0ge1Byb2dyZXNzfSBwcm9ncmVzc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTs7QUFFQSxNQUFNQSxvQkFBb0IsR0FBRyxJQUFJOztBQU9qQyxlQUFlQyxLQUFLLENBQUVDLEVBQUUsRUFBRTtFQUN4QixPQUFPLE1BQU1DLGlCQUFDLENBQUNDLEtBQUssQ0FBQ0YsRUFBRSxDQUFDO0FBQzFCOztBQWVBLGVBQWVHLFNBQVMsQ0FBRUgsRUFBRSxFQUFFO0VBQzVCSSxXQUFXLEdBQUdOLG9CQUFvQjtFQUNsQ08sVUFBVSxHQUFHLElBQUk7RUFDakJDLFVBQVUsR0FBRztBQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNOLElBQUlOLEVBQUUsR0FBR0ksV0FBVyxFQUFFO0lBQ3BCLE9BQU8sTUFBTUwsS0FBSyxDQUFDQyxFQUFFLENBQUM7RUFDeEI7RUFDQSxNQUFNTyxLQUFLLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLEdBQUdULEVBQUU7RUFDN0IsSUFBSVUsUUFBUTtFQUNaLElBQUlDLFNBQVMsR0FBRyxDQUFDO0VBQ2pCLEdBQUc7SUFDRCxNQUFNQyxHQUFHLEdBQUdKLElBQUksQ0FBQ0MsR0FBRyxFQUFFO0lBQ3RCLE1BQU1WLEtBQUssQ0FBQ00sVUFBVSxDQUFD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