UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

318 lines (316 loc) 30 kB
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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