@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
330 lines (328 loc) • 30.9 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/data-types/standard/duration.ts
var duration_exports = {};
__export(duration_exports, {
default: () => Duration
});
module.exports = __toCommonJS(duration_exports);
var import_encodable_datatypes = require("../encodable/index.cjs");
var import_errors = require("../../errors/index.cjs");
var import_utils = require("../../utils/index.cjs");
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 import_encodable_datatypes.Duration {
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 ((0, import_utils.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 import_errors.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:
(0, import_errors.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 import_errors.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 import_errors.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 import_errors.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;
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RhdGEtdHlwZXMvc3RhbmRhcmQvZHVyYXRpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIER1cmF0aW9uIGFzIEJhc2UsXG4gIHR5cGUgRHVyYXRpb25Tb3VyY2UsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZW5jb2RhYmxlLWRhdGF0eXBlc1wiO1xuaW1wb3J0IHtcbiAgTnVtYmVyUmFuZ2VFcnJvcixcbiAgU3VycmVhbFR5cGVFcnJvcixcbiAgU3VycmVhbFZhbHVlRXJyb3IsXG4gIHVucmVhY2hhYmxlLFxufSBmcm9tIFwiQHRhaS1rdW4vc3VycmVhbGRiL2Vycm9yc1wiO1xuaW1wb3J0IHsgaXNTYWZlTnVtYmVyIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi91dGlsc1wiO1xuXG5leHBvcnQgdHlwZSAqIGZyb20gXCIuLi9lbmNvZGFibGUvZHVyYXRpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBEdXJhdGlvbkxpa2Uge1xuICBzZWNvbmRzOiBiaWdpbnQ7XG4gIG5hbm9zZWNvbmRzOiBudW1iZXI7XG59XG5cbi8vIG0gXHUzMDZFXHU1MjREXHUzMDZCIG1zIFx1MzA0Q1x1MzBERVx1MzBDM1x1MzBDMVx1MzA1OVx1MzA4Qlx1MzA4OFx1MzA0Nlx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzAwMlxuY29uc3QgRFVSQVRJT05fUEFSVF9SRUdFWCA9IC9eKFxcZCspKCg/Om18dXxcdTAwQjV8XHUwM0JDfG4pP3N8bXxofGR8d3x5KS87XG5cbmNvbnN0IFNFQ09ORFNfUEVSX01JTlVURSA9IDYwbjtcbmNvbnN0IFNFQ09ORFNfUEVSX0hPVVIgPSA2MG4gKiBTRUNPTkRTX1BFUl9NSU5VVEU7XG5jb25zdCBTRUNPTkRTX1BFUl9EQVkgPSAyNG4gKiBTRUNPTkRTX1BFUl9IT1VSO1xuY29uc3QgU0VDT05EU19QRVJfV0VFSyA9IDduICogU0VDT05EU19QRVJfREFZO1xuY29uc3QgU0VDT05EU19QRVJfWUVBUiA9IDM2NW4gKiBTRUNPTkRTX1BFUl9EQVk7XG5jb25zdCBOQU5PU0VDT05EU19QRVJfTUlDUk9TRUNPTkQgPSAxXzAwMG47XG5jb25zdCBOQU5PU0VDT05EU19QRVJfTUlMTElTRUNPTkQgPSAxXzAwMF8wMDBuO1xuY29uc3QgTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCA9IDFfMDAwXzAwMF8wMDBuO1xuXG5jb25zdCBNQVhfVUlOVF82NCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1bjtcblxuLyoqXG4gKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvYXBpL2RhdGEvZHVyYXRpb24pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER1cmF0aW9uIGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBnZXQgTUFYKCkge1xuICAgIHJldHVybiBuZXcgdGhpcyhbTUFYX1VJTlRfNjQsIDFlOSAtIDFdKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgWkVSTygpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMoMCk7XG4gIH1cblxuICBzdGF0aWMgeWVhcnMoeWVhcnM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgdGhpcyh5ZWFycyArIFwieVwiKTtcbiAgfVxuXG4gIHN0YXRpYyB3ZWVrcyh3ZWVrczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHdlZWtzICsgXCJ3XCIpO1xuICB9XG5cbiAgc3RhdGljIGRheXMoZGF5czogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKGRheXMgKyBcImRcIik7XG4gIH1cblxuICBzdGF0aWMgaG91cnMoaG91cnM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhob3VycyArIFwiaFwiKTtcbiAgfVxuXG4gIHN0YXRpYyBtaW51dGVzKG1pbnV0ZXM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhtaW51dGVzICsgXCJtXCIpO1xuICB9XG5cbiAgc3RhdGljIHNlY29uZHMoc2Vjb25kczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHNlY29uZHMgKyBcInNcIik7XG4gIH1cblxuICBzdGF0aWMgbWlsbGlzZWNvbmRzKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG1pbGxpc2Vjb25kcyArIFwibXNcIik7XG4gIH1cblxuICBzdGF0aWMgbWljcm9zZWNvbmRzKG1pY3Jvc2Vjb25kczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG1pY3Jvc2Vjb25kcyArIFwidXNcIik7XG4gIH1cblxuICBzdGF0aWMgbmFub3NlY29uZHMobmFub3NlY29uZHM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgdGhpcyhuYW5vc2Vjb25kcyArIFwibnNcIik7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICB2YWx1ZTpcbiAgICAgIHwgRHVyYXRpb25Tb3VyY2VcbiAgICAgIHwgbnVtYmVyXG4gICAgICB8IGJpZ2ludFxuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgRHVyYXRpb25MaWtlLFxuICApIHtcbiAgICBsZXQgc291cmNlOiBEdXJhdGlvblNvdXJjZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgc291cmNlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICBpZiAoaXNTYWZlTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBbXG4gICAgICAgICAgICAgIEJpZ0ludChNYXRoLmZsb29yKHZhbHVlIC8gMWUzKSksXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IoKHZhbHVlICUgMWUzKSAqIDFlNikgJSAxZTksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICBzb3VyY2UgPSBbXG4gICAgICAgICAgICB2YWx1ZSAvIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQsXG4gICAgICAgICAgICBOdW1iZXIodmFsdWUgJSBOQU5PU0VDT05EU19QRVJfU0VDT05EKSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjoge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gXCIwXCIgfHwgdmFsdWUgPT09IFwiMG5zXCIpIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IFtdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCxcbiAgICAgICAgICAgIHJlc3QgPSB2YWx1ZSxcbiAgICAgICAgICAgIHNlY3MgPSAwbixcbiAgICAgICAgICAgIG5hbm8gPSAwbixcbiAgICAgICAgICAgIGk6IGJpZ2ludDtcblxuICAgICAgICAgIHdoaWxlIChyZXN0KSB7XG4gICAgICAgICAgICBpZiAoIShtYXRjaCA9IHJlc3QubWF0Y2goRFVSQVRJT05fUEFSVF9SRUdFWCkpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBTdXJyZWFsVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgICBgbWF0Y2hlcyAkey9eKFswLTldKyhtc3x1c3xcdTAwQjVzfFx1MDNCQ3N8bnNzfG18aHxkfHd8eSkpKyQvLnNvdXJjZX1gLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpID0gQmlnSW50KG1hdGNoWzFdISk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgICAgICAgICBzZWNzICs9IGkgKiBTRUNPTkRTX1BFUl9ZRUFSO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJ3XCI6XG4gICAgICAgICAgICAgICAgc2VjcyArPSBpICogU0VDT05EU19QRVJfV0VFSztcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgICAgICAgIHNlY3MgKz0gaSAqIFNFQ09ORFNfUEVSX0RBWTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgICAgICAgIHNlY3MgKz0gaSAqIFNFQ09ORFNfUEVSX0hPVVI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgICAgICBzZWNzICs9IGkgKiBTRUNPTkRTX1BFUl9NSU5VVEU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICAgICAgICBzZWNzICs9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSBcIm1zXCI6XG4gICAgICAgICAgICAgICAgbmFubyArPSBpICogTkFOT1NFQ09ORFNfUEVSX01JTExJU0VDT05EO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJ1c1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiXHUwMEI1c1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiXHUwM0JDc1wiOlxuICAgICAgICAgICAgICAgIG5hbm8gKz0gaSAqIE5BTk9TRUNPTkRTX1BFUl9NSUNST1NFQ09ORDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIFwibnNcIjpcbiAgICAgICAgICAgICAgICBuYW5vICs9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB1bnJlYWNoYWJsZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN0ID0gcmVzdC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzb3VyY2UgPSBbXG4gICAgICAgICAgICBzZWNzICsgbmFubyAvIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQsXG4gICAgICAgICAgICBOdW1iZXIobmFubyAlIE5BTk9TRUNPTkRTX1BFUl9TRUNPTkQpLFxuICAgICAgICAgIF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5zZWNvbmRzID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBbdmFsdWUuc2Vjb25kcywgdmFsdWUubmFub3NlY29uZHNdO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBTdXJyZWFsVHlwZUVycm9yKFxuICAgICAgICBbXCJOdW1iZXJcIiwgXCJCaWdJbnRcIiwgXCJTdHJpbmdcIiwgXCJBcnJheVwiLCBcIk9iamVjdFwiXSxcbiAgICAgICAgc291cmNlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzdXBlcihzb3VyY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IHNlY29uZHMoKTogYmlnaW50IHtcbiAgICByZXR1cm4gdGhpcy5fc2Vjb25kcztcbiAgfVxuXG4gIG92ZXJyaWRlIHNldCBzZWNvbmRzKHM6IGJpZ2ludCkge1xuICAgIGlmICh0eXBlb2YgcyA9PT0gXCJiaWdpbnRcIiAmJiBzID49IDBuICYmIHMgPD0gTUFYX1VJTlRfNjQpIHtcbiAgICAgIHRoaXMuX3NlY29uZHMgPSBzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgTnVtYmVyUmFuZ2VFcnJvcihbMG4sIE1BWF9VSU5UXzY0XSwgcywgeyBpbnRlZ2VyOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGdldCBuYW5vc2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9uYW5vc2Vjb25kcztcbiAgfVxuXG4gIG92ZXJyaWRlIHNldCBuYW5vc2Vjb25kcyhuczogbnVtYmVyKSB7XG4gICAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKG5zKSAmJiBucyA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW5vc2Vjb25kcyA9IG5zID09PSAwID8gMCA6IG5zICUgMWU5O1xuXG4gICAgICBpZiAobnMgPj0gMWU5KSB7XG4gICAgICAgIHRoaXMuc2Vjb25kcyArPSBCaWdJbnQoTWF0aC5mbG9vcihucyAvIDFlOSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgTnVtYmVyUmFuZ2VFcnJvcihbMCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdLCBucywge1xuICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcGFjdCgpOiBbc2Vjb25kczogYmlnaW50LCBuYW5vc2Vjb25kczogbnVtYmVyXSB7XG4gICAgcmV0dXJuIFt0aGlzLnNlY29uZHMsIHRoaXMubmFub3NlY29uZHNdO1xuICB9XG5cbiAgc2V0Q29tcGFjdChjb21wYWN0OiByZWFkb25seSBbc2Vjb25kczogYmlnaW50LCBuYW5vc2Vjb25kczogbnVtYmVyXSk6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyA9IGNvbXBhY3RbMF07XG4gICAgdGhpcy5uYW5vc2Vjb25kcyA9IGNvbXBhY3RbMV07XG4gIH1cblxuICBnZXRZZWFycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKClbXCJ5ZWFyc1wiXSB8fCAwO1xuICB9XG5cbiAgYWRkWWVhcnMoeWVhcnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyArPSBCaWdJbnQoeWVhcnMpICogU0VDT05EU19QRVJfWUVBUjtcbiAgfVxuXG4gIHN1YlllYXJzKHllYXJzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZHMgLT0gQmlnSW50KHllYXJzKSAqIFNFQ09ORFNfUEVSX1lFQVI7XG4gIH1cblxuICBnZXRXZWVrcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKClbXCJ3ZWVrc1wiXSB8fCAwO1xuICB9XG5cbiAgYWRkV2Vla3Mod2Vla3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyArPSBCaWdJbnQod2Vla3MpICogU0VDT05EU19QRVJfV0VFSztcbiAgfVxuXG4gIHN1YldlZWtzKHdlZWtzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZHMgLT0gQmlnSW50KHdlZWtzKSAqIFNFQ09ORFNfUEVSX1dFRUs7XG4gIH1cblxuICBnZXREYXlzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKVtcImRheXNcIl0gfHwgMDtcbiAgfVxuXG4gIGFkZERheXMoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWNvbmRzICs9IEJpZ0ludChkYXlzKSAqIFNFQ09ORFNfUEVSX0RBWTtcbiAgfVxuXG4gIHN1YkRheXMoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWNvbmRzIC09IEJpZ0ludChkYXlzKSAqIFNFQ09ORFNfUEVSX0RBWTtcbiAgfVxuXG4gIGdldEhvdXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKVtcImhvdXJzXCJdIHx8IDA7XG4gIH1cblxuICBhZGRIb3Vycyhob3VyczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWNvbmRzICs9IEJpZ0ludChob3VycykgKiBTRUNPTkRTX1BFUl9IT1VSO1xuICB9XG5cbiAgc3ViSG91cnMoaG91cnM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyAtPSBCaWdJbnQoaG91cnMpICogU0VDT05EU19QRVJfSE9VUjtcbiAgfVxuXG4gIGdldE1pbnV0ZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpW1wibWludXRlc1wiXSB8fCAwO1xuICB9XG5cbiAgYWRkTWludXRlcyhtaW51dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZHMgKz0gQmlnSW50KG1pbnV0ZXMpICogU0VDT05EU19QRVJfTUlOVVRFO1xuICB9XG5cbiAgc3ViTWludXRlcyhtaW51dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZHMgLT0gQmlnSW50KG1pbnV0ZXMpICogU0VDT05EU19QRVJfTUlOVVRFO1xuICB9XG5cbiAgZ2V0U2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKClbXCJzZWNvbmRzXCJdIHx8IDA7XG4gIH1cblxuICBhZGRTZWNvbmRzKHNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyArPSBCaWdJbnQoc2Vjb25kcyk7XG4gIH1cblxuICBzdWJTZWNvbmRzKHNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Vjb25kcyAtPSBCaWdJbnQoc2Vjb25kcyk7XG4gIH1cblxuICBnZXRNaWxsaXNlY29uZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpW1wibWlsbGlzZWNvbmRzXCJdIHx8IDA7XG4gIH1cblxuICBhZGRNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hbm9zZWNvbmRzICs9IG1pbGxpc2Vjb25kcyAqIDFlNjtcbiAgfVxuXG4gIHN1Yk1pbGxpc2Vjb25kcyhtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmFub3NlY29uZHMgLT0gbWlsbGlzZWNvbmRzICogMWU2O1xuICB9XG5cbiAgZ2V0TWljcm9zZWNvbmRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKVtcIm1pY3Jvc2Vjb25kc1wiXSB8fCAwO1xuICB9XG5cbiAgYWRkTWljcm9zZWNvbmRzKG1pY3Jvc2Vjb25kczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uYW5vc2Vjb25kcyArPSBtaWNyb3NlY29uZHMgKiAxZTM7XG4gIH1cblxuICBzdWJNaWNyb3NlY29uZHMobWljcm9zZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hbm9zZWNvbmRzIC09IG1pY3Jvc2Vjb25kcyAqIDFlMztcbiAgfVxuXG4gIGdldE5hbm9zZWNvbmRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKVtcIm5hbm9zZWNvbmRzXCJdIHx8IDA7XG4gIH1cblxuICBhZGROYW5vc2Vjb25kcyhuYW5vc2Vjb25kczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uYW5vc2Vjb25kcyArPSBuYW5vc2Vjb25kcztcbiAgfVxuXG4gIHN1Yk5hbm9zZWNvbmRzKG5hbm9zZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hbm9zZWNvbmRzIC09IG5hbm9zZWNvbmRzO1xuICB9XG5cbiAgYXNZZWFycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzRGF5cygpIC8gMzY1O1xuICB9XG5cbiAgYXNXZWVrcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzRGF5cygpIC8gNztcbiAgfVxuXG4gIGFzRGF5cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzSG91cnMoKSAvIDI0O1xuICB9XG5cbiAgYXNIb3VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFzTWludXRlcygpIC8gNjA7XG4gIH1cblxuICBhc01pbnV0ZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hc1NlY29uZHMoKSAvIDYwO1xuICB9XG5cbiAgYXNTZWNvbmRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYXNNaWxsaXNlY29uZHMoKSAvIDFlMztcbiAgfVxuXG4gIGFzTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XG4gICAgY29uc3QgbXMgPSB0aGlzLnNlY29uZHMgKiAxXzAwMG4gKyBCaWdJbnQodGhpcy5uYW5vc2Vjb25kcykgLyAxXzAwMF8wMDBuO1xuICAgIGNvbnN0IHVzID0gKHRoaXMubmFub3NlY29uZHMgJSAxZTYpIC8gMWU2O1xuXG4gICAgcmV0dXJuIE51bWJlcihtcykgKyB1cztcbiAgfVxuXG4gIGFzTWljcm9zZWNvbmRzKCk6IG51bWJlciB7XG4gICAgY29uc3QgdXMgPSB0aGlzLnNlY29uZHMgKiAxXzAwMF8wMDBuICsgQmlnSW50KHRoaXMubmFub3NlY29uZHMpIC8gMV8wMDBuO1xuICAgIGNvbnN0IG5zID0gKHRoaXMubmFub3NlY29uZHMgJSAxZTMpIC8gMWUzO1xuXG4gICAgcmV0dXJuIE51bWJlcih1cykgKyBucztcbiAgfVxuXG4gIGFzTmFub3NlY29uZHMoKTogbnVtYmVyIHtcbiAgICBjb25zdCBucyA9IHRoaXMuc2Vjb25kcyAqIDFfMDAwXzAwMF8wMDBuICsgQmlnSW50KHRoaXMubmFub3NlY29uZHMpO1xuXG4gICAgcmV0dXJuIE51bWJlcihucyk7XG4gIH1cblxuICAvLyBJU08gODYwMSBkdXJhdGlvbiBmb3JtYXRcbiAgLy8gZHByaW50LWlnbm9yZVxuICB0b0lTT1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IG8gPSB0aGlzLnBhcnNlKCk7XG4gICAgbGV0IHMgPSBcIlBcIjtcblxuICAgIGlmIChcInllYXJzXCIgICBpbiBvKSBzICs9IG8ueWVhcnMgICArIFwiWVwiO1xuICAgIGlmIChcIndlZWtzXCIgICBpbiBvKSBzICs9IG8ud2Vla3MgICArIFwiV1wiO1xuICAgIGlmIChcImRheXNcIiAgICBpbiBvKSBzICs9IG8uZGF5cyAgICArIFwiRFwiO1xuICAgIGlmIChcImhvdXJzXCIgICBpbiBvKSBzICs9IG8uaG91cnMgICArIFwiSFwiO1xuICAgIGlmIChcIm1pbnV0ZXNcIiBpbiBvKSBzICs9IG8ubWludXRlcyArIFwiTVwiO1xuICAgIGlmIChcInNlY29uZHNcIiBpbiBvKSBzICs9IG8uc2Vjb25kcyArIFwiU1wiO1xuICAgIGlmIChzID09PSBcIlBcIikgcyArPSBcIjBTXCI7XG5cbiAgICByZXR1cm4gc1xuICB9XG5cbiAgY2xvbmUoKTogdGhpcyB7XG4gICAgY29uc3QgVGhpcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIER1cmF0aW9uO1xuXG4gICAgcmV0dXJuIG5ldyBUaGlzKHRoaXMpIGFzIHRoaXM7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQ0FHTztBQUNQLG9CQUtPO0FBQ1AsbUJBQTZCO0FBVTdCLElBQU0sc0JBQXNCO0FBRTVCLElBQU0scUJBQXFCO0FBQzNCLElBQU0sbUJBQW1CLE1BQU07QUFDL0IsSUFBTSxrQkFBa0IsTUFBTTtBQUM5QixJQUFNLG1CQUFtQixLQUFLO0FBQzlCLElBQU0sbUJBQW1CLE9BQU87QUFDaEMsSUFBTSw4QkFBOEI7QUFDcEMsSUFBTSw4QkFBOEI7QUFDcEMsSUFBTSx5QkFBeUI7QUFFL0IsSUFBTSxjQUFjO0FBS3BCLElBQXFCLFlBQXJCLE1BQXFCLGtCQUFpQiwyQkFBQUEsU0FBSztBQUFBLEVBQ3pDLFdBQVcsTUFBTTtBQUNmLFdBQU8sSUFBSSxLQUFLLENBQUMsYUFBYSxNQUFNLENBQUMsQ0FBQztBQUFBLEVBQ3hDO0FBQUEsRUFFQSxXQUFXLE9BQU87QUFDaEIsV0FBTyxJQUFJLEtBQUssQ0FBQztBQUFBLEVBQ25CO0FBQUEsRUFFQSxPQUFPLE1BQU0sT0FBZTtBQUMxQixXQUFPLElBQUksS0FBSyxRQUFRLEdBQUc7QUFBQSxFQUM3QjtBQUFBLEVBRUEsT0FBTyxNQUFNLE9BQWU7QUFDMUIsV0FBTyxJQUFJLEtBQUssUUFBUSxHQUFHO0FBQUEsRUFDN0I7QUFBQSxFQUVBLE9BQU8sS0FBSyxNQUFjO0FBQ3hCLFdBQU8s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QXFCO0FBQzVCLFNBQUssV0FBVyxPQUFPLEtBQUssSUFBSTtBQUFBLEVBQ2xDO0FBQUEsRUFFQSxTQUFTLE9BQXFCO0FBQzVCLFNBQUssV0FBVyxPQUFPLEtBQUssSUFBSTtBQUFBLEVBQ2xDO0FBQUEsRUFFQSxXQUFtQjtBQUNqQixXQUFPLEtBQUssTUFBTSxFQUFFLE9BQU8sS0FBSztBQUFBLEVBQ2xDO0FBQUEsRUFFQSxTQUFTLE9BQXFCO0FBQzVCLFNBQUssV0FBVyxPQUFPLEtBQUssSUFBSTtBQUFBLEVBQ2xDO0FBQUEsRUFFQSxTQUFTLE9BQXFCO0FBQzVCLFNBQUssV0FBVyxPQUFPLEtBQUssSUFBSTtBQUFBLEVBQ2xDO0FBQUEsRUFFQSxVQUFrQjtBQUNoQixXQUFPLEtBQUssTUFBTSxFQUFFLE1BQU0sS0FBSztBQUFBLEVBQ2pDO0FBQUEsRUFFQSxRQUFRLE1BQW9CO0FBQzFCLFNBQUssV0FBVyxPQUFPLElBQUksSUFBSTtBQUFBLEVBQ2pDO0FBQUEsRUFFQSxRQUFRLE1BQW9CO0FBQzFCLFNBQUssV0FBVyxPQUFPLElBQUksSUFBSTtBQUFBLEVBQ2pDO0FBQUEsRUFFQSxXQUFtQjtBQUNqQixXQUFPLEtBQUssTUFBTSxFQUFFLE9BQU8sS0FBSztBQUFBLEVBQ2xDO0FBQUEsRUFFQSxTQUFTLE9BQXFCO0FBQzVCLFNBQUssV0FBVyxPQUFPLEtBQUssSUFBSTtBQUFBLEVBQ2xDO0FBQUEsRUFFQSxTQUFTLE9BQXFCO0FBQzVCLFNBQUssV0FBVyxPQUFPLEtBQUssSUFBSTtBQUFBLEVBQ2xDO0FBQUEsRUFFQSxhQUFxQjtBQUNuQixXQUFPLEtBQUssTUFBTSxFQUFFLFNBQVMsS0FBSztBQUFBLEVBQ3BDO0FBQUEsRUFFQSxXQUFXLFNBQXVCO0FBQ2hDLFNBQUssV0FBVyxPQUFPLE9BQU8sSUFBSTtBQUFBLEVBQ3BDO0FBQUEsRUFFQSxXQUFXLFNBQXVCO0FBQ2hDLFNBQUssV0FBVyxPQUFPLE9BQU8sSUFBSTtBQUFBLEVBQ3BDO0FBQUEsRUFFQSxhQUFxQjtBQUNuQixXQUFPLEtBQUssTUFB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