@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
318 lines (316 loc) • 30 kB
JavaScript
var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
// src/data-types/standard/duration.ts
import {
Duration as Base
} from "../encodable/index.mjs";
import {
NumberRangeError,
SurrealTypeError,
SurrealValueError,
unreachable
} from "../../errors/index.mjs";
import { isSafeNumber } from "../../utils/index.mjs";
var DURATION_PART_REGEX = /^(\d+)((?:m|u|µ|μ|n)?s|m|h|d|w|y)/;
var SECONDS_PER_MINUTE = 60n;
var SECONDS_PER_HOUR = 60n * SECONDS_PER_MINUTE;
var SECONDS_PER_DAY = 24n * SECONDS_PER_HOUR;
var SECONDS_PER_WEEK = 7n * SECONDS_PER_DAY;
var SECONDS_PER_YEAR = 365n * SECONDS_PER_DAY;
var NANOSECONDS_PER_MICROSECOND = 1000n;
var NANOSECONDS_PER_MILLISECOND = 1000000n;
var NANOSECONDS_PER_SECOND = 1000000000n;
var MAX_UINT_64 = 18446744073709551615n;
var _Duration = class _Duration extends Base {
static get MAX() {
return new this([MAX_UINT_64, 1e9 - 1]);
}
static get ZERO() {
return new this(0);
}
static years(years) {
return new this(years + "y");
}
static weeks(weeks) {
return new this(weeks + "w");
}
static days(days) {
return new this(days + "d");
}
static hours(hours) {
return new this(hours + "h");
}
static minutes(minutes) {
return new this(minutes + "m");
}
static seconds(seconds) {
return new this(seconds + "s");
}
static milliseconds(milliseconds) {
return new this(milliseconds + "ms");
}
static microseconds(microseconds) {
return new this(microseconds + "us");
}
static nanoseconds(nanoseconds) {
return new this(nanoseconds + "ns");
}
constructor(value) {
let source;
if (Array.isArray(value)) {
source = value;
} else {
switch (typeof value) {
case "number":
if (isSafeNumber(value) && value >= 0) {
source = [
BigInt(Math.floor(value / 1e3)),
Math.floor(value % 1e3 * 1e6) % 1e9
];
}
break;
case "bigint":
source = [
value / NANOSECONDS_PER_SECOND,
Number(value % NANOSECONDS_PER_SECOND)
];
break;
case "string": {
if (value === "" || value === "0" || value === "0ns") {
source = [];
break;
}
let match, rest = value, secs = 0n, nano = 0n, i;
while (rest) {
if (!(match = rest.match(DURATION_PART_REGEX))) {
throw new SurrealValueError(
`matches ${/^([0-9]+(ms|us|µs|μs|nss|m|h|d|w|y))+$/.source}`,
value
);
}
i = BigInt(match[1]);
switch (match[2]) {
case "y":
secs += i * SECONDS_PER_YEAR;
break;
case "w":
secs += i * SECONDS_PER_WEEK;
break;
case "d":
secs += i * SECONDS_PER_DAY;
break;
case "h":
secs += i * SECONDS_PER_HOUR;
break;
case "m":
secs += i * SECONDS_PER_MINUTE;
break;
case "s":
secs += i;
break;
case "ms":
nano += i * NANOSECONDS_PER_MILLISECOND;
break;
case "us":
case "\xB5s":
case "\u03BCs":
nano += i * NANOSECONDS_PER_MICROSECOND;
break;
case "ns":
nano += i;
break;
default:
unreachable();
}
rest = rest.substring(match[0].length);
}
source = [
secs + nano / NANOSECONDS_PER_SECOND,
Number(nano % NANOSECONDS_PER_SECOND)
];
break;
}
case "object":
if (typeof value.seconds === "bigint") {
source = [value.seconds, value.nanoseconds];
}
}
}
if (source === void 0) {
throw new SurrealTypeError(
["Number", "BigInt", "String", "Array", "Object"],
source
);
}
super(source);
}
get seconds() {
return this._seconds;
}
set seconds(s) {
if (typeof s === "bigint" && s >= 0n && s <= MAX_UINT_64) {
this._seconds = s;
} else {
throw new NumberRangeError([0n, MAX_UINT_64], s, { integer: true });
}
}
get nanoseconds() {
return this._nanoseconds;
}
set nanoseconds(ns) {
if (Number.isSafeInteger(ns) && ns >= 0) {
this._nanoseconds = ns === 0 ? 0 : ns % 1e9;
if (ns >= 1e9) {
this.seconds += BigInt(Math.floor(ns / 1e9));
}
} else {
throw new NumberRangeError([0, Number.MAX_SAFE_INTEGER], ns, {
integer: true
});
}
}
getCompact() {
return [this.seconds, this.nanoseconds];
}
setCompact(compact) {
this.seconds = compact[0];
this.nanoseconds = compact[1];
}
getYears() {
return this.parse()["years"] || 0;
}
addYears(years) {
this.seconds += BigInt(years) * SECONDS_PER_YEAR;
}
subYears(years) {
this.seconds -= BigInt(years) * SECONDS_PER_YEAR;
}
getWeeks() {
return this.parse()["weeks"] || 0;
}
addWeeks(weeks) {
this.seconds += BigInt(weeks) * SECONDS_PER_WEEK;
}
subWeeks(weeks) {
this.seconds -= BigInt(weeks) * SECONDS_PER_WEEK;
}
getDays() {
return this.parse()["days"] || 0;
}
addDays(days) {
this.seconds += BigInt(days) * SECONDS_PER_DAY;
}
subDays(days) {
this.seconds -= BigInt(days) * SECONDS_PER_DAY;
}
getHours() {
return this.parse()["hours"] || 0;
}
addHours(hours) {
this.seconds += BigInt(hours) * SECONDS_PER_HOUR;
}
subHours(hours) {
this.seconds -= BigInt(hours) * SECONDS_PER_HOUR;
}
getMinutes() {
return this.parse()["minutes"] || 0;
}
addMinutes(minutes) {
this.seconds += BigInt(minutes) * SECONDS_PER_MINUTE;
}
subMinutes(minutes) {
this.seconds -= BigInt(minutes) * SECONDS_PER_MINUTE;
}
getSeconds() {
return this.parse()["seconds"] || 0;
}
addSeconds(seconds) {
this.seconds += BigInt(seconds);
}
subSeconds(seconds) {
this.seconds -= BigInt(seconds);
}
getMilliseconds() {
return this.parse()["milliseconds"] || 0;
}
addMilliseconds(milliseconds) {
this.nanoseconds += milliseconds * 1e6;
}
subMilliseconds(milliseconds) {
this.nanoseconds -= milliseconds * 1e6;
}
getMicroseconds() {
return this.parse()["microseconds"] || 0;
}
addMicroseconds(microseconds) {
this.nanoseconds += microseconds * 1e3;
}
subMicroseconds(microseconds) {
this.nanoseconds -= microseconds * 1e3;
}
getNanoseconds() {
return this.parse()["nanoseconds"] || 0;
}
addNanoseconds(nanoseconds) {
this.nanoseconds += nanoseconds;
}
subNanoseconds(nanoseconds) {
this.nanoseconds -= nanoseconds;
}
asYears() {
return this.asDays() / 365;
}
asWeeks() {
return this.asDays() / 7;
}
asDays() {
return this.asHours() / 24;
}
asHours() {
return this.asMinutes() / 60;
}
asMinutes() {
return this.asSeconds() / 60;
}
asSeconds() {
return this.asMilliseconds() / 1e3;
}
asMilliseconds() {
const ms = this.seconds * 1000n + BigInt(this.nanoseconds) / 1000000n;
const us = this.nanoseconds % 1e6 / 1e6;
return Number(ms) + us;
}
asMicroseconds() {
const us = this.seconds * 1000000n + BigInt(this.nanoseconds) / 1000n;
const ns = this.nanoseconds % 1e3 / 1e3;
return Number(us) + ns;
}
asNanoseconds() {
const ns = this.seconds * 1000000000n + BigInt(this.nanoseconds);
return Number(ns);
}
// ISO 8601 duration format
// dprint-ignore
toISOString() {
const o = this.parse();
let s = "P";
if ("years" in o) s += o.years + "Y";
if ("weeks" in o) s += o.weeks + "W";
if ("days" in o) s += o.days + "D";
if ("hours" in o) s += o.hours + "H";
if ("minutes" in o) s += o.minutes + "M";
if ("seconds" in o) s += o.seconds + "S";
if (s === "P") s += "0S";
return s;
}
clone() {
const This = this.constructor;
return new This(this);
}
};
__name(_Duration, "Duration");
var Duration = _Duration;
export {
Duration as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RhdGEtdHlwZXMvc3RhbmRhcmQvZHVyYXRpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIER1cmF0aW9uIGFzIEJhc2UsXG4gIHR5cGUgRHVyYXRpb25Tb3VyY2UsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZW5jb2RhYmxlLWRhdGF0eXBlc1wiO1xuaW1wb3J0IHtcbiAgTnVtYmVyUmFuZ2VFcnJvcixcbiAgU3VycmVhbFR5cGVFcnJvcixcbiAgU3VycmVhbFZhbHVlRXJyb3IsXG4gIHVucmVhY2hhYmxlLFxufSBmcm9tIFwiQHRhaS1rdW4vc3VycmVhbGRiL2Vycm9yc1wiO1xuaW1wb3J0IHsgaXNTYWZlTnVtYmVyIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi91dGlsc1wiO1xuXG5leHBvcnQgdHlwZSAqIGZyb20gXCIuLi9lbmNvZGFibGUvZHVyYXRpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBEdXJhdGlvbkxpa2Uge1xuICBzZWNvbmRzOiBiaWdpbnQ7XG4gIG5hbm9zZWNvbmRzOiBudW1iZXI7XG59XG5cbi8vIG0gXHUzMDZFXHU1MjREXHUzMDZCIG1zIFx1MzA0Q1x1MzBERVx1MzBDM1x1MzBDMVx1MzA1OVx1MzA4Qlx1MzA4OFx1MzA0Nlx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzAwMlxuY29uc3QgRFVSQVRJT05fUEFSVF9SRUdFWCA9IC9eKFxcZCspKCg/Om18dXxcdTAwQjV8XHUwM0JDfG4pP3N8bXxofGR8d3x5KS87XG5cbmNvbnN0IFNFQ09ORFNfUEVSX01JTlVURSA9IDYwbjtcbmNvbnN0IFNFQ09ORFNfUEVSX0hPVVIgPSA2MG4gKiBTRUNPTkRTX1BFUl9NSU5VVEU7XG5jb25zdCBTRUNPTkRTX1BFUl9EQVkgPSAyNG4gKiBTRUNPTkRTX1BFUl9IT1VSO1xuY29uc3QgU0VDT05EU19QRVJfV0VFSyA9IDduICogU0VDT05EU19QRVJfREFZO1xuY29uc3QgU0VDT05EU19QRVJfWUVBUiA9IDM2NW4gKiBTRUNPTkRTX1BFUl9EQVk7XG5jb25zdCBOQU5PU0VDT05EU19QRVJfTUlDUk9TRUNPTkQgPSAxXzAwMG47XG5jb25zdCBOQU5PU0VDT05EU19QRVJfTUlMTElTRUNPTkQgPSAxXzAwMF8wMDBuO1xuY29uc3QgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCA9IDFfMDAwXzAwMF8wMDBuO1xuXG5jb25zdCBNQVhfVUlOVF82NCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1bjtcblxuLyoqXG4gKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvYXBpL2RhdGEvZHVyYXRpb24pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER1cmF0aW9uIGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBnZXQgTUFYKCkge1xuICAgIHJldHVybiBuZXcgdGhpcyhbTUFYX1VJTlRfNjQsIDFlOSAtIDFdKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgWkVSTygpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoMCk7XG4gIH1cblxuICBzdGF0aWMgeWVhcnMoeWVhcnM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgdGhpcyh5ZWFycyArIFwieVwiKTtcbiAgfVxuXG4gIHN0YXRpYyB3ZWVrcyh3ZWVrczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHdlZWtzICsgXCJ3XCIpO1xuICB9XG5cbiAgc3RhdGljIGRheXMoZGF5czogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKGRheXMgKyBcImRcIik7XG4gIH1cblxuICBzdGF0aWMgaG91cnMoaG91cnM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhob3VycyArIFwiaFwiKTtcbiAgfVxuXG4gIHN0YXRpYyBtaW51dGVzKG1pbnV0ZXM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhtaW51dGVzICsgXCJtXCIpO1xuICB9XG5cbiAgc3RhdGljIHNlY29uZHMoc2Vjb25kczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHNlY29uZHMgKyBcInNcIik7XG4gIH1cblxuICBzdGF0aWMgbWlsbGlzZWNvbmRzKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG1pbGxpc2Vjb25kcyArIFwibXNcIik7XG4gIH1cblxuICBzdGF0aWMgbWljcm9zZWNvbmRzKG1pY3Jvc2Vjb25kczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG1pY3Jvc2Vjb25kcyArIFwidXNcIik7XG4gIH1cblxuICBzdGF0aWMgbmFub3NlY29uZHMobmFub3NlY29uZHM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuYW5vc2Vjb25kcyArIFwibnNcIik7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICB2YWx1ZTpcbiAgICAgIHwgRHVyYXRpb25Tb3VyY2VcbiAgICAgIHwgbnVtYmVyXG4gICAgICB8IGJpZ2ludFxuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgRHVyYXRpb25MaWtlLFxuICApIHtcbiAgICBsZXQgc291cmNlOiBEdXJhdGlvblNvdXJjZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgc291cmNlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICBpZiAoaXNTYWZlTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBbXG4gICAgICAgICAgICAgIEJpZ0ludChNYXRoLmZsb29yKHZhbHVlIC8gMWUzKSksXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoKHZhbHVlICUgMWUzKSAqIDFlNikgJSAxZTksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICBzb3VyY2UgPSBbXG4gICAgICAgICAgICB2YWx1ZSAvIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQsXG4gICAgICAgICAgICBOdW1iZXIodmFsdWUgJSBOQU5PU0VDT05EU19QRVJfU0VDT05EKSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjoge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gXCIwXCIgfHwgdmFsdWUgPT09IFwiMG5zXCIpIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IFtdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCxcbiAgICAgICAgICAgIHJlc3QgPSB2YWx1ZSxcbiAgICAgICAgICAgIHNlY3MgPSAwbixcbiAgICAgICAgICAgIG5hbm8gPSAwbixcbiAgICAgICAgICAgIGk6IGJpZ2ludDtcblxuICAgICAgICAgIHdoaWxlIChyZXN0KSB7XG4gICAgICAgICAgICBpZiAoIShtYXRjaCA9IHJlc3QubWF0Y2goRFVSQVRJT05fUEFSVF9SRUdFWCkpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBTdXJyZWFsVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgICBgbWF0Y2hlcyAkey9eKFswLTldKyhtc3x1c3xcdTAwQjVzfFx1MDNCQ3N8bnNzfG18aHxkfHd8eSkpKyQvLnNvdXJjZX1gLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpID0gQmlnSW50KG1hdGNoWzFdISk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgICAgICAgICBzZWNzICs9IGkgKiBTRUNPTkRTX1BFUl9ZRUFSO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJ3XCI6XG4gICAgICAgICAgICAgICAgc2VjcyArPSBpICogU0VDT05EU19QRVJfV0VFSztcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgICAgICAgIHNlY3MgKz0gaSAqIFNFQ09ORFNfUEVSX0RBWTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgICAgICAgIHNlY3MgKz0gaSAqIFNFQ09ORFNfUEVSX0hPVVI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgICAgICBzZWNzICs9IGkgKiBTRUNPTkRTX1BFUl9NSU5VVEU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICAgICAgICBzZWNzICs9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcIm1zXCI6XG4gICAgICAgICAgICAgICAgbmFubyArPSBpICogTkFOT1NFQ09ORFNfUEVSX01JTExJU0VDT05EO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJ1c1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiXHUwMEI1c1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiXHUwM0JDc1wiOlxuICAgICAgICAgICAgICAgIG5hbm8gKz0gaSAqIE5BTk9TRUNPTkRTX1BFUl9NSUNST1NFQ09ORDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwibnNcIjpcbiAgICAgICAgICAgICAgICBuYW5vICs9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB1bnJlYWNoYWJsZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN0ID0gcmVzdC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzb3VyY2UgPSBbXG4gICAgICAgICAgICBzZWNzICsgbmFubyAvIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQsXG4gICAgICAgICAgICBOdW1iZXIobmFubyAlIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQpLFxuICAgICAgICAgIF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5zZWNvbmRzID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBbdmFsdWUuc2Vjb25kcywgdmFsdWUubmFub3NlY29uZHNdO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBTdXJyZWFsVHlwZUVycm9yKFxuICAgICAgICBbXCJOdW1iZXJcIiwgXCJCaWdJbnRcIiwgXCJTdHJpbmdcIiwgXCJBcnJheVwiLCBcIk9iamVjdFwiXSxcbiAgICAgICAgc291cmNlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzdXBlcihzb3VyY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IHNlY29uZHMoKTogYmlnaW50IHtcbiAgICByZXR1cm4gdGhpcy5fc2Vjb25kcztcbiAgfVxuXG4gIG92ZXJyaWRlIHNldCBzZWNvbmRzKHM6IGJpZ2ludCkge1xuICAgIGlmICh0eXBlb2YgcyA9PT0gXCJiaWdpbnRcIiAmJiBzID49IDBuICYmIHMgPD0gTUFYX1VJTlRfNjQpIHtcbiAgICAgIHRoaXMuX3NlY29uZHMgPSBzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgTnVtYmVyUmFuZ2VFcnJvcihbMG4sIE1BWF9VSU5UXzY0XSwgcywgeyBpbnRlZ2VyOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGdldCBuYW5vc2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9uYW5vc2Vjb25kcztcbiAgfVxuXG4gIG92ZXJyaWRlIHNldCBuYW5vc2Vjb25kcyhuczogbnVtYmVyKSB7XG4gICAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKG5zKSAmJiBucyA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW5vc2Vjb25kcyA9IG5zID09PSAwID8gMCA6IG5zICUgMWU5O1xuXG4gICAgICBpZiAobnMgPj0gMWU5KSB7XG4gICAgICAgIHRoaXMuc2Vjb25kcyArPSBCaWdJbnQoTWF0aC5mbG9vcihucyAvIDFlOSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgTnVtYmVyUmFuZ2VFcnJvcihbMCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdLCBucywge1xuICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcGFjdCgpOiBbc2Vjb25kczogYmlnaW50LCBuYW5vc2Vjb25kczogbnVtYmVyXSB7XG4gICAgcmV0dXJuIFt0aGlzLnNlY29uZHMsIHRoaXMubmFub3NlY29uZHNdO1xuICB9XG5cbiAgc2V0Q29tcGFjdChjb21wYWN0OiByZWFkb25seSBbc2Vjb25kczogYmlnaW50LCBuYW5vc2Vjb25kczogbnVtYmVyXSk6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyA9IGNvbXBhY3RbMF07XG4gICAgdGhpcy5uYW5vc2Vjb25kcyA9IGNvbXBhY3RbMV07XG4gIH1cblxuICBnZXRZZWFycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKClbXCJ5ZWFyc1wiXSB8fCAwO1xuICB9XG5cbiAgYWRkWWVhcnMoeWVhcnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyArPSBCaWdJbnQoeWVhcnMpICogU0VDT05EU19QRVJfWUVBUjtcbiAgfVxuXG4gIHN1YlllYXJzKHllYXJzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZHMgLT0gQmlnSW50KHllYXJzKSAqIFNFQ09ORFNfUEVSX1lFQVI7XG4gIH1cblxuICBnZXRXZWVrcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKClbXCJ3ZWVrc1wiXSB8fCAwO1xuICB9XG5cbiAgYWRkV2Vla3Mod2Vla3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyArPSBCaWdJbnQod2Vla3MpICogU0VDT05EU19QRVJfV0VFSztcbiAgfVxuXG4gIHN1YldlZWtzKHdlZWtzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZHMgLT0gQmlnSW50KHdlZWtzKSAqIFNFQ09ORFNfUEVSX1dFRUs7XG4gIH1cblxuICBnZXREYXlzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKVtcImRheXNcIl0gfHwgMDtcbiAgfVxuXG4gIGFkZERheXMoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWNvbmRzICs9IEJpZ0ludChkYXlzKSAqIFNFQ09ORFNfUEVSX0RBWTtcbiAgfVxuXG4gIHN1YkRheXMoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWNvbmRzIC09IEJpZ0ludChkYXlzKSAqIFNFQ09ORFNfUEVSX0RBWTtcbiAgfVxuXG4gIGdldEhvdXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKVtcImhvdXJzXCJdIHx8IDA7XG4gIH1cblxuICBhZGRIb3Vycyhob3VyczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWNvbmRzICs9IEJpZ0ludChob3VycykgKiBTRUNPTkRTX1BFUl9IT1VSO1xuICB9XG5cbiAgc3ViSG91cnMoaG91cnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyAtPSBCaWdJbnQoaG91cnMpICogU0VDT05EU19QRVJfSE9VUjtcbiAgfVxuXG4gIGdldE1pbnV0ZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpW1wibWludXRlc1wiXSB8fCAwO1xuICB9XG5cbiAgYWRkTWludXRlcyhtaW51dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZHMgKz0gQmlnSW50KG1pbnV0ZXMpICogU0VDT05EU19QRVJfTUlOVVRFO1xuICB9XG5cbiAgc3ViTWludXRlcyhtaW51dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZHMgLT0gQmlnSW50KG1pbnV0ZXMpICogU0VDT05EU19QRVJfTUlOVVRFO1xuICB9XG5cbiAgZ2V0U2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKClbXCJzZWNvbmRzXCJdIHx8IDA7XG4gIH1cblxuICBhZGRTZWNvbmRzKHNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyArPSBCaWdJbnQoc2Vjb25kcyk7XG4gIH1cblxuICBzdWJTZWNvbmRzKHNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyAtPSBCaWdJbnQoc2Vjb25kcyk7XG4gIH1cblxuICBnZXRNaWxsaXNlY29uZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpW1wibWlsbGlzZWNvbmRzXCJdIHx8IDA7XG4gIH1cblxuICBhZGRNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hbm9zZWNvbmRzICs9IG1pbGxpc2Vjb25kcyAqIDFlNjtcbiAgfVxuXG4gIHN1Yk1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmFub3NlY29uZHMgLT0gbWlsbGlzZWNvbmRzICogMWU2O1xuICB9XG5cbiAgZ2V0TWljcm9zZWNvbmRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKVtcIm1pY3Jvc2Vjb25kc1wiXSB8fCAwO1xuICB9XG5cbiAgYWRkTWljcm9zZWNvbmRzKG1pY3Jvc2Vjb25kczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uYW5vc2Vjb25kcyArPSBtaWNyb3NlY29uZHMgKiAxZTM7XG4gIH1cblxuICBzdWJNaWNyb3NlY29uZHMobWljcm9zZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hbm9zZWNvbmRzIC09IG1pY3Jvc2Vjb25kcyAqIDFlMztcbiAgfVxuXG4gIGdldE5hbm9zZWNvbmRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKVtcIm5hbm9zZWNvbmRzXCJdIHx8IDA7XG4gIH1cblxuICBhZGROYW5vc2Vjb25kcyhuYW5vc2Vjb25kczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uYW5vc2Vjb25kcyArPSBuYW5vc2Vjb25kcztcbiAgfVxuXG4gIHN1Yk5hbm9zZWNvbmRzKG5hbm9zZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hbm9zZWNvbmRzIC09IG5hbm9zZWNvbmRzO1xuICB9XG5cbiAgYXNZZWFycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzRGF5cygpIC8gMzY1O1xuICB9XG5cbiAgYXNXZWVrcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzRGF5cygpIC8gNztcbiAgfVxuXG4gIGFzRGF5cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzSG91cnMoKSAvIDI0O1xuICB9XG5cbiAgYXNIb3VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzTWludXRlcygpIC8gNjA7XG4gIH1cblxuICBhc01pbnV0ZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hc1NlY29uZHMoKSAvIDYwO1xuICB9XG5cbiAgYXNTZWNvbmRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYXNNaWxsaXNlY29uZHMoKSAvIDFlMztcbiAgfVxuXG4gIGFzTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XG4gICAgY29uc3QgbXMgPSB0aGlzLnNlY29uZHMgKiAxXzAwMG4gKyBCaWdJbnQodGhpcy5uYW5vc2Vjb25kcykgLyAxXzAwMF8wMDBuO1xuICAgIGNvbnN0IHVzID0gKHRoaXMubmFub3NlY29uZHMgJSAxZTYpIC8gMWU2O1xuXG4gICAgcmV0dXJuIE51bWJlcihtcykgKyB1cztcbiAgfVxuXG4gIGFzTWljcm9zZWNvbmRzKCk6IG51bWJlciB7XG4gICAgY29uc3QgdXMgPSB0aGlzLnNlY29uZHMgKiAxXzAwMF8wMDBuICsgQmlnSW50KHRoaXMubmFub3NlY29uZHMpIC8gMV8wMDBuO1xuICAgIGNvbnN0IG5zID0gKHRoaXMubmFub3NlY29uZHMgJSAxZTMpIC8gMWUzO1xuXG4gICAgcmV0dXJuIE51bWJlcih1cykgKyBucztcbiAgfVxuXG4gIGFzTmFub3NlY29uZHMoKTogbnVtYmVyIHtcbiAgICBjb25zdCBucyA9IHRoaXMuc2Vjb25kcyAqIDFfMDAwXzAwMF8wMDBuICsgQmlnSW50KHRoaXMubmFub3NlY29uZHMpO1xuXG4gICAgcmV0dXJuIE51bWJlcihucyk7XG4gIH1cblxuICAvLyBJU08gODYwMSBkdXJhdGlvbiBmb3JtYXRcbiAgLy8gZHByaW50LWlnbm9yZVxuICB0b0lTT1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IG8gPSB0aGlzLnBhcnNlKCk7XG4gICAgbGV0IHMgPSBcIlBcIjtcblxuICAgIGlmIChcInllYXJzXCIgICBpbiBvKSBzICs9IG8ueWVhcnMgICArIFwiWVwiO1xuICAgIGlmIChcIndlZWtzXCIgICBpbiBvKSBzICs9IG8ud2Vla3MgICArIFwiV1wiO1xuICAgIGlmIChcImRheXNcIiAgICBpbiBvKSBzICs9IG8uZGF5cyAgICArIFwiRFwiO1xuICAgIGlmIChcImhvdXJzXCIgICBpbiBvKSBzICs9IG8uaG91cnMgICArIFwiSFwiO1xuICAgIGlmIChcIm1pbnV0ZXNcIiBpbiBvKSBzICs9IG8ubWludXRlcyArIFwiTVwiO1xuICAgIGlmIChcInNlY29uZHNcIiBpbiBvKSBzICs9IG8uc2Vjb25kcyArIFwiU1wiO1xuICAgIGlmIChzID09PSBcIlBcIikgcyArPSBcIjBTXCI7XG5cbiAgICByZXR1cm4gc1xuICB9XG5cbiAgY2xvbmUoKTogdGhpcyB7XG4gICAgY29uc3QgVGhpcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIER1cmF0aW9uO1xuXG4gICAgcmV0dXJuIG5ldyBUaGlzKHRoaXMpIGFzIHRoaXM7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7QUFBQTtBQUFBLEVBQ0UsWUFBWTtBQUFBLE9BRVA7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxvQkFBb0I7QUFVN0IsSUFBTSxzQkFBc0I7QUFFNUIsSUFBTSxxQkFBcUI7QUFDM0IsSUFBTSxtQkFBbUIsTUFBTTtBQUMvQixJQUFNLGtCQUFrQixNQUFNO0FBQzlCLElBQU0sbUJBQW1CLEtBQUs7QUFDOUIsSUFBTSxtQkFBbUIsT0FBTztBQUNoQyxJQUFNLDhCQUE4QjtBQUNwQyxJQUFNLDhCQUE4QjtBQUNwQyxJQUFNLHlCQUF5QjtBQUUvQixJQUFNLGNBQWM7QUFLcEIsSUFBcUIsWUFBckIsTUFBcUIsa0JBQWlCLEtBQUs7QUFBQSxFQUN6QyxXQUFXLE1BQU07QUFDZixXQUFPLElBQUksS0FBSyxDQUFDLGFBQWEsTUFBTSxDQUFDLENBQUM7QUFBQSxFQUN4QztBQUFBLEVBRUEsV0FBVyxPQUFPO0FBQ2hCLFdBQU8sSUFBSSxLQUFLLENBQUM7QUFBQSxFQUNuQjtBQUFBLEVBRUEsT0FBTyxNQUFNLE9BQWU7QUFDMUIsV0FBTyxJQUFJLEtBQUssUUFBUSxHQUFHO0FBQUEsRUFDN0I7QUFBQSxFQUVBLE9BQU8sTUFBTSxPQUFlO0FBQzFCLFdBQU8sSUFBSSxLQUFLLFFBQVEsR0FBRztBQUFBLEVBQzdCO0FBQUEsRUFFQSxPQUFPLEtB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QUFBQSxFQUVBLFNBQVMsT0FBcUI7QUFDNUIsU0FBSyxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFNBQVMsT0FBcUI7QUFDNUIsU0FBSyxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFdBQW1CO0FBQ2pCLFdBQU8sS0FBSyxNQUFNLEVBQUUsT0FBTyxLQUFLO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFNBQVMsT0FBcUI7QUFDNUIsU0FBSyxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFNBQVMsT0FBcUI7QUFDNUIsU0FBSyxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFVBQWtCO0FBQ2hCLFdBQU8sS0FBSyxNQUFNLEVBQUUsTUFBTSxLQUFLO0FBQUEsRUFDakM7QUFBQSxFQUVBLFFBQVEsTUFBb0I7QUFDMUIsU0FBSyxXQUFXLE9BQU8sSUFBSSxJQUFJO0FBQUEsRUFDakM7QUFBQSxFQUVBLFFBQVEsTUFBb0I7QUFDMUIsU0FBSyxXQUFXLE9BQU8sSUFBSSxJQUFJO0FBQUEsRUFDakM7QUFBQSxFQUVBLFdBQW1CO0FBQ2pCLFdBQU8sS0FBSyxNQUFNLEVBQUUsT0FBTyxLQUFLO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFNBQVMsT0FBcUI7QUFDNUIsU0FBSyxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFNBQVMsT0FBcUI7QUFDNUIsU0FBSyxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDbEM7QUFBQSxFQUVBLGFBQXFCO0FBQ25CLFdBQU8sS0FBSyxNQUFNLEVBQUUsU0FBUyxLQUFLO0FBQUEsRUFDcEM7QUFBQSxFQUVBLFdBQVcsU0FBdUI7QUFDaEMsU0FBSyxXQUFXLE9BQU8sT0FBTyxJQUFJO0FBQUEsRUFDcEM7QUFBQSxFQUVBLFdBQVcsU0FBdUI7QUFDaEMsU0FBSyxXQUFXLE9BQU8sT0FBTyxJQUFJO0FBQUEsRUFDcEM7QUFBQSxFQUVBLGFBQXFCO0FB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