{"version":3,"file":"joi-browser.min.mjs","names":["NON_ASCII_RX","Url","Util"],"sources":["../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/assertError.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/stringify.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/assert.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/reach.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/types.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/utils.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/clone.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/merge.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/applyToDefaults.js","../browser/stubs/empty.cjs","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/deepEqual.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/escapeHtml.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/escapeRegex.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/ignore.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/index.js","../lib/schemas.js","../node_modules/.pnpm/@hapi+formula@3.0.2/node_modules/@hapi/formula/lib/index.js","../lib/errors.js","../lib/ref.js","../lib/template.js","../lib/messages.js","../lib/common.js","../lib/cache.js","../lib/compile.js","../lib/extend.js","../lib/modify.js","../lib/state.js","../lib/validator.js","../lib/values.js","../lib/base.js","../lib/types/any.js","../lib/types/alternatives.js","../lib/types/array.js","../lib/types/boolean.js","../lib/types/date.js","../node_modules/.pnpm/@hapi+topo@6.0.2/node_modules/@hapi/topo/lib/index.js","../lib/types/keys.js","../lib/types/function.js","../lib/types/link.js","../lib/types/number.js","../lib/types/object.js","../node_modules/.pnpm/@hapi+address@5.1.1/node_modules/@hapi/address/esm/errors.js","../node_modules/.pnpm/@hapi+address@5.1.1/node_modules/@hapi/address/esm/domain.js","../node_modules/.pnpm/@hapi+address@5.1.1/node_modules/@hapi/address/esm/email.js","../node_modules/.pnpm/@hapi+hoek@11.0.7/node_modules/@hapi/hoek/lib/index.mjs","../node_modules/.pnpm/@hapi+address@5.1.1/node_modules/@hapi/address/esm/uri.js","../node_modules/.pnpm/@hapi+address@5.1.1/node_modules/@hapi/address/esm/ip.js","../node_modules/.pnpm/@hapi+address@5.1.1/node_modules/@hapi/address/esm/index.js","../lib/types/string.js","../lib/types/symbol.js","../lib/index.js"],"sourcesContent":["'use strict';\n\nconst internals = {};\n\n\nmodule.exports = class AssertError extends Error {\n\n    name = 'AssertError';\n\n    constructor(message, ctor) {\n\n        super(message || 'Unknown error');\n\n        if (typeof Error.captureStackTrace === 'function') {            // $lab:coverage:ignore$\n            Error.captureStackTrace(this, ctor);\n        }\n    }\n};\n","'use strict';\n\nconst internals = {};\n\n\nmodule.exports = function (...args) {\n\n    try {\n        return JSON.stringify(...args);\n    }\n    catch (err) {\n        return '[Cannot display object: ' + err.message + ']';\n    }\n};\n","'use strict';\n\nconst AssertError = require('./assertError');\nconst Stringify = require('./stringify');\n\n\nconst internals = {};\n\n\nconst assert = module.exports = function (condition, ...args) {\n\n    if (condition) {\n        return;\n    }\n\n    if (args.length === 1 &&\n        args[0] instanceof Error) {\n\n        throw args[0];\n    }\n\n    const msgs = args\n        .filter((arg) => arg !== '')\n        .map((arg) => {\n\n            return typeof arg === 'string' ? arg : arg instanceof Error ? arg.message : Stringify(arg);\n        });\n\n    throw new AssertError(msgs.join(' '), assert);\n};\n","'use strict';\n\nconst Assert = require('./assert');\n\n\nconst internals = {};\n\n\nmodule.exports = function (obj, chain, options) {\n\n    if (chain === false ||\n        chain === null ||\n        chain === undefined) {\n\n        return obj;\n    }\n\n    options = options || {};\n    if (typeof options === 'string') {\n        options = { separator: options };\n    }\n\n    const isChainArray = Array.isArray(chain);\n\n    Assert(!isChainArray || !options.separator, 'Separator option is not valid for array-based chain');\n\n    const path = isChainArray ? chain : chain.split(options.separator || '.');\n    let ref = obj;\n    for (let i = 0; i < path.length; ++i) {\n        let key = path[i];\n        const type = options.iterables && internals.iterables(ref);\n\n        if (Array.isArray(ref) ||\n            type === 'set') {\n\n            const number = Number(key);\n            if (Number.isInteger(number)) {\n                key = number < 0 ? ref.length + number : number;\n            }\n        }\n\n        if (!ref ||\n            typeof ref === 'function' && options.functions === false ||         // Defaults to true\n            !type && ref[key] === undefined) {\n\n            Assert(!options.strict || i + 1 === path.length, 'Missing segment', key, 'in reach path ', chain);\n            Assert(typeof ref === 'object' || options.functions === true || typeof ref !== 'function', 'Invalid segment', key, 'in reach path ', chain);\n            ref = options.default;\n            break;\n        }\n\n        if (!type) {\n            ref = ref[key];\n        }\n        else if (type === 'set') {\n            ref = [...ref][key];\n        }\n        else {  // type === 'map'\n            ref = ref.get(key);\n        }\n    }\n\n    return ref;\n};\n\n\ninternals.iterables = function (ref) {\n\n    if (ref instanceof Set) {\n        return 'set';\n    }\n\n    if (ref instanceof Map) {\n        return 'map';\n    }\n};\n","'use strict';\n\nconst internals = {};\n\n\nexports = module.exports = {\n    array: Array.prototype,\n    buffer: Buffer && Buffer.prototype,             // $lab:coverage:ignore$\n    date: Date.prototype,\n    error: Error.prototype,\n    generic: Object.prototype,\n    map: Map.prototype,\n    promise: Promise.prototype,\n    regex: RegExp.prototype,\n    set: Set.prototype,\n    url: URL.prototype,\n    weakMap: WeakMap.prototype,\n    weakSet: WeakSet.prototype\n};\n\n\ninternals.typeMap = new Map([\n    ['[object Error]', exports.error],\n    ['[object Map]', exports.map],\n    ['[object Promise]', exports.promise],\n    ['[object Set]', exports.set],\n    ['[object URL]', exports.url],\n    ['[object WeakMap]', exports.weakMap],\n    ['[object WeakSet]', exports.weakSet]\n]);\n\n\nexports.getInternalProto = function (obj) {\n\n    if (Array.isArray(obj)) {\n        return exports.array;\n    }\n\n    if (Buffer && obj instanceof Buffer) {          // $lab:coverage:ignore$\n        return exports.buffer;\n    }\n\n    if (obj instanceof Date) {\n        return exports.date;\n    }\n\n    if (obj instanceof RegExp) {\n        return exports.regex;\n    }\n\n    if (obj instanceof Error) {\n        return exports.error;\n    }\n\n    const objName = Object.prototype.toString.call(obj);\n    return internals.typeMap.get(objName) || exports.generic;\n};\n","'use strict';\n\nconst internals = {};\n\n\nexports.keys = function (obj, options = {}) {\n\n    return options.symbols !== false ? Reflect.ownKeys(obj) : Object.getOwnPropertyNames(obj);  // Defaults to true\n};\n","'use strict';\n\nconst Reach = require('./reach');\nconst Types = require('./types');\nconst Utils = require('./utils');\n\n\nconst internals = {\n    needsProtoHack: new Set([Types.set, Types.map, Types.weakSet, Types.weakMap]),\n    structuredCloneExists: typeof structuredClone === 'function'\n};\n\n\nmodule.exports = internals.clone = function (obj, options = {}, _seen = null) {\n\n    if (typeof obj !== 'object' ||\n        obj === null) {\n\n        return obj;\n    }\n\n    let clone = internals.clone;\n    let seen = _seen;\n\n    if (options.shallow) {\n        if (options.shallow !== true) {\n            return internals.cloneWithShallow(obj, options);\n        }\n\n        clone = (value) => value;\n    }\n    else if (seen) {\n        const lookup = seen.get(obj);\n        if (lookup) {\n            return lookup;\n        }\n    }\n    else {\n        seen = new Map();\n    }\n\n    // Built-in object types\n\n    const baseProto = Types.getInternalProto(obj);\n    switch (baseProto) {\n        case Types.buffer:\n            return Buffer?.from(obj);\n        case Types.date:\n            return new Date(obj.getTime());\n        case Types.regex:\n        case Types.url:\n            return new baseProto.constructor(obj);\n    }\n\n    // Generic objects\n\n    const newObj = internals.base(obj, baseProto, options);\n    if (newObj === obj) {\n        return obj;\n    }\n\n    if (seen) {\n        seen.set(obj, newObj);                              // Set seen, since obj could recurse\n    }\n\n    if (baseProto === Types.set) {\n        for (const value of obj) {\n            newObj.add(clone(value, options, seen));\n        }\n    }\n    else if (baseProto === Types.map) {\n        for (const [key, value] of obj) {\n            newObj.set(key, clone(value, options, seen));\n        }\n    }\n\n    const keys = Utils.keys(obj, options);\n    for (const key of keys) {\n        if (key === '__proto__') {\n            continue;\n        }\n\n        if (baseProto === Types.array &&\n            key === 'length') {\n\n            newObj.length = obj.length;\n            continue;\n        }\n\n        // Can only be covered in node 21+\n        /* $lab:coverage:off$ */\n        if (internals.structuredCloneExists &&\n            baseProto === Types.error &&\n            key === 'stack') {\n\n            continue;       // Already a part of the base object\n        }\n        /* $lab:coverage:on$ */\n\n        const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n        if (descriptor) {\n            if (descriptor.get ||\n                descriptor.set) {\n\n                Object.defineProperty(newObj, key, descriptor);\n            }\n            else if (descriptor.enumerable) {\n                newObj[key] = clone(obj[key], options, seen);\n            }\n            else {\n                Object.defineProperty(newObj, key, { enumerable: false, writable: true, configurable: true, value: clone(obj[key], options, seen) });\n            }\n        }\n        else {\n            Object.defineProperty(newObj, key, {\n                enumerable: true,\n                writable: true,\n                configurable: true,\n                value: clone(obj[key], options, seen)\n            });\n        }\n    }\n\n    return newObj;\n};\n\n\ninternals.cloneWithShallow = function (source, options) {\n\n    const keys = options.shallow;\n    options = Object.assign({}, options);\n    options.shallow = false;\n\n    const seen = new Map();\n\n    for (const key of keys) {\n        const ref = Reach(source, key);\n        if (typeof ref === 'object' ||\n            typeof ref === 'function') {\n\n            seen.set(ref, ref);\n        }\n    }\n\n    return internals.clone(source, options, seen);\n};\n\n\ninternals.base = function (obj, baseProto, options) {\n\n    if (options.prototype === false) {                  // Defaults to true\n        if (internals.needsProtoHack.has(baseProto)) {\n            return new baseProto.constructor();\n        }\n\n        return baseProto === Types.array ? [] : {};\n    }\n\n    const proto = Object.getPrototypeOf(obj);\n    if (proto &&\n        proto.isImmutable) {\n\n        return obj;\n    }\n\n    if (baseProto === Types.array) {\n        const newObj = [];\n        if (proto !== baseProto) {\n            Object.setPrototypeOf(newObj, proto);\n        }\n\n        return newObj;\n    }\n    // Can only be covered in node 21+\n    /* $lab:coverage:off$ */\n    else if (baseProto === Types.error && internals.structuredCloneExists &&\n        (proto === baseProto || Error.isPrototypeOf(proto.constructor))) {      // Don't match Util.inherit() subclassed errors\n\n        const err = structuredClone(obj);                                       // Needed to copy internal stack state\n        if (Object.getPrototypeOf(err) !== proto) {\n            Object.setPrototypeOf(err, proto);                                  // Fix prototype\n        }\n\n        return err;\n    }\n    /* $lab:coverage:on$ */\n\n    if (internals.needsProtoHack.has(baseProto)) {\n        const newObj = new proto.constructor();\n        if (proto !== baseProto) {\n            Object.setPrototypeOf(newObj, proto);\n        }\n\n        return newObj;\n    }\n\n    return Object.create(proto);\n};\n","'use strict';\n\nconst Assert = require('./assert');\nconst Clone = require('./clone');\nconst Utils = require('./utils');\n\n\nconst internals = {};\n\n\nmodule.exports = internals.merge = function (target, source, options) {\n\n    Assert(target && typeof target === 'object', 'Invalid target value: must be an object');\n    Assert(source === null || source === undefined || typeof source === 'object', 'Invalid source value: must be null, undefined, or an object');\n\n    if (!source) {\n        return target;\n    }\n\n    options = Object.assign({ nullOverride: true, mergeArrays: true }, options);\n\n    if (Array.isArray(source)) {\n        Assert(Array.isArray(target), 'Cannot merge array onto an object');\n        if (!options.mergeArrays) {\n            target.length = 0;                                                          // Must not change target assignment\n        }\n\n        for (let i = 0; i < source.length; ++i) {\n            target.push(Clone(source[i], { symbols: options.symbols }));\n        }\n\n        return target;\n    }\n\n    const keys = Utils.keys(source, options);\n    for (let i = 0; i < keys.length; ++i) {\n        const key = keys[i];\n        if (key === '__proto__' ||\n            !Object.prototype.propertyIsEnumerable.call(source, key)) {\n\n            continue;\n        }\n\n        const value = source[key];\n        if (value &&\n            typeof value === 'object') {\n\n            if (target[key] === value) {\n                continue;                                           // Can occur for shallow merges\n            }\n\n            if (!target[key] ||\n                typeof target[key] !== 'object' ||\n                (Array.isArray(target[key]) !== Array.isArray(value)) ||\n                value instanceof Date ||\n                (Buffer && Buffer.isBuffer(value)) ||               // $lab:coverage:ignore$\n                value instanceof RegExp) {\n\n                target[key] = Clone(value, { symbols: options.symbols });\n            }\n            else {\n                internals.merge(target[key], value, options);\n            }\n        }\n        else {\n            if (value !== null &&\n                value !== undefined) {                              // Explicit to preserve empty strings\n\n                target[key] = value;\n            }\n            else if (options.nullOverride) {\n                target[key] = value;\n            }\n        }\n    }\n\n    return target;\n};\n","'use strict';\n\nconst Assert = require('./assert');\nconst Clone = require('./clone');\nconst Merge = require('./merge');\nconst Reach = require('./reach');\n\n\nconst internals = {};\n\n\nmodule.exports = function (defaults, source, options = {}) {\n\n    Assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');\n    Assert(!source || source === true || typeof source === 'object', 'Invalid source value: must be true, falsy or an object');\n    Assert(typeof options === 'object', 'Invalid options: must be an object');\n\n    if (!source) {                                                  // If no source, return null\n        return null;\n    }\n\n    if (options.shallow) {\n        return internals.applyToDefaultsWithShallow(defaults, source, options);\n    }\n\n    const copy = Clone(defaults);\n\n    if (source === true) {                                          // If source is set to true, use defaults\n        return copy;\n    }\n\n    const nullOverride = options.nullOverride !== undefined ? options.nullOverride : false;\n    return Merge(copy, source, { nullOverride, mergeArrays: false });\n};\n\n\ninternals.applyToDefaultsWithShallow = function (defaults, source, options) {\n\n    const keys = options.shallow;\n    Assert(Array.isArray(keys), 'Invalid keys');\n\n    const seen = new Map();\n    const merge = source === true ? null : new Set();\n\n    for (let key of keys) {\n        key = Array.isArray(key) ? key : key.split('.');            // Pre-split optimization\n\n        const ref = Reach(defaults, key);\n        if (ref &&\n            typeof ref === 'object') {\n\n            seen.set(ref, merge && Reach(source, key) || ref);\n        }\n        else if (merge) {\n            merge.add(key);\n        }\n    }\n\n    const copy = Clone(defaults, {}, seen);\n\n    if (!merge) {\n        return copy;\n    }\n\n    for (const key of merge) {\n        internals.reachCopy(copy, source, key);\n    }\n\n    const nullOverride = options.nullOverride !== undefined ? options.nullOverride : false;\n    return Merge(copy, source, { nullOverride, mergeArrays: false });\n};\n\n\ninternals.reachCopy = function (dst, src, path) {\n\n    for (const segment of path) {\n        if (!(segment in src)) {\n            return;\n        }\n\n        const val = src[segment];\n\n        if (typeof val !== 'object' || val === null) {\n            return;\n        }\n\n        src = val;\n    }\n\n    const value = src;\n    let ref = dst;\n    for (let i = 0; i < path.length - 1; ++i) {\n        const segment = path[i];\n        if (typeof ref[segment] !== 'object') {\n            ref[segment] = {};\n        }\n\n        ref = ref[segment];\n    }\n\n    ref[path[path.length - 1]] = value;\n};\n","module.exports = {};\n","'use strict';\n\nconst Types = require('./types');\n\n\nconst internals = {\n    mismatched: null\n};\n\n\nmodule.exports = function (obj, ref, options) {\n\n    options = Object.assign({ prototype: true }, options);\n\n    return !!internals.isDeepEqual(obj, ref, options, []);\n};\n\n\ninternals.isDeepEqual = function (obj, ref, options, seen) {\n\n    if (obj === ref) {                                                      // Copied from Deep-eql, copyright(c) 2013 Jake Luer, jake@alogicalparadox.com, MIT Licensed, https://github.com/chaijs/deep-eql\n        return obj !== 0 || 1 / obj === 1 / ref;\n    }\n\n    const type = typeof obj;\n\n    if (type !== typeof ref) {\n        return false;\n    }\n\n    if (obj === null ||\n        ref === null) {\n\n        return false;\n    }\n\n    if (type === 'function') {\n        if (!options.deepFunction ||\n            obj.toString() !== ref.toString()) {\n\n            return false;\n        }\n\n        // Continue as object\n    }\n    else if (type !== 'object') {\n        return obj !== obj && ref !== ref;                                  // NaN\n    }\n\n    const instanceType = internals.getSharedType(obj, ref, !!options.prototype);\n    switch (instanceType) {\n        case Types.buffer:\n            return Buffer && Buffer.prototype.equals.call(obj, ref);        // $lab:coverage:ignore$\n        case Types.promise:\n            return obj === ref;\n        case Types.regex:\n        case Types.url:\n            return obj.toString() === ref.toString();\n        case internals.mismatched:\n            return false;\n    }\n\n    for (let i = seen.length - 1; i >= 0; --i) {\n        if (seen[i].isSame(obj, ref)) {\n            return true;                                                    // If previous comparison failed, it would have stopped execution\n        }\n    }\n\n    seen.push(new internals.SeenEntry(obj, ref));\n\n    try {\n        return !!internals.isDeepEqualObj(instanceType, obj, ref, options, seen);\n    }\n    finally {\n        seen.pop();\n    }\n};\n\n\ninternals.getSharedType = function (obj, ref, checkPrototype) {\n\n    if (checkPrototype) {\n        if (Object.getPrototypeOf(obj) !== Object.getPrototypeOf(ref)) {\n            return internals.mismatched;\n        }\n\n        return Types.getInternalProto(obj);\n    }\n\n    const type = Types.getInternalProto(obj);\n    if (type !== Types.getInternalProto(ref)) {\n        return internals.mismatched;\n    }\n\n    return type;\n};\n\n\ninternals.valueOf = function (obj) {\n\n    const objValueOf = obj.valueOf;\n    if (objValueOf === undefined) {\n        return obj;\n    }\n\n    try {\n        return objValueOf.call(obj);\n    }\n    catch (err) {\n        return err;\n    }\n};\n\n\ninternals.hasOwnEnumerableProperty = function (obj, key) {\n\n    return Object.prototype.propertyIsEnumerable.call(obj, key);\n};\n\n\ninternals.isSetSimpleEqual = function (obj, ref) {\n\n    for (const entry of Set.prototype.values.call(obj)) {\n        if (!Set.prototype.has.call(ref, entry)) {\n            return false;\n        }\n    }\n\n    return true;\n};\n\n\ninternals.isDeepEqualObj = function (instanceType, obj, ref, options, seen) {\n\n    const { isDeepEqual, valueOf, hasOwnEnumerableProperty } = internals;\n    const { keys, getOwnPropertySymbols } = Object;\n\n    if (instanceType === Types.array) {\n        if (options.part) {\n\n            // Check if any index match any other index\n\n            for (const objValue of obj) {\n                for (const refValue of ref) {\n                    if (isDeepEqual(objValue, refValue, options, seen)) {\n                        return true;\n                    }\n                }\n            }\n        }\n        else {\n            if (obj.length !== ref.length) {\n                return false;\n            }\n\n            for (let i = 0; i < obj.length; ++i) {\n                if (!isDeepEqual(obj[i], ref[i], options, seen)) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n    }\n    else if (instanceType === Types.set) {\n        if (obj.size !== ref.size) {\n            return false;\n        }\n\n        if (!internals.isSetSimpleEqual(obj, ref)) {\n\n            // Check for deep equality\n\n            const ref2 = new Set(Set.prototype.values.call(ref));\n            for (const objEntry of Set.prototype.values.call(obj)) {\n                if (ref2.delete(objEntry)) {\n                    continue;\n                }\n\n                let found = false;\n                for (const refEntry of ref2) {\n                    if (isDeepEqual(objEntry, refEntry, options, seen)) {\n                        ref2.delete(refEntry);\n                        found = true;\n                        break;\n                    }\n                }\n\n                if (!found) {\n                    return false;\n                }\n            }\n        }\n    }\n    else if (instanceType === Types.map) {\n        if (obj.size !== ref.size) {\n            return false;\n        }\n\n        for (const [key, value] of Map.prototype.entries.call(obj)) {\n            if (value === undefined && !Map.prototype.has.call(ref, key)) {\n                return false;\n            }\n\n            if (!isDeepEqual(value, Map.prototype.get.call(ref, key), options, seen)) {\n                return false;\n            }\n        }\n    }\n    else if (instanceType === Types.error) {\n\n        // Always check name and message\n\n        if (obj.name !== ref.name ||\n            obj.message !== ref.message) {\n\n            return false;\n        }\n    }\n\n    // Check .valueOf()\n\n    const valueOfObj = valueOf(obj);\n    const valueOfRef = valueOf(ref);\n    if ((obj !== valueOfObj || ref !== valueOfRef) &&\n        !isDeepEqual(valueOfObj, valueOfRef, options, seen)) {\n\n        return false;\n    }\n\n    // Check properties\n\n    const objKeys = keys(obj);\n    if (!options.part &&\n        objKeys.length !== keys(ref).length &&\n        !options.skip) {\n\n        return false;\n    }\n\n    let skipped = 0;\n    for (const key of objKeys) {\n        if (options.skip &&\n            options.skip.includes(key)) {\n\n            if (ref[key] === undefined) {\n                ++skipped;\n            }\n\n            continue;\n        }\n\n        if (!hasOwnEnumerableProperty(ref, key)) {\n            return false;\n        }\n\n        if (!isDeepEqual(obj[key], ref[key], options, seen)) {\n            return false;\n        }\n    }\n\n    if (!options.part &&\n        objKeys.length - skipped !== keys(ref).length) {\n\n        return false;\n    }\n\n    // Check symbols\n\n    if (options.symbols !== false) {                                // Defaults to true\n        const objSymbols = getOwnPropertySymbols(obj);\n        const refSymbols = new Set(getOwnPropertySymbols(ref));\n\n        for (const key of objSymbols) {\n            if (!options.skip?.includes(key)) {\n\n                if (hasOwnEnumerableProperty(obj, key)) {\n                    if (!hasOwnEnumerableProperty(ref, key)) {\n                        return false;\n                    }\n\n                    if (!isDeepEqual(obj[key], ref[key], options, seen)) {\n                        return false;\n                    }\n                }\n                else if (hasOwnEnumerableProperty(ref, key)) {\n                    return false;\n                }\n            }\n\n            refSymbols.delete(key);\n        }\n\n        for (const key of refSymbols) {\n            if (hasOwnEnumerableProperty(ref, key)) {\n                return false;\n            }\n        }\n    }\n\n    return true;\n};\n\n\ninternals.SeenEntry = class {\n\n    constructor(obj, ref) {\n\n        this.obj = obj;\n        this.ref = ref;\n    }\n\n    isSame(obj, ref) {\n\n        return this.obj === obj && this.ref === ref;\n    }\n};\n","'use strict';\n\nconst internals = {};\n\n\nmodule.exports = function (input) {\n\n    if (!input) {\n        return '';\n    }\n\n    let escaped = '';\n\n    for (let i = 0; i < input.length; ++i) {\n\n        const charCode = input.charCodeAt(i);\n\n        if (internals.isSafe(charCode)) {\n            escaped += input[i];\n        }\n        else {\n            escaped += internals.escapeHtmlChar(charCode);\n        }\n    }\n\n    return escaped;\n};\n\n\ninternals.escapeHtmlChar = function (charCode) {\n\n    const namedEscape = internals.namedHtml.get(charCode);\n    if (namedEscape) {\n        return namedEscape;\n    }\n\n    if (charCode >= 256) {\n        return '&#' + charCode + ';';\n    }\n\n    const hexValue = charCode.toString(16).padStart(2, '0');\n    return `&#x${hexValue};`;\n};\n\n\ninternals.isSafe = function (charCode) {\n\n    return internals.safeCharCodes.has(charCode);\n};\n\n\ninternals.namedHtml = new Map([\n    [38, '&amp;'],\n    [60, '&lt;'],\n    [62, '&gt;'],\n    [34, '&quot;'],\n    [160, '&nbsp;'],\n    [162, '&cent;'],\n    [163, '&pound;'],\n    [164, '&curren;'],\n    [169, '&copy;'],\n    [174, '&reg;']\n]);\n\n\ninternals.safeCharCodes = (function () {\n\n    const safe = new Set();\n\n    for (let i = 32; i < 123; ++i) {\n\n        if ((i >= 97) ||                    // a-z\n            (i >= 65 && i <= 90) ||         // A-Z\n            (i >= 48 && i <= 57) ||         // 0-9\n            i === 32 ||                     // space\n            i === 46 ||                     // .\n            i === 44 ||                     // ,\n            i === 45 ||                     // -\n            i === 58 ||                     // :\n            i === 95) {                     // _\n\n            safe.add(i);\n        }\n    }\n\n    return safe;\n}());\n","'use strict';\n\nconst internals = {};\n\n\nmodule.exports = function (string) {\n\n    // Escape ^$.*+-?=!:|\\/()[]{},\n\n    return string.replace(/[\\^\\$\\.\\*\\+\\-\\?\\=\\!\\:\\|\\\\\\/\\(\\)\\[\\]\\{\\}\\,]/g, '\\\\$&');\n};\n","'use strict';\n\nconst internals = {};\n\n\nmodule.exports = function () { };\n","'use strict';\n\nexports.applyToDefaults = require('./applyToDefaults');\n\nexports.assert = require('./assert');\n\nexports.AssertError = require('./assertError');\n\nexports.Bench = require('./bench');\n\nexports.block = require('./block');\n\nexports.clone = require('./clone');\n\nexports.contain = require('./contain');\n\nexports.deepEqual = require('./deepEqual');\n\nexports.escapeHeaderAttribute = require('./escapeHeaderAttribute');\n\nexports.escapeHtml = require('./escapeHtml');\n\nexports.escapeJson = require('./escapeJson');\n\nexports.escapeRegex = require('./escapeRegex');\n\nexports.flatten = require('./flatten');\n\nexports.ignore = require('./ignore');\n\nexports.intersect = require('./intersect');\n\nexports.isPromise = require('./isPromise');\n\nexports.merge = require('./merge');\n\nexports.once = require('./once');\n\nexports.reach = require('./reach');\n\nexports.reachTemplate = require('./reachTemplate');\n\nexports.stringify = require('./stringify');\n\nexports.wait = require('./wait');\n","'use strict';\n\nconst Joi = require('./index');\n\n\nconst internals = {};\n\n\n// Preferences\n\ninternals.wrap = Joi.string()\n    .min(1)\n    .max(2)\n    .allow(false);\n\n\nexports.preferences = Joi.object({\n    allowUnknown: Joi.boolean(),\n    abortEarly: Joi.boolean(),\n    artifacts: Joi.boolean(),\n    cache: Joi.boolean(),\n    context: Joi.object(),\n    convert: Joi.boolean(),\n    dateFormat: Joi.valid('date', 'iso', 'string', 'time', 'utc'),\n    debug: Joi.boolean(),\n    errors: {\n        escapeHtml: Joi.boolean(),\n        label: Joi.valid('path', 'key', false),\n        language: [\n            Joi.string(),\n            Joi.object().ref()\n        ],\n        render: Joi.boolean(),\n        stack: Joi.boolean(),\n        wrap: {\n            label: internals.wrap,\n            array: internals.wrap,\n            string: internals.wrap\n        }\n    },\n    externals: Joi.boolean(),\n    messages: Joi.object(),\n    noDefaults: Joi.boolean(),\n    nonEnumerables: Joi.boolean(),\n    presence: Joi.valid('required', 'optional', 'forbidden'),\n    skipFunctions: Joi.boolean(),\n    stripUnknown: Joi.object({\n        arrays: Joi.boolean(),\n        objects: Joi.boolean()\n    })\n        .or('arrays', 'objects')\n        .allow(true, false),\n    warnings: Joi.boolean()\n})\n    .strict();\n\n\n// Extensions\n\ninternals.nameRx = /^[a-zA-Z0-9]\\w*$/;\n\n\ninternals.rule = Joi.object({\n    alias: Joi.array().items(Joi.string().pattern(internals.nameRx)).single(),\n    args: Joi.array().items(\n        Joi.string(),\n        Joi.object({\n            name: Joi.string().pattern(internals.nameRx).required(),\n            ref: Joi.boolean(),\n            assert: Joi.alternatives([\n                Joi.function(),\n                Joi.object().schema()\n            ])\n                .conditional('ref', { is: true, then: Joi.required() }),\n            normalize: Joi.function(),\n            message: Joi.string().when('assert', { is: Joi.function(), then: Joi.required() })\n        })\n    ),\n    convert: Joi.boolean(),\n    manifest: Joi.boolean(),\n    method: Joi.function().allow(false),\n    multi: Joi.boolean(),\n    validate: Joi.function(),\n    jsonSchema: Joi.function()\n});\n\n\nexports.extension = Joi.object({\n    type: Joi.alternatives([\n        Joi.string(),\n        Joi.object().regex()\n    ])\n        .required(),\n    args: Joi.function(),\n    cast: Joi.object().pattern(internals.nameRx, Joi.object({\n        from: Joi.function().maxArity(1).required(),\n        to: Joi.function().minArity(1).maxArity(2).required()\n    })),\n    base: Joi.object().schema()\n        .when('type', { is: Joi.object().regex(), then: Joi.forbidden() }),\n    coerce: [\n        Joi.function().maxArity(3),\n        Joi.object({ method: Joi.function().maxArity(3).required(), from: Joi.array().items(Joi.string()).single() })\n    ],\n    flags: Joi.object().pattern(internals.nameRx, Joi.object({\n        setter: Joi.string(),\n        default: Joi.any()\n    })),\n    manifest: {\n        build: Joi.function().arity(2)\n    },\n    messages: [Joi.object(), Joi.string()],\n    modifiers: Joi.object().pattern(internals.nameRx, Joi.function().minArity(1).maxArity(2)),\n    overrides: Joi.object().pattern(internals.nameRx, Joi.function()),\n    prepare: Joi.function().maxArity(3),\n    rebuild: Joi.function().arity(1),\n    rules: Joi.object().pattern(internals.nameRx, internals.rule),\n    jsonSchema: Joi.function(),\n    terms: Joi.object().pattern(internals.nameRx, Joi.object({\n        init: Joi.array().allow(null).required(),\n        manifest: Joi.object().pattern(/.+/, [\n            Joi.valid('schema', 'single'),\n            Joi.object({\n                mapped: Joi.object({\n                    from: Joi.string().required(),\n                    to: Joi.string().required()\n                })\n                    .required()\n            })\n        ])\n    })),\n    validate: Joi.function().maxArity(3)\n})\n    .strict();\n\n\nexports.extensions = Joi.array().items(Joi.object(), Joi.function().arity(1)).strict();\n\n\n// Manifest\n\ninternals.desc = {\n\n    buffer: Joi.object({\n        buffer: Joi.string()\n    }),\n\n    func: Joi.object({\n        function: Joi.function().required(),\n        options: {\n            literal: true\n        }\n    }),\n\n    override: Joi.object({\n        override: true\n    }),\n\n    ref: Joi.object({\n        ref: Joi.object({\n            type: Joi.valid('value', 'global', 'local'),\n            path: Joi.array().required(),\n            separator: Joi.string().length(1).allow(false),\n            ancestor: Joi.number().min(0).integer().allow('root'),\n            map: Joi.array().items(Joi.array().length(2)).min(1),\n            adjust: Joi.function(),\n            iterables: Joi.boolean(),\n            in: Joi.boolean(),\n            render: Joi.boolean()\n        })\n            .required()\n    }),\n\n    regex: Joi.object({\n        regex: Joi.string().min(3)\n    }),\n\n    special: Joi.object({\n        special: Joi.valid('deep').required()\n    }),\n\n    template: Joi.object({\n        template: Joi.string().required(),\n        options: Joi.object()\n    }),\n\n    value: Joi.object({\n        value: Joi.alternatives([Joi.object(), Joi.array()]).required()\n    })\n};\n\n\ninternals.desc.entity = Joi.alternatives([\n    Joi.array().items(Joi.link('...')),\n    Joi.boolean(),\n    Joi.function(),\n    Joi.number(),\n    Joi.string(),\n    internals.desc.buffer,\n    internals.desc.func,\n    internals.desc.ref,\n    internals.desc.regex,\n    internals.desc.special,\n    internals.desc.template,\n    internals.desc.value,\n    Joi.link('/')\n]);\n\n\ninternals.desc.values = Joi.array()\n    .items(\n        null,\n        Joi.boolean(),\n        Joi.function(),\n        Joi.number().allow(Infinity, -Infinity, NaN),\n        Joi.string().allow(''),\n        Joi.symbol(),\n        internals.desc.buffer,\n        internals.desc.func,\n        internals.desc.override,\n        internals.desc.ref,\n        internals.desc.regex,\n        internals.desc.template,\n        internals.desc.value\n    );\n\n\ninternals.desc.messages = Joi.object()\n    .pattern(/.+/, [\n        Joi.string(),\n        internals.desc.template,\n        Joi.object().pattern(/.+/, [Joi.string(), internals.desc.template])\n    ]);\n\n\nexports.description = Joi.object({\n    type: Joi.string().required(),\n    flags: Joi.object({\n        cast: Joi.string(),\n        default: Joi.any(),\n        description: Joi.string(),\n        empty: Joi.link('/'),\n        failover: internals.desc.entity,\n        id: Joi.string(),\n        label: Joi.string(),\n        only: true,\n        presence: ['optional', 'required', 'forbidden'],\n        result: ['raw', 'strip'],\n        strip: Joi.boolean(),\n        unit: Joi.string()\n    })\n        .unknown(),\n    preferences: {\n        allowUnknown: Joi.boolean(),\n        abortEarly: Joi.boolean(),\n        artifacts: Joi.boolean(),\n        cache: Joi.boolean(),\n        convert: Joi.boolean(),\n        dateFormat: ['date', 'iso', 'string', 'time', 'utc'],\n        errors: {\n            escapeHtml: Joi.boolean(),\n            label: ['path', 'key'],\n            language: [\n                Joi.string(),\n                internals.desc.ref\n            ],\n            wrap: {\n                label: internals.wrap,\n                array: internals.wrap\n            }\n        },\n        externals: Joi.boolean(),\n        messages: internals.desc.messages,\n        noDefaults: Joi.boolean(),\n        nonEnumerables: Joi.boolean(),\n        presence: ['required', 'optional', 'forbidden'],\n        skipFunctions: Joi.boolean(),\n        stripUnknown: Joi.object({\n            arrays: Joi.boolean(),\n            objects: Joi.boolean()\n        })\n            .or('arrays', 'objects')\n            .allow(true, false),\n        warnings: Joi.boolean()\n    },\n    allow: internals.desc.values,\n    invalid: internals.desc.values,\n    rules: Joi.array().min(1).items({\n        name: Joi.string().required(),\n        args: Joi.object().min(1),\n        keep: Joi.boolean(),\n        message: [\n            Joi.string(),\n            internals.desc.messages\n        ],\n        warn: Joi.boolean()\n    }),\n\n    // Terms\n\n    keys: Joi.object().pattern(/.*/, Joi.link('/')),\n    link: internals.desc.ref\n})\n    .pattern(/^[a-z]\\w*$/, Joi.any());\n","'use strict';\n\nconst internals = {\n    operators: ['!', '^', '*', '/', '%', '+', '-', '<', '<=', '>', '>=', '==', '!=', '&&', '||', '??'],\n    operatorCharacters: ['!', '^', '*', '/', '%', '+', '-', '<', '=', '>', '&', '|', '?'],\n    operatorsOrder: [['^'], ['*', '/', '%'], ['+', '-'], ['<', '<=', '>', '>='], ['==', '!='], ['&&'], ['||', '??']],\n    operatorsPrefix: ['!', 'n'],\n\n    literals: {\n        '\"': '\"',\n        '`': '`',\n        '\\'': '\\'',\n        '[': ']'\n    },\n\n    numberRx: /^(?:[0-9]*(\\.[0-9]*)?){1}$/,\n    tokenRx: /^[\\w\\$\\#\\.\\@\\:\\{\\}]+$/,\n\n    symbol: Symbol('formula'),\n    settings: Symbol('settings')\n};\n\n\nexports.Parser = class {\n\n    constructor(string, options = {}) {\n\n        if (!options[internals.settings] &&\n            options.constants) {\n\n            for (const constant in options.constants) {\n                const value = options.constants[constant];\n                if (value !== null &&\n                    !['boolean', 'number', 'string'].includes(typeof value)) {\n\n                    throw new Error(`Formula constant ${constant} contains invalid ${typeof value} value type`);\n                }\n            }\n        }\n\n        this.settings = options[internals.settings] ? options : Object.assign({ [internals.settings]: true, constants: {}, functions: {} }, options);\n        this.single = null;\n\n        this._parts = null;\n        this._parse(string);\n    }\n\n    _parse(string) {\n\n        let parts = [];\n        let current = '';\n        let parenthesis = 0;\n        let literal = false;\n\n        const flush = (inner) => {\n\n            if (parenthesis) {\n                throw new Error('Formula missing closing parenthesis');\n            }\n\n            const last = parts.length ? parts[parts.length - 1] : null;\n\n            if (!literal &&\n                !current &&\n                !inner) {\n\n                return;\n            }\n\n            if (last &&\n                last.type === 'reference' &&\n                inner === ')') {                                                                // Function\n\n                last.type = 'function';\n                last.value = this._subFormula(current, last.value);\n                current = '';\n                return;\n            }\n\n            if (inner === ')') {                                                                // Segment\n                const sub = new exports.Parser(current, this.settings);\n                parts.push({ type: 'segment', value: sub });\n            }\n            else if (literal) {\n                if (literal === ']') {                                                          // Reference\n                    parts.push({ type: 'reference', value: current });\n                    current = '';\n                    return;\n                }\n\n                parts.push({ type: 'literal', value: current });                                // Literal\n            }\n            else if (internals.operatorCharacters.includes(current)) {                          // Operator\n                if (last &&\n                    last.type === 'operator' &&\n                    internals.operators.includes(last.value + current)) {                       // 2 characters operator\n\n                    last.value += current;\n                }\n                else {\n                    parts.push({ type: 'operator', value: current });\n                }\n            }\n            else if (current.match(internals.numberRx)) {                                       // Number\n                parts.push({ type: 'constant', value: parseFloat(current) });\n            }\n            else if (this.settings.constants[current] !== undefined) {                          // Constant\n                parts.push({ type: 'constant', value: this.settings.constants[current] });\n            }\n            else {                                                                              // Reference\n                if (!current.match(internals.tokenRx)) {\n                    throw new Error(`Formula contains invalid token: ${current}`);\n                }\n\n                parts.push({ type: 'reference', value: current });\n            }\n\n            current = '';\n        };\n\n        for (const c of string) {\n            if (literal) {\n                if (c === literal) {\n                    flush();\n                    literal = false;\n                }\n                else {\n                    current += c;\n                }\n            }\n            else if (parenthesis) {\n                if (c === '(') {\n                    current += c;\n                    ++parenthesis;\n                }\n                else if (c === ')') {\n                    --parenthesis;\n                    if (!parenthesis) {\n                        flush(c);\n                    }\n                    else {\n                        current += c;\n                    }\n                }\n                else {\n                    current += c;\n                }\n            }\n            else if (c in internals.literals) {\n                literal = internals.literals[c];\n            }\n            else if (c === '(') {\n                flush();\n                ++parenthesis;\n            }\n            else if (internals.operatorCharacters.includes(c)) {\n                flush();\n                current = c;\n                flush();\n            }\n            else if (c !== ' ') {\n                current += c;\n            }\n            else {\n                flush();\n            }\n        }\n\n        flush();\n\n        // Replace prefix - to internal negative operator\n\n        parts = parts.map((part, i) => {\n\n            if (part.type !== 'operator' ||\n                part.value !== '-' ||\n                i && parts[i - 1].type !== 'operator') {\n\n                return part;\n            }\n\n            return { type: 'operator', value: 'n' };\n        });\n\n        // Validate tokens order\n\n        let operator = false;\n        for (const part of parts) {\n            if (part.type === 'operator') {\n                if (internals.operatorsPrefix.includes(part.value)) {\n                    continue;\n                }\n\n                if (!operator) {\n                    throw new Error('Formula contains an operator in invalid position');\n                }\n\n                if (!internals.operators.includes(part.value)) {\n                    throw new Error(`Formula contains an unknown operator ${part.value}`);\n                }\n            }\n            else if (operator) {\n                throw new Error('Formula missing expected operator');\n            }\n\n            operator = !operator;\n        }\n\n        if (!operator) {\n            throw new Error('Formula contains invalid trailing operator');\n        }\n\n        // Identify single part\n\n        if (parts.length === 1 &&\n            ['reference', 'literal', 'constant'].includes(parts[0].type)) {\n\n            this.single = { type: parts[0].type === 'reference' ? 'reference' : 'value', value: parts[0].value };\n        }\n\n        // Process parts\n\n        this._parts = parts.map((part) => {\n\n            // Operators\n\n            if (part.type === 'operator') {\n                return internals.operatorsPrefix.includes(part.value) ? part : part.value;\n            }\n\n            // Literals, constants, segments\n\n            if (part.type !== 'reference') {\n                return part.value;\n            }\n\n            // References\n\n            if (this.settings.tokenRx &&\n                !this.settings.tokenRx.test(part.value)) {\n\n                throw new Error(`Formula contains invalid reference ${part.value}`);\n            }\n\n            if (this.settings.reference) {\n                return this.settings.reference(part.value);\n            }\n\n            return internals.reference(part.value);\n        });\n    }\n\n    _subFormula(string, name) {\n\n        const method = this.settings.functions[name];\n        if (typeof method !== 'function') {\n            throw new Error(`Formula contains unknown function ${name}`);\n        }\n\n        let args = [];\n        if (string) {\n            let current = '';\n            let parenthesis = 0;\n            let literal = false;\n\n            const flush = () => {\n\n                if (!current) {\n                    throw new Error(`Formula contains function ${name} with invalid arguments ${string}`);\n                }\n\n                args.push(current);\n                current = '';\n            };\n\n            for (let i = 0; i < string.length; ++i) {\n                const c = string[i];\n                if (literal) {\n                    current += c;\n                    if (c === literal) {\n                        literal = false;\n                    }\n                }\n                else if (c in internals.literals &&\n                    !parenthesis) {\n\n                    current += c;\n                    literal = internals.literals[c];\n                }\n                else if (c === ',' &&\n                    !parenthesis) {\n\n                    flush();\n                }\n                else {\n                    current += c;\n                    if (c === '(') {\n                        ++parenthesis;\n                    }\n                    else if (c === ')') {\n                        --parenthesis;\n                    }\n                }\n            }\n\n            flush();\n        }\n\n        args = args.map((arg) => new exports.Parser(arg, this.settings));\n\n        return function (context) {\n\n            const innerValues = [];\n            for (const arg of args) {\n                innerValues.push(arg.evaluate(context));\n            }\n\n            return method.call(context, ...innerValues);\n        };\n    }\n\n    evaluate(context) {\n\n        const parts = this._parts.slice();\n\n        // Prefix operators\n\n        for (let i = parts.length - 2; i >= 0; --i) {\n            const part = parts[i];\n            if (part &&\n                part.type === 'operator') {\n\n                const current = parts[i + 1];\n                parts.splice(i + 1, 1);\n                const value = internals.evaluate(current, context);\n                parts[i] = internals.single(part.value, value);\n            }\n        }\n\n        // Left-right operators\n\n        internals.operatorsOrder.forEach((set) => {\n\n            for (let i = 1; i < parts.length - 1;) {\n                if (set.includes(parts[i])) {\n                    const operator = parts[i];\n                    const left = internals.evaluate(parts[i - 1], context);\n                    const right = internals.evaluate(parts[i + 1], context);\n\n                    parts.splice(i, 2);\n                    const result = internals.calculate(operator, left, right);\n                    parts[i - 1] = result === 0 ? 0 : result;                               // Convert -0\n                }\n                else {\n                    i += 2;\n                }\n            }\n        });\n\n        return internals.evaluate(parts[0], context);\n    }\n};\n\n\nexports.Parser.prototype[internals.symbol] = true;\n\n\ninternals.reference = function (name) {\n\n    return function (context) {\n\n        return context && context[name] !== undefined ? context[name] : null;\n    };\n};\n\n\ninternals.evaluate = function (part, context) {\n\n    if (part === null) {\n        return null;\n    }\n\n    if (typeof part === 'function') {\n        return part(context);\n    }\n\n    if (part[internals.symbol]) {\n        return part.evaluate(context);\n    }\n\n    return part;\n};\n\n\ninternals.single = function (operator, value) {\n\n    if (operator === '!') {\n        return value ? false : true;\n    }\n\n    // operator === 'n'\n\n    const negative = -value;\n    if (negative === 0) {       // Override -0\n        return 0;\n    }\n\n    return negative;\n};\n\n\ninternals.calculate = function (operator, left, right) {\n\n    if (operator === '??') {\n        return internals.exists(left) ? left : right;\n    }\n\n    if (typeof left === 'string' ||\n        typeof right === 'string') {\n\n        if (operator === '+') {\n            left = internals.exists(left) ? left : '';\n            right = internals.exists(right) ? right : '';\n            return left + right;\n        }\n    }\n    else {\n        switch (operator) {\n            case '^': return Math.pow(left, right);\n            case '*': return left * right;\n            case '/': return left / right;\n            case '%': return left % right;\n            case '+': return left + right;\n            case '-': return left - right;\n        }\n    }\n\n    switch (operator) {\n        case '<': return left < right;\n        case '<=': return left <= right;\n        case '>': return left > right;\n        case '>=': return left >= right;\n        case '==': return left === right;\n        case '!=': return left !== right;\n        case '&&': return left && right;\n        case '||': return left || right;\n    }\n\n    return null;\n};\n\n\ninternals.exists = function (value) {\n\n    return value !== null && value !== undefined;\n};\n","'use strict';\n\nconst Annotate = require('./annotate');\nconst Common = require('./common');\nconst Template = require('./template');\n\n\nconst internals = {};\n\n\nexports.Report = class {\n\n    constructor(code, value, local, flags, messages, state, prefs) {\n\n        this.code = code;\n        this.flags = flags;\n        this.messages = messages;\n        this.path = state.path;\n        this.prefs = prefs;\n        this.state = state;\n        this.value = value;\n\n        this.message = null;\n        this.template = null;\n\n        this.local = local || {};\n        this.local.label = exports.label(this.flags, this.state, this.prefs, this.messages);\n\n        if (this.value !== undefined &&\n            !this.local.hasOwnProperty('value')) {\n\n            this.local.value = this.value;\n        }\n\n        if (this.path.length) {\n            const key = this.path[this.path.length - 1];\n            if (typeof key !== 'object') {\n                this.local.key = key;\n            }\n        }\n    }\n\n    _setTemplate(template) {\n\n        this.template = template;\n\n        if (!this.flags.label &&\n            this.path.length === 0) {\n\n            const localized = this._template(this.template, 'root');\n            if (localized) {\n                this.local.label = localized;\n            }\n        }\n    }\n\n    toString() {\n\n        if (this.message) {\n            return this.message;\n        }\n\n        const code = this.code;\n\n        if (!this.prefs.errors.render) {\n            return this.code;\n        }\n\n        const template = this._template(this.template) ||\n            this._template(this.prefs.messages) ||\n            this._template(this.messages);\n\n        if (template === undefined) {\n            return `Error code \"${code}\" is not defined, your custom type is missing the correct messages definition`;\n        }\n\n        // Render and cache result\n\n        this.message = template.render(this.value, this.state, this.prefs, this.local, { errors: this.prefs.errors, messages: [this.prefs.messages, this.messages] });\n        if (!this.prefs.errors.label) {\n            this.message = this.message.replace(/^\"\" /, '').trim();\n        }\n\n        return this.message;\n    }\n\n    _template(messages, code) {\n\n        return exports.template(this.value, messages, code || this.code, this.state, this.prefs);\n    }\n};\n\n\nexports.path = function (path) {\n\n    let label = '';\n    for (const segment of path) {\n        if (typeof segment === 'object') {          // Exclude array single path segment\n            continue;\n        }\n\n        if (typeof segment === 'string') {\n            if (label) {\n                label += '.';\n            }\n\n            label += segment;\n        }\n        else {\n            label += `[${segment}]`;\n        }\n    }\n\n    return label;\n};\n\n\nexports.template = function (value, messages, code, state, prefs) {\n\n    if (!messages) {\n        return;\n    }\n\n    if (Template.isTemplate(messages)) {\n        return code !== 'root' ? messages : null;\n    }\n\n    let lang = prefs.errors.language;\n    if (Common.isResolvable(lang)) {\n        lang = lang.resolve(value, state, prefs);\n    }\n\n    if (lang &&\n        messages[lang]) {\n\n        if (messages[lang][code] !== undefined) {\n            return messages[lang][code];\n        }\n\n        if (messages[lang]['*'] !== undefined) {\n            return messages[lang]['*'];\n        }\n    }\n\n    if (!messages[code]) {\n        return messages['*'];\n    }\n\n    return messages[code];\n};\n\n\nexports.label = function (flags, state, prefs, messages) {\n\n    if (!prefs.errors.label) {\n        return '';\n    }\n\n    if (flags.label) {\n        return flags.label;\n    }\n\n    let path = state.path;\n    if (prefs.errors.label === 'key' &&\n        state.path.length > 1) {\n\n        path = state.path.slice(-1);\n    }\n\n    const normalized = exports.path(path);\n    if (normalized) {\n        return normalized;\n    }\n\n    return exports.template(null, prefs.messages, 'root', state, prefs) ||\n        messages && exports.template(null, messages, 'root', state, prefs) ||\n        'value';\n};\n\n\nexports.process = function (errors, original, prefs) {\n\n    if (!errors) {\n        return null;\n    }\n\n    const { override, message, details } = exports.details(errors);\n    if (override) {\n        return override;\n    }\n\n    if (prefs.errors.stack) {\n        return new exports.ValidationError(message, details, original);\n    }\n\n    const limit = Error.stackTraceLimit;\n    Error.stackTraceLimit = 0;\n    const validationError = new exports.ValidationError(message, details, original);\n    Error.stackTraceLimit = limit;\n    return validationError;\n};\n\n\nexports.details = function (errors, options = {}) {\n\n    let messages = [];\n    const details = [];\n\n    for (const item of errors) {\n\n        // Override\n\n        if (item instanceof Error) {\n            if (options.override !== false) {\n                return { override: item };\n            }\n\n            const message = item.toString();\n            messages.push(message);\n\n            details.push({\n                message,\n                type: 'override',\n                context: { error: item }\n            });\n\n            continue;\n        }\n\n        // Report\n\n        const message = item.toString();\n        messages.push(message);\n\n        details.push({\n            message,\n            path: item.path.filter((v) => typeof v !== 'object'),\n            type: item.code,\n            context: item.local\n        });\n    }\n\n    if (messages.length > 1) {\n        messages = [...new Set(messages)];\n    }\n\n    return { message: messages.join('. '), details };\n};\n\n\nexports.ValidationError = class extends Error {\n\n    constructor(message, details, original) {\n\n        super(message);\n        this._original = original;\n        this.details = details;\n    }\n\n    static isError(err) {\n\n        return err instanceof exports.ValidationError;\n    }\n};\n\n\nexports.ValidationError.prototype.isJoi = true;\n\nexports.ValidationError.prototype.name = 'ValidationError';\n\nexports.ValidationError.prototype.annotate = Annotate.error;\n","'use strict';\n\nconst { assert, clone, reach } = require('@hapi/hoek');\n\nconst Common = require('./common');\n\nlet Template;\n\n\nconst internals = {\n    symbol: Symbol('ref'),      // Used to internally identify references (shared with other joi versions)\n    defaults: {\n        adjust: null,\n        in: false,\n        iterables: null,\n        map: null,\n        separator: '.',\n        type: 'value'\n    }\n};\n\n\nexports.create = function (key, options = {}) {\n\n    assert(typeof key === 'string', 'Invalid reference key:', key);\n    Common.assertOptions(options, ['adjust', 'ancestor', 'in', 'iterables', 'map', 'prefix', 'render', 'separator']);\n    assert(!options.prefix || typeof options.prefix === 'object', 'options.prefix must be of type object');\n\n    const ref = Object.assign({}, internals.defaults, options);\n    delete ref.prefix;\n\n    const separator = ref.separator;\n    const context = internals.context(key, separator, options.prefix);\n    ref.type = context.type;\n    key = context.key;\n\n    if (ref.type === 'value') {\n        if (context.root) {\n            assert(!separator || key[0] !== separator, 'Cannot specify relative path with root prefix');\n            ref.ancestor = 'root';\n            if (!key) {\n                key = null;\n            }\n        }\n\n        if (separator &&\n            separator === key) {\n\n            key = null;\n            ref.ancestor = 0;\n        }\n        else {\n            if (ref.ancestor !== undefined) {\n                assert(!separator || !key || key[0] !== separator, 'Cannot combine prefix with ancestor option');\n            }\n            else {\n                const [ancestor, slice] = internals.ancestor(key, separator);\n                if (slice) {\n                    key = key.slice(slice);\n                    if (key === '') {\n                        key = null;\n                    }\n                }\n\n                ref.ancestor = ancestor;\n            }\n        }\n    }\n\n    ref.path = separator ? (key === null ? [] : key.split(separator)) : [key];\n\n    return new internals.Ref(ref);\n};\n\n\nexports.in = function (key, options = {}) {\n\n    return exports.create(key, { ...options, in: true });\n};\n\n\nexports.isRef = function (ref) {\n\n    return ref ? !!ref[Common.symbols.ref] : false;\n};\n\n\ninternals.Ref = class {\n\n    constructor(options) {\n\n        assert(typeof options === 'object', 'Invalid reference construction');\n        Common.assertOptions(options, [\n            'adjust', 'ancestor', 'in', 'iterables', 'map', 'path', 'render', 'separator', 'type',  // Copied\n            'depth', 'key', 'root', 'display'                                                       // Overridden\n        ]);\n\n        assert([false, undefined].includes(options.separator) || typeof options.separator === 'string' && options.separator.length === 1, 'Invalid separator');\n        assert(!options.adjust || typeof options.adjust === 'function', 'options.adjust must be a function');\n        assert(!options.map || Array.isArray(options.map), 'options.map must be an array');\n        assert(!options.map || !options.adjust, 'Cannot set both map and adjust options');\n\n        Object.assign(this, internals.defaults, options);\n\n        assert(this.type === 'value' || this.ancestor === undefined, 'Non-value references cannot reference ancestors');\n\n        if (Array.isArray(this.map)) {\n            this.map = new Map(this.map);\n        }\n\n        this.depth = this.path.length;\n        this.key = this.path.length ? this.path.join(this.separator) : null;\n        this.root = this.path[0];\n\n        this.updateDisplay();\n    }\n\n    resolve(value, state, prefs, local, options = {}) {\n\n        assert(!this.in || options.in, 'Invalid in() reference usage');\n\n        if (this.type === 'global') {\n            return this._resolve(prefs.context, state, options);\n        }\n\n        if (this.type === 'local') {\n            return this._resolve(local, state, options);\n        }\n\n        if (!this.ancestor) {\n            return this._resolve(value, state, options);\n        }\n\n        if (this.ancestor === 'root') {\n            return this._resolve(state.ancestors[state.ancestors.length - 1], state, options);\n        }\n\n        assert(this.ancestor <= state.ancestors.length, 'Invalid reference exceeds the schema root:', this.display);\n        return this._resolve(state.ancestors[this.ancestor - 1], state, options);\n    }\n\n    _resolve(target, state, options) {\n\n        let resolved;\n\n        if (this.type === 'value' &&\n            state.mainstay.shadow &&\n            options.shadow !== false) {\n\n            resolved = state.mainstay.shadow.get(this.absolute(state));\n        }\n\n        if (resolved === undefined) {\n            resolved = reach(target, this.path, { iterables: this.iterables, functions: true });\n        }\n\n        if (this.adjust) {\n            resolved = this.adjust(resolved);\n        }\n\n        if (this.map) {\n            const mapped = this.map.get(resolved);\n            if (mapped !== undefined) {\n                resolved = mapped;\n            }\n        }\n\n        if (state.mainstay) {\n            state.mainstay.tracer.resolve(state, this, resolved);\n        }\n\n        return resolved;\n    }\n\n    toString() {\n\n        return this.display;\n    }\n\n    absolute(state) {\n\n        return [...state.path.slice(0, -this.ancestor), ...this.path];\n    }\n\n    clone() {\n\n        return new internals.Ref(this);\n    }\n\n    describe() {\n\n        const ref = { path: this.path };\n\n        if (this.type !== 'value') {\n            ref.type = this.type;\n        }\n\n        if (this.separator !== '.') {\n            ref.separator = this.separator;\n        }\n\n        if (this.type === 'value' &&\n            this.ancestor !== 1) {\n\n            ref.ancestor = this.ancestor;\n        }\n\n        if (this.map) {\n            ref.map = [...this.map];\n        }\n\n        for (const key of ['adjust', 'iterables', 'render']) {\n            if (this[key] !== null &&\n                this[key] !== undefined) {\n\n                ref[key] = this[key];\n            }\n        }\n\n        if (this.in !== false) {\n            ref.in = true;\n        }\n\n        return { ref };\n    }\n\n    updateDisplay() {\n\n        const key = this.key !== null ? this.key : '';\n        if (this.type !== 'value') {\n            this.display = `ref:${this.type}:${key}`;\n            return;\n        }\n\n        if (!this.separator) {\n            this.display = `ref:${key}`;\n            return;\n        }\n\n        if (!this.ancestor) {\n            this.display = `ref:${this.separator}${key}`;\n            return;\n        }\n\n        if (this.ancestor === 'root') {\n            this.display = `ref:root:${key}`;\n            return;\n        }\n\n        if (this.ancestor === 1) {\n            this.display = `ref:${key || '..'}`;\n            return;\n        }\n\n        const lead = new Array(this.ancestor + 1).fill(this.separator).join('');\n        this.display = `ref:${lead}${key || ''}`;\n    }\n};\n\n\ninternals.Ref.prototype[Common.symbols.ref] = true;\n\n\nexports.build = function (desc) {\n\n    desc = Object.assign({}, internals.defaults, desc);\n    if (desc.type === 'value' &&\n        desc.ancestor === undefined) {\n\n        desc.ancestor = 1;\n    }\n\n    return new internals.Ref(desc);\n};\n\n\ninternals.context = function (key, separator, prefix = {}) {\n\n    key = key.trim();\n\n    if (prefix) {\n        const globalp = prefix.global === undefined ? '$' : prefix.global;\n        if (globalp !== separator &&\n            key.startsWith(globalp)) {\n\n            return { key: key.slice(globalp.length), type: 'global' };\n        }\n\n        const local = prefix.local === undefined ? '#' : prefix.local;\n        if (local !== separator &&\n            key.startsWith(local)) {\n\n            return { key: key.slice(local.length), type: 'local' };\n        }\n\n        const root = prefix.root === undefined ? '/' : prefix.root;\n        if (root !== separator &&\n            key.startsWith(root)) {\n\n            return { key: key.slice(root.length), type: 'value', root: true };\n        }\n    }\n\n    return { key, type: 'value' };\n};\n\n\ninternals.ancestor = function (key, separator) {\n\n    if (!separator) {\n        return [1, 0];              // 'a_b' -> 1 (parent)\n    }\n\n    if (key[0] !== separator) {     // 'a.b' -> 1 (parent)\n        return [1, 0];\n    }\n\n    if (key[1] !== separator) {     // '.a.b' -> 0 (self)\n        return [0, 1];\n    }\n\n    let i = 2;\n    while (key[i] === separator) {\n        ++i;\n    }\n\n    return [i - 1, i];              // '...a.b.' -> 2 (grandparent)\n};\n\n\nexports.toSibling = 0;\n\nexports.toParent = 1;\n\n\nexports.Manager = class {\n\n    constructor() {\n\n        this.refs = [];                     // 0: [self refs], 1: [parent refs], 2: [grandparent refs], ...\n    }\n\n    register(source, target) {\n\n        if (!source) {\n            return;\n        }\n\n        target = target === undefined ? exports.toParent : target;\n\n        // Array\n\n        if (Array.isArray(source)) {\n            for (const ref of source) {\n                this.register(ref, target);\n            }\n\n            return;\n        }\n\n        // Schema\n\n        if (Common.isSchema(source)) {\n            for (const item of source._refs.refs) {\n                if (item.ancestor - target >= 0) {\n                    this.refs.push({ ancestor: item.ancestor - target, root: item.root });\n                }\n            }\n\n            return;\n        }\n\n        // Reference\n\n        if (exports.isRef(source) &&\n            source.type === 'value' &&\n            source.ancestor - target >= 0) {\n\n            this.refs.push({ ancestor: source.ancestor - target, root: source.root });\n        }\n\n        // Template\n\n        Template = Template || require('./template');\n\n        if (Template.isTemplate(source)) {\n            this.register(source.refs(), target);\n        }\n    }\n\n    get length() {\n\n        return this.refs.length;\n    }\n\n    clone() {\n\n        const copy = new exports.Manager();\n        copy.refs = clone(this.refs);\n        return copy;\n    }\n\n    reset() {\n\n        this.refs = [];\n    }\n\n    roots() {\n\n        return this.refs.filter((ref) => !ref.ancestor).map((ref) => ref.root);\n    }\n};\n","'use strict';\n\nconst { assert, clone, escapeHtml } = require('@hapi/hoek');\nconst Formula = require('@hapi/formula');\n\nconst Common = require('./common');\nconst Errors = require('./errors');\nconst Ref = require('./ref');\n\n\nconst internals = {\n    symbol: Symbol('template'),\n\n    opens: new Array(1000).join('\\u0000'),\n    closes: new Array(1000).join('\\u0001'),\n\n    dateFormat: {\n        date: Date.prototype.toDateString,\n        iso: Date.prototype.toISOString,\n        string: Date.prototype.toString,\n        time: Date.prototype.toTimeString,\n        utc: Date.prototype.toUTCString\n    }\n};\n\n\nmodule.exports = exports = internals.Template = class {\n\n    constructor(source, options) {\n\n        assert(typeof source === 'string', 'Template source must be a string');\n        assert(!source.includes('\\u0000') && !source.includes('\\u0001'), 'Template source cannot contain reserved control characters');\n\n        this.source = source;\n        this.rendered = source;\n\n        this._template = null;\n\n        if (options) {\n            const { functions, ...opts } = options;\n            this._settings = Object.keys(opts).length ? clone(opts) : undefined;\n            this._functions = functions;\n            if (this._functions) {\n                assert(Object.keys(this._functions).every((key) => typeof key === 'string'), 'Functions keys must be strings');\n                assert(Object.values(this._functions).every((key) => typeof key === 'function'), 'Functions values must be functions');\n            }\n        }\n        else {\n            this._settings = undefined;\n            this._functions = undefined;\n        }\n\n        this._parse();\n    }\n\n    _parse() {\n\n        // 'text {raw} {{ref}} \\\\{{ignore}} {{ignore\\\\}} {{ignore {{ignore}'\n\n        if (!this.source.includes('{')) {\n            return;\n        }\n\n        // Encode escaped \\\\{{{{{\n\n        const encoded = internals.encode(this.source);\n\n        // Split on first { in each set\n\n        const parts = internals.split(encoded);\n\n        // Process parts\n\n        let refs = false;\n        const processed = [];\n        const head = parts.shift();\n        if (head) {\n            processed.push(internals.decode(head));\n        }\n\n        for (const part of parts) {\n            const raw = part[0] !== '{';\n            const ender = raw ? '}' : '}}';\n            const end = part.indexOf(ender);\n            if (end === -1 ||                               // Ignore non-matching closing\n                part[1] === '{') {                          // Ignore more than two {\n\n                processed.push(`{${internals.decode(part)}`);\n                continue;\n            }\n\n            let variable = part.slice(raw ? 0 : 1, end);\n            const wrapped = variable[0] === ':';\n            if (wrapped) {\n                variable = variable.slice(1);\n            }\n\n            const dynamic = this._ref(internals.decode(variable), { raw, wrapped });\n            processed.push(dynamic);\n            if (typeof dynamic !== 'string') {\n                refs = true;\n            }\n\n            const rest = part.slice(end + ender.length);\n            if (rest) {\n                processed.push(internals.decode(rest));\n            }\n        }\n\n        if (!refs) {\n            this.rendered = processed.join('');\n            return;\n        }\n\n        this._template = processed;\n    }\n\n    static date(date, prefs) {\n\n        return internals.dateFormat[prefs.dateFormat].call(date);\n    }\n\n    describe(options = {}) {\n\n        if (!this._settings &&\n            options.compact) {\n\n            return this.source;\n        }\n\n        const desc = { template: this.source };\n        if (this._settings) {\n            desc.options = this._settings;\n        }\n\n        if (this._functions) {\n            desc.functions = this._functions;\n        }\n\n        return desc;\n    }\n\n    static build(desc) {\n\n        return new internals.Template(desc.template, desc.options || desc.functions ? { ...desc.options, functions: desc.functions } : undefined);\n    }\n\n    isDynamic() {\n\n        return !!this._template;\n    }\n\n    static isTemplate(template) {\n\n        return template ? !!template[Common.symbols.template] : false;\n    }\n\n    refs() {\n\n        if (!this._template) {\n            return;\n        }\n\n        const refs = [];\n        for (const part of this._template) {\n            if (typeof part !== 'string') {\n                refs.push(...part.refs);\n            }\n        }\n\n        return refs;\n    }\n\n    resolve(value, state, prefs, local) {\n\n        if (this._template &&\n            this._template.length === 1) {\n\n            return this._part(this._template[0], /* context -> [*/ value, state, prefs, local, {} /*] */);\n        }\n\n        return this.render(value, state, prefs, local);\n    }\n\n    _part(part, ...args) {\n\n        if (part.ref) {\n            return part.ref.resolve(...args);\n        }\n\n        return part.formula.evaluate(args);\n    }\n\n    render(value, state, prefs, local, options = {}) {\n\n        if (!this.isDynamic()) {\n            return this.rendered;\n        }\n\n        const parts = [];\n        for (const part of this._template) {\n            if (typeof part === 'string') {\n                parts.push(part);\n            }\n            else {\n                const rendered = this._part(part, /* context -> [*/ value, state, prefs, local, options /*] */);\n                const string = internals.stringify(rendered, value, state, prefs, local, options);\n                if (string !== undefined) {\n                    const result = part.raw || (options.errors && options.errors.escapeHtml) === false ? string : escapeHtml(string);\n                    parts.push(internals.wrap(result, part.wrapped && prefs.errors.wrap.label));\n                }\n            }\n        }\n\n        return parts.join('');\n    }\n\n    _ref(content, { raw, wrapped }) {\n\n        const refs = [];\n        const reference = (variable) => {\n\n            const ref = Ref.create(variable, this._settings);\n            refs.push(ref);\n            return (context) => {\n\n                const resolved = ref.resolve(...context);\n                return resolved !== undefined ? resolved : null;\n            };\n        };\n\n        try {\n            const functions = this._functions ? { ...internals.functions, ...this._functions } : internals.functions;\n            var formula = new Formula.Parser(content, { reference, functions, constants: internals.constants });\n        }\n        catch (err) {\n            err.message = `Invalid template variable \"${content}\" fails due to: ${err.message}`;\n            throw err;\n        }\n\n        if (formula.single) {\n            if (formula.single.type === 'reference') {\n                const ref = refs[0];\n                return { ref, raw, refs, wrapped: wrapped || ref.type === 'local' && ref.key === 'label' };\n            }\n\n            return internals.stringify(formula.single.value);\n        }\n\n        return { formula, raw, refs };\n    }\n\n    toString() {\n\n        return this.source;\n    }\n};\n\n\ninternals.Template.prototype[Common.symbols.template] = true;\ninternals.Template.prototype.isImmutable = true;                // Prevents Hoek from deep cloning schema objects\n\n\ninternals.encode = function (string) {\n\n    return string\n        .replace(/\\\\(\\{+)/g, ($0, $1) => {\n\n            return internals.opens.slice(0, $1.length);\n        })\n        .replace(/\\\\(\\}+)/g, ($0, $1) => {\n\n            return internals.closes.slice(0, $1.length);\n        });\n};\n\n\ninternals.decode = function (string) {\n\n    return string\n        .replace(/\\u0000/g, '{')\n        .replace(/\\u0001/g, '}');\n};\n\n\ninternals.split = function (string) {\n\n    const parts = [];\n    let current = '';\n\n    for (let i = 0; i < string.length; ++i) {\n        const char = string[i];\n\n        if (char === '{') {\n            let next = '';\n            while (i + 1 < string.length &&\n                string[i + 1] === '{') {\n\n                next += '{';\n                ++i;\n            }\n\n            parts.push(current);\n            current = next;\n        }\n        else {\n            current += char;\n        }\n    }\n\n    parts.push(current);\n    return parts;\n};\n\n\ninternals.wrap = function (value, ends) {\n\n    if (!ends) {\n        return value;\n    }\n\n    if (ends.length === 1) {\n        return `${ends}${value}${ends}`;\n    }\n\n    return `${ends[0]}${value}${ends[1]}`;\n};\n\n\ninternals.stringify = function (value, original, state, prefs, local, options = {}) {\n\n    const type = typeof value;\n    const wrap = prefs && prefs.errors && prefs.errors.wrap || {};\n\n    let skipWrap = false;\n    if (Ref.isRef(value) &&\n        value.render) {\n\n        skipWrap = value.in;\n        value = value.resolve(original, state, prefs, local, { in: value.in, ...options });\n    }\n\n    if (value === null) {\n        return 'null';\n    }\n\n    if (type === 'string') {\n        return internals.wrap(value, options.arrayItems && wrap.string);\n    }\n\n    if (type === 'number' ||\n        type === 'function' ||\n        type === 'symbol') {\n\n        return value.toString();\n    }\n\n    if (type !== 'object') {\n        return JSON.stringify(value);\n    }\n\n    if (value instanceof Date) {\n        return internals.Template.date(value, prefs);\n    }\n\n    if (value instanceof Map) {\n        const pairs = [];\n        for (const [key, sym] of value.entries()) {\n            pairs.push(`${key.toString()} -> ${sym.toString()}`);\n        }\n\n        value = pairs;\n    }\n\n    if (!Array.isArray(value)) {\n        return value.toString();\n    }\n\n    const values = [];\n    for (const item of value) {\n        values.push(internals.stringify(item, original, state, prefs, local, { arrayItems: true, ...options }));\n    }\n\n    return internals.wrap(values.join(', '), !skipWrap && wrap.array);\n};\n\n\ninternals.constants = {\n\n    true: true,\n    false: false,\n    null: null,\n\n    second: 1000,\n    minute: 60 * 1000,\n    hour: 60 * 60 * 1000,\n    day: 24 * 60 * 60 * 1000\n};\n\n\ninternals.functions = {\n\n    if(condition, then, otherwise) {\n\n        return condition ? then : otherwise;\n    },\n\n    length(item) {\n\n        if (typeof item === 'string') {\n            return item.length;\n        }\n\n        if (!item || typeof item !== 'object') {\n            return null;\n        }\n\n        if (Array.isArray(item)) {\n            return item.length;\n        }\n\n        return Object.keys(item).length;\n    },\n\n    msg(code) {\n\n        const [value, state, prefs, local, options] = this;\n        const messages = options.messages;\n        if (!messages) {\n            return '';\n        }\n\n        const template = Errors.template(value, messages[0], code, state, prefs) || Errors.template(value, messages[1], code, state, prefs);\n        if (!template) {\n            return '';\n        }\n\n        return template.render(value, state, prefs, local, options);\n    },\n\n    number(value) {\n\n        if (typeof value === 'number') {\n            return value;\n        }\n\n        if (typeof value === 'string') {\n            return parseFloat(value);\n        }\n\n        if (typeof value === 'boolean') {\n            return value ? 1 : 0;\n        }\n\n        if (value instanceof Date) {\n            return value.getTime();\n        }\n\n        return null;\n    }\n};\n","'use strict';\n\nconst { assert, clone } = require('@hapi/hoek');\n\nconst Template = require('./template');\n\n\nconst internals = {};\n\n\nexports.compile = function (messages, target) {\n\n    // Single value string ('plain error message', 'template {error} message')\n\n    if (typeof messages === 'string') {\n        assert(!target, 'Cannot set single message string');\n        return new Template(messages);\n    }\n\n    // Single value template\n\n    if (Template.isTemplate(messages)) {\n        assert(!target, 'Cannot set single message template');\n        return messages;\n    }\n\n    // By error code { 'number.min': <string | template> }\n\n    assert(typeof messages === 'object' && !Array.isArray(messages), 'Invalid message options');\n\n    target = target ? clone(target) : {};\n\n    for (let code in messages) {\n        const message = messages[code];\n\n        if (code === 'root' ||\n            Template.isTemplate(message)) {\n\n            target[code] = message;\n            continue;\n        }\n\n        if (typeof message === 'string') {\n            target[code] = new Template(message);\n            continue;\n        }\n\n        // By language { english: { 'number.min': <string | template> } }\n\n        assert(typeof message === 'object' && !Array.isArray(message), 'Invalid message for', code);\n\n        const language = code;\n        target[language] = target[language] || {};\n\n        for (code in message) {\n            const localized = message[code];\n\n            if (code === 'root' ||\n                Template.isTemplate(localized)) {\n\n                target[language][code] = localized;\n                continue;\n            }\n\n            assert(typeof localized === 'string', 'Invalid message for', code, 'in', language);\n            target[language][code] = new Template(localized);\n        }\n    }\n\n    return target;\n};\n\n\nexports.decompile = function (messages) {\n\n    // By error code { 'number.min': <string | template> }\n\n    const target = {};\n    for (let code in messages) {\n        const message = messages[code];\n\n        if (code === 'root') {\n            target.root = message;\n            continue;\n        }\n\n        if (Template.isTemplate(message)) {\n            target[code] = message.describe({ compact: true });\n            continue;\n        }\n\n        // By language { english: { 'number.min': <string | template> } }\n\n        const language = code;\n        target[language] = {};\n\n        for (code in message) {\n            const localized = message[code];\n\n            if (code === 'root') {\n                target[language].root = localized;\n                continue;\n            }\n\n            target[language][code] = localized.describe({ compact: true });\n        }\n    }\n\n    return target;\n};\n\n\nexports.merge = function (base, extended) {\n\n    if (!base) {\n        return exports.compile(extended);\n    }\n\n    if (!extended) {\n        return base;\n    }\n\n    // Single value string\n\n    if (typeof extended === 'string') {\n        return new Template(extended);\n    }\n\n    // Single value template\n\n    if (Template.isTemplate(extended)) {\n        return extended;\n    }\n\n    // By error code { 'number.min': <string | template> }\n\n    const target = clone(base);\n\n    for (let code in extended) {\n        const message = extended[code];\n\n        if (code === 'root' ||\n            Template.isTemplate(message)) {\n\n            target[code] = message;\n            continue;\n        }\n\n        if (typeof message === 'string') {\n            target[code] = new Template(message);\n            continue;\n        }\n\n        // By language { english: { 'number.min': <string | template> } }\n\n        assert(typeof message === 'object' && !Array.isArray(message), 'Invalid message for', code);\n\n        const language = code;\n        target[language] = target[language] || {};\n\n        for (code in message) {\n            const localized = message[code];\n\n            if (code === 'root' ||\n                Template.isTemplate(localized)) {\n\n                target[language][code] = localized;\n                continue;\n            }\n\n            assert(typeof localized === 'string', 'Invalid message for', code, 'in', language);\n            target[language][code] = new Template(localized);\n        }\n    }\n\n    return target;\n};\n","'use strict';\n\nconst { assert: Assert, AssertError } = require('@hapi/hoek');\n\nconst Pkg = require('../package.json');\n\nlet Messages;\nlet Schemas;\n\n\nconst internals = {\n    isoDate: /^(?:[-+]\\d{2})?(?:\\d{4}(?!\\d{2}\\b))(?:(-?)(?:(?:0[1-9]|1[0-2])(?:\\1(?:[12]\\d|0[1-9]|3[01]))?|W(?:[0-4]\\d|5[0-2])(?:-?[1-7])?|(?:00[1-9]|0[1-9]\\d|[12]\\d{2}|3(?:[0-5]\\d|6[1-6])))(?![T]$|[T][\\d]+Z$)(?:[T\\s](?:(?:(?:[01]\\d|2[0-3])(?:(:?)[0-5]\\d)?|24\\:?00)(?:[.,]\\d+(?!:))?)(?:\\2[0-5]\\d(?:[.,]\\d+)?)?(?:[Z]|(?:[+-])(?:[01]\\d|2[0-3])(?::?[0-5]\\d)?)?)?)?$/\n};\n\n\nexports.version = Pkg.version;\n\n\nexports.defaults = {\n    abortEarly: true,\n    allowUnknown: false,\n    artifacts: false,\n    cache: true,\n    context: null,\n    convert: true,\n    dateFormat: 'iso',\n    errors: {\n        escapeHtml: false,\n        label: 'path',\n        language: null,\n        render: true,\n        stack: false,\n        wrap: {\n            label: '\"',\n            array: '[]'\n        }\n    },\n    externals: true,\n    messages: {},\n    nonEnumerables: false,\n    noDefaults: false,\n    presence: 'optional',\n    skipFunctions: false,\n    stripUnknown: false,\n    warnings: false\n};\n\n\nexports.symbols = {\n    any: Symbol.for('@hapi/joi/schema'),            // Used to internally identify any-based types (shared with other joi versions)\n    arraySingle: Symbol('arraySingle'),\n    deepDefault: Symbol('deepDefault'),\n    errors: Symbol('errors'),\n    literal: Symbol('literal'),\n    override: Symbol('override'),\n    parent: Symbol('parent'),\n    prefs: Symbol('prefs'),\n    ref: Symbol('ref'),\n    template: Symbol('template'),\n    values: Symbol('values')\n};\n\n\nexports.assertOptions = function (options, keys, name = 'Options') {\n\n    Assert(options && typeof options === 'object' && !Array.isArray(options), 'Options must be of type object');\n    const unknownKeys = Object.keys(options).filter((k) => !keys.includes(k));\n    Assert(unknownKeys.length === 0, `${name} contain unknown keys: ${unknownKeys}`);\n};\n\n\nexports.checkPreferences = function (prefs) {\n\n    Schemas = Schemas || require('./schemas');\n\n    const result = Schemas.preferences.validate(prefs);\n\n    if (result.error) {\n        throw new AssertError([result.error.details[0].message]);\n    }\n};\n\n\nexports.compare = function (a, b, operator) {\n\n    switch (operator) {\n        case '=': return a === b;\n        case '>': return a > b;\n        case '<': return a < b;\n        case '>=': return a >= b;\n        case '<=': return a <= b;\n    }\n};\n\n\nexports.default = function (value, defaultValue) {\n\n    return value === undefined ? defaultValue : value;\n};\n\n\nexports.intersect = function (set, other) {\n\n    /* $lab:coverage:off$ */\n    if (typeof set.intersection === 'function') {\n        return set.intersection(other);\n    }\n\n    const result = new Set();\n    for (const item of set) {\n        if (other.has(item)) {\n            result.add(item);\n        }\n    }\n\n    return result;\n    /* $lab:coverage:on$ */\n};\n\n\nexports.isIsoDate = function (date) {\n\n    return internals.isoDate.test(date);\n};\n\n\nexports.isNumber = function (value) {\n\n    return typeof value === 'number' && !isNaN(value);\n};\n\n\nexports.isResolvable = function (obj) {\n\n    if (!obj) {\n        return false;\n    }\n\n    return obj[exports.symbols.ref] || obj[exports.symbols.template];\n};\n\n\nexports.isSchema = function (schema, options = {}) {\n\n    const any = schema && schema[exports.symbols.any];\n    if (!any) {\n        return false;\n    }\n\n    Assert(options.legacy || any.version === exports.version, 'Cannot mix different versions of joi schemas');\n    return true;\n};\n\n\nexports.isValues = function (obj) {\n\n    return obj[exports.symbols.values];\n};\n\n\nexports.limit = function (value) {\n\n    return Number.isSafeInteger(value) && value >= 0;\n};\n\n\nexports.preferences = function (target, source) {\n\n    Messages = Messages || require('./messages');\n\n    target = target || {};\n    source = source || {};\n\n    const merged = Object.assign({}, target, source);\n    if (source.errors &&\n        target.errors) {\n\n        merged.errors = Object.assign({}, target.errors, source.errors);\n        merged.errors.wrap = Object.assign({}, target.errors.wrap, source.errors.wrap);\n    }\n\n    if (source.messages) {\n        merged.messages = Messages.compile(source.messages, target.messages);\n    }\n\n    delete merged[exports.symbols.prefs];\n    return merged;\n};\n\n\nexports.tryWithPath = function (fn, key, options = {}) {\n\n    try {\n        return fn();\n    }\n    catch (err) {\n        if (err.path !== undefined) {\n            err.path = key + '.' + err.path;\n        }\n        else {\n            err.path = key;\n        }\n\n        if (options.append) {\n            err.message = `${err.message} (${err.path})`;\n        }\n\n        throw err;\n    }\n};\n\n\nexports.validateArg = function (value, label, { assert, message }) {\n\n    if (exports.isSchema(assert)) {\n        const result = assert.validate(value);\n        if (!result.error) {\n            return;\n        }\n\n        return result.error.message;\n    }\n    else if (!assert(value)) {\n        return label ? `${label} ${message}` : message;\n    }\n};\n\n\nexports.verifyFlat = function (args, method) {\n\n    for (const arg of args) {\n        Assert(!Array.isArray(arg), 'Method no longer accepts array arguments:', method);\n    }\n};\n","'use strict';\n\nconst { assert, clone } = require('@hapi/hoek');\n\nconst Common = require('./common');\n\n\nconst internals = {\n    max: 1000,\n    supported: new Set(['undefined', 'boolean', 'number', 'string'])\n};\n\n\nexports.provider = {\n\n    provision(options) {\n\n        return new internals.Cache(options);\n    }\n};\n\n\n// Least Recently Used (LRU) Cache\n\ninternals.Cache = class {\n\n    constructor(options = {}) {\n\n        Common.assertOptions(options, ['max']);\n        assert(options.max === undefined || options.max && options.max > 0 && isFinite(options.max), 'Invalid max cache size');\n\n        this._max = options.max || internals.max;\n\n        this._map = new Map();                          // Map of nodes by key\n        this._list = new internals.List();              // List of nodes (most recently used in head)\n    }\n\n    get length() {\n\n        return this._map.size;\n    }\n\n    set(key, value) {\n\n        if (key !== null &&\n            !internals.supported.has(typeof key)) {\n\n            return;\n        }\n\n        let node = this._map.get(key);\n        if (node) {\n            node.value = value;\n            this._list.first(node);\n            return;\n        }\n\n        node = this._list.unshift({ key, value });\n        this._map.set(key, node);\n        this._compact();\n    }\n\n    get(key) {\n\n        const node = this._map.get(key);\n        if (node) {\n            this._list.first(node);\n            return clone(node.value);\n        }\n    }\n\n    _compact() {\n\n        if (this._map.size > this._max) {\n            const node = this._list.pop();\n            this._map.delete(node.key);\n        }\n    }\n};\n\n\ninternals.List = class {\n\n    constructor() {\n\n        this.tail = null;\n        this.head = null;\n    }\n\n    unshift(node) {\n\n        node.next = null;\n        node.prev = this.head;\n\n        if (this.head) {\n            this.head.next = node;\n        }\n\n        this.head = node;\n\n        if (!this.tail) {\n            this.tail = node;\n        }\n\n        return node;\n    }\n\n    first(node) {\n\n        if (node === this.head) {\n            return;\n        }\n\n        this._remove(node);\n        this.unshift(node);\n    }\n\n    pop() {\n\n        return this._remove(this.tail);\n    }\n\n    _remove(node) {\n\n        const { next, prev } = node;\n\n        next.prev = prev;\n\n        if (prev) {\n            prev.next = next;\n        }\n\n        if (node === this.tail) {\n            this.tail = next;\n        }\n\n        node.prev = null;\n        node.next = null;\n\n        return node;\n    }\n};\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Common = require('./common');\nconst Ref = require('./ref');\n\n\nconst internals = {};\n\n\nexports.schema = function (Joi, config, options = {}) {\n\n    Common.assertOptions(options, ['appendPath', 'override']);\n\n    try {\n        return internals.schema(Joi, config, options);\n    }\n    catch (err) {\n        if (options.appendPath &&\n            err.path !== undefined) {\n\n            err.message = `${err.message} (${err.path})`;\n        }\n\n        throw err;\n    }\n};\n\n\ninternals.schema = function (Joi, config, options) {\n\n    assert(config !== undefined, 'Invalid undefined schema');\n\n    if (Array.isArray(config)) {\n        assert(config.length, 'Invalid empty array schema');\n\n        if (config.length === 1) {\n            config = config[0];\n        }\n    }\n\n    const valid = (base, ...values) => {\n\n        if (options.override !== false) {\n            return base.valid(Joi.override, ...values);\n        }\n\n        return base.valid(...values);\n    };\n\n    if (internals.simple(config)) {\n        return valid(Joi, config);\n    }\n\n    if (typeof config === 'function') {\n        return Joi.custom(config);\n    }\n\n    assert(typeof config === 'object', 'Invalid schema content:', typeof config);\n\n    if (Common.isResolvable(config)) {\n        return valid(Joi, config);\n    }\n\n    if (Common.isSchema(config)) {\n        return config;\n    }\n\n    if (Array.isArray(config)) {\n        for (const item of config) {\n            if (!internals.simple(item)) {\n                return Joi.alternatives().try(...config);\n            }\n        }\n\n        return valid(Joi, ...config);\n    }\n\n    if (config instanceof RegExp) {\n        return Joi.string().regex(config);\n    }\n\n    if (config instanceof Date) {\n        return valid(Joi.date(), config);\n    }\n\n    assert(Object.getPrototypeOf(config) === Object.getPrototypeOf({}), 'Schema can only contain plain objects');\n\n    return Joi.object().keys(config);\n};\n\n\nexports.ref = function (id, options) {\n\n    return Ref.isRef(id) ? id : Ref.create(id, options);\n};\n\n\nexports.compile = function (root, schema, options = {}) {\n\n    Common.assertOptions(options, ['legacy']);\n\n    // Compiled by any supported version\n\n    const any = schema && schema[Common.symbols.any];\n    if (any) {\n        assert(options.legacy || any.version === Common.version, 'Cannot mix different versions of joi schemas:', any.version, Common.version);\n        return schema;\n    }\n\n    // Uncompiled root\n\n    if (typeof schema !== 'object' ||\n        !options.legacy) {\n\n        return exports.schema(root, schema, { appendPath: true });          // Will error if schema contains other versions\n    }\n\n    // Scan schema for compiled parts\n\n    const compiler = internals.walk(schema);\n    if (!compiler) {\n        return exports.schema(root, schema, { appendPath: true });\n    }\n\n    return compiler.compile(compiler.root, schema);\n};\n\n\ninternals.walk = function (schema) {\n\n    if (typeof schema !== 'object') {\n        return null;\n    }\n\n    if (Array.isArray(schema)) {\n        for (const item of schema) {\n            const compiler = internals.walk(item);\n            if (compiler) {\n                return compiler;\n            }\n        }\n\n        return null;\n    }\n\n    const any = schema[Common.symbols.any];\n    if (any) {\n        return { root: schema[any.root], compile: any.compile };\n    }\n\n    assert(Object.getPrototypeOf(schema) === Object.getPrototypeOf({}), 'Schema can only contain plain objects');\n\n    for (const key in schema) {\n        const compiler = internals.walk(schema[key]);\n        if (compiler) {\n            return compiler;\n        }\n    }\n\n    return null;\n};\n\n\ninternals.simple = function (value) {\n\n    return value === null || ['boolean', 'string', 'number'].includes(typeof value);\n};\n\n\nexports.when = function (schema, condition, options) {\n\n    if (options === undefined) {\n        assert(condition && typeof condition === 'object', 'Missing options');\n\n        options = condition;\n        condition = Ref.create('.');\n    }\n\n    if (Array.isArray(options)) {\n        options = { switch: options };\n    }\n\n    Common.assertOptions(options, ['is', 'not', 'then', 'otherwise', 'switch', 'break']);\n\n    // Schema condition\n\n    if (Common.isSchema(condition)) {\n        assert(options.is === undefined, '\"is\" can not be used with a schema condition');\n        assert(options.not === undefined, '\"not\" can not be used with a schema condition');\n        assert(options.switch === undefined, '\"switch\" can not be used with a schema condition');\n\n        return internals.condition(schema, { is: condition, then: options.then, otherwise: options.otherwise, break: options.break });\n    }\n\n    // Single condition\n\n    assert(Ref.isRef(condition) || typeof condition === 'string', 'Invalid condition:', condition);\n    assert(options.not === undefined || options.is === undefined, 'Cannot combine \"is\" with \"not\"');\n\n    if (options.switch === undefined) {\n        let rule = options;\n        if (options.not !== undefined) {\n            rule = { is: options.not, then: options.otherwise, otherwise: options.then, break: options.break };\n        }\n\n        let is = rule.is !== undefined ? schema.$_compile(rule.is) : schema.$_root.invalid(null, false, 0, '').required();\n        assert(rule.then !== undefined || rule.otherwise !== undefined, 'options must have at least one of \"then\", \"otherwise\", or \"switch\"');\n        assert(rule.break === undefined || rule.then === undefined || rule.otherwise === undefined, 'Cannot specify then, otherwise, and break all together');\n\n        if (options.is !== undefined &&\n            !Ref.isRef(options.is) &&\n            !Common.isSchema(options.is)) {\n\n            is = is.required();                     // Only apply required if this wasn't already a schema or a ref\n        }\n\n        return internals.condition(schema, { ref: exports.ref(condition), is, then: rule.then, otherwise: rule.otherwise, break: rule.break });\n    }\n\n    // Switch statement\n\n    assert(Array.isArray(options.switch), '\"switch\" must be an array');\n    assert(options.is === undefined, 'Cannot combine \"switch\" with \"is\"');\n    assert(options.not === undefined, 'Cannot combine \"switch\" with \"not\"');\n    assert(options.then === undefined, 'Cannot combine \"switch\" with \"then\"');\n\n    const rule = {\n        ref: exports.ref(condition),\n        switch: [],\n        break: options.break\n    };\n\n    for (let i = 0; i < options.switch.length; ++i) {\n        const test = options.switch[i];\n        const last = i === options.switch.length - 1;\n\n        Common.assertOptions(test, last ? ['is', 'then', 'otherwise'] : ['is', 'then']);\n\n        assert(test.is !== undefined, 'Switch statement missing \"is\"');\n        assert(test.then !== undefined, 'Switch statement missing \"then\"');\n\n        const item = {\n            is: schema.$_compile(test.is),\n            then: schema.$_compile(test.then)\n        };\n\n        if (!Ref.isRef(test.is) &&\n            !Common.isSchema(test.is)) {\n\n            item.is = item.is.required();           // Only apply required if this wasn't already a schema or a ref\n        }\n\n        if (last) {\n            assert(options.otherwise === undefined || test.otherwise === undefined, 'Cannot specify \"otherwise\" inside and outside a \"switch\"');\n            const otherwise = options.otherwise !== undefined ? options.otherwise : test.otherwise;\n            if (otherwise !== undefined) {\n                assert(rule.break === undefined, 'Cannot specify both otherwise and break');\n                item.otherwise = schema.$_compile(otherwise);\n            }\n        }\n\n        rule.switch.push(item);\n    }\n\n    return rule;\n};\n\n\ninternals.condition = function (schema, condition) {\n\n    for (const key of ['then', 'otherwise']) {\n        if (condition[key] === undefined) {\n            delete condition[key];\n        }\n        else {\n            condition[key] = schema.$_compile(condition[key]);\n        }\n    }\n\n    return condition;\n};\n","'use strict';\n\nconst { assert, clone } = require('@hapi/hoek');\n\nconst Common = require('./common');\nconst Messages = require('./messages');\n\n\nconst internals = {};\n\n\nexports.type = function (from, options) {\n\n    const base = Object.getPrototypeOf(from);\n    const prototype = clone(base);\n    const schema = from._assign(Object.create(prototype));\n    const def = Object.assign({}, options);                                 // Shallow cloned\n    delete def.base;\n\n    prototype._definition = def;\n\n    const parent = base._definition || {};\n    def.messages = Messages.merge(parent.messages, def.messages);\n    def.properties = Object.assign({}, parent.properties, def.properties);\n\n    // Type\n\n    schema.type = def.type;\n\n    // Flags\n\n    def.flags = Object.assign({}, parent.flags, def.flags);\n\n    // Terms\n\n    const terms = Object.assign({}, parent.terms);\n    if (def.terms) {\n        for (const name in def.terms) {                                     // Only apply own terms\n            const term = def.terms[name];\n            assert(schema.$_terms[name] === undefined, 'Invalid term override for', def.type, name);\n            schema.$_terms[name] = term.init;\n            terms[name] = term;\n        }\n    }\n\n    def.terms = terms;\n\n    // Constructor arguments\n\n    if (!def.args) {\n        def.args = parent.args;\n    }\n\n    // Prepare\n\n    def.prepare = internals.prepare(def.prepare, parent.prepare);\n\n    // Coerce\n\n    if (def.coerce) {\n        if (typeof def.coerce === 'function') {\n            def.coerce = { method: def.coerce };\n        }\n\n        if (def.coerce.from &&\n            !Array.isArray(def.coerce.from)) {\n\n            def.coerce = { method: def.coerce.method, from: [].concat(def.coerce.from) };\n        }\n    }\n\n    def.coerce = internals.coerce(def.coerce, parent.coerce);\n\n    // Validate\n\n    def.validate = internals.validate(def.validate, parent.validate);\n\n    // Rules\n\n    const rules = Object.assign({}, parent.rules);\n    if (def.rules) {\n        for (const name in def.rules) {\n            const rule = def.rules[name];\n            assert(typeof rule === 'object', 'Invalid rule definition for', def.type, name);\n\n            let method = rule.method;\n            if (method === undefined) {\n                method = function () {\n\n                    return this.$_addRule(name);\n                };\n            }\n\n            if (method) {\n                assert(!prototype[name], 'Rule conflict in', def.type, name);\n                prototype[name] = method;\n            }\n\n            assert(!rules[name], 'Rule conflict in', def.type, name);\n            rules[name] = rule;\n\n            if (rule.alias) {\n                const aliases = [].concat(rule.alias);\n                for (const alias of aliases) {\n                    prototype[alias] = rule.method;\n                }\n            }\n\n            if (rule.args) {\n                rule.argsByName = new Map();\n                rule.args = rule.args.map((arg) => {\n\n                    if (typeof arg === 'string') {\n                        arg = { name: arg };\n                    }\n\n                    assert(!rule.argsByName.has(arg.name), 'Duplicated argument name', arg.name);\n\n                    if (Common.isSchema(arg.assert)) {\n                        arg.assert = arg.assert.strict().label(arg.name);\n                    }\n\n                    rule.argsByName.set(arg.name, arg);\n                    return arg;\n                });\n            }\n        }\n    }\n\n    def.rules = rules;\n\n    // JSON Schema\n\n    if (!def.jsonSchema) {\n        def.jsonSchema = parent.jsonSchema;\n    }\n\n    // Modifiers\n\n    const modifiers = Object.assign({}, parent.modifiers);\n    if (def.modifiers) {\n        for (const name in def.modifiers) {\n            assert(!prototype[name], 'Rule conflict in', def.type, name);\n\n            const modifier = def.modifiers[name];\n            assert(typeof modifier === 'function', 'Invalid modifier definition for', def.type, name);\n\n            const method = function (arg) {\n\n                return this.rule({ [name]: arg });\n            };\n\n            prototype[name] = method;\n            modifiers[name] = modifier;\n        }\n    }\n\n    def.modifiers = modifiers;\n\n    // Overrides\n\n    if (def.overrides) {\n        prototype._super = base;\n        schema.$_super = {};                                                            // Backwards compatibility\n        for (const override in def.overrides) {\n            assert(base[override], 'Cannot override missing', override);\n            def.overrides[override][Common.symbols.parent] = base[override];\n            schema.$_super[override] = base[override].bind(schema);                     // Backwards compatibility\n        }\n\n        Object.assign(prototype, def.overrides);\n    }\n\n    // Casts\n\n    def.cast = Object.assign({}, parent.cast, def.cast);\n\n    // Manifest\n\n    const manifest = Object.assign({}, parent.manifest, def.manifest);\n    manifest.build = internals.build(def.manifest && def.manifest.build, parent.manifest && parent.manifest.build);\n    def.manifest = manifest;\n\n    // Rebuild\n\n    def.rebuild = internals.rebuild(def.rebuild, parent.rebuild);\n\n    return schema;\n};\n\n\n// Helpers\n\ninternals.build = function (child, parent) {\n\n    if (!child ||\n        !parent) {\n\n        return child || parent;\n    }\n\n    return function (obj, desc) {\n\n        return parent(child(obj, desc), desc);\n    };\n};\n\n\ninternals.coerce = function (child, parent) {\n\n    if (!child ||\n        !parent) {\n\n        return child || parent;\n    }\n\n    return {\n        from: child.from && parent.from ? [...new Set([...child.from, ...parent.from])] : null,\n        method(value, helpers) {\n\n            let coerced;\n            if (!parent.from ||\n                parent.from.includes(typeof value)) {\n\n                coerced = parent.method(value, helpers);\n                if (coerced) {\n                    if (coerced.errors ||\n                        coerced.value === undefined) {\n\n                        return coerced;\n                    }\n\n                    value = coerced.value;\n                }\n            }\n\n            if (!child.from ||\n                child.from.includes(typeof value)) {\n\n                const own = child.method(value, helpers);\n                if (own) {\n                    return own;\n                }\n            }\n\n            return coerced;\n        }\n    };\n};\n\n\ninternals.prepare = function (child, parent) {\n\n    if (!child ||\n        !parent) {\n\n        return child || parent;\n    }\n\n    return function (value, helpers) {\n\n        const prepared = child(value, helpers);\n        if (prepared) {\n            if (prepared.errors ||\n                prepared.value === undefined) {\n\n                return prepared;\n            }\n\n            value = prepared.value;\n        }\n\n        return parent(value, helpers) || prepared;\n    };\n};\n\n\ninternals.rebuild = function (child, parent) {\n\n    if (!child ||\n        !parent) {\n\n        return child || parent;\n    }\n\n    return function (schema) {\n\n        parent(schema);\n        child(schema);\n    };\n};\n\n\ninternals.validate = function (child, parent) {\n\n    if (!child ||\n        !parent) {\n\n        return child || parent;\n    }\n\n    return function (value, helpers) {\n\n        const result = parent(value, helpers);\n        if (result) {\n            if (result.errors &&\n                (!Array.isArray(result.errors) || result.errors.length)) {\n\n                return result;\n            }\n\n            value = result.value;\n        }\n\n        return child(value, helpers) || result;\n    };\n};\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Common = require('./common');\nconst Ref = require('./ref');\n\n\nconst internals = {};\n\n\n\nexports.Ids = internals.Ids = class {\n\n    constructor() {\n\n        this._byId = new Map();\n        this._byKey = new Map();\n        this._schemaChain = false;\n    }\n\n    clone() {\n\n        const clone = new internals.Ids();\n        clone._byId = new Map(this._byId);\n        clone._byKey = new Map(this._byKey);\n        clone._schemaChain = this._schemaChain;\n        return clone;\n    }\n\n    concat(source) {\n\n        if (source._schemaChain) {\n            this._schemaChain = true;\n        }\n\n        for (const [id, value] of source._byId.entries()) {\n            assert(!this._byKey.has(id), 'Schema id conflicts with existing key:', id);\n            this._byId.set(id, value);\n        }\n\n        for (const [key, value] of source._byKey.entries()) {\n            assert(!this._byId.has(key), 'Schema key conflicts with existing id:', key);\n            this._byKey.set(key, value);\n        }\n    }\n\n    fork(path, adjuster, root) {\n\n        const chain = this._collect(path);\n        chain.push({ schema: root });\n        const tail = chain.shift();\n        let adjusted = { id: tail.id, schema: adjuster(tail.schema) };\n\n        assert(Common.isSchema(adjusted.schema), 'adjuster function failed to return a joi schema type');\n\n        for (const node of chain) {\n            adjusted = { id: node.id, schema: internals.fork(node.schema, adjusted.id, adjusted.schema) };\n        }\n\n        return adjusted.schema;\n    }\n\n    labels(path, behind = []) {\n\n        const current = path[0];\n        const node = this._get(current);\n        if (!node) {\n            return [...behind, ...path].join('.');\n        }\n\n        const forward = path.slice(1);\n        behind = [...behind, node.schema._flags.label || current];\n        if (!forward.length) {\n            return behind.join('.');\n        }\n\n        return node.schema._ids.labels(forward, behind);\n    }\n\n    reach(path, behind = []) {\n\n        const current = path[0];\n        const node = this._get(current);\n        assert(node, 'Schema does not contain path', [...behind, ...path].join('.'));\n\n        const forward = path.slice(1);\n        if (!forward.length) {\n            return node.schema;\n        }\n\n        return node.schema._ids.reach(forward, [...behind, current]);\n    }\n\n    register(schema, { key } = {}) {\n\n        if (!schema ||\n            !Common.isSchema(schema)) {\n\n            return;\n        }\n\n        if (schema.$_property('schemaChain') ||\n            schema._ids._schemaChain) {\n\n            this._schemaChain = true;\n        }\n\n        const id = schema._flags.id;\n        if (id) {\n            const existing = this._byId.get(id);\n            assert(!existing || existing.schema === schema, 'Cannot add different schemas with the same id:', id);\n            assert(!this._byKey.has(id), 'Schema id conflicts with existing key:', id);\n\n            this._byId.set(id, { schema, id });\n        }\n\n        if (key) {\n            assert(!this._byKey.has(key), 'Schema already contains key:', key);\n            assert(!this._byId.has(key), 'Schema key conflicts with existing id:', key);\n\n            this._byKey.set(key, { schema, id: key });\n        }\n    }\n\n    reset() {\n\n        this._byId = new Map();\n        this._byKey = new Map();\n        this._schemaChain = false;\n    }\n\n    _collect(path, behind = [], nodes = []) {\n\n        const current = path[0];\n        const node = this._get(current);\n        assert(node, 'Schema does not contain path', [...behind, ...path].join('.'));\n\n        nodes = [node, ...nodes];\n\n        const forward = path.slice(1);\n        if (!forward.length) {\n            return nodes;\n        }\n\n        return node.schema._ids._collect(forward, [...behind, current], nodes);\n    }\n\n    _get(id) {\n\n        return this._byId.get(id) || this._byKey.get(id);\n    }\n};\n\n\ninternals.fork = function (schema, id, replacement) {\n\n    const each = (item, { key }) => {\n\n        if (id === (item._flags.id || key)) {\n            return replacement;\n        }\n    };\n\n    const obj = exports.schema(schema, { each, ref: false });\n    return obj ? obj.$_mutateRebuild() : schema;\n};\n\n\nexports.schema = function (schema, options) {\n\n    let obj;\n\n    for (const name in schema._flags) {\n        if (name[0] === '_') {\n            continue;\n        }\n\n        const result = internals.scan(schema._flags[name], { source: 'flags', name }, options);\n        if (result !== undefined) {\n            obj = obj || schema.clone();\n            obj._flags[name] = result;\n        }\n    }\n\n    for (let i = 0; i < schema._rules.length; ++i) {\n        const rule = schema._rules[i];\n        const result = internals.scan(rule.args, { source: 'rules', name: rule.name }, options);\n        if (result !== undefined) {\n            obj = obj || schema.clone();\n            const clone = Object.assign({}, rule);\n            clone.args = result;\n            obj._rules[i] = clone;\n\n            const existingUnique = obj._singleRules.get(rule.name);\n            if (existingUnique === rule) {\n                obj._singleRules.set(rule.name, clone);\n            }\n        }\n    }\n\n    for (const name in schema.$_terms) {\n        if (name[0] === '_') {\n            continue;\n        }\n\n        const result = internals.scan(schema.$_terms[name], { source: 'terms', name }, options);\n        if (result !== undefined) {\n            obj = obj || schema.clone();\n            obj.$_terms[name] = result;\n        }\n    }\n\n    return obj;\n};\n\n\ninternals.scan = function (item, source, options, _path, _key) {\n\n    const path = _path || [];\n\n    if (item === null ||\n        typeof item !== 'object') {\n\n        return;\n    }\n\n    let clone;\n\n    if (Array.isArray(item)) {\n        for (let i = 0; i < item.length; ++i) {\n            const key = source.source === 'terms' && source.name === 'keys' && item[i].key;\n            const result = internals.scan(item[i], source, options, [i, ...path], key);\n            if (result !== undefined) {\n                clone = clone || item.slice();\n                clone[i] = result;\n            }\n        }\n\n        return clone;\n    }\n\n    if (options.schema !== false && Common.isSchema(item) ||\n        options.ref !== false && Ref.isRef(item)) {\n\n        const result = options.each(item, { ...source, path, key: _key });\n        if (result === item) {\n            return;\n        }\n\n        return result;\n    }\n\n    for (const key in item) {\n        if (key[0] === '_') {\n            continue;\n        }\n\n        const result = internals.scan(item[key], source, options, [key, ...path], _key);\n        if (result !== undefined) {\n            clone = clone || Object.assign({}, item);\n            clone[key] = result;\n        }\n    }\n\n    return clone;\n};\n","'use strict';\n\nconst { clone, reach } = require('@hapi/hoek');\n\nconst Common = require('./common');\n\n\nconst internals = {\n    value: Symbol('value')\n};\n\n\nmodule.exports = internals.State = class {\n\n    constructor(path, ancestors, state) {\n\n        this.path = path;\n        this.ancestors = ancestors;                 // [parent, ..., root]\n\n        this.mainstay = state.mainstay;\n        this.schemas = state.schemas;               // [current, ..., root]\n        this.debug = null;\n    }\n\n    localize(path, ancestors = null, schema = null) {\n\n        const state = new internals.State(path, ancestors, this);\n\n        if (schema &&\n            state.schemas) {\n\n            state.schemas = [internals.schemas(schema), ...state.schemas];\n        }\n\n        return state;\n    }\n\n    nest(schema, debug) {\n\n        const state = new internals.State(this.path, this.ancestors, this);\n        state.schemas = state.schemas && [internals.schemas(schema), ...state.schemas];\n        state.debug = debug;\n        return state;\n    }\n\n    shadow(value, reason) {\n\n        this.mainstay.shadow = this.mainstay.shadow || new internals.Shadow();\n        this.mainstay.shadow.set(this.path, value, reason);\n    }\n\n    snapshot() {\n\n        if (this.mainstay.shadow) {\n            this._snapshot = clone(this.mainstay.shadow.node(this.path));\n        }\n\n        this.mainstay.snapshot();\n    }\n\n    restore() {\n\n        if (this.mainstay.shadow) {\n            this.mainstay.shadow.override(this.path, this._snapshot);\n            this._snapshot = undefined;\n        }\n\n        this.mainstay.restore();\n    }\n\n    commit() {\n\n        if (this.mainstay.shadow) {\n            this.mainstay.shadow.override(this.path, this._snapshot);\n            this._snapshot = undefined;\n        }\n\n        this.mainstay.commit();\n    }\n};\n\n\ninternals.schemas = function (schema) {\n\n    if (Common.isSchema(schema)) {\n        return { schema };\n    }\n\n    return schema;\n};\n\n\ninternals.Shadow = class {\n\n    constructor() {\n\n        this._values = null;\n    }\n\n    set(path, value, reason) {\n\n        if (!path.length) {                                     // No need to store root value\n            return;\n        }\n\n        if (reason === 'strip' &&\n            typeof path[path.length - 1] === 'number') {        // Cannot store stripped array values (due to shift)\n\n            return;\n        }\n\n        this._values = this._values || new Map();\n\n        let node = this._values;\n        for (let i = 0; i < path.length; ++i) {\n            const segment = path[i];\n            let next = node.get(segment);\n            if (!next) {\n                next = new Map();\n                node.set(segment, next);\n            }\n\n            node = next;\n        }\n\n        node[internals.value] = value;\n    }\n\n    get(path) {\n\n        const node = this.node(path);\n        if (node) {\n            return node[internals.value];\n        }\n    }\n\n    node(path) {\n\n        if (!this._values) {\n            return;\n        }\n\n        return reach(this._values, path, { iterables: true });\n    }\n\n    override(path, node) {\n\n        if (!this._values) {\n            return;\n        }\n\n        const parents = path.slice(0, -1);\n        const own = path[path.length - 1];\n        const parent = reach(this._values, parents, { iterables: true });\n\n        if (node) {\n            parent.set(own, node);\n            return;\n        }\n\n        if (parent) {\n            parent.delete(own);\n        }\n    }\n};\n","'use strict';\n\nconst { assert, clone, ignore, reach } = require('@hapi/hoek');\n\nconst Common = require('./common');\nconst Errors = require('./errors');\nconst State = require('./state');\n\n\nconst internals = {\n    result: Symbol('result')\n};\n\n\nexports.entry = function (value, schema, prefs) {\n\n    let settings = Common.defaults;\n    if (prefs) {\n        assert(prefs.warnings === undefined, 'Cannot override warnings preference in synchronous validation');\n        assert(prefs.artifacts === undefined, 'Cannot override artifacts preference in synchronous validation');\n        settings = Common.preferences(Common.defaults, prefs);\n    }\n\n    const result = internals.entry(value, schema, settings);\n    assert(!result.mainstay.externals.length, 'Schema with external rules must use validateAsync()');\n    const outcome = { value: result.value };\n\n    if (result.error) {\n        outcome.error = result.error;\n    }\n\n    if (result.mainstay.warnings.length) {\n        outcome.warning = Errors.details(result.mainstay.warnings);\n    }\n\n    if (result.mainstay.debug) {\n        outcome.debug = result.mainstay.debug;\n    }\n\n    if (result.mainstay.artifacts) {\n        outcome.artifacts = result.mainstay.artifacts;\n    }\n\n    return outcome;\n};\n\n\nexports.entryAsync = async function (value, schema, prefs) {\n\n    let settings = Common.defaults;\n    if (prefs) {\n        settings = Common.preferences(Common.defaults, prefs);\n    }\n\n    const result = internals.entry(value, schema, settings);\n    const mainstay = result.mainstay;\n    if (result.error) {\n        if (mainstay.debug) {\n            result.error.debug = mainstay.debug;\n        }\n\n        throw result.error;\n    }\n\n    if (mainstay.externals.length) {\n        let root = result.value;\n        const errors = [];\n        for (const external of mainstay.externals) {\n            const path = external.state.path;\n            const linked = external.schema.type === 'link' ? mainstay.links.get(external.schema) : null;\n            let node = root;\n            let key;\n            let parent;\n\n            const ancestors = path.length ? [root] : [];\n            const original = path.length ? reach(value, path) : value;\n\n            if (path.length) {\n                key = path[path.length - 1];\n\n                let current = root;\n                for (const segment of path.slice(0, -1)) {\n                    current = current[segment];\n                    ancestors.unshift(current);\n                }\n\n                parent = ancestors[0];\n                node = parent[key];\n            }\n\n            try {\n                const createError = (code, local) => (linked || external.schema).$_createError(code, node, local, external.state, settings);\n                const output = await external.method(node, {\n                    schema: external.schema,\n                    linked,\n                    state: external.state,\n                    prefs,\n                    original,\n                    error: createError,\n                    errorsArray: internals.errorsArray,\n                    warn: (code, local) => mainstay.warnings.push((linked || external.schema).$_createError(code, node, local, external.state, settings)),\n                    message: (messages, local) => (linked || external.schema).$_createError('external', node, local, external.state, settings, { messages })\n                });\n\n                if (output === undefined ||\n                    output === node) {\n\n                    continue;\n                }\n\n                if (output instanceof Errors.Report) {\n                    mainstay.tracer.log(external.schema, external.state, 'rule', 'external', 'error');\n                    errors.push(output);\n\n                    if (settings.abortEarly) {\n                        break;\n                    }\n\n                    continue;\n                }\n\n                if (Array.isArray(output) &&\n                    output[Common.symbols.errors]) {\n                    mainstay.tracer.log(external.schema, external.state, 'rule', 'external', 'error');\n                    errors.push(...output);\n\n                    if (settings.abortEarly) {\n                        break;\n                    }\n\n                    continue;\n                }\n\n                if (parent) {\n                    mainstay.tracer.value(external.state, 'rule', node, output, 'external');\n                    parent[key] = output;\n                }\n                else {\n                    mainstay.tracer.value(external.state, 'rule', root, output, 'external');\n                    root = output;\n                }\n            }\n            catch (err) {\n                if (settings.errors.label) {\n                    err.message += ` (${(external.label)})`;       // Change message to include path\n                }\n\n                throw err;\n            }\n        }\n\n        result.value = root;\n\n        if (errors.length) {\n            result.error = Errors.process(errors, value, settings);\n\n            if (mainstay.debug) {\n                result.error.debug = mainstay.debug;\n            }\n\n            throw result.error;\n        }\n    }\n\n    if (!settings.warnings &&\n        !settings.debug &&\n        !settings.artifacts) {\n\n        return result.value;\n    }\n\n    const outcome = { value: result.value };\n    if (mainstay.warnings.length) {\n        outcome.warning = Errors.details(mainstay.warnings);\n    }\n\n    if (mainstay.debug) {\n        outcome.debug = mainstay.debug;\n    }\n\n    if (mainstay.artifacts) {\n        outcome.artifacts = mainstay.artifacts;\n    }\n\n    return outcome;\n};\n\n\nexports.standard = function (value, schema, options) {\n\n    const prefs = options?.libraryOptions;\n\n    if (schema.isAsync()) {\n        return exports.entryAsync(value, schema, prefs);\n    }\n\n    return exports.entry(value, schema, prefs);\n};\n\n\ninternals.Mainstay = class {\n\n    constructor(tracer, debug, links) {\n\n        this.externals = [];\n        this.warnings = [];\n        this.tracer = tracer;\n        this.debug = debug;\n        this.links = links;\n        this.shadow = null;\n        this.artifacts = null;\n\n        this._snapshots = [];\n    }\n\n    snapshot() {\n\n        this._snapshots.push({\n            externals: this.externals.slice(),\n            warnings: this.warnings.slice()\n        });\n    }\n\n    restore() {\n\n        const snapshot = this._snapshots.pop();\n        this.externals = snapshot.externals;\n        this.warnings = snapshot.warnings;\n    }\n\n    commit() {\n\n        this._snapshots.pop();\n    }\n};\n\n\ninternals.entry = function (value, schema, prefs) {\n\n    // Prepare state\n\n    const { tracer, cleanup } = internals.tracer(schema, prefs);\n    const debug = prefs.debug ? [] : null;\n    const links = schema._ids._schemaChain ? new Map() : null;\n    const mainstay = new internals.Mainstay(tracer, debug, links);\n    const schemas = schema._ids._schemaChain ? [{ schema }] : null;\n    const state = new State([], [], { mainstay, schemas });\n\n    // Validate value\n\n    const result = exports.validate(value, schema, state, prefs);\n\n    // Process value and errors\n\n    if (cleanup) {\n        schema.$_root.untrace();\n    }\n\n    const error = Errors.process(result.errors, value, prefs);\n    return { value: result.value, error, mainstay };\n};\n\n\ninternals.tracer = function (schema, prefs) {\n\n    if (schema.$_root._tracer) {\n        return { tracer: schema.$_root._tracer._register(schema) };\n    }\n\n    if (prefs.debug) {\n        assert(schema.$_root.trace, 'Debug mode not supported');\n        return { tracer: schema.$_root.trace()._register(schema), cleanup: true };\n    }\n\n    return { tracer: internals.ignore };\n};\n\n\nexports.validate = function (value, schema, state, prefs, overrides = {}) {\n\n    if (schema.$_terms.whens) {\n        schema = schema._generate(value, state, prefs).schema;\n    }\n\n    // Setup state and settings\n\n    if (schema._preferences) {\n        prefs = internals.prefs(schema, prefs);\n    }\n\n    // Cache\n\n    if (schema._cache &&\n        prefs.cache) {\n\n        const result = schema._cache.get(value);\n        state.mainstay.tracer.debug(state, 'validate', 'cached', !!result);\n        if (result) {\n            return result;\n        }\n    }\n\n    // Helpers\n\n    const createError = (code, local, localState) => schema.$_createError(code, value, local, localState || state, prefs);\n    const helpers = {\n        original: value,\n        prefs,\n        schema,\n        state,\n        error: createError,\n        errorsArray: internals.errorsArray,\n        warn: (code, local, localState) => state.mainstay.warnings.push(createError(code, local, localState)),\n        message: (messages, local) => schema.$_createError('custom', value, local, state, prefs, { messages })\n    };\n\n    // Prepare\n\n    state.mainstay.tracer.entry(schema, state);\n\n    const def = schema._definition;\n    if (def.prepare &&\n        value !== undefined &&\n        prefs.convert) {\n\n        const prepared = def.prepare(value, helpers);\n        if (prepared) {\n            state.mainstay.tracer.value(state, 'prepare', value, prepared.value);\n            if (prepared.errors) {\n                return internals.finalize(prepared.value, [].concat(prepared.errors), helpers);         // Prepare error always aborts early\n            }\n\n            value = prepared.value;\n        }\n    }\n\n    // Type coercion\n\n    if (def.coerce &&\n        value !== undefined &&\n        prefs.convert &&\n        (!def.coerce.from || def.coerce.from.includes(typeof value))) {\n\n        const coerced = def.coerce.method(value, helpers);\n        if (coerced) {\n            state.mainstay.tracer.value(state, 'coerced', value, coerced.value);\n            if (coerced.errors) {\n                return internals.finalize(coerced.value, [].concat(coerced.errors), helpers);           // Coerce error always aborts early\n            }\n\n            value = coerced.value;\n        }\n    }\n\n    // Empty value\n\n    const empty = schema._flags.empty;\n    if (empty &&\n        empty.$_match(internals.trim(value, schema), state.nest(empty), Common.defaults)) {\n\n        state.mainstay.tracer.value(state, 'empty', value, undefined);\n        value = undefined;\n    }\n\n    // Presence requirements (required, optional, forbidden)\n\n    const presence = overrides.presence || schema._flags.presence || (schema._flags._endedSwitch ? null : prefs.presence);\n    if (value === undefined) {\n        if (presence === 'forbidden') {\n            return internals.finalize(value, null, helpers);\n        }\n\n        if (presence === 'required') {\n            return internals.finalize(value, [schema.$_createError('any.required', value, null, state, prefs)], helpers);\n        }\n\n        if (presence === 'optional') {\n            if (schema._flags.default !== Common.symbols.deepDefault) {\n                return internals.finalize(value, null, helpers);\n            }\n\n            state.mainstay.tracer.value(state, 'default', value, {});\n            value = {};\n        }\n    }\n    else if (presence === 'forbidden') {\n        return internals.finalize(value, [schema.$_createError('any.unknown', value, null, state, prefs)], helpers);\n    }\n\n    // Allowed values\n\n    const errors = [];\n\n    if (schema._valids) {\n        const match = schema._valids.get(value, state, prefs, schema._flags.insensitive);\n        if (match) {\n            if (prefs.convert) {\n                state.mainstay.tracer.value(state, 'valids', value, match.value);\n                value = match.value;\n            }\n\n            state.mainstay.tracer.filter(schema, state, 'valid', match);\n            return internals.finalize(value, null, helpers);\n        }\n\n        if (schema._flags.only) {\n            const report = schema.$_createError('any.only', value, { valids: schema._valids.values({ display: true }) }, state, prefs);\n            if (prefs.abortEarly) {\n                return internals.finalize(value, [report], helpers);\n            }\n\n            errors.push(report);\n        }\n    }\n\n    // Denied values\n\n    if (schema._invalids) {\n        const match = schema._invalids.get(value, state, prefs, schema._flags.insensitive);\n        if (match) {\n            state.mainstay.tracer.filter(schema, state, 'invalid', match);\n            const report = schema.$_createError('any.invalid', value, { invalids: schema._invalids.values({ display: true }) }, state, prefs);\n            if (prefs.abortEarly) {\n                return internals.finalize(value, [report], helpers);\n            }\n\n            errors.push(report);\n        }\n    }\n\n    // Base type\n\n    if (def.validate) {\n        const base = def.validate(value, helpers);\n        if (base) {\n            state.mainstay.tracer.value(state, 'base', value, base.value);\n            value = base.value;\n\n            if (base.errors) {\n                if (!Array.isArray(base.errors)) {\n                    errors.push(base.errors);\n                    return internals.finalize(value, errors, helpers);          // Base error always aborts early\n                }\n\n                if (base.errors.length) {\n                    errors.push(...base.errors);\n                    return internals.finalize(value, errors, helpers);          // Base error always aborts early\n                }\n            }\n        }\n    }\n\n    // Validate tests\n\n    if (!schema._rules.length) {\n        return internals.finalize(value, errors, helpers);\n    }\n\n    return internals.rules(value, errors, helpers);\n};\n\n\ninternals.rules = function (value, errors, helpers) {\n\n    const { schema, state, prefs } = helpers;\n\n    for (const rule of schema._rules) {\n        const definition = schema._definition.rules[rule.method];\n\n        // Skip rules that are also applied in coerce step\n\n        if (definition.convert &&\n            prefs.convert) {\n\n            state.mainstay.tracer.log(schema, state, 'rule', rule.name, 'full');\n            continue;\n        }\n\n        // Resolve references\n\n        let ret;\n        let args = rule.args;\n        if (rule._resolve.length) {\n            args = Object.assign({}, args);                                     // Shallow copy\n            for (const key of rule._resolve) {\n                const resolver = definition.argsByName.get(key);\n\n                const resolved = args[key].resolve(value, state, prefs);\n                const normalized = resolver.normalize ? resolver.normalize(resolved) : resolved;\n\n                const invalid = Common.validateArg(normalized, null, resolver);\n                if (invalid) {\n                    ret = schema.$_createError('any.ref', resolved, { arg: key, ref: args[key], reason: invalid }, state, prefs);\n                    break;\n                }\n\n                args[key] = normalized;\n            }\n        }\n\n        // Test rule\n\n        ret = ret || definition.validate(value, helpers, args, rule);           // Use ret if already set to reference error\n\n        const result = internals.rule(ret, rule);\n        if (result.errors) {\n            state.mainstay.tracer.log(schema, state, 'rule', rule.name, 'error');\n\n            if (rule.warn) {\n                state.mainstay.warnings.push(...result.errors);\n                continue;\n            }\n\n            if (prefs.abortEarly) {\n                return internals.finalize(value, result.errors, helpers);\n            }\n\n            errors.push(...result.errors);\n        }\n        else {\n            state.mainstay.tracer.log(schema, state, 'rule', rule.name, 'pass');\n            state.mainstay.tracer.value(state, 'rule', value, result.value, rule.name);\n            value = result.value;\n        }\n    }\n\n    return internals.finalize(value, errors, helpers);\n};\n\n\ninternals.rule = function (ret, rule) {\n\n    if (ret instanceof Errors.Report) {\n        internals.error(ret, rule);\n        return { errors: [ret], value: null };\n    }\n\n    if (Array.isArray(ret) &&\n        ret[Common.symbols.errors]) {\n\n        ret.forEach((report) => internals.error(report, rule));\n        return { errors: ret, value: null };\n    }\n\n    return { errors: null, value: ret };\n};\n\n\ninternals.error = function (report, rule) {\n\n    if (rule.message) {\n        report._setTemplate(rule.message);\n    }\n\n    return report;\n};\n\n\ninternals.finalize = function (value, errors, helpers) {\n\n    errors = errors || [];\n    const { schema, state, prefs } = helpers;\n\n    // Failover value\n\n    if (errors.length) {\n        const failover = internals.default('failover', undefined, errors, helpers);\n        if (failover !== undefined) {\n            state.mainstay.tracer.value(state, 'failover', value, failover);\n            value = failover;\n            errors = [];\n        }\n    }\n\n    // Error override\n\n    if (errors.length &&\n        schema._flags.error) {\n\n        if (typeof schema._flags.error === 'function') {\n            errors = schema._flags.error(errors);\n            if (!Array.isArray(errors)) {\n                errors = [errors];\n            }\n\n            for (const error of errors) {\n                assert(error instanceof Error || error instanceof Errors.Report, 'error() must return an Error object');\n            }\n        }\n        else {\n            errors = [schema._flags.error];\n        }\n    }\n\n    // Default\n\n    if (value === undefined) {\n        const defaulted = internals.default('default', value, errors, helpers);\n        state.mainstay.tracer.value(state, 'default', value, defaulted);\n        value = defaulted;\n    }\n\n    // Cast\n\n    if (schema._flags.cast &&\n        value !== undefined) {\n\n        const caster = schema._definition.cast[schema._flags.cast];\n        if (caster.from(value)) {\n            const casted = caster.to(value, helpers);\n            state.mainstay.tracer.value(state, 'cast', value, casted, schema._flags.cast);\n            value = casted;\n        }\n    }\n\n    // Externals\n\n    if (schema.$_terms.externals &&\n        prefs.externals &&\n        prefs._externals !== false) {                       // Disabled for matching\n\n        for (const { method } of schema.$_terms.externals) {\n            state.mainstay.externals.push({ method, schema, state, label: Errors.label(schema._flags, state, prefs) });\n        }\n    }\n\n    // Result\n\n    const result = { value, errors: errors.length ? errors : null };\n\n    if (schema._flags.result) {\n        result.value = schema._flags.result === 'strip' ? undefined : /* raw */ helpers.original;\n        state.mainstay.tracer.value(state, schema._flags.result, value, result.value);\n        state.shadow(value, schema._flags.result);\n    }\n\n    // Cache\n\n    if (schema._cache &&\n        prefs.cache !== false &&\n        !schema._refs.length) {\n\n        schema._cache.set(helpers.original, result);\n    }\n\n    // Artifacts\n\n    if (value !== undefined &&\n        !result.errors &&\n        schema._flags.artifact !== undefined) {\n\n        state.mainstay.artifacts = state.mainstay.artifacts || new Map();\n        if (!state.mainstay.artifacts.has(schema._flags.artifact)) {\n            state.mainstay.artifacts.set(schema._flags.artifact, []);\n        }\n\n        state.mainstay.artifacts.get(schema._flags.artifact).push(state.path);\n    }\n\n    return result;\n};\n\n\ninternals.prefs = function (schema, prefs) {\n\n    const isDefaultOptions = prefs === Common.defaults;\n    if (isDefaultOptions &&\n        schema._preferences[Common.symbols.prefs]) {\n\n        return schema._preferences[Common.symbols.prefs];\n    }\n\n    prefs = Common.preferences(prefs, schema._preferences);\n    if (isDefaultOptions) {\n        schema._preferences[Common.symbols.prefs] = prefs;\n    }\n\n    return prefs;\n};\n\n\ninternals.default = function (flag, value, errors, helpers) {\n\n    const { schema, state, prefs } = helpers;\n    const source = schema._flags[flag];\n    if (prefs.noDefaults ||\n        source === undefined) {\n\n        return value;\n    }\n\n    state.mainstay.tracer.log(schema, state, 'rule', flag, 'full');\n\n    if (!source) {\n        return source;\n    }\n\n    if (typeof source === 'function') {\n        const args = source.length ? [clone(state.ancestors[0]), helpers] : [];\n\n        try {\n            return source(...args);\n        }\n        catch (err) {\n            errors.push(schema.$_createError(`any.${flag}`, null, { error: err }, state, prefs));\n            return;\n        }\n    }\n\n    if (typeof source !== 'object') {\n        return source;\n    }\n\n    if (source[Common.symbols.literal]) {\n        return source.literal;\n    }\n\n    if (Common.isResolvable(source)) {\n        return source.resolve(value, state, prefs);\n    }\n\n    return clone(source);\n};\n\n\ninternals.trim = function (value, schema) {\n\n    if (typeof value !== 'string') {\n        return value;\n    }\n\n    const trim = schema.$_getRule('trim');\n    if (!trim ||\n        !trim.args.enabled) {\n\n        return value;\n    }\n\n    return value.trim();\n};\n\n\ninternals.ignore = {\n    active: false,\n    debug: ignore,\n    entry: ignore,\n    filter: ignore,\n    log: ignore,\n    resolve: ignore,\n    value: ignore\n};\n\n\ninternals.errorsArray = function () {\n\n    const errors = [];\n    errors[Common.symbols.errors] = true;\n    return errors;\n};\n","'use strict';\n\nconst { assert, deepEqual } = require('@hapi/hoek');\n\nconst Common = require('./common');\n\n\nconst internals = {};\n\n\nmodule.exports = internals.Values = class {\n\n    constructor(values, refs) {\n\n        this._values = new Set(values);\n        this._refs = new Set(refs);\n        this._lowercase = internals.lowercases(values);\n\n        this._override = false;\n    }\n\n    get length() {\n\n        return this._values.size + this._refs.size;\n    }\n\n    add(value, refs) {\n\n        // Reference\n\n        if (Common.isResolvable(value)) {\n            if (!this._refs.has(value)) {\n                this._refs.add(value);\n\n                if (refs) {                     // Skipped in a merge\n                    refs.register(value);\n                }\n            }\n\n            return;\n        }\n\n        // Value\n\n        if (!this.has(value, null, null, false)) {\n            this._values.add(value);\n\n            if (typeof value === 'string') {\n                this._lowercase.set(value.toLowerCase(), value);\n            }\n        }\n    }\n\n    static merge(target, source, remove) {\n\n        target = target || new internals.Values();\n\n        if (source) {\n            if (source._override) {\n                return source.clone();\n            }\n\n            for (const item of [...source._values, ...source._refs]) {\n                target.add(item);\n            }\n        }\n\n        if (remove) {\n            for (const item of [...remove._values, ...remove._refs]) {\n                target.remove(item);\n            }\n        }\n\n        return target.length ? target : null;\n    }\n\n    remove(value) {\n\n        // Reference\n\n        if (Common.isResolvable(value)) {\n            this._refs.delete(value);\n            return;\n        }\n\n        // Value\n\n        this._values.delete(value);\n\n        if (typeof value === 'string') {\n            this._lowercase.delete(value.toLowerCase());\n        }\n    }\n\n    has(value, state, prefs, insensitive) {\n\n        return !!this.get(value, state, prefs, insensitive);\n    }\n\n    get(value, state, prefs, insensitive) {\n\n        if (!this.length) {\n            return false;\n        }\n\n        // Simple match\n\n        if (this._values.has(value)) {\n            return { value };\n        }\n\n        // Case insensitive string match\n\n        if (typeof value === 'string' &&\n            value &&\n            insensitive) {\n\n            const found = this._lowercase.get(value.toLowerCase());\n            if (found) {\n                return { value: found };\n            }\n        }\n\n        if (!this._refs.size &&\n            typeof value !== 'object') {\n\n            return false;\n        }\n\n        // Objects\n\n        if (typeof value === 'object') {\n            for (const item of this._values) {\n                if (deepEqual(item, value)) {\n                    return { value: item };\n                }\n            }\n        }\n\n        // References\n\n        if (state) {\n            for (const ref of this._refs) {\n                const resolved = ref.resolve(value, state, prefs, null, { in: true });\n                if (resolved === undefined) {\n                    continue;\n                }\n\n                const items = !ref.in || typeof resolved !== 'object'\n                    ? [resolved]\n                    : Array.isArray(resolved) ? resolved : Object.keys(resolved);\n\n                for (const item of items) {\n                    if (typeof item !== typeof value) {\n                        continue;\n                    }\n\n                    if (insensitive &&\n                        value &&\n                        typeof value === 'string') {\n\n                        if (item.toLowerCase() === value.toLowerCase()) {\n                            return { value: item, ref };\n                        }\n                    }\n                    else {\n                        if (deepEqual(item, value)) {\n                            return { value: item, ref };\n                        }\n                    }\n                }\n            }\n        }\n\n        return false;\n    }\n\n    override() {\n\n        this._override = true;\n    }\n\n    values(options) {\n\n        if (options &&\n            options.display) {\n\n            const values = [];\n\n            for (const item of [...this._values, ...this._refs]) {\n                if (item !== undefined) {\n                    values.push(item);\n                }\n            }\n\n            return values;\n        }\n\n        return Array.from([...this._values, ...this._refs]);\n    }\n\n    clone() {\n\n        const set = new internals.Values(this._values, this._refs);\n        set._override = this._override;\n        return set;\n    }\n\n    concat(source) {\n\n        assert(!source._override, 'Cannot concat override set of values');\n\n        const set = new internals.Values([...this._values, ...source._values], [...this._refs, ...source._refs]);\n        set._override = this._override;\n        return set;\n    }\n\n    describe() {\n\n        const normalized = [];\n\n        if (this._override) {\n            normalized.push({ override: true });\n        }\n\n        for (const value of this._values.values()) {\n            normalized.push(value && typeof value === 'object' ? { value } : value);\n        }\n\n        for (const value of this._refs.values()) {\n            normalized.push(value.describe());\n        }\n\n        return normalized;\n    }\n};\n\n\ninternals.Values.prototype[Common.symbols.values] = true;\n\n\n// Aliases\n\ninternals.Values.prototype.slice = internals.Values.prototype.clone;\n\n\n// Helpers\n\ninternals.lowercases = function (from) {\n\n    const map = new Map();\n\n    if (from) {\n        for (const value of from) {\n            if (typeof value === 'string') {\n                map.set(value.toLowerCase(), value);\n            }\n        }\n    }\n\n    return map;\n};\n","'use strict';\n\nconst { assert, clone, deepEqual, merge } = require('@hapi/hoek');\n\nconst Cache = require('./cache');\nconst Common = require('./common');\nconst Compile = require('./compile');\nconst Errors = require('./errors');\nconst Extend = require('./extend');\nconst Manifest = require('./manifest');\nconst Messages = require('./messages');\nconst Modify = require('./modify');\nconst Ref = require('./ref');\nconst Trace = require('./trace');\nconst Validator = require('./validator');\nconst Values = require('./values');\n\n\nconst internals = {\n    standardTypes: new Set(['string', 'number', 'integer', 'boolean', 'object', 'array', 'null']),\n    jsonSchemaTarget: 'draft-2020-12',\n    primitiveTypes: new Set(['string', 'number', 'boolean']),\n    nullSchema: () => ({ type: 'null' })\n};\n\n\ninternals.Base = class {\n\n    constructor(type) {\n\n        // Naming: public, _private, $_extension, $_mutate{action}\n\n        this.type = type;\n\n        this.$_root = null;\n        this._definition = {};\n        this._reset();\n    }\n\n    _reset() {\n\n        this._ids = new Modify.Ids();\n        this._preferences = null;\n        this._refs = new Ref.Manager();\n        this._cache = null;\n\n        this._valids = null;\n        this._invalids = null;\n\n        this._flags = {};\n        this._rules = [];\n        this._singleRules = new Map();              // The rule options passed for non-multi rules\n\n        this.$_terms = {};                          // Hash of arrays of immutable objects (extended by other types)\n\n        this.$_temp = {                             // Runtime state (not cloned)\n            ruleset: null,                          // null: use last, false: error, number: start position\n            whens: {}                               // Runtime cache of generated whens\n        };\n    }\n\n    // Manifest\n\n    describe() {\n\n        assert(typeof Manifest.describe === 'function', 'Manifest functionality disabled');\n        return Manifest.describe(this);\n    }\n\n    $_jsonSchema(mode, options = {}) {\n\n        if (options.target !== undefined &&\n            options.target !== internals.jsonSchemaTarget) {\n\n            throw new Error(`Unsupported JSON Schema target: ${options.target}`);\n        }\n\n        const rootCall = !options.$defs;\n        const defs = options.$defs ?? {};\n\n        let schema = {};\n\n        const isTypeAny = this.type === 'any';\n        const isOnly = this._flags.only;\n\n        const valids = this._valids && Array.from(this._valids._values).filter((v) => v !== null);\n        let typesOverlap = true;\n\n        // If 'only' is set, check if the allowed values' types overlap with the schema type\n\n        if (valids && valids.length && isOnly && !isTypeAny) {\n            const types = new Set(valids.map((v) => typeof v));\n            typesOverlap = types.has(this.type) || (this.type === 'date' && types.has('object'));\n        }\n\n        // Set the JSON Schema 'type' if it's a standard type and there's an overlap\n\n        if (!isTypeAny && typesOverlap && internals.standardTypes.has(this.type)) {\n            schema.type = this.type;\n        }\n\n        if (this._flags.description) {\n            schema.description = this._flags.description;\n        }\n\n        if (this._flags.default !== undefined && typeof this._flags.default !== 'function') {\n            schema.default = this._flags.default;\n        }\n\n        // Apply type-specific JSON Schema conversion\n\n        const subOptions = { ...options, $defs: defs };\n        if (this._definition.jsonSchema && typesOverlap) {\n            schema = this._definition.jsonSchema(this, schema, mode, subOptions);\n        }\n\n        // Apply rule-specific JSON Schema conversions\n\n        for (const rule of this._rules) {\n            const definition = this._definition.rules[rule.name];\n            if (definition.jsonSchema && typesOverlap) {\n                schema = definition.jsonSchema(rule, schema, isOnly, mode, subOptions);\n            }\n        }\n\n        // Handle shared schemas\n\n        if (this.$_terms.shared) {\n            for (const shared of this.$_terms.shared) {\n                defs[shared._flags.id] = shared.$_jsonSchema(mode, subOptions);\n            }\n        }\n\n        if (rootCall && Object.keys(defs).length) {\n            schema.$defs = defs;\n        }\n\n        // Handle allowed values (valids)\n\n        if (this._valids) {\n\n            const values = valids.filter((v) => typeof v !== 'symbol');\n            if (values.length) {\n                if (this._flags.only) {\n                    schema.enum = values;\n\n                    const list = Common.intersect(new Set(values.map((v) => typeof v)), internals.primitiveTypes);\n\n                    if (list.size) {\n                        const types = [...list];\n                        schema.type = types.length === 1 ? types[0] : types;\n                    }\n                }\n                else {\n                    // If values are allowed but not exclusive, add them via 'anyOf' if they differ from the main type\n\n                    const otherTypes = values.filter((v) => typeof v !== this.type || isTypeAny);\n                    if (otherTypes.length && !(isTypeAny && !isOnly)) {\n                        if (!schema.anyOf) {\n                            schema = {\n                                anyOf: [schema]\n                            };\n                        }\n\n                        schema.anyOf.push({ enum: otherTypes });\n                    }\n                }\n            }\n        }\n\n        // Handle 'null' if it's an allowed value\n\n        if (this._valids && this._valids.has(null) && !(isTypeAny && !isOnly)) {\n            if (this._valids.length === 1 && (isTypeAny || isOnly)) {\n                schema.type = 'null';\n            }\n            else if (schema.type) {\n                schema.type = [schema.type, 'null'];\n            }\n            else if (schema.anyOf) {\n                schema.anyOf.unshift(internals.nullSchema());\n            }\n            else {\n                schema = {\n                    anyOf: [\n                        internals.nullSchema(),\n                        schema\n                    ]\n                };\n            }\n        }\n\n        // Handle conditionals (whens) by generating multiple possible schemas combined with 'anyOf'\n\n        if (this.$_terms.whens) {\n\n            const base = this.clone();\n            base.$_terms.whens = null;\n\n            const matches = [];\n            for (const when of this.$_terms.whens) {\n                const tests = when.is ? [when] : when.switch;\n                for (let i = 0; i < tests.length; ++i) {\n                    const test = tests[i];\n                    if (test.then) {\n                        matches.push(base.concat(test.then).$_jsonSchema(mode, subOptions));\n                    }\n\n                    if (test.otherwise) {\n                        matches.push(base.concat(test.otherwise).$_jsonSchema(mode, subOptions));\n                    }\n\n                    if (!test.then || (i === tests.length - 1 && !test.otherwise)) {\n                        matches.push(base.$_jsonSchema(mode, subOptions));\n                    }\n                }\n            }\n\n            const results = [];\n            for (const match of matches) {\n                if (!results.some((r) => deepEqual(r, match))) {\n                    results.push(match);\n                }\n            }\n\n            return { anyOf: results };\n        }\n\n        return schema;\n    }\n\n    // Rules\n\n    allow(...values) {\n\n        Common.verifyFlat(values, 'allow');\n        return this._values(values, '_valids');\n    }\n\n    alter(targets) {\n\n        assert(targets && typeof targets === 'object' && !Array.isArray(targets), 'Invalid targets argument');\n        assert(!this._inRuleset(), 'Cannot set alterations inside a ruleset');\n\n        const obj = this.clone();\n        obj.$_terms.alterations = obj.$_terms.alterations || [];\n        for (const target in targets) {\n            const adjuster = targets[target];\n            assert(typeof adjuster === 'function', 'Alteration adjuster for', target, 'must be a function');\n            obj.$_terms.alterations.push({ target, adjuster });\n        }\n\n        obj.$_temp.ruleset = false;\n        return obj;\n    }\n\n    artifact(id) {\n\n        assert(id !== undefined, 'Artifact cannot be undefined');\n        assert(!this._cache, 'Cannot set an artifact with a rule cache');\n\n        return this.$_setFlag('artifact', id);\n    }\n\n    cast(to) {\n\n        assert(to === false || typeof to === 'string', 'Invalid to value');\n        assert(to === false || this._definition.cast[to], 'Type', this.type, 'does not support casting to', to);\n\n        return this.$_setFlag('cast', to === false ? undefined : to);\n    }\n\n    default(value, options) {\n\n        return this._default('default', value, options);\n    }\n\n    description(desc) {\n\n        assert(desc && typeof desc === 'string', 'Description must be a non-empty string');\n\n        return this.$_setFlag('description', desc);\n    }\n\n    empty(schema) {\n\n        const obj = this.clone();\n\n        if (schema !== undefined) {\n            schema = obj.$_compile(schema, { override: false });\n        }\n\n        return obj.$_setFlag('empty', schema, { clone: false });\n    }\n\n    error(err) {\n\n        assert(err, 'Missing error');\n        assert(err instanceof Error || typeof err === 'function', 'Must provide a valid Error object or a function');\n\n        return this.$_setFlag('error', err);\n    }\n\n    example(example, options = {}) {\n\n        assert(example !== undefined, 'Missing example');\n        Common.assertOptions(options, ['override']);\n\n        return this._inner('examples', example, { single: true, override: options.override });\n    }\n\n    external(method, description) {\n\n        if (typeof method === 'object') {\n            assert(!description, 'Cannot combine options with description');\n            description = method.description;\n            method = method.method;\n        }\n\n        assert(typeof method === 'function', 'Method must be a function');\n        assert(description === undefined || description && typeof description === 'string', 'Description must be a non-empty string');\n\n        return this._inner('externals', { method, description }, { single: true });\n    }\n\n    failover(value, options) {\n\n        return this._default('failover', value, options);\n    }\n\n    forbidden() {\n\n        return this.presence('forbidden');\n    }\n\n    id(id) {\n\n        if (!id) {\n            return this.$_setFlag('id', undefined);\n        }\n\n        assert(typeof id === 'string', 'id must be a non-empty string');\n        assert(/^[^\\.]+$/.test(id), 'id cannot contain period character');\n\n        return this.$_setFlag('id', id);\n    }\n\n    invalid(...values) {\n\n        return this._values(values, '_invalids');\n    }\n\n    label(name) {\n\n        assert(name && typeof name === 'string', 'Label name must be a non-empty string');\n\n        return this.$_setFlag('label', name);\n    }\n\n    meta(meta) {\n\n        assert(meta !== undefined, 'Meta cannot be undefined');\n\n        return this._inner('metas', meta, { single: true });\n    }\n\n    note(...notes) {\n\n        assert(notes.length, 'Missing notes');\n        for (const note of notes) {\n            assert(note && typeof note === 'string', 'Notes must be non-empty strings');\n        }\n\n        return this._inner('notes', notes);\n    }\n\n    only(mode = true) {\n\n        assert(typeof mode === 'boolean', 'Invalid mode:', mode);\n\n        return this.$_setFlag('only', mode);\n    }\n\n    optional() {\n\n        return this.presence('optional');\n    }\n\n    prefs(prefs) {\n\n        assert(prefs, 'Missing preferences');\n        assert(prefs.context === undefined, 'Cannot override context');\n        assert(prefs.externals === undefined, 'Cannot override externals');\n        assert(prefs.warnings === undefined, 'Cannot override warnings');\n        assert(prefs.debug === undefined, 'Cannot override debug');\n\n        Common.checkPreferences(prefs);\n\n        const obj = this.clone();\n        obj._preferences = Common.preferences(obj._preferences, prefs);\n        return obj;\n    }\n\n    presence(mode) {\n\n        assert(['optional', 'required', 'forbidden'].includes(mode), 'Unknown presence mode', mode);\n\n        return this.$_setFlag('presence', mode);\n    }\n\n    raw(enabled = true) {\n\n        return this.$_setFlag('result', enabled ? 'raw' : undefined);\n    }\n\n    result(mode) {\n\n        assert(['raw', 'strip'].includes(mode), 'Unknown result mode', mode);\n\n        return this.$_setFlag('result', mode);\n    }\n\n    required() {\n\n        return this.presence('required');\n    }\n\n    strict(enabled) {\n\n        const obj = this.clone();\n\n        const convert = enabled === undefined ? false : !enabled;\n        obj._preferences = Common.preferences(obj._preferences, { convert });\n        return obj;\n    }\n\n    strip(enabled = true) {\n\n        return this.$_setFlag('result', enabled ? 'strip' : undefined);\n    }\n\n    tag(...tags) {\n\n        assert(tags.length, 'Missing tags');\n        for (const tag of tags) {\n            assert(tag && typeof tag === 'string', 'Tags must be non-empty strings');\n        }\n\n        return this._inner('tags', tags);\n    }\n\n    unit(name) {\n\n        assert(name && typeof name === 'string', 'Unit name must be a non-empty string');\n\n        return this.$_setFlag('unit', name);\n    }\n\n    valid(...values) {\n\n        Common.verifyFlat(values, 'valid');\n\n        const obj = this.allow(...values);\n        obj.$_setFlag('only', !!obj._valids, { clone: false });\n        return obj;\n    }\n\n    when(condition, options) {\n\n        const obj = this.clone();\n\n        if (!obj.$_terms.whens) {\n            obj.$_terms.whens = [];\n        }\n\n        const when = Compile.when(obj, condition, options);\n        if (!['any', 'link'].includes(obj.type)) {\n            const conditions = when.is ? [when] : when.switch;\n            for (const item of conditions) {\n                assert(!item.then || item.then.type === 'any' || item.then.type === obj.type, 'Cannot combine', obj.type, 'with', item.then && item.then.type);\n                assert(!item.otherwise || item.otherwise.type === 'any' || item.otherwise.type === obj.type, 'Cannot combine', obj.type, 'with', item.otherwise && item.otherwise.type);\n\n            }\n        }\n\n        obj.$_terms.whens.push(when);\n        return obj.$_mutateRebuild();\n    }\n\n    // Helpers\n\n    cache(cache) {\n\n        assert(!this._inRuleset(), 'Cannot set caching inside a ruleset');\n        assert(!this._cache, 'Cannot override schema cache');\n        assert(this._flags.artifact === undefined, 'Cannot cache a rule with an artifact');\n\n        const obj = this.clone();\n        obj._cache = cache || Cache.provider.provision();\n        obj.$_temp.ruleset = false;\n        return obj;\n    }\n\n    clone() {\n\n        const obj = Object.create(Object.getPrototypeOf(this));\n        return this._assign(obj);\n    }\n\n    concat(source) {\n\n        assert(Common.isSchema(source), 'Invalid schema object');\n        assert(this.type === 'any' || source.type === 'any' || source.type === this.type, 'Cannot merge type', this.type, 'with another type:', source.type);\n        assert(!this._inRuleset(), 'Cannot concatenate onto a schema with open ruleset');\n        assert(!source._inRuleset(), 'Cannot concatenate a schema with open ruleset');\n\n        let obj = this.clone();\n\n        if (this.type === 'any' &&\n            source.type !== 'any') {\n\n            // Change obj to match source type\n\n            const tmpObj = source.clone();\n            for (const key of Object.keys(obj)) {\n                if (key !== 'type') {\n                    tmpObj[key] = obj[key];\n                }\n            }\n\n            obj = tmpObj;\n        }\n\n        obj._ids.concat(source._ids);\n        obj._refs.register(source, Ref.toSibling);\n\n        obj._preferences = obj._preferences ? Common.preferences(obj._preferences, source._preferences) : source._preferences;\n        obj._valids = Values.merge(obj._valids, source._valids, source._invalids);\n        obj._invalids = Values.merge(obj._invalids, source._invalids, source._valids);\n\n        // Remove unique rules present in source\n\n        for (const name of source._singleRules.keys()) {\n            if (obj._singleRules.has(name)) {\n                obj._rules = obj._rules.filter((target) => target.keep || target.name !== name);\n                obj._singleRules.delete(name);\n            }\n        }\n\n        // Rules\n\n        for (const test of source._rules) {\n            if (!source._definition.rules[test.method].multi) {\n                obj._singleRules.set(test.name, test);\n            }\n\n            obj._rules.push(test);\n        }\n\n        // Flags\n\n        if (obj._flags.empty &&\n            source._flags.empty) {\n\n            obj._flags.empty = obj._flags.empty.concat(source._flags.empty);\n            const flags = Object.assign({}, source._flags);\n            delete flags.empty;\n            merge(obj._flags, flags);\n        }\n        else if (source._flags.empty) {\n            obj._flags.empty = source._flags.empty;\n            const flags = Object.assign({}, source._flags);\n            delete flags.empty;\n            merge(obj._flags, flags);\n        }\n        else {\n            merge(obj._flags, source._flags);\n        }\n\n        // Terms\n\n        for (const key in source.$_terms) {\n            const terms = source.$_terms[key];\n            if (!terms) {\n                if (!obj.$_terms[key]) {\n                    obj.$_terms[key] = terms;\n                }\n\n                continue;\n            }\n\n            if (!obj.$_terms[key]) {\n                obj.$_terms[key] = terms.slice();\n                continue;\n            }\n\n            obj.$_terms[key] = obj.$_terms[key].concat(terms);\n        }\n\n        // Tracing\n\n        if (this.$_root._tracer) {\n            this.$_root._tracer._combine(obj, [this, source]);\n        }\n\n        // Rebuild\n\n        return obj.$_mutateRebuild();\n    }\n\n    extend(options) {\n\n        assert(!options.base, 'Cannot extend type with another base');\n\n        return Extend.type(this, options);\n    }\n\n    extract(path) {\n\n        path = Array.isArray(path) ? path : path.split('.');\n        return this._ids.reach(path);\n    }\n\n    fork(paths, adjuster) {\n\n        assert(!this._inRuleset(), 'Cannot fork inside a ruleset');\n\n        let obj = this;                                             // eslint-disable-line consistent-this\n        for (let path of [].concat(paths)) {\n            path = Array.isArray(path) ? path : path.split('.');\n            obj = obj._ids.fork(path, adjuster, obj);\n        }\n\n        obj.$_temp.ruleset = false;\n        return obj;\n    }\n\n    isAsync() {\n\n        if (Boolean(this.$_terms.externals?.length)) {\n            return true;\n        }\n\n        if (this.$_terms.whens) {\n            for (const when of this.$_terms.whens) {\n                if (when.then?.isAsync()) {\n                    return true;\n                }\n\n                if (when.otherwise?.isAsync()) {\n                    return true;\n                }\n\n                if (when.switch) {\n                    for (const item of when.switch) {\n                        if (item.then?.isAsync()) {\n                            return true;\n                        }\n\n                        if (item.otherwise?.isAsync()) {\n                            return true;\n                        }\n                    }\n                }\n            }\n        }\n\n        return false;\n    }\n\n    rule(options) {\n\n        const def = this._definition;\n        Common.assertOptions(options, Object.keys(def.modifiers));\n\n        assert(this.$_temp.ruleset !== false, 'Cannot apply rules to empty ruleset or the last rule added does not support rule properties');\n        const start = this.$_temp.ruleset === null ? this._rules.length - 1 : this.$_temp.ruleset;\n        assert(start >= 0 && start < this._rules.length, 'Cannot apply rules to empty ruleset');\n\n        const obj = this.clone();\n\n        for (let i = start; i < obj._rules.length; ++i) {\n            const original = obj._rules[i];\n            const rule = clone(original);\n\n            for (const name in options) {\n                def.modifiers[name](rule, options[name]);\n                assert(rule.name === original.name, 'Cannot change rule name');\n            }\n\n            obj._rules[i] = rule;\n\n            if (obj._singleRules.get(rule.name) === original) {\n                obj._singleRules.set(rule.name, rule);\n            }\n        }\n\n        obj.$_temp.ruleset = false;\n        return obj.$_mutateRebuild();\n    }\n\n    get ruleset() {\n\n        assert(!this._inRuleset(), 'Cannot start a new ruleset without closing the previous one');\n\n        const obj = this.clone();\n        obj.$_temp.ruleset = obj._rules.length;\n        return obj;\n    }\n\n    get $() {\n\n        return this.ruleset;\n    }\n\n    tailor(targets) {\n\n        targets = [].concat(targets);\n\n        assert(!this._inRuleset(), 'Cannot tailor inside a ruleset');\n\n        let obj = this;                                                     // eslint-disable-line consistent-this\n\n        if (this.$_terms.alterations) {\n            for (const { target, adjuster } of this.$_terms.alterations) {\n                if (targets.includes(target)) {\n                    obj = adjuster(obj);\n                    assert(Common.isSchema(obj), 'Alteration adjuster for', target, 'failed to return a schema object');\n                }\n            }\n        }\n\n        obj = obj.$_modify({ each: (item) => item.tailor(targets), ref: false });\n        obj.$_temp.ruleset = false;\n        return obj.$_mutateRebuild();\n    }\n\n    tracer() {\n\n        return Trace.location ? Trace.location(this) : this;                // $lab:coverage:ignore$\n    }\n\n    validate(value, options) {\n\n        return Validator.entry(value, this, options);\n    }\n\n    validateAsync(value, options) {\n\n        return Validator.entryAsync(value, this, options);\n    }\n\n    // Extensions\n\n    $_addRule(options) {\n\n        // Normalize rule\n\n        if (typeof options === 'string') {\n            options = { name: options };\n        }\n\n        assert(options && typeof options === 'object', 'Invalid options');\n        assert(options.name && typeof options.name === 'string', 'Invalid rule name');\n\n        for (const key in options) {\n            assert(key[0] !== '_', 'Cannot set private rule properties');\n        }\n\n        const rule = Object.assign({}, options);        // Shallow cloned\n        rule._resolve = [];\n        rule.method = rule.method || rule.name;\n\n        const definition = this._definition.rules[rule.method];\n        const args = rule.args;\n\n        assert(definition, 'Unknown rule', rule.method);\n\n        // Args\n\n        const obj = this.clone();\n\n        if (args) {\n            assert(Object.keys(args).length === 1 || Object.keys(args).length === this._definition.rules[rule.name].args.length, 'Invalid rule definition for', this.type, rule.name);\n\n            for (const key in args) {\n                let arg = args[key];\n\n                if (definition.argsByName) {\n                    const resolver = definition.argsByName.get(key);\n\n                    if (resolver.ref &&\n                        Common.isResolvable(arg)) {\n\n                        rule._resolve.push(key);\n                        obj.$_mutateRegister(arg);\n                    }\n                    else {\n                        if (resolver.normalize) {\n                            arg = resolver.normalize(arg);\n                            args[key] = arg;\n                        }\n\n                        if (resolver.assert) {\n                            const error = Common.validateArg(arg, key, resolver);\n                            assert(!error, error, 'or reference');\n                        }\n                    }\n                }\n\n                if (arg === undefined) {\n                    delete args[key];\n                    continue;\n                }\n\n                args[key] = arg;\n            }\n        }\n\n        // Unique rules\n\n        if (!definition.multi) {\n            obj._ruleRemove(rule.name, { clone: false });\n            obj._singleRules.set(rule.name, rule);\n        }\n\n        if (obj.$_temp.ruleset === false) {\n            obj.$_temp.ruleset = null;\n        }\n\n        if (definition.priority) {\n            obj._rules.unshift(rule);\n        }\n        else {\n            obj._rules.push(rule);\n        }\n\n        return obj;\n    }\n\n    $_compile(schema, options) {\n\n        return Compile.schema(this.$_root, schema, options);\n    }\n\n    $_createError(code, value, local, state, prefs, options = {}) {\n\n        const flags = options.flags !== false ? this._flags : {};\n        const messages = options.messages ? Messages.merge(this._definition.messages, options.messages) : this._definition.messages;\n        return new Errors.Report(code, value, local, flags, messages, state, prefs);\n    }\n\n    $_getFlag(name) {\n\n        return this._flags[name];\n    }\n\n    $_getRule(name) {\n\n        return this._singleRules.get(name);\n    }\n\n    $_mapLabels(path) {\n\n        path = Array.isArray(path) ? path : path.split('.');\n        return this._ids.labels(path);\n    }\n\n    $_match(value, state, prefs, overrides) {\n\n        prefs = Object.assign({}, prefs);       // Shallow cloned\n        prefs.abortEarly = true;\n        prefs._externals = false;\n\n        state.snapshot();\n        const result = !Validator.validate(value, this, state, prefs, overrides).errors;\n        state.restore();\n\n        return result;\n    }\n\n    $_modify(options) {\n\n        Common.assertOptions(options, ['each', 'once', 'ref', 'schema']);\n        return Modify.schema(this, options) || this;\n    }\n\n    $_mutateRebuild() {\n\n        assert(!this._inRuleset(), 'Cannot add this rule inside a ruleset');\n\n        this._refs.reset();\n        this._ids.reset();\n\n        const each = (item, { source, name, path, key }) => {\n\n            const family = this._definition[source][name] && this._definition[source][name].register;\n            if (family !== false) {\n                this.$_mutateRegister(item, { family, key });\n            }\n        };\n\n        this.$_modify({ each });\n\n        if (this._definition.rebuild) {\n            this._definition.rebuild(this);\n        }\n\n        this.$_temp.ruleset = false;\n        return this;\n    }\n\n    $_mutateRegister(schema, { family, key } = {}) {\n\n        this._refs.register(schema, family);\n        this._ids.register(schema, { key });\n    }\n\n    $_property(name) {\n\n        return this._definition.properties[name];\n    }\n\n    $_reach(path) {\n\n        return this._ids.reach(path);\n    }\n\n    $_rootReferences() {\n\n        return this._refs.roots();\n    }\n\n    $_setFlag(name, value, options = {}) {\n\n        assert(name[0] === '_' || !this._inRuleset(), 'Cannot set flag inside a ruleset');\n\n        const flag = this._definition.flags[name] || {};\n        if (deepEqual(value, flag.default)) {\n            value = undefined;\n        }\n\n        if (deepEqual(value, this._flags[name])) {\n            return this;\n        }\n\n        const obj = options.clone !== false ? this.clone() : this;\n\n        if (value !== undefined) {\n            obj._flags[name] = value;\n            obj.$_mutateRegister(value);\n        }\n        else {\n            delete obj._flags[name];\n        }\n\n        if (name[0] !== '_') {\n            obj.$_temp.ruleset = false;\n        }\n\n        return obj;\n    }\n\n    $_parent(method, ...args) {\n\n        return this[method][Common.symbols.parent].call(this, ...args);\n    }\n\n    $_validate(value, state, prefs) {\n\n        return Validator.validate(value, this, state, prefs);\n    }\n\n    // Internals\n\n    _assign(target) {\n\n        target.type = this.type;\n\n        target.$_root = this.$_root;\n\n        target.$_temp = Object.assign({}, this.$_temp);\n        target.$_temp.whens = {};\n\n        target._ids = this._ids.clone();\n        target._preferences = this._preferences;\n        target._valids = this._valids && this._valids.clone();\n        target._invalids = this._invalids && this._invalids.clone();\n        target._rules = this._rules.slice();\n        target._singleRules = clone(this._singleRules, { shallow: true });\n        target._refs = this._refs.clone();\n        target._flags = Object.assign({}, this._flags);\n        target._cache = null;\n\n        target.$_terms = {};\n        for (const key in this.$_terms) {\n            target.$_terms[key] = this.$_terms[key] ? this.$_terms[key].slice() : null;\n        }\n\n        // Backwards compatibility\n\n        target.$_super = {};\n        for (const override in this.$_super) {\n            target.$_super[override] = this._super[override].bind(target);\n        }\n\n        return target;\n    }\n\n    _bare() {\n\n        const obj = this.clone();\n        obj._reset();\n\n        const terms = obj._definition.terms;\n        for (const name in terms) {\n            const term = terms[name];\n            obj.$_terms[name] = term.init;\n        }\n\n        return obj.$_mutateRebuild();\n    }\n\n    _default(flag, value, options = {}) {\n\n        Common.assertOptions(options, 'literal');\n\n        assert(value !== undefined, 'Missing', flag, 'value');\n        assert(typeof value === 'function' || !options.literal, 'Only function value supports literal option');\n\n        if (typeof value === 'function' &&\n            options.literal) {\n\n            value = {\n                [Common.symbols.literal]: true,\n                literal: value\n            };\n        }\n\n        const obj = this.$_setFlag(flag, value);\n        return obj;\n    }\n\n    _generate(value, state, prefs) {\n\n        if (!this.$_terms.whens) {\n            return { schema: this };\n        }\n\n        // Collect matching whens\n\n        const whens = [];\n        const ids = [];\n        for (let i = 0; i < this.$_terms.whens.length; ++i) {\n            const when = this.$_terms.whens[i];\n\n            if (when.concat) {\n                whens.push(when.concat);\n                ids.push(`${i}.concat`);\n                continue;\n            }\n\n            const input = when.ref ? when.ref.resolve(value, state, prefs) : value;\n            const tests = when.is ? [when] : when.switch;\n            const before = ids.length;\n\n            for (let j = 0; j < tests.length; ++j) {\n                const { is, then, otherwise } = tests[j];\n\n                const baseId = `${i}${when.switch ? '.' + j : ''}`;\n                if (is.$_match(input, state.nest(is, `${baseId}.is`), prefs)) {\n                    if (then) {\n                        const localState = state.localize([...state.path, `${baseId}.then`], state.ancestors, state.schemas);\n                        const { schema: generated, id } = then._generate(value, localState, prefs);\n                        whens.push(generated);\n                        ids.push(`${baseId}.then${id ? `(${id})` : ''}`);\n                        break;\n                    }\n                }\n                else if (otherwise) {\n                    const localState = state.localize([...state.path, `${baseId}.otherwise`], state.ancestors, state.schemas);\n                    const { schema: generated, id } = otherwise._generate(value, localState, prefs);\n                    whens.push(generated);\n                    ids.push(`${baseId}.otherwise${id ? `(${id})` : ''}`);\n                    break;\n                }\n            }\n\n            if (when.break &&\n                ids.length > before) {          // Something matched\n\n                break;\n            }\n        }\n\n        // Check cache\n\n        const id = ids.join(', ');\n        state.mainstay.tracer.debug(state, 'rule', 'when', id);\n\n        if (!id) {\n            return { schema: this };\n        }\n\n        if (!state.mainstay.tracer.active &&\n            this.$_temp.whens[id]) {\n\n            return { schema: this.$_temp.whens[id], id };\n        }\n\n        // Generate dynamic schema\n\n        let obj = this;                                             // eslint-disable-line consistent-this\n        if (this._definition.generate) {\n            obj = this._definition.generate(this, value, state, prefs);\n        }\n\n        // Apply whens\n\n        for (const when of whens) {\n            obj = obj.concat(when);\n        }\n\n        // Tracing\n\n        if (this.$_root._tracer) {\n            this.$_root._tracer._combine(obj, [this, ...whens]);\n        }\n\n        // Cache result\n\n        this.$_temp.whens[id] = obj;\n        return { schema: obj, id };\n    }\n\n    _inner(type, values, options = {}) {\n\n        assert(!this._inRuleset(), `Cannot set ${type} inside a ruleset`);\n\n        const obj = this.clone();\n        if (!obj.$_terms[type] ||\n            options.override) {\n\n            obj.$_terms[type] = [];\n        }\n\n        if (options.single) {\n            obj.$_terms[type].push(values);\n        }\n        else {\n            obj.$_terms[type].push(...values);\n        }\n\n        obj.$_temp.ruleset = false;\n        return obj;\n    }\n\n    _inRuleset() {\n\n        return this.$_temp.ruleset !== null && this.$_temp.ruleset !== false;\n    }\n\n    _ruleRemove(name, options = {}) {\n\n        if (!this._singleRules.has(name)) {\n            return this;\n        }\n\n        const obj = options.clone !== false ? this.clone() : this;\n\n        obj._singleRules.delete(name);\n\n        const filtered = [];\n        for (let i = 0; i < obj._rules.length; ++i) {\n            const test = obj._rules[i];\n            if (test.name === name &&\n                !test.keep) {\n\n                if (obj._inRuleset() &&\n                    i < obj.$_temp.ruleset) {\n\n                    --obj.$_temp.ruleset;\n                }\n\n                continue;\n            }\n\n            filtered.push(test);\n        }\n\n        obj._rules = filtered;\n        return obj;\n    }\n\n    _values(values, key) {\n\n        Common.verifyFlat(values, key.slice(1, -1));\n\n        const obj = this.clone();\n\n        const override = values[0] === Common.symbols.override;\n        if (override) {\n            values = values.slice(1);\n        }\n\n        if (!obj[key] &&\n            values.length) {\n\n            obj[key] = new Values();\n        }\n        else if (override) {\n            obj[key] = values.length ? new Values() : null;\n            obj.$_mutateRebuild();\n        }\n\n        if (!obj[key]) {\n            return obj;\n        }\n\n        if (override) {\n            obj[key].override();\n        }\n\n        for (const value of values) {\n            assert(value !== undefined, 'Cannot call allow/valid/invalid with undefined');\n            assert(value !== Common.symbols.override, 'Override must be the first value');\n\n            const other = key === '_invalids' ? '_valids' : '_invalids';\n            if (obj[other]) {\n                obj[other].remove(value);\n                if (!obj[other].length) {\n                    assert(key === '_valids' || !obj._flags.only, 'Setting invalid value', value, 'leaves schema rejecting all values due to previous valid rule');\n                    obj[other] = null;\n                }\n            }\n\n            obj[key].add(value, obj._refs);\n        }\n\n        return obj;\n    }\n\n    // Standard Schema\n\n    get '~standard'() {\n\n        const mapToStandardError = (error) => {\n\n            let issues;\n            if (Errors.ValidationError.isError(error)) {\n                issues = error.details.map(({ message, path }) => ({\n                    message,\n                    path\n                }));\n            }\n            else {\n                issues = [{\n                    message: error.message\n                }];\n            }\n\n            return {\n                issues\n            };\n        };\n\n        const mapToStandardValue = (value) => ({ value });\n\n        return {\n            version: 1,\n            vendor: 'joi',\n            validate: (value, options) => {\n\n                const result = Validator.standard(value, this, options);\n\n                if (result instanceof Promise) {\n                    return result\n                        .then(mapToStandardValue, mapToStandardError);\n                }\n\n                if (!result.error) {\n                    return mapToStandardValue(result.value);\n                }\n\n                return mapToStandardError(result.error);\n            },\n            jsonSchema: {\n                input: (options) => this.$_jsonSchema('input', options),\n                output: (options) => this.$_jsonSchema('output', options)\n            }\n        };\n    }\n};\n\n\ninternals.Base.prototype[Common.symbols.any] = {\n    version: Common.version,\n    compile: Compile.compile,\n    root: '$_root'\n};\n\n\ninternals.Base.prototype.isImmutable = true;                // Prevents Hoek from deep cloning schema objects (must be on prototype)\n\n\n// Aliases\n\ninternals.Base.prototype.deny = internals.Base.prototype.invalid;\ninternals.Base.prototype.disallow = internals.Base.prototype.invalid;\ninternals.Base.prototype.equal = internals.Base.prototype.valid;\ninternals.Base.prototype.exist = internals.Base.prototype.required;\ninternals.Base.prototype.not = internals.Base.prototype.invalid;\ninternals.Base.prototype.options = internals.Base.prototype.prefs;\ninternals.Base.prototype.preferences = internals.Base.prototype.prefs;\n\n\nmodule.exports = new internals.Base();\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Base = require('../base');\nconst Common = require('../common');\nconst Messages = require('../messages');\n\n\nconst internals = {};\n\n\nmodule.exports = Base.extend({\n\n    type: 'any',\n\n    flags: {\n\n        only: { default: false }\n    },\n\n    terms: {\n\n        alterations: { init: null },\n        examples: { init: null },\n        externals: { init: null },\n        metas: { init: [] },\n        notes: { init: [] },\n        shared: { init: null },\n        tags: { init: [] },\n        whens: { init: null }\n    },\n\n    rules: {\n\n        custom: {\n            method(method, description) {\n\n                assert(typeof method === 'function', 'Method must be a function');\n                assert(description === undefined || description && typeof description === 'string', 'Description must be a non-empty string');\n\n                return this.$_addRule({ name: 'custom', args: { method, description } });\n            },\n            validate(value, helpers, { method }) {\n\n                try {\n                    return method(value, helpers);\n                }\n                catch (err) {\n                    return helpers.error('any.custom', { error: err });\n                }\n            },\n            args: ['method', 'description'],\n            multi: true\n        },\n\n        messages: {\n            method(messages) {\n\n                return this.prefs({ messages });\n            }\n        },\n\n        shared: {\n            method(schema) {\n\n                assert(Common.isSchema(schema) && schema._flags.id, 'Schema must be a schema with an id');\n\n                const obj = this.clone();\n                obj.$_terms.shared = obj.$_terms.shared || [];\n                obj.$_terms.shared.push(schema);\n                obj.$_mutateRegister(schema);\n                return obj;\n            }\n        },\n\n        warning: {\n            method(code, local) {\n\n                assert(code && typeof code === 'string', 'Invalid warning code');\n\n                return this.$_addRule({ name: 'warning', args: { code, local }, warn: true });\n            },\n            validate(value, helpers, { code, local }) {\n\n                return helpers.error(code, local);\n            },\n            args: ['code', 'local'],\n            multi: true\n        }\n    },\n\n    modifiers: {\n\n        keep(rule, enabled = true) {\n\n            rule.keep = enabled;\n        },\n\n        message(rule, message) {\n\n            rule.message = Messages.compile(message);\n        },\n\n        warn(rule, enabled = true) {\n\n            rule.warn = enabled;\n        }\n    },\n\n    manifest: {\n\n        build(obj, desc) {\n\n            for (const key in desc) {\n                const values = desc[key];\n\n                if (['examples', 'externals', 'metas', 'notes', 'tags'].includes(key)) {\n                    for (const value of values) {\n                        obj = obj[key.slice(0, -1)](value);\n                    }\n\n                    continue;\n                }\n\n                if (key === 'alterations') {\n                    const alter = {};\n                    for (const { target, adjuster } of values) {\n                        alter[target] = adjuster;\n                    }\n\n                    obj = obj.alter(alter);\n                    continue;\n                }\n\n                if (key === 'whens') {\n                    for (const value of values) {\n                        const { ref, is, not, then, otherwise, concat } = value;\n                        if (concat) {\n                            obj = obj.concat(concat);\n                        }\n                        else if (ref) {\n                            obj = obj.when(ref, { is, not, then, otherwise, switch: value.switch, break: value.break });\n                        }\n                        else {\n                            obj = obj.when(is, { then, otherwise, break: value.break });\n                        }\n                    }\n\n                    continue;\n                }\n\n                if (key === 'shared') {\n                    for (const value of values) {\n                        obj = obj.shared(value);\n                    }\n                }\n            }\n\n            return obj;\n        }\n    },\n\n    messages: {\n        'any.custom': '{{#label}} failed custom validation because {{#error.message}}',\n        'any.default': '{{#label}} threw an error when running default method',\n        'any.failover': '{{#label}} threw an error when running failover method',\n        'any.invalid': '{{#label}} contains an invalid value',\n        'any.only': '{{#label}} must be {if(#valids.length == 1, \"\", \"one of \")}{{#valids}}',\n        'any.ref': '{{#label}} {{#arg}} references {{:#ref}} which {{#reason}}',\n        'any.required': '{{#label}} is required',\n        'any.unknown': '{{#label}} is not allowed'\n    }\n});\n","'use strict';\n\nconst { assert, merge } = require('@hapi/hoek');\n\nconst Any = require('./any');\nconst Common = require('../common');\nconst Compile = require('../compile');\nconst Errors = require('../errors');\nconst Ref = require('../ref');\n\n\nconst internals = {};\n\n\nmodule.exports = Any.extend({\n\n    type: 'alternatives',\n\n    flags: {\n\n        match: { default: 'any' }                 // 'any', 'one', 'all'\n    },\n\n    terms: {\n\n        matches: { init: [], register: Ref.toSibling }\n    },\n\n    args(schema, ...schemas) {\n\n        if (schemas.length === 1) {\n            if (Array.isArray(schemas[0])) {\n                return schema.try(...schemas[0]);\n            }\n        }\n\n        return schema.try(...schemas);\n    },\n\n    validate(value, helpers) {\n\n        const { schema, error, state, prefs } = helpers;\n\n        // Match all or one\n\n        if (schema._flags.match) {\n            const matched = [];\n            const failed = [];\n\n            for (let i = 0; i < schema.$_terms.matches.length; ++i) {\n                const item = schema.$_terms.matches[i];\n                const localState = state.nest(item.schema, `match.${i}`);\n                localState.snapshot();\n\n                const result = item.schema.$_validate(value, localState, prefs);\n                if (!result.errors) {\n                    matched.push(result.value);\n                    localState.commit();\n                }\n                else {\n                    failed.push(result.errors);\n                    localState.restore();\n                }\n            }\n\n            if (matched.length === 0) {\n                const context = {\n                    details: failed.map((f) => Errors.details(f, { override: false }))\n                };\n\n                return { errors: error('alternatives.any', context) };\n            }\n\n            // Match one\n\n            if (schema._flags.match === 'one') {\n                return matched.length === 1 ? { value: matched[0] } : { errors: error('alternatives.one') };\n            }\n\n            // Match all\n\n            if (matched.length !== schema.$_terms.matches.length) {\n                const context = {\n                    details: failed.map((f) => Errors.details(f, { override: false }))\n                };\n\n                return { errors: error('alternatives.all', context) };\n            }\n\n            const isAnyObj = (alternative) => {\n\n                return alternative.$_terms.matches.some((v) => {\n\n                    return v.schema.type === 'object' ||\n                        (v.schema.type === 'alternatives' && isAnyObj(v.schema));\n                });\n            };\n\n            return isAnyObj(schema) ? { value: matched.reduce((acc, v) => merge(acc, v, { mergeArrays: false })) } : { value: matched[matched.length - 1] };\n        }\n\n        // Match any\n\n        const errors = [];\n        for (let i = 0; i < schema.$_terms.matches.length; ++i) {\n            const item = schema.$_terms.matches[i];\n\n            // Try\n\n            if (item.schema) {\n                const localState = state.nest(item.schema, `match.${i}`);\n                localState.snapshot();\n\n                const result = item.schema.$_validate(value, localState, prefs);\n                if (!result.errors) {\n                    localState.commit();\n                    return result;\n                }\n\n                localState.restore();\n                errors.push({ schema: item.schema, reports: result.errors });\n                continue;\n            }\n\n            // Conditional\n\n            const input = item.ref ? item.ref.resolve(value, state, prefs) : value;\n            const tests = item.is ? [item] : item.switch;\n\n            for (let j = 0; j < tests.length; ++j) {\n                const test = tests[j];\n                const { is, then, otherwise } = test;\n\n                const id = `match.${i}${item.switch ? '.' + j : ''}`;\n                if (!is.$_match(input, state.nest(is, `${id}.is`), prefs)) {\n                    if (otherwise) {\n                        return otherwise.$_validate(value, state.nest(otherwise, `${id}.otherwise`), prefs);\n                    }\n                }\n                else if (then) {\n                    return then.$_validate(value, state.nest(then, `${id}.then`), prefs);\n                }\n            }\n        }\n\n        return internals.errors(errors, helpers);\n    },\n\n    jsonSchema(schema, res, mode, options) {\n\n        const matches = [];\n\n        // Collect all alternative schemas from 'matches' term\n\n        for (const match of schema.$_terms.matches) {\n            if (match.schema) {\n                matches.push(match.schema.$_jsonSchema(mode, options));\n            }\n            else {\n                // Handle conditional matches (when/switch)\n\n                const tests = match.is ? [match] : match.switch;\n                for (const test of tests) {\n                    if (test.then) {\n                        matches.push(test.then.$_jsonSchema(mode, options));\n                    }\n\n                    if (test.otherwise) {\n                        matches.push(test.otherwise.$_jsonSchema(mode, options));\n                    }\n                }\n            }\n        }\n\n        if (matches.length) {\n            delete res.type;\n\n            // Map alternatives to 'anyOf' or 'oneOf' based on the match flag\n\n            const matchMode = schema._flags.match ?? 'any';\n            if (matchMode === 'one') {\n                res.oneOf = matches;\n            }\n            else {\n                res.anyOf = matches;\n            }\n        }\n\n        return res;\n    },\n\n    rules: {\n\n        conditional: {\n            method(condition, options) {\n\n                assert(!this._flags._endedSwitch, 'Unreachable condition');\n                assert(!this._flags.match, 'Cannot combine match mode', this._flags.match, 'with conditional rule');\n                assert(options.break === undefined, 'Cannot use break option with alternatives conditional');\n\n                const obj = this.clone();\n\n                const match = Compile.when(obj, condition, options);\n                const conditions = match.is ? [match] : match.switch;\n                for (const item of conditions) {\n                    if (item.then &&\n                        item.otherwise) {\n\n                        obj.$_setFlag('_endedSwitch', true, { clone: false });\n                        break;\n                    }\n                }\n\n                obj.$_terms.matches.push(match);\n                return obj.$_mutateRebuild();\n            }\n        },\n\n        match: {\n            method(mode) {\n\n                assert(['any', 'one', 'all'].includes(mode), 'Invalid alternatives match mode', mode);\n\n                if (mode !== 'any') {\n                    for (const match of this.$_terms.matches) {\n                        assert(match.schema, 'Cannot combine match mode', mode, 'with conditional rules');\n                    }\n                }\n\n                return this.$_setFlag('match', mode);\n            }\n        },\n\n        try: {\n            method(...schemas) {\n\n                assert(schemas.length, 'Missing alternative schemas');\n                Common.verifyFlat(schemas, 'try');\n\n                assert(!this._flags._endedSwitch, 'Unreachable condition');\n\n                const obj = this.clone();\n                for (const schema of schemas) {\n                    obj.$_terms.matches.push({ schema: obj.$_compile(schema) });\n                }\n\n                return obj.$_mutateRebuild();\n            }\n        }\n    },\n\n    overrides: {\n\n        label(name) {\n\n            const obj = this.$_parent('label', name);\n            const each = (item, source) => {\n\n                return source.path[0] !== 'is' && typeof item._flags.label !== 'string' ? item.label(name) : undefined;\n            };\n\n            return obj.$_modify({ each, ref: false });\n        },\n\n        isAsync() {\n\n            if (this.$_terms.externals?.length) {\n                return true;\n            }\n\n            for (const match of this.$_terms.matches) {\n\n                if (match.schema?.isAsync()) {\n                    return true;\n                }\n\n                if (match.then?.isAsync()) {\n                    return true;\n                }\n\n                if (match.otherwise?.isAsync()) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    },\n\n    rebuild(schema) {\n\n        // Flag when an alternative type is an array\n\n        const each = (item) => {\n\n            if (Common.isSchema(item) &&\n                item.type === 'array') {\n\n                schema.$_setFlag('_arrayItems', true, { clone: false });\n            }\n        };\n\n        schema.$_modify({ each });\n    },\n\n    manifest: {\n\n        build(obj, desc) {\n\n            if (desc.matches) {\n                for (const match of desc.matches) {\n                    const { schema, ref, is, not, then, otherwise } = match;\n                    if (schema) {\n                        obj = obj.try(schema);\n                    }\n                    else if (ref) {\n                        obj = obj.conditional(ref, { is, then, not, otherwise, switch: match.switch });\n                    }\n                    else {\n                        obj = obj.conditional(is, { then, otherwise });\n                    }\n                }\n            }\n\n            return obj;\n        }\n    },\n\n    messages: {\n        'alternatives.all': '{{#label}} does not match all of the required types',\n        'alternatives.any': '{{#label}} does not match any of the allowed types',\n        'alternatives.match': '{{#label}} does not match any of the allowed types',\n        'alternatives.one': '{{#label}} matches more than one allowed type',\n        'alternatives.types': '{{#label}} must be one of {{#types}}'\n    }\n});\n\n\n// Helpers\n\ninternals.errors = function (failures, { error, state }) {\n\n    // Nothing matched due to type criteria rules\n\n    if (!failures.length) {\n        return { errors: error('alternatives.any') };\n    }\n\n    // Single error\n\n    if (failures.length === 1) {\n        return { errors: failures[0].reports };\n    }\n\n    // Analyze reasons\n\n    const valids = new Set();\n    const complex = [];\n\n    for (const { reports, schema } of failures) {\n\n        // Multiple errors (!abortEarly)\n\n        if (reports.length > 1) {\n            return internals.unmatched(failures, error);\n        }\n\n        // Custom error\n\n        const report = reports[0];\n        if (report instanceof Errors.Report === false) {\n            return internals.unmatched(failures, error);\n        }\n\n        // Internal object or array error\n\n        if (report.state.path.length !== state.path.length) {\n            complex.push({ type: schema.type, report });\n            continue;\n        }\n\n        // Valids\n\n        if (report.code === 'any.only') {\n            for (const valid of report.local.valids) {\n                valids.add(valid);\n            }\n\n            continue;\n        }\n\n        // Base type\n\n        const [type, code] = report.code.split('.');\n        if (code !== 'base') {\n            complex.push({ type: schema.type, report });\n        }\n        else if (report.code === 'object.base') {\n            valids.add(report.local.type);\n        }\n        else {\n            valids.add(type);\n        }\n    }\n\n    // All errors are base types or valids\n\n    if (!complex.length) {\n        return { errors: error('alternatives.types', { types: [...valids] }) };\n    }\n\n    // Single complex error\n\n    if (complex.length === 1) {\n        return { errors: complex[0].report };\n    }\n\n    return internals.unmatched(failures, error);\n};\n\n\ninternals.unmatched = function (failures, error) {\n\n    const errors = [];\n    for (const failure of failures) {\n        errors.push(...failure.reports);\n    }\n\n    return { errors: error('alternatives.match', Errors.details(errors, { override: false })) };\n};\n","'use strict';\n\nconst { assert, deepEqual, reach } = require('@hapi/hoek');\n\nconst Any = require('./any');\nconst Common = require('../common');\nconst Compile = require('../compile');\n\n\nconst internals = {};\n\n\nmodule.exports = Any.extend({\n\n    type: 'array',\n\n    flags: {\n\n        single: { default: false },\n        sparse: { default: false }\n    },\n\n    terms: {\n\n        items: { init: [], manifest: 'schema' },\n        ordered: { init: [], manifest: 'schema' },\n\n        _exclusions: { init: [] },\n        _inclusions: { init: [] },\n        _requireds: { init: [] }\n    },\n\n    coerce: {\n        from: 'object',\n        method(value, { schema, state, prefs }) {\n\n            if (!Array.isArray(value)) {\n                return;\n            }\n\n            const sort = schema.$_getRule('sort');\n            if (!sort) {\n                return;\n            }\n\n            return internals.sort(schema, value, sort.args.options, state, prefs);\n        }\n    },\n\n    validate(value, { schema, error }) {\n\n        if (!Array.isArray(value)) {\n            if (schema._flags.single) {\n                const single = [value];\n                single[Common.symbols.arraySingle] = true;\n                return { value: single };\n            }\n\n            return { errors: error('array.base') };\n        }\n\n        if (!schema.$_getRule('items') &&\n            !schema.$_terms.externals) {\n\n            return;\n        }\n\n        return { value: value.slice() };        // Clone the array so that we don't modify the original\n    },\n\n    jsonSchema(schema, res, mode, options) {\n\n        const ordered = schema.$_terms.ordered;\n\n        // Handle ordered items (tuple-like) using 'prefixItems'\n\n        if (ordered.length) {\n            res.prefixItems = ordered.map((item) => item.$_jsonSchema(mode, options));\n        }\n\n        if (schema.$_terms.items.length) {\n            let items;\n            if (schema.$_terms.items.length === 1) {\n                items = schema.$_terms.items[0].$_jsonSchema(mode, options);\n            }\n            else {\n                items = {\n                    anyOf: schema.$_terms.items.map((item) => item.$_jsonSchema(mode, options))\n                };\n            }\n\n            // If there are ordered items, remaining items are 'unevaluatedItems'\n\n            if (ordered.length) {\n                res.unevaluatedItems = items;\n                res.minItems = ordered.length;\n            }\n            else {\n                res.items = items;\n            }\n        }\n        else if (ordered.length) {\n            // No additional items allowed beyond the ordered ones\n\n            res.unevaluatedItems = false;\n            res.minItems = ordered.length;\n            res.maxItems = ordered.length;\n        }\n\n        // Map 'has' rules to 'contains' in JSON Schema\n\n        const contains = [];\n        for (const rule of schema._rules) {\n            if (rule.name === 'has') {\n                contains.push(rule.args.schema.$_jsonSchema(mode, options));\n            }\n        }\n\n        if (contains.length) {\n            if (contains.length === 1) {\n                res.contains = contains[0];\n            }\n            else {\n                res.allOf = contains.map((item) => ({ contains: item }));\n            }\n        }\n\n        if (schema._flags.single &&\n            schema.$_terms.items.length) {\n\n            let items;\n            if (schema.$_terms.items.length === 1) {\n                items = schema.$_terms.items[0].$_jsonSchema(mode, options);\n            }\n            else {\n                items = {\n                    anyOf: schema.$_terms.items.map((item) => item.$_jsonSchema(mode, options))\n                };\n            }\n\n            res = {\n                anyOf: [\n                    res,\n                    items\n                ]\n            };\n        }\n\n        return res;\n    },\n\n    rules: {\n\n        has: {\n            method(schema) {\n\n                schema = this.$_compile(schema, { appendPath: true });\n                const obj = this.$_addRule({ name: 'has', args: { schema } });\n                obj.$_mutateRegister(schema);\n                return obj;\n            },\n            validate(value, { state, prefs, error }, { schema: has }) {\n\n                const ancestors = [value, ...state.ancestors];\n                for (let i = 0; i < value.length; ++i) {\n                    const localState = state.localize([...state.path, i], ancestors, has);\n                    if (has.$_match(value[i], localState, prefs)) {\n                        return value;\n                    }\n                }\n\n                const patternLabel = has._flags.label;\n                if (patternLabel) {\n                    return error('array.hasKnown', { patternLabel });\n                }\n\n                return error('array.hasUnknown', null);\n            },\n            multi: true\n        },\n\n        items: {\n            method(...schemas) {\n\n                Common.verifyFlat(schemas, 'items');\n\n                const obj = this.$_addRule('items');\n\n                for (let i = 0; i < schemas.length; ++i) {\n                    const type = Common.tryWithPath(() => this.$_compile(schemas[i]), i, { append: true });\n                    obj.$_terms.items.push(type);\n                }\n\n                return obj.$_mutateRebuild();\n            },\n            validate(value, { schema, error, state, prefs, errorsArray }) {\n\n                const requireds = schema.$_terms._requireds.slice();\n                const ordereds = schema.$_terms.ordered.slice();\n                const inclusions = [...schema.$_terms._inclusions, ...requireds];\n\n                const wasArray = !value[Common.symbols.arraySingle];\n                delete value[Common.symbols.arraySingle];\n\n                const errors = errorsArray();\n\n                let il = value.length;\n                for (let i = 0; i < il; ++i) {\n                    const item = value[i];\n\n                    let errored = false;\n                    let isValid = false;\n\n                    const key = wasArray ? i : new Number(i);       // eslint-disable-line no-new-wrappers\n                    const path = [...state.path, key];\n\n                    // Sparse\n\n                    if (!schema._flags.sparse &&\n                        item === undefined) {\n\n                        errors.push(error('array.sparse', { key, path, pos: i, value: undefined }, state.localize(path)));\n                        if (prefs.abortEarly) {\n                            return errors;\n                        }\n\n                        ordereds.shift();\n                        continue;\n                    }\n\n                    // Exclusions\n\n                    const ancestors = [value, ...state.ancestors];\n\n                    for (const exclusion of schema.$_terms._exclusions) {\n                        if (!exclusion.$_match(item, state.localize(path, ancestors, exclusion), prefs, { presence: 'ignore' })) {\n                            continue;\n                        }\n\n                        errors.push(error('array.excludes', { pos: i, value: item }, state.localize(path)));\n                        if (prefs.abortEarly) {\n                            return errors;\n                        }\n\n                        errored = true;\n                        ordereds.shift();\n                        break;\n                    }\n\n                    if (errored) {\n                        continue;\n                    }\n\n                    // Ordered\n\n                    if (schema.$_terms.ordered.length) {\n                        if (ordereds.length) {\n                            const ordered = ordereds.shift();\n                            const res = ordered.$_validate(item, state.localize(path, ancestors, ordered), prefs);\n                            if (!res.errors) {\n                                if (ordered._flags.result === 'strip') {\n                                    internals.fastSplice(value, i);\n                                    --i;\n                                    --il;\n                                }\n                                else if (!schema._flags.sparse && res.value === undefined) {\n                                    errors.push(error('array.sparse', { key, path, pos: i, value: undefined }, state.localize(path)));\n                                    if (prefs.abortEarly) {\n                                        return errors;\n                                    }\n\n                                    continue;\n                                }\n                                else {\n                                    value[i] = res.value;\n                                }\n                            }\n                            else {\n                                errors.push(...res.errors);\n                                if (prefs.abortEarly) {\n                                    return errors;\n                                }\n                            }\n\n                            continue;\n                        }\n                        else if (!schema.$_terms.items.length) {\n                            errors.push(error('array.orderedLength', { pos: i, limit: schema.$_terms.ordered.length }));\n                            if (prefs.abortEarly) {\n                                return errors;\n                            }\n\n                            break;      // No reason to continue since there are no other rules to validate other than array.orderedLength\n                        }\n                    }\n\n                    // Requireds\n\n                    const requiredChecks = [];\n                    let jl = requireds.length;\n                    for (let j = 0; j < jl; ++j) {\n                        const localState = state.localize(path, ancestors, requireds[j]);\n                        localState.snapshot();\n\n                        const res = requireds[j].$_validate(item, localState, prefs);\n                        requiredChecks[j] = res;\n\n                        if (!res.errors) {\n                            localState.commit();\n                            value[i] = res.value;\n                            isValid = true;\n                            internals.fastSplice(requireds, j);\n                            --j;\n                            --jl;\n\n                            if (!schema._flags.sparse &&\n                                res.value === undefined) {\n\n                                errors.push(error('array.sparse', { key, path, pos: i, value: undefined }, state.localize(path)));\n                                if (prefs.abortEarly) {\n                                    return errors;\n                                }\n                            }\n\n                            break;\n                        }\n\n                        localState.restore();\n                    }\n\n                    if (isValid) {\n                        continue;\n                    }\n\n                    // Inclusions\n\n                    const stripUnknown = prefs.stripUnknown && !!prefs.stripUnknown.arrays || false;\n\n                    jl = inclusions.length;\n                    for (const inclusion of inclusions) {\n\n                        // Avoid re-running requireds that already didn't match in the previous loop\n\n                        let res;\n                        const previousCheck = requireds.indexOf(inclusion);\n                        if (previousCheck !== -1) {\n                            res = requiredChecks[previousCheck];\n                        }\n                        else {\n                            const localState = state.localize(path, ancestors, inclusion);\n                            localState.snapshot();\n\n                            res = inclusion.$_validate(item, localState, prefs);\n                            if (!res.errors) {\n                                localState.commit();\n                                if (inclusion._flags.result === 'strip') {\n                                    internals.fastSplice(value, i);\n                                    --i;\n                                    --il;\n                                }\n                                else if (!schema._flags.sparse &&\n                                    res.value === undefined) {\n\n                                    errors.push(error('array.sparse', { key, path, pos: i, value: undefined }, state.localize(path)));\n                                    errored = true;\n                                }\n                                else {\n                                    value[i] = res.value;\n                                }\n\n                                isValid = true;\n                                break;\n                            }\n\n                            localState.restore();\n                        }\n\n                        // Return the actual error if only one inclusion defined\n\n                        if (jl === 1) {\n                            if (stripUnknown) {\n                                internals.fastSplice(value, i);\n                                --i;\n                                --il;\n                                isValid = true;\n                                break;\n                            }\n\n                            errors.push(...res.errors);\n                            if (prefs.abortEarly) {\n                                return errors;\n                            }\n\n                            errored = true;\n                            break;\n                        }\n                    }\n\n                    if (errored) {\n                        continue;\n                    }\n\n                    if ((schema.$_terms._inclusions.length || schema.$_terms._requireds.length) &&\n                        !isValid) {\n\n                        if (stripUnknown) {\n                            internals.fastSplice(value, i);\n                            --i;\n                            --il;\n                            continue;\n                        }\n\n                        errors.push(error('array.includes', { pos: i, value: item }, state.localize(path)));\n                        if (prefs.abortEarly) {\n                            return errors;\n                        }\n                    }\n                }\n\n                if (requireds.length) {\n                    internals.fillMissedErrors(schema, errors, requireds, value, state, prefs);\n                }\n\n                if (ordereds.length) {\n                    internals.fillOrderedErrors(schema, errors, ordereds, value, state, prefs);\n\n                    if (!errors.length) {\n                        internals.fillDefault(ordereds, value, state, prefs);\n                    }\n                }\n\n                return errors.length ? errors : value;\n            },\n\n            priority: true,\n            manifest: false\n        },\n\n        length: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'length', args: { limit }, operator: '=' });\n            },\n            validate(value, helpers, { limit }, { name, operator, args }) {\n\n                if (Common.compare(value.length, limit, operator)) {\n                    return value;\n                }\n\n                return helpers.error('array.' + name, { limit: args.limit, value });\n            },\n            jsonSchema(rule, res) {\n\n                res.minItems = rule.args.limit;\n                res.maxItems = rule.args.limit;\n\n                return res;\n            },\n            args: [\n                {\n                    name: 'limit',\n                    ref: true,\n                    assert: Common.limit,\n                    message: 'must be a positive integer'\n                }\n            ]\n        },\n\n        max: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'max', method: 'length', args: { limit }, operator: '<=' });\n            },\n            jsonSchema(rule, res) {\n\n                res.maxItems = rule.args.limit;\n\n                return res;\n            }\n        },\n\n        min: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'min', method: 'length', args: { limit }, operator: '>=' });\n            },\n            jsonSchema(rule, res) {\n\n                res.minItems = rule.args.limit;\n\n                return res;\n            }\n        },\n\n        ordered: {\n            method(...schemas) {\n\n                Common.verifyFlat(schemas, 'ordered');\n\n                const obj = this.$_addRule('items');\n\n                for (let i = 0; i < schemas.length; ++i) {\n                    const type = Common.tryWithPath(() => this.$_compile(schemas[i]), i, { append: true });\n                    internals.validateSingle(type, obj);\n\n                    obj.$_mutateRegister(type);\n                    obj.$_terms.ordered.push(type);\n                }\n\n                return obj.$_mutateRebuild();\n            }\n        },\n\n        single: {\n            method(enabled) {\n\n                const value = enabled === undefined ? true : !!enabled;\n                assert(!value || !this._flags._arrayItems, 'Cannot specify single rule when array has array items');\n\n                return this.$_setFlag('single', value);\n            }\n        },\n\n        sort: {\n            method(options = {}) {\n\n                Common.assertOptions(options, ['by', 'order']);\n\n                const settings = {\n                    order: options.order || 'ascending'\n                };\n\n                if (options.by) {\n                    settings.by = Compile.ref(options.by, { ancestor: 0 });\n                    assert(!settings.by.ancestor, 'Cannot sort by ancestor');\n                }\n\n                return this.$_addRule({ name: 'sort', args: { options: settings } });\n            },\n            validate(value, { error, state, prefs, schema }, { options }) {\n\n                const { value: sorted, errors } = internals.sort(schema, value, options, state, prefs);\n                if (errors) {\n                    return errors;\n                }\n\n                for (let i = 0; i < value.length; ++i) {\n                    if (value[i] !== sorted[i]) {\n                        return error('array.sort', { order: options.order, by: options.by ? options.by.key : 'value' });\n                    }\n                }\n\n                return value;\n            },\n            convert: true\n        },\n\n        sparse: {\n            method(enabled) {\n\n                const value = enabled === undefined ? true : !!enabled;\n\n                if (this._flags.sparse === value) {\n                    return this;\n                }\n\n                const obj = value ? this.clone() : this.$_addRule('items');\n                return obj.$_setFlag('sparse', value, { clone: false });\n            }\n        },\n\n        unique: {\n            method(comparator, options = {}) {\n\n                assert(!comparator || typeof comparator === 'function' || typeof comparator === 'string', 'comparator must be a function or a string');\n                Common.assertOptions(options, ['ignoreUndefined', 'separator']);\n\n                const rule = { name: 'unique', args: { options, comparator } };\n\n                if (comparator) {\n                    if (typeof comparator === 'string') {\n                        const separator = Common.default(options.separator, '.');\n                        rule.path = separator ? comparator.split(separator) : [comparator];\n                    }\n                    else {\n                        rule.comparator = comparator;\n                    }\n                }\n\n                return this.$_addRule(rule);\n            },\n            validate(value, { state, error, schema }, { comparator: raw, options }, { comparator, path }) {\n\n                const found = {\n                    string: Object.create(null),\n                    number: Object.create(null),\n                    undefined: Object.create(null),\n                    boolean: Object.create(null),\n                    bigint: Object.create(null),\n                    object: new Map(),\n                    function: new Map(),\n                    custom: new Map()\n                };\n\n                const compare = comparator || deepEqual;\n                const ignoreUndefined = options.ignoreUndefined;\n\n                for (let i = 0; i < value.length; ++i) {\n                    const item = path ? reach(value[i], path) : value[i];\n                    const records = comparator ? found.custom : found[typeof item];\n                    assert(records, 'Failed to find unique map container for type', typeof item);\n\n                    if (records instanceof Map) {\n                        const entries = records.entries();\n                        let current;\n                        while (!(current = entries.next()).done) {\n                            if (compare(current.value[0], item)) {\n                                const localState = state.localize([...state.path, i], [value, ...state.ancestors]);\n                                const context = {\n                                    pos: i,\n                                    value: value[i],\n                                    dupePos: current.value[1],\n                                    dupeValue: value[current.value[1]]\n                                };\n\n                                if (path) {\n                                    context.path = raw;\n                                }\n\n                                return error('array.unique', context, localState);\n                            }\n                        }\n\n                        records.set(item, i);\n                    }\n                    else {\n                        if ((!ignoreUndefined || item !== undefined) &&\n                            records[item] !== undefined) {\n\n                            const context = {\n                                pos: i,\n                                value: value[i],\n                                dupePos: records[item],\n                                dupeValue: value[records[item]]\n                            };\n\n                            if (path) {\n                                context.path = raw;\n                            }\n\n                            const localState = state.localize([...state.path, i], [value, ...state.ancestors]);\n                            return error('array.unique', context, localState);\n                        }\n\n                        records[item] = i;\n                    }\n                }\n\n                return value;\n            },\n            jsonSchema(rule, res) {\n\n                res.uniqueItems = true;\n\n                return res;\n            },\n            args: ['comparator', 'options'],\n            multi: true\n        }\n    },\n\n    overrides: {\n\n        isAsync() {\n\n            if (this.$_terms.externals?.length) {\n                return true;\n            }\n\n            for (const item of this.$_terms.items) {\n                if (item.isAsync()) {\n                    return true;\n                }\n            }\n\n            for (const item of this.$_terms.ordered) {\n                if (item.isAsync()) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    },\n\n    cast: {\n        set: {\n            from: Array.isArray,\n            to(value, helpers) {\n\n                return new Set(value);\n            }\n        }\n    },\n\n    rebuild(schema) {\n\n        schema.$_terms._inclusions = [];\n        schema.$_terms._exclusions = [];\n        schema.$_terms._requireds = [];\n\n        for (const type of schema.$_terms.items) {\n            internals.validateSingle(type, schema);\n\n            if (type._flags.presence === 'required') {\n                schema.$_terms._requireds.push(type);\n            }\n            else if (type._flags.presence === 'forbidden') {\n                schema.$_terms._exclusions.push(type);\n            }\n            else {\n                schema.$_terms._inclusions.push(type);\n            }\n        }\n\n        for (const type of schema.$_terms.ordered) {\n            internals.validateSingle(type, schema);\n        }\n    },\n\n    manifest: {\n\n        build(obj, desc) {\n\n            if (desc.items) {\n                obj = obj.items(...desc.items);\n            }\n\n            if (desc.ordered) {\n                obj = obj.ordered(...desc.ordered);\n            }\n\n            return obj;\n        }\n    },\n\n    messages: {\n        'array.base': '{{#label}} must be an array',\n        'array.excludes': '{{#label}} contains an excluded value',\n        'array.hasKnown': '{{#label}} does not contain at least one required match for type {:#patternLabel}',\n        'array.hasUnknown': '{{#label}} does not contain at least one required match',\n        'array.includes': '{{#label}} does not match any of the allowed types',\n        'array.includesRequiredBoth': '{{#label}} does not contain {{#knownMisses}} and {{#unknownMisses}} other required value(s)',\n        'array.includesRequiredKnowns': '{{#label}} does not contain {{#knownMisses}}',\n        'array.includesRequiredUnknowns': '{{#label}} does not contain {{#unknownMisses}} required value(s)',\n        'array.length': '{{#label}} must contain {{#limit}} items',\n        'array.max': '{{#label}} must contain less than or equal to {{#limit}} items',\n        'array.min': '{{#label}} must contain at least {{#limit}} items',\n        'array.orderedLength': '{{#label}} must contain at most {{#limit}} items',\n        'array.sort': '{{#label}} must be sorted in {#order} order by {{#by}}',\n        'array.sort.mismatching': '{{#label}} cannot be sorted due to mismatching types',\n        'array.sort.unsupported': '{{#label}} cannot be sorted due to unsupported type {#type}',\n        'array.sparse': '{{#label}} must not be a sparse array item',\n        'array.unique': '{{#label}} contains a duplicate value'\n    }\n});\n\n\n// Helpers\n\ninternals.fillMissedErrors = function (schema, errors, requireds, value, state, prefs) {\n\n    const knownMisses = [];\n    let unknownMisses = 0;\n    for (const required of requireds) {\n        const label = required._flags.label;\n        if (label) {\n            knownMisses.push(label);\n        }\n        else {\n            ++unknownMisses;\n        }\n    }\n\n    if (knownMisses.length) {\n        if (unknownMisses) {\n            errors.push(schema.$_createError('array.includesRequiredBoth', value, { knownMisses, unknownMisses }, state, prefs));\n        }\n        else {\n            errors.push(schema.$_createError('array.includesRequiredKnowns', value, { knownMisses }, state, prefs));\n        }\n    }\n    else {\n        errors.push(schema.$_createError('array.includesRequiredUnknowns', value, { unknownMisses }, state, prefs));\n    }\n};\n\n\ninternals.fillOrderedErrors = function (schema, errors, ordereds, value, state, prefs) {\n\n    const requiredOrdereds = [];\n\n    for (const ordered of ordereds) {\n        if (ordered._flags.presence === 'required') {\n            requiredOrdereds.push(ordered);\n        }\n    }\n\n    if (requiredOrdereds.length) {\n        internals.fillMissedErrors(schema, errors, requiredOrdereds, value, state, prefs);\n    }\n};\n\n\ninternals.fillDefault = function (ordereds, value, state, prefs) {\n\n    const overrides = [];\n    let trailingUndefined = true;\n\n    for (let i = ordereds.length - 1; i >= 0; --i) {\n        const ordered = ordereds[i];\n        const ancestors = [value, ...state.ancestors];\n        const override = ordered.$_validate(undefined, state.localize(state.path, ancestors, ordered), prefs).value;\n\n        if (trailingUndefined) {\n            if (override === undefined) {\n                continue;\n            }\n\n            trailingUndefined = false;\n        }\n\n        overrides.unshift(override);\n    }\n\n    if (overrides.length) {\n        value.push(...overrides);\n    }\n};\n\n\ninternals.fastSplice = function (arr, i) {\n\n    let pos = i;\n    while (pos < arr.length) {\n        arr[pos++] = arr[pos];\n    }\n\n    --arr.length;\n};\n\n\ninternals.validateSingle = function (type, obj) {\n\n    if (type.type === 'array' ||\n        type._flags._arrayItems) {\n\n        assert(!obj._flags.single, 'Cannot specify array item with single rule enabled');\n        obj.$_setFlag('_arrayItems', true, { clone: false });\n    }\n};\n\n\ninternals.sort = function (schema, value, settings, state, prefs) {\n\n    const order = settings.order === 'ascending' ? 1 : -1;\n    const aFirst = -1 * order;\n    const bFirst = order;\n\n    const sort = (a, b) => {\n\n        let compare = internals.compare(a, b, aFirst, bFirst);\n        if (compare !== null) {\n            return compare;\n        }\n\n        if (settings.by) {\n            a = settings.by.resolve(a, state, prefs);\n            b = settings.by.resolve(b, state, prefs);\n        }\n\n        compare = internals.compare(a, b, aFirst, bFirst);\n        if (compare !== null) {\n            return compare;\n        }\n\n        const type = typeof a;\n        if (type !== typeof b) {\n            throw schema.$_createError('array.sort.mismatching', value, null, state, prefs);\n        }\n\n        if (type !== 'number' &&\n            type !== 'string') {\n\n            throw schema.$_createError('array.sort.unsupported', value, { type }, state, prefs);\n        }\n\n        if (type === 'number') {\n            return (a - b) * order;\n        }\n\n        return a < b ? aFirst : bFirst;\n    };\n\n    try {\n        return { value: value.slice().sort(sort) };\n    }\n    catch (err) {\n        return { errors: err };\n    }\n};\n\n\ninternals.compare = function (a, b, aFirst, bFirst) {\n\n    if (a === b) {\n        return 0;\n    }\n\n    if (a === undefined) {\n        return 1;           // Always last regardless of sort order\n    }\n\n    if (b === undefined) {\n        return -1;           // Always last regardless of sort order\n    }\n\n    if (a === null) {\n        return bFirst;\n    }\n\n    if (b === null) {\n        return aFirst;\n    }\n\n    return null;\n};\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Any = require('./any');\nconst Common = require('../common');\nconst Values = require('../values');\n\n\nconst internals = {};\n\n\ninternals.isBool = function (value) {\n\n    return typeof value === 'boolean';\n};\n\n\nmodule.exports = Any.extend({\n\n    type: 'boolean',\n\n    flags: {\n\n        sensitive: { default: false }\n    },\n\n    terms: {\n\n        falsy: {\n            init: null,\n            manifest: 'values'\n        },\n\n        truthy: {\n            init: null,\n            manifest: 'values'\n        }\n    },\n\n    coerce(value, { schema }) {\n\n        if (typeof value === 'boolean') {\n            return;\n        }\n\n        if (typeof value === 'string') {\n            const trimmedValue = value.trim();\n            const normalized = schema._flags.sensitive ? trimmedValue : trimmedValue.toLowerCase();\n            value = normalized === 'true' ? true : (normalized === 'false' ? false : value);\n        }\n\n        if (typeof value !== 'boolean') {\n            value = schema.$_terms.truthy && schema.$_terms.truthy.has(value, null, null, !schema._flags.sensitive) ||\n                (schema.$_terms.falsy && schema.$_terms.falsy.has(value, null, null, !schema._flags.sensitive) ? false : value);\n        }\n\n        return { value };\n    },\n\n    validate(value, { error }) {\n\n        if (typeof value !== 'boolean') {\n            return { value, errors: error('boolean.base') };\n        }\n    },\n\n    rules: {\n        truthy: {\n            method(...values) {\n\n                Common.verifyFlat(values, 'truthy');\n\n                const obj = this.clone();\n                obj.$_terms.truthy = obj.$_terms.truthy || new Values();\n\n                for (let i = 0; i < values.length; ++i) {\n                    const value = values[i];\n\n                    assert(value !== undefined, 'Cannot call truthy with undefined');\n                    obj.$_terms.truthy.add(value);\n                }\n\n                return obj;\n            }\n        },\n\n        falsy: {\n            method(...values) {\n\n                Common.verifyFlat(values, 'falsy');\n\n                const obj = this.clone();\n                obj.$_terms.falsy = obj.$_terms.falsy || new Values();\n\n                for (let i = 0; i < values.length; ++i) {\n                    const value = values[i];\n\n                    assert(value !== undefined, 'Cannot call falsy with undefined');\n                    obj.$_terms.falsy.add(value);\n                }\n\n                return obj;\n            }\n        },\n\n        sensitive: {\n            method(enabled = true) {\n\n                return this.$_setFlag('sensitive', enabled);\n            }\n        }\n    },\n\n    cast: {\n        number: {\n            from: internals.isBool,\n            to(value, helpers) {\n\n                return value ? 1 : 0;\n            }\n        },\n        string: {\n            from: internals.isBool,\n            to(value, helpers) {\n\n                return value ? 'true' : 'false';\n            }\n        }\n    },\n\n    manifest: {\n\n        build(obj, desc) {\n\n            if (desc.truthy) {\n                obj = obj.truthy(...desc.truthy);\n            }\n\n            if (desc.falsy) {\n                obj = obj.falsy(...desc.falsy);\n            }\n\n            return obj;\n        }\n    },\n\n    messages: {\n        'boolean.base': '{{#label}} must be a boolean'\n    }\n});\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Any = require('./any');\nconst Common = require('../common');\nconst Template = require('../template');\n\n\nconst internals = {\n    formats: ['iso', 'javascript', 'unix']\n};\n\n\ninternals.isDate = function (value) {\n\n    return value instanceof Date;\n};\n\n\nmodule.exports = Any.extend({\n\n    type: 'date',\n\n    coerce: {\n        from: ['number', 'string'],\n        method(value, { schema }) {\n\n            return { value: internals.parse(value, schema._flags.format) || value };\n        }\n    },\n\n    validate(value, { schema, error, prefs }) {\n\n        if (value instanceof Date &&\n            !isNaN(value.getTime())) {\n\n            return;\n        }\n\n        const format = schema._flags.format;\n\n        if (!prefs.convert ||\n            !format ||\n            typeof value !== 'string') {\n\n            return { value, errors: error('date.base') };\n        }\n\n        return { value, errors: error('date.format', { format }) };\n    },\n\n    jsonSchema(schema, res, mode, options) {\n\n        res.type = 'string';\n        res.format = 'date-time';\n\n        return res;\n    },\n\n    rules: {\n\n        compare: {\n            method: false,\n            validate(value, helpers, { date }, { name, operator, args }) {\n\n                const to = date === 'now' ? Date.now() : date.getTime();\n                if (Common.compare(value.getTime(), to, operator)) {\n                    return value;\n                }\n\n                return helpers.error('date.' + name, { limit: args.date, value });\n            },\n            args: [\n                {\n                    name: 'date',\n                    ref: true,\n                    normalize: (date) => {\n\n                        return date === 'now' ? date : internals.parse(date);\n                    },\n                    assert: (date) => date !== null,\n                    message: 'must have a valid date format'\n                }\n            ]\n        },\n\n        format: {\n            method(format) {\n\n                assert(internals.formats.includes(format), 'Unknown date format', format);\n\n                return this.$_setFlag('format', format);\n            }\n        },\n\n        greater: {\n            method(date) {\n\n                return this.$_addRule({ name: 'greater', method: 'compare', args: { date }, operator: '>' });\n            },\n            jsonSchema(rule, res) {\n\n                const date = rule.args.date;\n                if (date instanceof Date) {\n                    res['x-constraint'] = { ...res['x-constraint'], greater: date.toISOString() };\n                }\n\n                return res;\n            }\n        },\n\n        iso: {\n            method() {\n\n                return this.format('iso');\n            }\n        },\n\n        less: {\n            method(date) {\n\n                return this.$_addRule({ name: 'less', method: 'compare', args: { date }, operator: '<' });\n            },\n            jsonSchema(rule, res) {\n\n                const date = rule.args.date;\n                if (date instanceof Date) {\n                    res['x-constraint'] = { ...res['x-constraint'], less: date.toISOString() };\n                }\n\n                return res;\n            }\n        },\n\n        max: {\n            method(date) {\n\n                return this.$_addRule({ name: 'max', method: 'compare', args: { date }, operator: '<=' });\n            },\n            jsonSchema(rule, res) {\n\n                const date = rule.args.date;\n                if (date instanceof Date) {\n                    res['x-constraint'] = { ...res['x-constraint'], max: date.toISOString() };\n                }\n\n                return res;\n            }\n        },\n\n        min: {\n            method(date) {\n\n                return this.$_addRule({ name: 'min', method: 'compare', args: { date }, operator: '>=' });\n            },\n            jsonSchema(rule, res) {\n\n                const date = rule.args.date;\n                if (date instanceof Date) {\n                    res['x-constraint'] = { ...res['x-constraint'], min: date.toISOString() };\n                }\n\n                return res;\n            }\n        },\n\n        timestamp: {\n            method(type = 'javascript') {\n\n                assert(['javascript', 'unix'].includes(type), '\"type\" must be one of \"javascript, unix\"');\n\n                return this.format(type);\n            }\n        }\n    },\n\n    cast: {\n        number: {\n            from: internals.isDate,\n            to(value, helpers) {\n\n                return value.getTime();\n            }\n        },\n        string: {\n            from: internals.isDate,\n            to(value, { prefs }) {\n\n                return Template.date(value, prefs);\n            }\n        }\n    },\n\n    messages: {\n        'date.base': '{{#label}} must be a valid date',\n        'date.format': '{{#label}} must be in {msg(\"date.format.\" + #format) || #format} format',\n        'date.greater': '{{#label}} must be greater than {{:#limit}}',\n        'date.less': '{{#label}} must be less than {{:#limit}}',\n        'date.max': '{{#label}} must be less than or equal to {{:#limit}}',\n        'date.min': '{{#label}} must be greater than or equal to {{:#limit}}',\n\n        // Messages used in date.format\n\n        'date.format.iso': 'ISO 8601 date',\n        'date.format.javascript': 'timestamp or number of milliseconds',\n        'date.format.unix': 'timestamp or number of seconds'\n    }\n});\n\n\n// Helpers\n\ninternals.parse = function (value, format) {\n\n    if (value instanceof Date) {\n        return value;\n    }\n\n    if (typeof value !== 'string' &&\n        (isNaN(value) || !isFinite(value))) {\n\n        return null;\n    }\n\n    if (/^\\s*$/.test(value)) {\n        return null;\n    }\n\n    // ISO\n\n    if (format === 'iso') {\n        if (!Common.isIsoDate(value)) {\n            return null;\n        }\n\n        return internals.date(value.toString());\n    }\n\n    // Normalize number string\n\n    const original = value;\n    if (typeof value === 'string' &&\n        /^[+-]?\\d+(\\.\\d+)?$/.test(value)) {\n\n        value = parseFloat(value);\n    }\n\n    // Timestamp\n\n    if (format) {\n        if (format === 'javascript') {\n            return internals.date(1 * value);        // Casting to number\n        }\n\n        if (format === 'unix') {\n            return internals.date(1000 * value);\n        }\n\n        if (typeof original === 'string') {\n            return null;\n        }\n    }\n\n    // Plain\n\n    return internals.date(value);\n};\n\n\ninternals.date = function (value) {\n\n    const date = new Date(value);\n    if (!isNaN(date.getTime())) {\n        return date;\n    }\n\n    return null;\n};\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\n\nconst internals = {};\n\n\nexports.Sorter = class {\n\n    constructor() {\n\n        this._items = [];\n        this.nodes = [];\n    }\n\n    add(nodes, options) {\n\n        options = options ?? {};\n\n        // Validate rules\n\n        const before = [].concat(options.before ?? []);\n        const after = [].concat(options.after ?? []);\n        const group = options.group ?? '?';\n        const sort = options.sort ?? 0;                   // Used for merging only\n\n        assert(!before.includes(group), `Item cannot come before itself: ${group}`);\n        assert(!before.includes('?'), 'Item cannot come before unassociated items');\n        assert(!after.includes(group), `Item cannot come after itself: ${group}`);\n        assert(!after.includes('?'), 'Item cannot come after unassociated items');\n\n        if (!Array.isArray(nodes)) {\n            nodes = [nodes];\n        }\n\n        for (const node of nodes) {\n            const item = {\n                seq: this._items.length,\n                sort,\n                before,\n                after,\n                group,\n                node\n            };\n\n            this._items.push(item);\n        }\n\n        // Insert event\n\n        if (!options.manual) {\n            const valid = this._sort();\n            assert(valid, 'item', group !== '?' ? `added into group ${group}` : '', 'created a dependencies error');\n        }\n\n        return this.nodes;\n    }\n\n    merge(others) {\n\n        if (!Array.isArray(others)) {\n            others = [others];\n        }\n\n        for (const other of others) {\n            if (other) {\n                for (const item of other._items) {\n                    this._items.push(Object.assign({}, item));      // Shallow cloned\n                }\n            }\n        }\n\n        // Sort items\n\n        this._items.sort(internals.mergeSort);\n        for (let i = 0; i < this._items.length; ++i) {\n            this._items[i].seq = i;\n        }\n\n        const valid = this._sort();\n        assert(valid, 'merge created a dependencies error');\n\n        return this.nodes;\n    }\n\n    sort() {\n\n        const valid = this._sort();\n        assert(valid, 'sort created a dependencies error');\n\n        return this.nodes;\n    }\n\n    _sort() {\n\n        // Construct graph\n\n        const graph = {};\n        const graphAfters = Object.create(null);            // A prototype can bungle lookups w/ false positives\n        const groups = Object.create(null);\n\n        for (const item of this._items) {\n            const seq = item.seq;                           // Unique across all items\n            const group = item.group;\n\n            // Determine Groups\n\n            groups[group] = groups[group] ?? [];\n            groups[group].push(seq);\n\n            // Build intermediary graph using 'before'\n\n            graph[seq] = item.before;\n\n            // Build second intermediary graph with 'after'\n\n            for (const after of item.after) {\n                graphAfters[after] = graphAfters[after] ?? [];\n                graphAfters[after].push(seq);\n            }\n        }\n\n        // Expand intermediary graph\n\n        for (const node in graph) {\n            const expandedGroups = [];\n\n            for (const graphNodeItem in graph[node]) {\n                const group = graph[node][graphNodeItem];\n                groups[group] = groups[group] ?? [];\n                expandedGroups.push(...groups[group]);\n            }\n\n            graph[node] = expandedGroups;\n        }\n\n        // Merge intermediary graph using graphAfters into final graph\n\n        for (const group in graphAfters) {\n            if (groups[group]) {\n                for (const node of groups[group]) {\n                    graph[node].push(...graphAfters[group]);\n                }\n            }\n        }\n\n        // Compile ancestors\n\n        const ancestors = {};\n        for (const node in graph) {\n            const children = graph[node];\n            for (const child of children) {\n                ancestors[child] = ancestors[child] ?? [];\n                ancestors[child].push(node);\n            }\n        }\n\n        // Topo sort\n\n        const visited = {};\n        const sorted = [];\n\n        for (let i = 0; i < this._items.length; ++i) {          // Looping through item.seq values out of order\n            let next = i;\n\n            if (ancestors[i]) {\n                next = null;\n                for (let j = 0; j < this._items.length; ++j) {  // As above, these are item.seq values\n                    if (visited[j] === true) {\n                        continue;\n                    }\n\n                    if (!ancestors[j]) {\n                        ancestors[j] = [];\n                    }\n\n                    const shouldSeeCount = ancestors[j].length;\n                    let seenCount = 0;\n                    for (let k = 0; k < shouldSeeCount; ++k) {\n                        if (visited[ancestors[j][k]]) {\n                            ++seenCount;\n                        }\n                    }\n\n                    if (seenCount === shouldSeeCount) {\n                        next = j;\n                        break;\n                    }\n                }\n            }\n\n            if (next !== null) {\n                visited[next] = true;\n                sorted.push(next);\n            }\n        }\n\n        if (sorted.length !== this._items.length) {\n            return false;\n        }\n\n        const seqIndex = {};\n        for (const item of this._items) {\n            seqIndex[item.seq] = item;\n        }\n\n        this._items = [];\n        this.nodes = [];\n\n        for (const value of sorted) {\n            const sortedItem = seqIndex[value];\n            this.nodes.push(sortedItem.node);\n            this._items.push(sortedItem);\n        }\n\n        return true;\n    }\n};\n\n\ninternals.mergeSort = (a, b) => {\n\n    return a.sort === b.sort ? 0 : (a.sort < b.sort ? -1 : 1);\n};\n","'use strict';\n\nconst { applyToDefaults, assert, clone: Clone } = require('@hapi/hoek');\nconst Topo = require('@hapi/topo');\n\nconst Any = require('./any');\nconst Common = require('../common');\nconst Compile = require('../compile');\nconst Errors = require('../errors');\nconst Ref = require('../ref');\nconst Template = require('../template');\n\n\nconst internals = {\n    renameDefaults: {\n        alias: false,                   // Keep old value in place\n        multiple: false,                // Allow renaming multiple keys into the same target\n        override: false                 // Overrides an existing key\n    }\n};\n\n\nmodule.exports = Any.extend({\n\n    type: '_keys',\n\n    properties: {\n\n        typeof: 'object'\n    },\n\n    flags: {\n\n        unknown: { default: undefined }\n    },\n\n    terms: {\n\n        dependencies: { init: null },\n        keys: { init: null, manifest: { mapped: { from: 'schema', to: 'key' } } },\n        patterns: { init: null },\n        renames: { init: null }\n    },\n\n    args(schema, keys) {\n\n        return schema.keys(keys);\n    },\n\n    jsonSchema(schema, res, mode, options) {\n\n        res.type = 'object';\n\n        // Map Joi keys to JSON Schema 'properties' and 'required'\n\n        if (schema.$_terms.keys) {\n            res.properties = {};\n\n            const required = [];\n\n            for (const child of schema.$_terms.keys) {\n                const jsonSchema = child.schema.$_jsonSchema(mode, options);\n                res.properties[child.key] = jsonSchema;\n                if (child.schema._flags.presence === 'required' ||\n                    (mode === 'output' && child.schema._flags.default !== undefined)) {\n\n                    required.push(child.key);\n                }\n            }\n\n            if (required.length) {\n                res.required = required.sort();\n            }\n        }\n\n        // Map Joi patterns to JSON Schema 'patternProperties' or 'additionalProperties'\n\n        if (schema.$_terms.patterns) {\n            const patternProperties = {};\n\n            for (const pattern of schema.$_terms.patterns) {\n                if (pattern.regex) {\n                    patternProperties[pattern.regex.source] = pattern.rule.$_jsonSchema(mode, options);\n                }\n                else {\n                    const isAny = pattern.schema.type === 'any';\n                    if (isAny) {\n                        res.additionalProperties = pattern.rule.$_jsonSchema(mode, options);\n                    }\n                    else {\n                        // Best effort for schema-based patterns that are not 'any'\n                        patternProperties['.*'] = pattern.rule.$_jsonSchema(mode, options);\n                    }\n                }\n            }\n\n            if (Object.keys(patternProperties).length) {\n                res.patternProperties = patternProperties;\n            }\n        }\n\n        // Handle 'additionalProperties' based on unknown keys flag\n\n        if (res.additionalProperties === undefined) {\n            const additionalProperties = schema._flags.unknown === true || (schema._flags.unknown === undefined && !schema.$_terms.keys && !schema.$_terms.patterns && !schema._flags.only);\n            if (additionalProperties === false) {\n                res.additionalProperties = false;\n            }\n        }\n\n        return res;\n    },\n\n    validate(value, { schema, error, state, prefs }) {\n\n        if (!value ||\n            typeof value !== schema.$_property('typeof') ||\n            Array.isArray(value)) {\n\n            return { value, errors: error('object.base', { type: schema.$_property('typeof') }) };\n        }\n\n        // Skip if there are no other rules to test\n\n        if (!schema.$_terms.renames &&\n            !schema.$_terms.dependencies &&\n            !schema.$_terms.keys &&                       // null allows any keys\n            !schema.$_terms.patterns &&\n            !schema.$_terms.externals) {\n\n            return;\n        }\n\n        // Shallow clone value\n\n        value = internals.clone(value, prefs);\n        const errors = [];\n\n        // Rename keys\n\n        if (schema.$_terms.renames &&\n            !internals.rename(schema, value, state, prefs, errors)) {\n\n            return { value, errors };\n        }\n\n        // Anything allowed\n\n        if (!schema.$_terms.keys &&                       // null allows any keys\n            !schema.$_terms.patterns &&\n            !schema.$_terms.dependencies) {\n\n            return { value, errors };\n        }\n\n        // Defined keys\n\n        const unprocessed = new Set(Object.keys(value));\n\n        if (schema.$_terms.keys) {\n            const ancestors = [value, ...state.ancestors];\n\n            for (const child of schema.$_terms.keys) {\n                const key = child.key;\n                const item = value[key];\n\n                unprocessed.delete(key);\n\n                const localState = state.localize([...state.path, key], ancestors, child);\n                const result = child.schema.$_validate(item, localState, prefs);\n\n                if (result.errors) {\n                    if (prefs.abortEarly) {\n                        return { value, errors: result.errors };\n                    }\n\n                    if (result.value !== undefined) {\n                        value[key] = result.value;\n                    }\n\n                    errors.push(...result.errors);\n                }\n                else if (child.schema._flags.result === 'strip' ||\n                    result.value === undefined && item !== undefined) {\n\n                    delete value[key];\n                }\n                else if (result.value !== undefined) {\n                    value[key] = result.value;\n                }\n            }\n        }\n\n        // Unknown keys\n\n        if (unprocessed.size ||\n            schema._flags._hasPatternMatch) {\n\n            const early = internals.unknown(schema, value, unprocessed, errors, state, prefs);\n            if (early) {\n                return early;\n            }\n        }\n\n        // Validate dependencies\n\n        if (schema.$_terms.dependencies) {\n            for (const dep of schema.$_terms.dependencies) {\n                if (\n                    dep.key !== null &&\n                    internals.isPresent(dep.options)(dep.key.resolve(value, state, prefs, null, { shadow: false })) === false\n                ) {\n\n                    continue;\n                }\n\n                const failed = internals.dependencies[dep.rel](schema, dep, value, state, prefs);\n                if (failed) {\n                    const report = schema.$_createError(failed.code, value, failed.context, state, prefs);\n                    if (prefs.abortEarly) {\n                        return { value, errors: report };\n                    }\n\n                    errors.push(report);\n                }\n            }\n        }\n\n        return { value, errors };\n    },\n\n    rules: {\n\n        and: {\n            method(...peers /*, [options] */) {\n\n                Common.verifyFlat(peers, 'and');\n\n                return internals.dependency(this, 'and', null, peers);\n            }\n        },\n\n        append: {\n            method(schema) {\n\n                if (schema === null ||\n                    schema === undefined ||\n                    Object.keys(schema).length === 0) {\n\n                    return this;\n                }\n\n                return this.keys(schema);\n            }\n        },\n\n        assert: {\n            method(subject, schema, message) {\n\n                if (!Template.isTemplate(subject)) {\n                    subject = Compile.ref(subject);\n                }\n\n                assert(message === undefined || typeof message === 'string', 'Message must be a string');\n\n                schema = this.$_compile(schema, { appendPath: true });\n\n                const obj = this.$_addRule({ name: 'assert', args: { subject, schema, message } });\n                obj.$_mutateRegister(subject);\n                obj.$_mutateRegister(schema);\n                return obj;\n            },\n            validate(value, { error, prefs, state }, { subject, schema, message }) {\n\n                const about = subject.resolve(value, state, prefs);\n                const path = Ref.isRef(subject) ? subject.absolute(state) : [];\n                if (schema.$_match(about, state.localize(path, [value, ...state.ancestors], schema), prefs)) {\n                    return value;\n                }\n\n                return error('object.assert', { subject, message });\n            },\n            args: ['subject', 'schema', 'message'],\n            multi: true\n        },\n\n        instance: {\n            method(constructor, name) {\n\n                assert(typeof constructor === 'function', 'constructor must be a function');\n\n                name = name || constructor.name;\n\n                return this.$_addRule({ name: 'instance', args: { constructor, name } });\n            },\n            validate(value, helpers, { constructor, name }) {\n\n                if (value instanceof constructor) {\n                    return value;\n                }\n\n                return helpers.error('object.instance', { type: name, value });\n            },\n            args: ['constructor', 'name']\n        },\n\n        keys: {\n            method(schema) {\n\n                assert(schema === undefined || typeof schema === 'object', 'Object schema must be a valid object');\n                assert(!Common.isSchema(schema), 'Object schema cannot be a joi schema');\n\n                const obj = this.clone();\n\n                if (!schema) {                                      // Allow all\n                    obj.$_terms.keys = null;\n                }\n                else if (!Object.keys(schema).length) {             // Allow none\n                    obj.$_terms.keys = new internals.Keys();\n                }\n                else {\n                    obj.$_terms.keys = obj.$_terms.keys ? obj.$_terms.keys.filter((child) => !schema.hasOwnProperty(child.key)) : new internals.Keys();\n                    for (const key in schema) {\n                        Common.tryWithPath(() => obj.$_terms.keys.push({ key, schema: this.$_compile(schema[key]) }), key);\n                    }\n                }\n\n                return obj.$_mutateRebuild();\n            }\n        },\n\n        length: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'length', args: { limit }, operator: '=' });\n            },\n            validate(value, helpers, { limit }, { name, operator, args }) {\n\n                if (Common.compare(Object.keys(value).length, limit, operator)) {\n                    return value;\n                }\n\n                return helpers.error('object.' + name, { limit: args.limit, value });\n            },\n            jsonSchema(rule, res) {\n\n                res.minProperties = rule.args.limit;\n                res.maxProperties = rule.args.limit;\n                return res;\n            },\n            args: [\n                {\n                    name: 'limit',\n                    ref: true,\n                    assert: Common.limit,\n                    message: 'must be a positive integer'\n                }\n            ]\n        },\n\n        max: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'max', method: 'length', args: { limit }, operator: '<=' });\n            },\n            jsonSchema(rule, res) {\n\n                res.maxProperties = rule.args.limit;\n                return res;\n            }\n        },\n\n        min: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'min', method: 'length', args: { limit }, operator: '>=' });\n            },\n            jsonSchema(rule, res) {\n\n                res.minProperties = rule.args.limit;\n                return res;\n            }\n        },\n\n        nand: {\n            method(...peers /*, [options] */) {\n\n                Common.verifyFlat(peers, 'nand');\n\n                return internals.dependency(this, 'nand', null, peers);\n            }\n        },\n\n        or: {\n            method(...peers /*, [options] */) {\n\n                Common.verifyFlat(peers, 'or');\n\n                return internals.dependency(this, 'or', null, peers);\n            }\n        },\n\n        oxor: {\n            method(...peers /*, [options] */) {\n\n                return internals.dependency(this, 'oxor', null, peers);\n            }\n        },\n\n        pattern: {\n            method(pattern, schema, options = {}) {\n\n                const isRegExp = pattern instanceof RegExp;\n                if (!isRegExp) {\n                    pattern = this.$_compile(pattern, { appendPath: true });\n                }\n\n                assert(schema !== undefined, 'Invalid rule');\n                Common.assertOptions(options, ['fallthrough', 'matches']);\n\n                if (isRegExp) {\n                    assert(!pattern.flags.includes('g') && !pattern.flags.includes('y'), 'pattern should not use global or sticky mode');\n                }\n\n                schema = this.$_compile(schema, { appendPath: true });\n\n                const obj = this.clone();\n                obj.$_terms.patterns = obj.$_terms.patterns || [];\n                const config = { [isRegExp ? 'regex' : 'schema']: pattern, rule: schema };\n                if (options.matches) {\n                    config.matches = this.$_compile(options.matches);\n                    if (config.matches.type !== 'array') {\n                        config.matches = config.matches.$_root.array().items(config.matches);\n                    }\n\n                    obj.$_mutateRegister(config.matches);\n                    obj.$_setFlag('_hasPatternMatch', true, { clone: false });\n                }\n\n                if (options.fallthrough) {\n                    config.fallthrough = true;\n                }\n\n                obj.$_terms.patterns.push(config);\n                obj.$_mutateRegister(schema);\n                return obj;\n            }\n        },\n\n        ref: {\n            method() {\n\n                return this.$_addRule('ref');\n            },\n            validate(value, helpers) {\n\n                if (Ref.isRef(value)) {\n                    return value;\n                }\n\n                return helpers.error('object.refType', { value });\n            }\n        },\n\n        regex: {\n            method() {\n\n                return this.$_addRule('regex');\n            },\n            validate(value, helpers) {\n\n                if (value instanceof RegExp) {\n                    return value;\n                }\n\n                return helpers.error('object.regex', { value });\n            }\n        },\n\n        rename: {\n            method(from, to, options = {}) {\n\n                assert(typeof from === 'string' || from instanceof RegExp, 'Rename missing the from argument');\n                assert(typeof to === 'string' || to instanceof Template, 'Invalid rename to argument');\n                assert(to !== from, 'Cannot rename key to same name:', from);\n\n                Common.assertOptions(options, ['alias', 'ignoreUndefined', 'override', 'multiple']);\n\n                const obj = this.clone();\n\n                obj.$_terms.renames = obj.$_terms.renames || [];\n                for (const rename of obj.$_terms.renames) {\n                    assert(rename.from !== from, 'Cannot rename the same key multiple times');\n                }\n\n                if (to instanceof Template) {\n                    obj.$_mutateRegister(to);\n                }\n\n                obj.$_terms.renames.push({\n                    from,\n                    to,\n                    options: applyToDefaults(internals.renameDefaults, options)\n                });\n\n                return obj;\n            }\n        },\n\n        schema: {\n            method(type = 'any') {\n\n                return this.$_addRule({ name: 'schema', args: { type } });\n            },\n            validate(value, helpers, { type }) {\n\n                if (Common.isSchema(value) &&\n                    (type === 'any' || value.type === type)) {\n\n                    return value;\n                }\n\n                return helpers.error('object.schema', { type });\n            }\n        },\n\n        unknown: {\n            method(allow) {\n\n                return this.$_setFlag('unknown', allow !== false);\n            }\n        },\n\n        with: {\n            method(key, peers, options = {}) {\n\n                return internals.dependency(this, 'with', key, peers, options);\n            }\n        },\n\n        without: {\n            method(key, peers, options = {}) {\n\n                return internals.dependency(this, 'without', key, peers, options);\n            }\n        },\n\n        xor: {\n            method(...peers /*, [options] */) {\n\n                Common.verifyFlat(peers, 'xor');\n\n                return internals.dependency(this, 'xor', null, peers);\n            }\n        }\n    },\n\n    overrides: {\n\n        default(value, options) {\n\n            if (value === undefined) {\n                value = Common.symbols.deepDefault;\n            }\n\n            return this.$_parent('default', value, options);\n        },\n\n        isAsync() {\n\n            if (this.$_terms.externals?.length) {\n                return true;\n            }\n\n            if (this.$_terms.keys?.length) {\n                for (const key of this.$_terms.keys) {\n                    if (key.schema.isAsync()) {\n                        return true;\n                    }\n                }\n            }\n\n            if (this.$_terms.patterns?.length) {\n                for (const pattern of this.$_terms.patterns) {\n                    if (pattern.rule.isAsync()) {\n                        return true;\n                    }\n                }\n            }\n\n            return false;\n        }\n    },\n\n    rebuild(schema) {\n\n        if (schema.$_terms.keys) {\n            const topo = new Topo.Sorter();\n            for (const child of schema.$_terms.keys) {\n                Common.tryWithPath(() => topo.add(child, { after: child.schema.$_rootReferences(), group: child.key }), child.key);\n            }\n\n            schema.$_terms.keys = new internals.Keys(...topo.nodes);\n        }\n    },\n\n    manifest: {\n\n        build(obj, desc) {\n\n            if (desc.keys) {\n                obj = obj.keys(desc.keys);\n            }\n\n            if (desc.dependencies) {\n                for (const { rel, key = null, peers, options } of desc.dependencies) {\n                    obj = internals.dependency(obj, rel, key, peers, options);\n                }\n            }\n\n            if (desc.patterns) {\n                for (const { regex, schema, rule, fallthrough, matches } of desc.patterns) {\n                    obj = obj.pattern(regex || schema, rule, { fallthrough, matches });\n                }\n            }\n\n            if (desc.renames) {\n                for (const { from, to, options } of desc.renames) {\n                    obj = obj.rename(from, to, options);\n                }\n            }\n\n            return obj;\n        }\n    },\n\n    messages: {\n        'object.and': '{{#label}} contains {{#presentWithLabels}} without its required peers {{#missingWithLabels}}',\n        'object.assert': '{{#label}} is invalid because {if(#subject.key, `\"` + #subject.key + `\" failed to ` + (#message || \"pass the assertion test\"), #message || \"the assertion failed\")}',\n        'object.base': '{{#label}} must be of type {{#type}}',\n        'object.instance': '{{#label}} must be an instance of {{:#type}}',\n        'object.length': '{{#label}} must have {{#limit}} key{if(#limit == 1, \"\", \"s\")}',\n        'object.max': '{{#label}} must have less than or equal to {{#limit}} key{if(#limit == 1, \"\", \"s\")}',\n        'object.min': '{{#label}} must have at least {{#limit}} key{if(#limit == 1, \"\", \"s\")}',\n        'object.missing': '{{#label}} must contain at least one of {{#peersWithLabels}}',\n        'object.nand': '{{:#mainWithLabel}} must not exist simultaneously with {{#peersWithLabels}}',\n        'object.oxor': '{{#label}} contains a conflict between optional exclusive peers {{#peersWithLabels}}',\n        'object.pattern.match': '{{#label}} keys failed to match pattern requirements',\n        'object.refType': '{{#label}} must be a Joi reference',\n        'object.regex': '{{#label}} must be a RegExp object',\n        'object.rename.multiple': '{{#label}} cannot rename {{:#from}} because multiple renames are disabled and another key was already renamed to {{:#to}}',\n        'object.rename.override': '{{#label}} cannot rename {{:#from}} because override is disabled and target {{:#to}} exists',\n        'object.schema': '{{#label}} must be a Joi schema of {{#type}} type',\n        'object.unknown': '{{#label}} is not allowed',\n        'object.with': '{{:#mainWithLabel}} missing required peer {{:#peerWithLabel}}',\n        'object.without': '{{:#mainWithLabel}} conflict with forbidden peer {{:#peerWithLabel}}',\n        'object.xor': '{{#label}} contains a conflict between exclusive peers {{#peersWithLabels}}'\n    }\n});\n\n\n// Helpers\n\ninternals.clone = function (value, prefs) {\n\n    // Object\n\n    if (typeof value === 'object') {\n        if (prefs.nonEnumerables) {\n            return Clone(value, { shallow: true });\n        }\n\n        const clone = Object.create(Object.getPrototypeOf(value));\n        Object.assign(clone, value);\n        return clone;\n    }\n\n    // Function\n\n    const clone = function (...args) {\n\n        return value.apply(this, args);\n    };\n\n    clone.prototype = Clone(value.prototype);\n    Object.defineProperty(clone, 'name', { value: value.name, writable: false });\n    Object.defineProperty(clone, 'length', { value: value.length, writable: false });\n    Object.assign(clone, value);\n    return clone;\n};\n\n\ninternals.dependency = function (schema, rel, key, peers, options) {\n\n    assert(key === null || typeof key === 'string', rel, 'key must be a strings');\n\n    // Extract options from peers array\n\n    if (!options) {\n        options = peers.length > 1 && typeof peers[peers.length - 1] === 'object' ? peers.pop() : {};\n    }\n\n    Common.assertOptions(options, ['separator', 'isPresent']);\n\n    peers = [].concat(peers);\n\n    // Cast peer paths\n\n    const separator = Common.default(options.separator, '.');\n    const paths = [];\n    for (const peer of peers) {\n        assert(typeof peer === 'string', rel, 'peers must be strings');\n        paths.push(Compile.ref(peer, { separator, ancestor: 0, prefix: false }));\n    }\n\n    // Cast key\n\n    if (key !== null) {\n        key = Compile.ref(key, { separator, ancestor: 0, prefix: false });\n    }\n\n    // Add rule\n\n    const obj = schema.clone();\n    obj.$_terms.dependencies = obj.$_terms.dependencies || [];\n    obj.$_terms.dependencies.push(new internals.Dependency(rel, key, paths, peers, options));\n    return obj;\n};\n\n\ninternals.dependencies = {\n\n    and(schema, dep, value, state, prefs) {\n\n        const missing = [];\n        const present = [];\n        const count = dep.peers.length;\n        const isPresent = internals.isPresent(dep.options);\n        for (const peer of dep.peers) {\n            if (isPresent(peer.resolve(value, state, prefs, null, { shadow: false })) === false) {\n                missing.push(peer.key);\n            }\n            else {\n                present.push(peer.key);\n            }\n        }\n\n        if (missing.length !== count &&\n            present.length !== count) {\n\n            return {\n                code: 'object.and',\n                context: {\n                    present,\n                    presentWithLabels: internals.keysToLabels(schema, present),\n                    missing,\n                    missingWithLabels: internals.keysToLabels(schema, missing)\n                }\n            };\n        }\n    },\n\n    nand(schema, dep, value, state, prefs) {\n\n        const present = [];\n        const isPresent = internals.isPresent(dep.options);\n        for (const peer of dep.peers) {\n            if (isPresent(peer.resolve(value, state, prefs, null, { shadow: false }))) {\n                present.push(peer.key);\n            }\n        }\n\n        if (present.length !== dep.peers.length) {\n            return;\n        }\n\n        const main = dep.paths[0];\n        const values = dep.paths.slice(1);\n        return {\n            code: 'object.nand',\n            context: {\n                main,\n                mainWithLabel: internals.keysToLabels(schema, main),\n                peers: values,\n                peersWithLabels: internals.keysToLabels(schema, values)\n            }\n        };\n    },\n\n    or(schema, dep, value, state, prefs) {\n\n        const isPresent = internals.isPresent(dep.options);\n        for (const peer of dep.peers) {\n            if (isPresent(peer.resolve(value, state, prefs, null, { shadow: false }))) {\n                return;\n            }\n        }\n\n        return {\n            code: 'object.missing',\n            context: {\n                peers: dep.paths,\n                peersWithLabels: internals.keysToLabels(schema, dep.paths)\n            }\n        };\n    },\n\n    oxor(schema, dep, value, state, prefs) {\n\n        const present = [];\n        const isPresent = internals.isPresent(dep.options);\n        for (const peer of dep.peers) {\n            if (isPresent(peer.resolve(value, state, prefs, null, { shadow: false }))) {\n                present.push(peer.key);\n            }\n        }\n\n        if (!present.length ||\n            present.length === 1) {\n\n            return;\n        }\n\n        const context = { peers: dep.paths, peersWithLabels: internals.keysToLabels(schema, dep.paths) };\n        context.present = present;\n        context.presentWithLabels = internals.keysToLabels(schema, present);\n        return { code: 'object.oxor', context };\n    },\n\n    with(schema, dep, value, state, prefs) {\n\n        const isPresent = internals.isPresent(dep.options);\n        for (const peer of dep.peers) {\n            if (isPresent(peer.resolve(value, state, prefs, null, { shadow: false })) === false) {\n                return {\n                    code: 'object.with',\n                    context: {\n                        main: dep.key.key,\n                        mainWithLabel: internals.keysToLabels(schema, dep.key.key),\n                        peer: peer.key,\n                        peerWithLabel: internals.keysToLabels(schema, peer.key)\n                    }\n                };\n            }\n        }\n    },\n\n    without(schema, dep, value, state, prefs) {\n\n        const isPresent = internals.isPresent(dep.options);\n        for (const peer of dep.peers) {\n            if (isPresent(peer.resolve(value, state, prefs, null, { shadow: false }))) {\n                return {\n                    code: 'object.without',\n                    context: {\n                        main: dep.key.key,\n                        mainWithLabel: internals.keysToLabels(schema, dep.key.key),\n                        peer: peer.key,\n                        peerWithLabel: internals.keysToLabels(schema, peer.key)\n                    }\n                };\n            }\n        }\n    },\n\n    xor(schema, dep, value, state, prefs) {\n\n        const present = [];\n        const isPresent = internals.isPresent(dep.options);\n        for (const peer of dep.peers) {\n            if (isPresent(peer.resolve(value, state, prefs, null, { shadow: false }))) {\n                present.push(peer.key);\n            }\n        }\n\n        if (present.length === 1) {\n            return;\n        }\n\n        const context = { peers: dep.paths, peersWithLabels: internals.keysToLabels(schema, dep.paths) };\n        if (present.length === 0) {\n            return { code: 'object.missing', context };\n        }\n\n        context.present = present;\n        context.presentWithLabels = internals.keysToLabels(schema, present);\n        return { code: 'object.xor', context };\n    }\n};\n\n\ninternals.keysToLabels = function (schema, keys) {\n\n    if (Array.isArray(keys)) {\n        return keys.map((key) => schema.$_mapLabels(key));\n    }\n\n    return schema.$_mapLabels(keys);\n};\n\n\ninternals.isPresent = function (options) {\n\n    return typeof options.isPresent === 'function' ? options.isPresent : (resolved) => resolved !== undefined;\n};\n\n\ninternals.rename = function (schema, value, state, prefs, errors) {\n\n    const renamed = {};\n    for (const rename of schema.$_terms.renames) {\n        const matches = [];\n        const pattern = typeof rename.from !== 'string';\n\n        if (!pattern) {\n            if (Object.prototype.hasOwnProperty.call(value, rename.from) &&\n                (value[rename.from] !== undefined || !rename.options.ignoreUndefined)) {\n\n                matches.push(rename);\n            }\n        }\n        else {\n            for (const from in value) {\n                if (value[from] === undefined &&\n                    rename.options.ignoreUndefined) {\n\n                    continue;\n                }\n\n                if (from === rename.to) {\n                    continue;\n                }\n\n                const match = rename.from.exec(from);\n                if (!match) {\n                    continue;\n                }\n\n                matches.push({ from, to: rename.to, match });\n            }\n        }\n\n        for (const match of matches) {\n            const from = match.from;\n            let to = match.to;\n            if (to instanceof Template) {\n                to = to.render(value, state, prefs, match.match);\n            }\n\n            if (from === to) {\n                continue;\n            }\n\n            if (!rename.options.multiple &&\n                renamed[to]) {\n\n                errors.push(schema.$_createError('object.rename.multiple', value, { from, to, pattern }, state, prefs));\n                if (prefs.abortEarly) {\n                    return false;\n                }\n            }\n\n            if (Object.prototype.hasOwnProperty.call(value, to) &&\n                !rename.options.override &&\n                !renamed[to]) {\n\n                errors.push(schema.$_createError('object.rename.override', value, { from, to, pattern }, state, prefs));\n                if (prefs.abortEarly) {\n                    return false;\n                }\n            }\n\n            if (value[from] === undefined) {\n                delete value[to];\n            }\n            else {\n                value[to] = value[from];\n            }\n\n            renamed[to] = true;\n\n            if (!rename.options.alias) {\n                delete value[from];\n            }\n        }\n    }\n\n    return true;\n};\n\n\ninternals.unknown = function (schema, value, unprocessed, errors, state, prefs) {\n\n    if (schema.$_terms.patterns) {\n        let hasMatches = false;\n        const matches = schema.$_terms.patterns.map((pattern) => {\n\n            if (pattern.matches) {\n                hasMatches = true;\n                return [];\n            }\n        });\n\n        const ancestors = [value, ...state.ancestors];\n\n        for (const key of unprocessed) {\n            const item = value[key];\n            const path = [...state.path, key];\n\n            for (let i = 0; i < schema.$_terms.patterns.length; ++i) {\n                const pattern = schema.$_terms.patterns[i];\n                if (pattern.regex) {\n                    const match = pattern.regex.test(key);\n                    state.mainstay.tracer.debug(state, 'rule', `pattern.${i}`, match ? 'pass' : 'error');\n                    if (!match) {\n                        continue;\n                    }\n                }\n                else {\n                    if (!pattern.schema.$_match(key, state.nest(pattern.schema, `pattern.${i}`), prefs)) {\n                        continue;\n                    }\n                }\n\n                unprocessed.delete(key);\n\n                const localState = state.localize(path, ancestors, { schema: pattern.rule, key });\n                const result = pattern.rule.$_validate(item, localState, prefs);\n                if (result.errors) {\n                    if (prefs.abortEarly) {\n                        return { value, errors: result.errors };\n                    }\n\n                    errors.push(...result.errors);\n                }\n\n                if (pattern.matches) {\n                    matches[i].push(key);\n                }\n\n                value[key] = result.value;\n                if (!pattern.fallthrough) {\n                    break;\n                }\n            }\n        }\n\n        // Validate pattern matches rules\n\n        if (hasMatches) {\n            for (let i = 0; i < matches.length; ++i) {\n                const match = matches[i];\n                if (!match) {\n                    continue;\n                }\n\n                const stpm = schema.$_terms.patterns[i].matches;\n                const localState = state.localize(state.path, ancestors, stpm);\n                const result = stpm.$_validate(match, localState, prefs);\n                if (result.errors) {\n                    const details = Errors.details(result.errors, { override: false });\n                    details.matches = match;\n                    const report = schema.$_createError('object.pattern.match', value, details, state, prefs);\n                    if (prefs.abortEarly) {\n                        return { value, errors: report };\n                    }\n\n                    errors.push(report);\n                }\n            }\n        }\n    }\n\n    if (!unprocessed.size ||\n        !schema.$_terms.keys && !schema.$_terms.patterns) {     // If no keys or patterns specified, unknown keys allowed\n\n        return;\n    }\n\n    if (prefs.stripUnknown && typeof schema._flags.unknown === 'undefined' ||\n        prefs.skipFunctions) {\n\n        const stripUnknown = prefs.stripUnknown ? (prefs.stripUnknown === true ? true : !!prefs.stripUnknown.objects) : false;\n\n        for (const key of unprocessed) {\n            if (stripUnknown) {\n                delete value[key];\n                unprocessed.delete(key);\n            }\n            else if (typeof value[key] === 'function') {\n                unprocessed.delete(key);\n            }\n        }\n    }\n\n    const forbidUnknown = !Common.default(schema._flags.unknown, prefs.allowUnknown);\n    if (forbidUnknown) {\n        for (const unprocessedKey of unprocessed) {\n            const localState = state.localize([...state.path, unprocessedKey], []);\n            const report = schema.$_createError('object.unknown', value[unprocessedKey], { child: unprocessedKey }, localState, prefs, { flags: false });\n            if (prefs.abortEarly) {\n                return { value, errors: report };\n            }\n\n            errors.push(report);\n        }\n    }\n};\n\n\ninternals.Dependency = class {\n\n    constructor(rel, key, peers, paths, options) {\n\n        this.rel = rel;\n        this.key = key;\n        this.peers = peers;\n        this.paths = paths;\n        this.options = options;\n    }\n\n    describe() {\n\n        const desc = {\n            rel: this.rel,\n            peers: this.paths\n        };\n\n        if (this.key !== null) {\n            desc.key = this.key.key;\n        }\n\n        if (this.peers[0].separator !== '.') {\n            desc.options = { ...desc.options, separator: this.peers[0].separator };\n        }\n\n        if (this.options.isPresent) {\n            desc.options = { ...desc.options, isPresent: this.options.isPresent };\n        }\n\n        return desc;\n    }\n};\n\n\ninternals.Keys = class extends Array {\n\n    concat(source) {\n\n        const result = this.slice();\n\n        const keys = new Map();\n        for (let i = 0; i < result.length; ++i) {\n            keys.set(result[i].key, i);\n        }\n\n        for (const item of source) {\n            const key = item.key;\n            const pos = keys.get(key);\n            if (pos !== undefined) {\n                result[pos] = { key, schema: result[pos].schema.concat(item.schema) };\n            }\n            else {\n                result.push(item);\n            }\n        }\n\n        return result;\n    }\n};\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Keys = require('./keys');\n\n\nconst internals = {};\n\n\nmodule.exports = Keys.extend({\n\n    type: 'function',\n\n    properties: {\n        typeof: 'function'\n    },\n\n    rules: {\n        arity: {\n            method(n) {\n\n                assert(Number.isSafeInteger(n) && n >= 0, 'n must be a positive integer');\n\n                return this.$_addRule({ name: 'arity', args: { n } });\n            },\n            validate(value, helpers, { n }) {\n\n                if (value.length === n) {\n                    return value;\n                }\n\n                return helpers.error('function.arity', { n });\n            }\n        },\n\n        class: {\n            method() {\n\n                return this.$_addRule('class');\n            },\n            validate(value, helpers) {\n\n                if ((/^\\s*class\\s/).test(value.toString())) {\n                    return value;\n                }\n\n                return helpers.error('function.class', { value });\n            }\n        },\n\n        minArity: {\n            method(n) {\n\n                assert(Number.isSafeInteger(n) && n > 0, 'n must be a strict positive integer');\n\n                return this.$_addRule({ name: 'minArity', args: { n } });\n            },\n            validate(value, helpers, { n }) {\n\n                if (value.length >= n) {\n                    return value;\n                }\n\n                return helpers.error('function.minArity', { n });\n            }\n        },\n\n        maxArity: {\n            method(n) {\n\n                assert(Number.isSafeInteger(n) && n >= 0, 'n must be a positive integer');\n\n                return this.$_addRule({ name: 'maxArity', args: { n } });\n            },\n            validate(value, helpers, { n }) {\n\n                if (value.length <= n) {\n                    return value;\n                }\n\n                return helpers.error('function.maxArity', { n });\n            }\n        }\n    },\n\n    messages: {\n        'function.arity': '{{#label}} must have an arity of {{#n}}',\n        'function.class': '{{#label}} must be a class',\n        'function.maxArity': '{{#label}} must have an arity lesser or equal to {{#n}}',\n        'function.minArity': '{{#label}} must have an arity greater or equal to {{#n}}'\n    }\n});\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Any = require('./any');\nconst Common = require('../common');\nconst Compile = require('../compile');\nconst Errors = require('../errors');\n\n\nconst internals = {};\n\n\nmodule.exports = Any.extend({\n\n    type: 'link',\n\n    properties: {\n        schemaChain: true\n    },\n\n    terms: {\n\n        link: { init: null, manifest: 'single', register: false }\n    },\n\n    args(schema, ref) {\n\n        return schema.ref(ref);\n    },\n\n    jsonSchema(schema, res, mode, options) {\n\n        if (!schema.$_terms.link) {\n            return res;\n        }\n\n        const { ref } = schema.$_terms.link[0];\n\n        if (ref.ancestor === 'root' || ref.ancestor > 0) {\n            res.$ref = `#/${ref.path.map((p) => `properties/${p}`).join('/')}`;\n            return res;\n        }\n\n        if (ref.path.length === 1) {\n            res.$ref = `#/$defs/${ref.path[0]}`;\n        }\n        else {\n            res.$ref = `#/${ref.path.slice(1).map((p) => `properties/${p}`).join('/')}`;\n        }\n\n        return res;\n    },\n\n    validate(value, { schema, state, prefs, error }) {\n\n        assert(schema.$_terms.link, 'Uninitialized link schema');\n\n        const limit = schema._flags.maxRecursion;\n        if (limit !== undefined &&\n            state.schemas.filter((entry) => entry.schema === schema).length > limit) {\n\n            return { value, errors: error('link.maxRecursion', { limit }) };\n        }\n\n        const linked = internals.generate(schema, value, state, prefs);\n        const ref = schema.$_terms.link[0].ref;\n\n        try {\n            return linked.$_validate(value, state.nest(linked, `link:${ref.display}:${linked.type}`), prefs);\n        }\n        catch (err) {\n            /* $lab:coverage:off$ */\n            if (!(err instanceof RangeError)) {\n                throw err;\n            }\n            /* $lab:coverage:on$ */\n\n            return { value, errors: error('link.depth') };\n        }\n    },\n\n    generate(schema, value, state, prefs) {\n\n        return internals.generate(schema, value, state, prefs);\n    },\n\n    rules: {\n\n        ref: {\n            method(ref) {\n\n                assert(!this.$_terms.link, 'Cannot reinitialize schema');\n\n                ref = Compile.ref(ref);\n\n                assert(ref.type === 'value' || ref.type === 'local', 'Invalid reference type:', ref.type);\n                assert(ref.type === 'local' || ref.ancestor === 'root' || ref.ancestor > 0, 'Link cannot reference itself');\n\n                const obj = this.clone();\n                obj.$_terms.link = [{ ref }];\n                return obj;\n            }\n        },\n\n        relative: {\n            method(enabled = true) {\n\n                return this.$_setFlag('relative', enabled);\n            }\n        },\n\n        maxRecursion: {\n            method(limit) {\n\n                assert(Number.isSafeInteger(limit) && limit >= 1, 'limit must be a positive integer');\n\n                return this.$_setFlag('maxRecursion', limit);\n            }\n        }\n    },\n\n    messages: {\n        'link.depth': '{{#label}} exceeds maximum recursion depth supported by the runtime',\n        'link.maxRecursion': '{{#label}} exceeds maximum recursion depth of {{#limit}}'\n    },\n\n    overrides: {\n\n        concat(source) {\n\n            assert(this.$_terms.link, 'Uninitialized link schema');\n            assert(Common.isSchema(source), 'Invalid schema object');\n            assert(source.type !== 'link', 'Cannot merge type link with another link');\n\n            const obj = this.clone();\n\n            if (!obj.$_terms.whens) {\n                obj.$_terms.whens = [];\n            }\n\n            obj.$_terms.whens.push({ concat: source });\n            return obj.$_mutateRebuild();\n        }\n    },\n\n    manifest: {\n\n        build(obj, desc) {\n\n            assert(desc.link, 'Invalid link description missing link');\n            return obj.ref(desc.link);\n        }\n    }\n});\n\n\n// Helpers\n\ninternals.generate = function (schema, value, state, prefs) {\n\n    let linked = state.mainstay.links.get(schema);\n    if (linked) {\n        return linked._generate(value, state, prefs).schema;\n    }\n\n    const ref = schema.$_terms.link[0].ref;\n    const { perspective, path } = internals.perspective(ref, state);\n    internals.assert(perspective, 'which is outside of schema boundaries', ref, schema, state, prefs);\n\n    try {\n        linked = path.length ? perspective.$_reach(path) : perspective;\n    }\n    catch {\n        internals.assert(false, 'to non-existing schema', ref, schema, state, prefs);\n    }\n\n    internals.assert(linked.type !== 'link', 'which is another link', ref, schema, state, prefs);\n\n    if (!schema._flags.relative) {\n        state.mainstay.links.set(schema, linked);\n    }\n\n    return linked._generate(value, state, prefs).schema;\n};\n\n\ninternals.perspective = function (ref, state) {\n\n    if (ref.type === 'local') {\n        for (const { schema, key } of state.schemas) {                              // From parent to root\n            const id = schema._flags.id || key;\n            if (id === ref.path[0]) {\n                return { perspective: schema, path: ref.path.slice(1) };\n            }\n\n            if (schema.$_terms.shared) {\n                for (const shared of schema.$_terms.shared) {\n                    if (shared._flags.id === ref.path[0]) {\n                        return { perspective: shared, path: ref.path.slice(1) };\n                    }\n                }\n            }\n        }\n\n        return { perspective: null, path: null };\n    }\n\n    if (ref.ancestor === 'root') {\n        return { perspective: state.schemas[state.schemas.length - 1].schema, path: ref.path };\n    }\n\n    return { perspective: state.schemas[ref.ancestor] && state.schemas[ref.ancestor].schema, path: ref.path };\n};\n\n\ninternals.assert = function (condition, message, ref, schema, state, prefs) {\n\n    if (condition) {                // Manual check to avoid generating error message on success\n        return;\n    }\n\n    assert(false, `\"${Errors.label(schema._flags, state, prefs)}\" contains link reference \"${ref.display}\" ${message}`);\n};\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Any = require('./any');\nconst Common = require('../common');\n\n\nconst internals = {\n    numberRx: /^\\s*[+-]?(?:(?:\\d+(?:\\.\\d*)?)|(?:\\.\\d+))(?:e([+-]?\\d+))?\\s*$/i,\n    precisionRx: /(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/,\n    exponentialPartRegex: /[eE][+-]?\\d+$/,\n    leadingSignAndZerosRegex: /^[+-]?(0*)?/,\n    dotRegex: /\\./,\n    trailingZerosRegex: /0+$/,\n    decimalPlaces(value) {\n\n        const str = value.toString();\n        const dindex = str.indexOf('.');\n        const eindex = str.indexOf('e');\n        return (\n            (dindex < 0 ? 0 : (eindex < 0 ? str.length : eindex) - dindex - 1) +\n            (eindex < 0 ? 0 : Math.max(0, -parseInt(str.slice(eindex + 1))))\n        );\n    }\n};\n\n\nmodule.exports = Any.extend({\n\n    type: 'number',\n\n    flags: {\n\n        unsafe: { default: false }\n    },\n\n    coerce: {\n        from: 'string',\n        method(value, { schema, error }) {\n\n            const matches = value.match(internals.numberRx);\n            if (!matches) {\n                return;\n            }\n\n            value = value.trim();\n            const result = { value: parseFloat(value) };\n\n            if (result.value === 0) {\n                result.value = 0;           // -0\n            }\n\n            if (!schema._flags.unsafe) {\n                if (value.match(/e/i)) {\n                    if (internals.extractSignificantDigits(value) !== internals.extractSignificantDigits(String(result.value))) {\n                        result.errors = error('number.unsafe');\n                        return result;\n                    }\n                }\n                else {\n                    const string = result.value.toString();\n                    if (string.match(/e/i)) {\n                        return result;\n                    }\n\n                    if (string !== internals.normalizeDecimal(value)) {\n                        result.errors = error('number.unsafe');\n                        return result;\n                    }\n                }\n            }\n\n            return result;\n        }\n    },\n\n    validate(value, { schema, error, prefs }) {\n\n        if (value === Infinity ||\n            value === -Infinity) {\n\n            return { value, errors: error('number.infinity') };\n        }\n\n        if (!Common.isNumber(value)) {\n            return { value, errors: error('number.base') };\n        }\n\n        const result = { value };\n\n        if (prefs.convert) {\n            const rule = schema.$_getRule('precision');\n            if (rule) {\n                const precision = Math.pow(10, rule.args.limit);                    // This is conceptually equivalent to using toFixed but it should be much faster\n                result.value = Math.round(result.value * precision) / precision;\n            }\n        }\n\n        if (result.value === 0) {\n            result.value = 0;           // -0\n        }\n\n        if (!schema._flags.unsafe &&\n            (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER)) {\n\n            result.errors = error('number.unsafe');\n        }\n\n        return result;\n    },\n\n    rules: {\n\n        compare: {\n            method: false,\n            validate(value, helpers, { limit }, { name, operator, args }) {\n\n                if (Common.compare(value, limit, operator)) {\n                    return value;\n                }\n\n                return helpers.error('number.' + name, { limit: args.limit, value });\n            },\n            args: [\n                {\n                    name: 'limit',\n                    ref: true,\n                    assert: Common.isNumber,\n                    message: 'must be a number'\n                }\n            ]\n        },\n\n        greater: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'greater', method: 'compare', args: { limit }, operator: '>' });\n            },\n            jsonSchema(rule, res) {\n\n                res.exclusiveMinimum = rule.args.limit;\n                return res;\n            }\n        },\n\n        integer: {\n            method() {\n\n                return this.$_addRule('integer');\n            },\n            validate(value, helpers) {\n\n                if (Math.trunc(value) - value === 0) {\n                    return value;\n                }\n\n                return helpers.error('number.integer');\n            },\n            jsonSchema(rule, res) {\n\n                res.type = 'integer';\n\n                return res;\n            }\n        },\n\n        less: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'less', method: 'compare', args: { limit }, operator: '<' });\n            },\n            jsonSchema(rule, res) {\n\n                res.exclusiveMaximum = rule.args.limit;\n                return res;\n            }\n        },\n\n        max: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'max', method: 'compare', args: { limit }, operator: '<=' });\n            },\n            jsonSchema(rule, res) {\n\n                res.maximum = rule.args.limit;\n                return res;\n            }\n        },\n\n        min: {\n            method(limit) {\n\n                return this.$_addRule({ name: 'min', method: 'compare', args: { limit }, operator: '>=' });\n            },\n            jsonSchema(rule, res) {\n\n                res.minimum = rule.args.limit;\n                return res;\n            }\n        },\n\n        multiple: {\n            method(base) {\n\n                const baseDecimalPlace = typeof base === 'number' ? internals.decimalPlaces(base) : null;\n                const pfactor = Math.pow(10, baseDecimalPlace);\n\n                return this.$_addRule({\n                    name: 'multiple',\n                    args: {\n                        base,\n                        baseDecimalPlace,\n                        pfactor\n                    }\n                });\n            },\n            validate(value, helpers, { base, baseDecimalPlace, pfactor }, options) {\n\n                const valueDecimalPlace = internals.decimalPlaces(value);\n\n                if (valueDecimalPlace > baseDecimalPlace) {\n                    // Value with higher precision than base can never be a multiple\n                    return helpers.error('number.multiple', { multiple: options.args.base, value });\n                }\n\n                return Math.round(pfactor * value) % Math.round(pfactor * base) === 0 ?\n                    value :\n                    helpers.error('number.multiple', { multiple: options.args.base, value });\n            },\n            jsonSchema(rule, res) {\n\n                res.multipleOf = rule.args.base;\n                return res;\n            },\n            args: [\n                {\n                    name: 'base',\n                    ref: true,\n                    assert: (value) => typeof value === 'number' && isFinite(value) && value > 0,\n                    message: 'must be a positive number'\n                },\n                'baseDecimalPlace',\n                'pfactor'\n            ],\n            multi: true\n        },\n\n        negative: {\n            method() {\n\n                return this.sign('negative');\n            }\n        },\n\n        port: {\n            method() {\n\n                return this.$_addRule('port');\n            },\n            validate(value, helpers) {\n\n                if (Number.isSafeInteger(value) &&\n                    value >= 0 &&\n                    value <= 65535) {\n\n                    return value;\n                }\n\n                return helpers.error('number.port');\n            },\n            jsonSchema(rule, res) {\n\n                res.type = 'integer';\n                res.minimum = 0;\n                res.maximum = 65535;\n                return res;\n            }\n        },\n\n        positive: {\n            method() {\n\n                return this.sign('positive');\n            }\n        },\n\n        precision: {\n            method(limit) {\n\n                assert(Number.isSafeInteger(limit), 'limit must be an integer');\n\n                return this.$_addRule({ name: 'precision', args: { limit } });\n            },\n            validate(value, helpers, { limit }) {\n\n                const places = value.toString().match(internals.precisionRx);\n                const decimals = Math.max((places[1] ? places[1].length : 0) - (places[2] ? parseInt(places[2], 10) : 0), 0);\n                if (decimals <= limit) {\n                    return value;\n                }\n\n                return helpers.error('number.precision', { limit, value });\n            },\n            convert: true\n        },\n\n        sign: {\n            method(sign) {\n\n                assert(['negative', 'positive'].includes(sign), 'Invalid sign', sign);\n\n                return this.$_addRule({ name: 'sign', args: { sign } });\n            },\n            validate(value, helpers, { sign }) {\n\n                if (sign === 'negative' && value < 0 ||\n                    sign === 'positive' && value > 0) {\n\n                    return value;\n                }\n\n                return helpers.error(`number.${sign}`);\n            },\n            jsonSchema(rule, res) {\n\n                if (rule.args.sign === 'positive') {\n                    res.exclusiveMinimum = 0;\n                }\n                else {\n                    res.exclusiveMaximum = 0;\n                }\n\n                return res;\n            }\n        },\n\n        unsafe: {\n            method(enabled = true) {\n\n                assert(typeof enabled === 'boolean', 'enabled must be a boolean');\n\n                return this.$_setFlag('unsafe', enabled);\n            }\n        }\n    },\n\n    cast: {\n        string: {\n            from: (value) => typeof value === 'number',\n            to(value, helpers) {\n\n                return value.toString();\n            }\n        }\n    },\n\n    messages: {\n        'number.base': '{{#label}} must be a number',\n        'number.greater': '{{#label}} must be greater than {{#limit}}',\n        'number.infinity': '{{#label}} cannot be infinity',\n        'number.integer': '{{#label}} must be an integer',\n        'number.less': '{{#label}} must be less than {{#limit}}',\n        'number.max': '{{#label}} must be less than or equal to {{#limit}}',\n        'number.min': '{{#label}} must be greater than or equal to {{#limit}}',\n        'number.multiple': '{{#label}} must be a multiple of {{#multiple}}',\n        'number.negative': '{{#label}} must be a negative number',\n        'number.port': '{{#label}} must be a valid port',\n        'number.positive': '{{#label}} must be a positive number',\n        'number.precision': '{{#label}} must have no more than {{#limit}} decimal places',\n        'number.unsafe': '{{#label}} must be a safe number'\n    }\n});\n\n\n// Helpers\n\ninternals.extractSignificantDigits = function (value) {\n\n    return value\n        .replace(internals.exponentialPartRegex, '')\n        .replace(internals.dotRegex, '')\n        .replace(internals.trailingZerosRegex, '')\n        .replace(internals.leadingSignAndZerosRegex, '');\n};\n\n\ninternals.normalizeDecimal = function (str) {\n\n    str = str\n        // Remove leading plus signs\n        .replace(/^\\+/, '')\n        // Remove trailing zeros if there is a decimal point and unecessary decimal points\n        .replace(/\\.0*$/, '')\n        // Add a integer 0 if the numbers starts with a decimal point\n        .replace(/^(-?)\\.([^\\.]*)$/, '$10.$2')\n        // Remove leading zeros\n        .replace(/^(-?)0+([0-9])/, '$1$2');\n\n    if (str.includes('.') &&\n        str.endsWith('0')) {\n\n        str = str.replace(/0+$/, '');\n    }\n\n    if (str === '-0') {\n        return '0';\n    }\n\n    return str;\n};\n","'use strict';\n\nconst Keys = require('./keys');\n\n\nconst internals = {};\n\n\nmodule.exports = Keys.extend({\n\n    type: 'object',\n\n    cast: {\n        map: {\n            from: (value) => value && typeof value === 'object',\n            to(value, helpers) {\n\n                return new Map(Object.entries(value));\n            }\n        }\n    }\n});\n","export const errorCodes = {\n    EMPTY_STRING: 'Address must be a non-empty string',\n    FORBIDDEN_UNICODE: 'Address contains forbidden Unicode characters',\n    MULTIPLE_AT_CHAR: 'Address cannot contain more than one @ character',\n    MISSING_AT_CHAR: 'Address must contain one @ character',\n    EMPTY_LOCAL: 'Address local part cannot be empty',\n    ADDRESS_TOO_LONG: 'Address too long',\n    LOCAL_TOO_LONG: 'Address local part too long',\n    EMPTY_LOCAL_SEGMENT: 'Address local part contains empty dot-separated segment',\n    INVALID_LOCAL_CHARS: 'Address local part contains invalid character',\n    DOMAIN_NON_EMPTY_STRING: 'Domain must be a non-empty string',\n    DOMAIN_TOO_LONG: 'Domain too long',\n    DOMAIN_INVALID_UNICODE_CHARS: 'Domain contains forbidden Unicode characters',\n    DOMAIN_INVALID_CHARS: 'Domain contains invalid character',\n    DOMAIN_INVALID_TLDS_CHARS: 'Domain contains invalid tld character',\n    DOMAIN_SEGMENTS_COUNT: 'Domain lacks the minimum required number of segments',\n    DOMAIN_SEGMENTS_COUNT_MAX: 'Domain contains too many segments',\n    DOMAIN_FORBIDDEN_TLDS: 'Domain uses forbidden TLD',\n    DOMAIN_EMPTY_SEGMENT: 'Domain contains empty dot-separated segment',\n    DOMAIN_LONG_SEGMENT: 'Domain contains dot-separated segment that is too long'\n};\nexport function errorCode(code) {\n    return { code, error: errorCodes[code] };\n}\n//# sourceMappingURL=errors.js.map","import * as Url from 'url';\nimport { errorCode } from './errors';\nconst MIN_DOMAIN_SEGMENTS = 2;\nconst NON_ASCII_RX = /[^\\x00-\\x7f]/;\nconst DOMAIN_CONTROL_RX = /[\\x00-\\x20@\\:\\/\\\\#!\\$&\\'\\(\\)\\*\\+,;=\\?]/; // Control + space + separators\nconst TLD_SEGMENT_RX = /^[a-zA-Z](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?$/;\nconst DOMAIN_SEGMENT_RX = /^[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?$/;\nconst DOMAIN_UNDERSCORE_SEGMENT_RX = /^[a-zA-Z0-9_](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?$/;\nconst URL_IMPL = Url.URL || URL; // $lab:coverage:ignore$\nfunction isTldsAllow(tlds) {\n    return !!tlds.allow;\n}\n/**\n * Analyzes a string to verify it is a valid domain name.\n *\n * @param domain - the domain name to validate.\n * @param options - optional settings.\n *\n * @return - undefined when valid, otherwise an object with single error key with a string message value.\n */\nexport function analyzeDomain(domain, options = {}) {\n    if (!domain) {\n        // Catch null / undefined\n        return errorCode('DOMAIN_NON_EMPTY_STRING');\n    }\n    if (typeof domain !== 'string') {\n        throw new Error('Invalid input: domain must be a string');\n    }\n    if (domain.length > 256) {\n        return errorCode('DOMAIN_TOO_LONG');\n    }\n    const ascii = !NON_ASCII_RX.test(domain);\n    if (!ascii) {\n        if (options.allowUnicode === false) {\n            // Defaults to true\n            return errorCode('DOMAIN_INVALID_UNICODE_CHARS');\n        }\n        domain = domain.normalize('NFC');\n    }\n    if (DOMAIN_CONTROL_RX.test(domain)) {\n        return errorCode('DOMAIN_INVALID_CHARS');\n    }\n    domain = punycode(domain);\n    // https://tools.ietf.org/html/rfc1035 section 2.3.1\n    if (options.allowFullyQualified && domain[domain.length - 1] === '.') {\n        domain = domain.slice(0, -1);\n    }\n    const minDomainSegments = options.minDomainSegments || MIN_DOMAIN_SEGMENTS;\n    const segments = domain.split('.');\n    if (segments.length < minDomainSegments) {\n        return errorCode('DOMAIN_SEGMENTS_COUNT');\n    }\n    if (options.maxDomainSegments) {\n        if (segments.length > options.maxDomainSegments) {\n            return errorCode('DOMAIN_SEGMENTS_COUNT_MAX');\n        }\n    }\n    const tlds = options.tlds;\n    if (tlds) {\n        const tld = segments[segments.length - 1].toLowerCase();\n        if (isTldsAllow(tlds)) {\n            if (!tlds.allow.has(tld)) {\n                return errorCode('DOMAIN_FORBIDDEN_TLDS');\n            }\n        }\n        else if (tlds.deny.has(tld)) {\n            return errorCode('DOMAIN_FORBIDDEN_TLDS');\n        }\n    }\n    for (let i = 0; i < segments.length; ++i) {\n        const segment = segments[i];\n        if (!segment.length) {\n            return errorCode('DOMAIN_EMPTY_SEGMENT');\n        }\n        if (segment.length > 63) {\n            return errorCode('DOMAIN_LONG_SEGMENT');\n        }\n        if (i < segments.length - 1) {\n            if (options.allowUnderscore) {\n                if (!DOMAIN_UNDERSCORE_SEGMENT_RX.test(segment)) {\n                    return errorCode('DOMAIN_INVALID_CHARS');\n                }\n            }\n            else {\n                if (!DOMAIN_SEGMENT_RX.test(segment)) {\n                    return errorCode('DOMAIN_INVALID_CHARS');\n                }\n            }\n        }\n        else {\n            if (!TLD_SEGMENT_RX.test(segment)) {\n                return errorCode('DOMAIN_INVALID_TLDS_CHARS');\n            }\n        }\n    }\n    return null;\n}\n/**\n * Analyzes a string to verify it is a valid domain name.\n *\n * @param domain - the domain name to validate.\n * @param options - optional settings.\n *\n * @return - true when valid, otherwise false.\n */\nexport function isDomainValid(domain, options) {\n    return !analyzeDomain(domain, options);\n}\nfunction punycode(domain) {\n    if (domain.includes('%')) {\n        domain = domain.replace(/%/g, '%25');\n    }\n    try {\n        return new URL_IMPL(`http://${domain}`).host;\n    }\n    catch (err) {\n        return domain;\n    }\n}\nexport function validateDomainOptions(options) {\n    if (!options) {\n        return;\n    }\n    if (typeof options.tlds !== 'object') {\n        throw new Error('Invalid options: tlds must be a boolean or an object');\n    }\n    if (isTldsAllow(options.tlds)) {\n        if (options.tlds.allow instanceof Set === false) {\n            throw new Error('Invalid options: tlds.allow must be a Set object or true');\n        }\n        if (options.tlds.deny) {\n            throw new Error('Invalid options: cannot specify both tlds.allow and tlds.deny lists');\n        }\n    }\n    else {\n        if (options.tlds.deny instanceof Set === false) {\n            throw new Error('Invalid options: tlds.deny must be a Set object');\n        }\n    }\n}\n//# sourceMappingURL=domain.js.map","import * as Util from 'util';\nimport { analyzeDomain } from './domain';\nimport { errorCode } from './errors';\nconst NON_ASCII_RX = /[^\\x00-\\x7f]/;\nconst ENCODER_IMPL = new (Util.TextEncoder || TextEncoder)(); // $lab:coverage:ignore$\n/**\n * Analyzes a string to verify it is a valid email address.\n *\n * @param email - the email address to validate.\n * @param options - optional settings.\n *\n * @return - undefined when valid, otherwise an object with single error key with a string message value.\n */\nexport function analyzeEmail(email, options) {\n    return validateEmail(email, options);\n}\n/**\n * Analyzes a string to verify it is a valid email address.\n *\n * @param email - the email address to validate.\n * @param options - optional settings.\n *\n * @return - true when valid, otherwise false.\n */\nexport function isEmailValid(email, options) {\n    return !validateEmail(email, options);\n}\nfunction validateEmail(email, options = {}) {\n    if (typeof email !== 'string') {\n        throw new Error('Invalid input: email must be a string');\n    }\n    if (!email) {\n        return errorCode('EMPTY_STRING');\n    }\n    // Unicode\n    const ascii = !NON_ASCII_RX.test(email);\n    if (!ascii) {\n        if (options.allowUnicode === false) {\n            // Defaults to true\n            return errorCode('FORBIDDEN_UNICODE');\n        }\n        email = email.normalize('NFC');\n    }\n    // Basic structure\n    const parts = email.split('@');\n    if (parts.length !== 2) {\n        return parts.length > 2 ? errorCode('MULTIPLE_AT_CHAR') : errorCode('MISSING_AT_CHAR');\n    }\n    const [local, domain] = parts;\n    if (!local) {\n        return errorCode('EMPTY_LOCAL');\n    }\n    if (!options.ignoreLength) {\n        if (email.length > 254) {\n            // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.3\n            return errorCode('ADDRESS_TOO_LONG');\n        }\n        if (ENCODER_IMPL.encode(local).length > 64) {\n            // http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1\n            return errorCode('LOCAL_TOO_LONG');\n        }\n    }\n    // Validate parts\n    return validateLocal(local, ascii) || analyzeDomain(domain, options);\n}\nfunction validateLocal(local, ascii) {\n    const segments = local.split('.');\n    for (const segment of segments) {\n        if (!segment.length) {\n            return errorCode('EMPTY_LOCAL_SEGMENT');\n        }\n        if (ascii) {\n            if (!ATEXT_RX.test(segment)) {\n                return errorCode('INVALID_LOCAL_CHARS');\n            }\n            continue;\n        }\n        for (const char of segment) {\n            if (ATEXT_RX.test(char)) {\n                continue;\n            }\n            const binary = toBinary(char);\n            if (!ATOM_RX.test(binary)) {\n                return errorCode('INVALID_LOCAL_CHARS');\n            }\n        }\n    }\n    return null;\n}\nfunction toBinary(char) {\n    return Array.from(ENCODER_IMPL.encode(char), (v) => String.fromCharCode(v)).join('');\n}\n/*\n    From RFC 5321:\n\n        Mailbox         =   Local-part \"@\" ( Domain / address-literal )\n\n        Local-part      =   Dot-string / Quoted-string\n        Dot-string      =   Atom *(\".\"  Atom)\n        Atom            =   1*atext\n        atext           =   ALPHA / DIGIT / \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\" / \"+\" / \"-\" / \"/\" / \"=\" / \"?\" / \"^\" / \"_\" / \"`\" / \"{\" / \"|\" / \"}\" / \"~\"\n\n        Domain          =   sub-domain *(\".\" sub-domain)\n        sub-domain      =   Let-dig [Ldh-str]\n        Let-dig         =   ALPHA / DIGIT\n        Ldh-str         =   *( ALPHA / DIGIT / \"-\" ) Let-dig\n\n        ALPHA           =   %x41-5A / %x61-7A        ; a-z, A-Z\n        DIGIT           =   %x30-39                  ; 0-9\n\n    From RFC 6531:\n\n        sub-domain      =/  U-label\n        atext           =/  UTF8-non-ascii\n\n        UTF8-non-ascii  =   UTF8-2 / UTF8-3 / UTF8-4\n\n        UTF8-2          =   %xC2-DF UTF8-tail\n        UTF8-3          =   %xE0 %xA0-BF UTF8-tail /\n                            %xE1-EC 2( UTF8-tail ) /\n                            %xED %x80-9F UTF8-tail /\n                            %xEE-EF 2( UTF8-tail )\n        UTF8-4          =   %xF0 %x90-BF 2( UTF8-tail ) /\n                            %xF1-F3 3( UTF8-tail ) /\n                            %xF4 %x80-8F 2( UTF8-tail )\n\n        UTF8-tail       =   %x80-BF\n\n    Note: The following are not supported:\n\n        RFC 5321: address-literal, Quoted-string\n        RFC 5322: obs-*, CFWS\n*/\nconst ATEXT_RX = /^[\\w!#\\$%&'\\*\\+\\-/=\\?\\^`\\{\\|\\}~]+$/; // _ included in \\w\nconst ATOM_RX = new RegExp([\n    //  %xC2-DF UTF8-tail\n    '(?:[\\\\xc2-\\\\xdf][\\\\x80-\\\\xbf])',\n    //  %xE0 %xA0-BF UTF8-tail              %xE1-EC 2( UTF8-tail )            %xED %x80-9F UTF8-tail              %xEE-EF 2( UTF8-tail )\n    '(?:\\\\xe0[\\\\xa0-\\\\xbf][\\\\x80-\\\\xbf])|(?:[\\\\xe1-\\\\xec][\\\\x80-\\\\xbf]{2})|(?:\\\\xed[\\\\x80-\\\\x9f][\\\\x80-\\\\xbf])|(?:[\\\\xee-\\\\xef][\\\\x80-\\\\xbf]{2})',\n    //  %xF0 %x90-BF 2( UTF8-tail )            %xF1-F3 3( UTF8-tail )            %xF4 %x80-8F 2( UTF8-tail )\n    '(?:\\\\xf0[\\\\x90-\\\\xbf][\\\\x80-\\\\xbf]{2})|(?:[\\\\xf1-\\\\xf3][\\\\x80-\\\\xbf]{3})|(?:\\\\xf4[\\\\x80-\\\\x8f][\\\\x80-\\\\xbf]{2})'\n].join('|'));\n//# sourceMappingURL=email.js.map","export { default as applyToDefaults } from './applyToDefaults.js';\n\nexport { default as assert } from './assert.js';\n\nexport { default as Bench } from './bench.js';\n\nexport { default as block } from './block.js';\n\nexport { default as clone } from './clone.js';\n\nexport { default as contain } from './contain.js';\n\nexport { default as deepEqual } from './deepEqual.js';\n\nexport { default as AssertError } from './assertError.js';\n\nexport { default as escapeHeaderAttribute } from './escapeHeaderAttribute.js';\n\nexport { default as escapeHtml } from './escapeHtml.js';\n\nexport { default as escapeJson } from './escapeJson.js';\n\nexport { default as escapeRegex } from './escapeRegex.js';\n\nexport { default as flatten } from './flatten.js';\n\nexport { default as ignore } from './ignore.js';\n\nexport { default as intersect } from './intersect.js';\n\nexport { default as isPromise } from './isPromise.js';\n\nexport { default as merge } from './merge.js';\n\nexport { default as once } from './once.js';\n\nexport { default as reach } from './reach.js';\n\nexport { default as reachTemplate } from './reachTemplate.js';\n\nexport { default as stringify } from './stringify.js';\n\nexport { default as wait } from './wait.js';\n","import { assert, escapeRegex } from '@hapi/hoek';\nfunction generate() {\n    const rfc3986 = {};\n    const hexDigit = '\\\\dA-Fa-f'; // HEXDIG = DIGIT / \"A\" / \"B\" / \"C\" / \"D\" / \"E\" / \"F\"\n    const hexDigitOnly = '[' + hexDigit + ']';\n    const unreserved = '\\\\w-\\\\.~'; // unreserved = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n    const subDelims = \"!\\\\$&'\\\\(\\\\)\\\\*\\\\+,;=\"; // sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\" / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n    const pctEncoded = '%' + hexDigit; // pct-encoded = \"%\" HEXDIG HEXDIG\n    const pchar = unreserved + pctEncoded + subDelims + ':@'; // pchar = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n    const pcharOnly = '[' + pchar + ']';\n    const decOctect = '(?:0{0,2}\\\\d|0?[1-9]\\\\d|1\\\\d\\\\d|2[0-4]\\\\d|25[0-5])'; // dec-octet = DIGIT / %x31-39 DIGIT / \"1\" 2DIGIT / \"2\" %x30-34 DIGIT / \"25\" %x30-35  ; 0-9 / 10-99 / 100-199 / 200-249 / 250-255\n    rfc3986.ipv4address = '(?:' + decOctect + '\\\\.){3}' + decOctect; // IPv4address = dec-octet \".\" dec-octet \".\" dec-octet \".\" dec-octet\n    /*\n        h16 = 1*4HEXDIG ; 16 bits of address represented in hexadecimal\n        ls32 = ( h16 \":\" h16 ) / IPv4address ; least-significant 32 bits of address\n        IPv6address =                            6( h16 \":\" ) ls32\n                    /                       \"::\" 5( h16 \":\" ) ls32\n                    / [               h16 ] \"::\" 4( h16 \":\" ) ls32\n                    / [ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n                    / [ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n                    / [ *3( h16 \":\" ) h16 ] \"::\"    h16 \":\"   ls32\n                    / [ *4( h16 \":\" ) h16 ] \"::\"              ls32\n                    / [ *5( h16 \":\" ) h16 ] \"::\"              h16\n                    / [ *6( h16 \":\" ) h16 ] \"::\"\n    */\n    const h16 = hexDigitOnly + '{1,4}';\n    const ls32 = '(?:' + h16 + ':' + h16 + '|' + rfc3986.ipv4address + ')';\n    const IPv6SixHex = '(?:' + h16 + ':){6}' + ls32;\n    const IPv6FiveHex = '::(?:' + h16 + ':){5}' + ls32;\n    const IPv6FourHex = '(?:' + h16 + ')?::(?:' + h16 + ':){4}' + ls32;\n    const IPv6ThreeHex = '(?:(?:' + h16 + ':){0,1}' + h16 + ')?::(?:' + h16 + ':){3}' + ls32;\n    const IPv6TwoHex = '(?:(?:' + h16 + ':){0,2}' + h16 + ')?::(?:' + h16 + ':){2}' + ls32;\n    const IPv6OneHex = '(?:(?:' + h16 + ':){0,3}' + h16 + ')?::' + h16 + ':' + ls32;\n    const IPv6NoneHex = '(?:(?:' + h16 + ':){0,4}' + h16 + ')?::' + ls32;\n    const IPv6NoneHex2 = '(?:(?:' + h16 + ':){0,5}' + h16 + ')?::' + h16;\n    const IPv6NoneHex3 = '(?:(?:' + h16 + ':){0,6}' + h16 + ')?::';\n    rfc3986.ipv4Cidr = '(?:\\\\d|[1-2]\\\\d|3[0-2])'; // IPv4 cidr = DIGIT / %x31-32 DIGIT / \"3\" %x30-32  ; 0-9 / 10-29 / 30-32\n    rfc3986.ipv6Cidr = '(?:0{0,2}\\\\d|0?[1-9]\\\\d|1[01]\\\\d|12[0-8])'; // IPv6 cidr = DIGIT / %x31-39 DIGIT / \"1\" %x0-1 DIGIT / \"12\" %x0-8;   0-9 / 10-99 / 100-119 / 120-128\n    rfc3986.ipv6address =\n        '(?:' +\n            IPv6SixHex +\n            '|' +\n            IPv6FiveHex +\n            '|' +\n            IPv6FourHex +\n            '|' +\n            IPv6ThreeHex +\n            '|' +\n            IPv6TwoHex +\n            '|' +\n            IPv6OneHex +\n            '|' +\n            IPv6NoneHex +\n            '|' +\n            IPv6NoneHex2 +\n            '|' +\n            IPv6NoneHex3 +\n            ')';\n    rfc3986.ipvFuture = 'v' + hexDigitOnly + '+\\\\.[' + unreserved + subDelims + ':]+'; // IPvFuture = \"v\" 1*HEXDIG \".\" 1*( unreserved / sub-delims / \":\" )\n    rfc3986.scheme = '[a-zA-Z][a-zA-Z\\\\d+-\\\\.]*'; // scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n    rfc3986.schemeRegex = new RegExp(rfc3986.scheme);\n    const userinfo = '[' + unreserved + pctEncoded + subDelims + ':]*'; // userinfo = *( unreserved / pct-encoded / sub-delims / \":\" )\n    const IPLiteral = '\\\\[(?:' + rfc3986.ipv6address + '|' + rfc3986.ipvFuture + ')\\\\]'; // IP-literal = \"[\" ( IPv6address / IPvFuture  ) \"]\"\n    const regName = '[' + unreserved + pctEncoded + subDelims + ']{1,255}'; // reg-name = *( unreserved / pct-encoded / sub-delims )\n    const host = '(?:' + IPLiteral + '|' + rfc3986.ipv4address + '|' + regName + ')'; // host = IP-literal / IPv4address / reg-name\n    const port = '\\\\d*'; // port = *DIGIT\n    const authority = '(?:' + userinfo + '@)?' + host + '(?::' + port + ')?'; // authority   = [ userinfo \"@\" ] host [ \":\" port ]\n    const authorityCapture = '(?:' + userinfo + '@)?(' + host + ')(?::' + port + ')?';\n    /*\n        segment       = *pchar\n        segment-nz    = 1*pchar\n        path          = path-abempty    ; begins with \"/\" '|' is empty\n                    / path-absolute   ; begins with \"/\" but not \"//\"\n                    / path-noscheme   ; begins with a non-colon segment\n                    / path-rootless   ; begins with a segment\n                    / path-empty      ; zero characters\n        path-abempty  = *( \"/\" segment )\n        path-absolute = \"/\" [ segment-nz *( \"/\" segment ) ]\n        path-rootless = segment-nz *( \"/\" segment )\n    */\n    const segment = pcharOnly + '*';\n    const segmentNz = pcharOnly + '+';\n    const segmentNzNc = '[' + unreserved + pctEncoded + subDelims + '@' + ']+';\n    const pathEmpty = '';\n    const pathAbEmpty = '(?:\\\\/' + segment + ')*';\n    const pathAbsolute = '\\\\/(?:' + segmentNz + pathAbEmpty + ')?';\n    const pathRootless = segmentNz + pathAbEmpty;\n    const pathNoScheme = segmentNzNc + pathAbEmpty;\n    const pathAbNoAuthority = '(?:\\\\/\\\\/\\\\/' + segment + pathAbEmpty + ')'; // Used by file:///\n    // hier-part = \"//\" authority path\n    rfc3986.hierPart =\n        '(?:' +\n            '(?:\\\\/\\\\/' +\n            authority +\n            pathAbEmpty +\n            ')' +\n            '|' +\n            pathAbsolute +\n            '|' +\n            pathRootless +\n            '|' +\n            pathAbNoAuthority +\n            ')';\n    rfc3986.hierPartCapture =\n        '(?:' + '(?:\\\\/\\\\/' + authorityCapture + pathAbEmpty + ')' + '|' + pathAbsolute + '|' + pathRootless + ')';\n    // relative-part = \"//\" authority path-abempty / path-absolute / path-noscheme / path-empty\n    rfc3986.relativeRef =\n        '(?:' +\n            '(?:\\\\/\\\\/' +\n            authority +\n            pathAbEmpty +\n            ')' +\n            '|' +\n            pathAbsolute +\n            '|' +\n            pathNoScheme +\n            '|' +\n            pathEmpty +\n            ')';\n    rfc3986.relativeRefCapture =\n        '(?:' +\n            '(?:\\\\/\\\\/' +\n            authorityCapture +\n            pathAbEmpty +\n            ')' +\n            '|' +\n            pathAbsolute +\n            '|' +\n            pathNoScheme +\n            '|' +\n            pathEmpty +\n            ')';\n    // query = *( pchar / \"/\" / \"?\" )\n    // query = *( pchar / \"[\" / \"]\" / \"/\" / \"?\" )\n    rfc3986.query = '[' + pchar + '\\\\/\\\\?]*(?=#|$)'; //Finish matching either at the fragment part '|' end of the line.\n    rfc3986.queryWithSquareBrackets = '[' + pchar + '\\\\[\\\\]\\\\/\\\\?]*(?=#|$)';\n    // fragment = *( pchar / \"/\" / \"?\" )\n    rfc3986.fragment = '[' + pchar + '\\\\/\\\\?]*';\n    return rfc3986;\n}\nconst rfc3986 = generate();\nexport const ipVersions = {\n    v4Cidr: rfc3986.ipv4Cidr,\n    v6Cidr: rfc3986.ipv6Cidr,\n    ipv4: rfc3986.ipv4address,\n    ipv6: rfc3986.ipv6address,\n    ipvfuture: rfc3986.ipvFuture\n};\nfunction createRegex(options) {\n    const rfc = rfc3986;\n    // Construct expression\n    const query = options.allowQuerySquareBrackets ? rfc.queryWithSquareBrackets : rfc.query;\n    const suffix = '(?:\\\\?' + query + ')?' + '(?:#' + rfc.fragment + ')?';\n    // relative-ref = relative-part [ \"?\" query ] [ \"#\" fragment ]\n    const relative = options.domain ? rfc.relativeRefCapture : rfc.relativeRef;\n    if (options.relativeOnly) {\n        return wrap(relative + suffix);\n    }\n    // Custom schemes\n    let customScheme = '';\n    if (options.scheme) {\n        assert(options.scheme instanceof RegExp || typeof options.scheme === 'string' || Array.isArray(options.scheme), 'scheme must be a RegExp, String, or Array');\n        const schemes = [].concat(options.scheme);\n        assert(schemes.length >= 1, 'scheme must have at least 1 scheme specified');\n        // Flatten the array into a string to be used to match the schemes\n        const selections = [];\n        for (let i = 0; i < schemes.length; ++i) {\n            const scheme = schemes[i];\n            assert(scheme instanceof RegExp || typeof scheme === 'string', 'scheme at position ' + i + ' must be a RegExp or String');\n            if (scheme instanceof RegExp) {\n                selections.push(scheme.source.toString());\n            }\n            else {\n                assert(rfc.schemeRegex.test(scheme), 'scheme at position ' + i + ' must be a valid scheme');\n                selections.push(escapeRegex(scheme));\n            }\n        }\n        customScheme = selections.join('|');\n    }\n    // URI = scheme \":\" hier-part [ \"?\" query ] [ \"#\" fragment ]\n    const scheme = customScheme ? '(?:' + customScheme + ')' : rfc.scheme;\n    const absolute = '(?:' + scheme + ':' + (options.domain ? rfc.hierPartCapture : rfc.hierPart) + ')';\n    const prefix = options.allowRelative ? '(?:' + absolute + '|' + relative + ')' : absolute;\n    return wrap(prefix + suffix, customScheme);\n}\nfunction wrap(raw, scheme = null) {\n    raw = `(?=.)(?!https?\\:/(?:$|[^/]))(?!https?\\:///)(?!https?\\:[^/])${raw}`; // Require at least one character and explicitly forbid 'http:/' or HTTP with empty domain\n    return {\n        raw,\n        regex: new RegExp(`^${raw}$`),\n        scheme\n    };\n}\nconst genericUriRegex = createRegex({});\n/**\n * Generates a regular expression used to validate URI addresses.\n *\n * @param options - optional settings.\n *\n * @returns an object with the regular expression and meta data.\n */\nexport function uriRegex(options = {}) {\n    if (options.scheme ||\n        options.allowRelative ||\n        options.relativeOnly ||\n        options.allowQuerySquareBrackets ||\n        options.domain) {\n        return createRegex(options);\n    }\n    return genericUriRegex;\n}\n//# sourceMappingURL=uri.js.map","import { assert } from '@hapi/hoek';\nimport { ipVersions } from './uri';\n/**\n * Generates a regular expression used to validate IP addresses.\n *\n * @param options - optional settings.\n *\n * @returns an object with the regular expression and meta data.\n */\nexport function ipRegex(options = {}) {\n    // CIDR\n    const cidr = options.cidr || 'optional';\n    assert(['required', 'optional', 'forbidden'].includes(cidr), 'options.cidr must be one of required, optional, forbidden');\n    // Versions\n    assert(options.version === undefined || typeof options.version === 'string' || Array.isArray(options.version), 'options.version must be a string or an array of string');\n    let versions = options.version || ['ipv4', 'ipv6', 'ipvfuture'];\n    if (!Array.isArray(versions)) {\n        versions = [versions];\n    }\n    assert(versions.length >= 1, 'options.version must have at least 1 version specified');\n    for (const version of versions) {\n        assert(typeof version === 'string' && version === version.toLowerCase(), 'Invalid options.version value');\n        assert(['ipv4', 'ipv6', 'ipvfuture'].includes(version), 'options.version contains unknown version ' + version + ' - must be one of ipv4, ipv6, ipvfuture');\n    }\n    versions = Array.from(new Set(versions));\n    // Regex\n    const parts = versions.map((version) => {\n        // Forbidden\n        if (cidr === 'forbidden') {\n            return ipVersions[version];\n        }\n        // Required\n        const cidrpart = `\\\\/${version === 'ipv4' ? ipVersions.v4Cidr : ipVersions.v6Cidr}`;\n        if (cidr === 'required') {\n            return `${ipVersions[version]}${cidrpart}`;\n        }\n        // Optional\n        return `${ipVersions[version]}(?:${cidrpart})?`;\n    });\n    const raw = `(?:${parts.join('|')})`;\n    const regex = new RegExp(`^${raw}$`);\n    return { cidr, versions, regex, raw };\n}\n//# sourceMappingURL=ip.js.map","export * from './domain';\nexport * from './email';\nexport { errorCodes } from './errors';\nexport { ipRegex } from './ip';\nexport { uriRegex } from './uri';\nexport { uriDecode } from './decode';\n//# sourceMappingURL=index.js.map","'use strict';\n\nconst { assert, escapeRegex } = require('@hapi/hoek');\nconst { isDomainValid, isEmailValid, ipRegex, uriRegex } = require('@hapi/address');\nconst Tlds = require('@hapi/tlds');\n\nconst Any = require('./any');\nconst Common = require('../common');\n\n\nconst internals = {\n    tlds: Tlds.tlds instanceof Set ? { tlds: { allow: Tlds.tlds, deny: null } } : false,              // $lab:coverage:ignore$\n    base64Regex: {\n        // paddingRequired\n        true: {\n            // urlSafe\n            true: /^(?:[\\w\\-]{2}[\\w\\-]{2})*(?:[\\w\\-]{2}==|[\\w\\-]{3}=)?$/,\n            false: /^(?:[A-Za-z0-9+\\/]{2}[A-Za-z0-9+\\/]{2})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=)?$/\n        },\n        false: {\n            true: /^(?:[\\w\\-]{2}[\\w\\-]{2})*(?:[\\w\\-]{2}(==)?|[\\w\\-]{3}=?)?$/,\n            false: /^(?:[A-Za-z0-9+\\/]{2}[A-Za-z0-9+\\/]{2})*(?:[A-Za-z0-9+\\/]{2}(==)?|[A-Za-z0-9+\\/]{3}=?)?$/\n        }\n    },\n    dataUriRegex: /^data:[\\w+.-]+\\/[\\w+.-]+;((charset=[\\w-]+|base64),)?(.*)$/,\n    hexRegex: {\n        withPrefix: /^0x[0-9a-f]+$/i,\n        withOptionalPrefix: /^(?:0x)?[0-9a-f]+$/i,\n        withoutPrefix: /^[0-9a-f]+$/i\n    },\n    ipRegex: ipRegex({ cidr: 'forbidden' }).regex,\n    isoDurationRegex: /^P(?!$)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+S)?)?$/,\n\n    guidBrackets: {\n        '{': '}', '[': ']', '(': ')', '': ''\n    },\n    guidVersions: {\n        uuidv1: '1',\n        uuidv2: '2',\n        uuidv3: '3',\n        uuidv4: '4',\n        uuidv5: '5',\n        uuidv6: '6',\n        uuidv7: '7',\n        uuidv8: '8'\n    },\n    guidSeparators: new Set([undefined, true, false, '-', ':']),\n\n    normalizationForms: ['NFC', 'NFD', 'NFKC', 'NFKD']\n};\n\n\nmodule.exports = Any.extend({\n\n    type: 'string',\n\n    flags: {\n\n        insensitive: { default: false },\n        truncate: { default: false }\n    },\n\n    terms: {\n\n        replacements: { init: null }\n    },\n\n    coerce: {\n        from: 'string',\n        method(value, { schema, state, prefs }) {\n\n            const normalize = schema.$_getRule('normalize');\n            if (normalize) {\n                value = value.normalize(normalize.args.form);\n            }\n\n            const casing = schema.$_getRule('case');\n            if (casing) {\n                value = casing.args.direction === 'upper' ? value.toLocaleUpperCase() : value.toLocaleLowerCase();\n            }\n\n            const trim = schema.$_getRule('trim');\n            if (trim &&\n                trim.args.enabled) {\n\n                value = value.trim();\n            }\n\n            if (schema.$_terms.replacements) {\n                for (const replacement of schema.$_terms.replacements) {\n                    value = value.replace(replacement.pattern, replacement.replacement);\n                }\n            }\n\n            const hex = schema.$_getRule('hex');\n            if (hex &&\n                hex.args.options.byteAligned &&\n                value.length % 2 !== 0) {\n\n                value = `0${value}`;\n            }\n\n            if (schema.$_getRule('isoDate')) {\n                const iso = internals.isoDate(value);\n                if (iso) {\n                    value = iso;\n                }\n            }\n\n            if (schema._flags.truncate) {\n                const rule = schema.$_getRule('max');\n                if (rule) {\n                    let limit = rule.args.limit;\n                    if (Common.isResolvable(limit)) {\n                        limit = limit.resolve(value, state, prefs);\n                        if (!Common.limit(limit)) {\n                            return { value, errors: schema.$_createError('any.ref', limit, { ref: rule.args.limit, arg: 'limit', reason: 'must be a positive integer' }, state, prefs) };\n                        }\n                    }\n\n                    value = value.slice(0, limit);\n                }\n            }\n\n            return { value };\n        }\n    },\n\n    validate(value, { schema, error }) {\n\n        if (typeof value !== 'string') {\n            return { value, errors: error('string.base') };\n        }\n\n        if (value === '') {\n            const min = schema.$_getRule('min');\n            if (min &&\n                min.args.limit === 0) {\n\n                return;\n            }\n\n            return { value, errors: error('string.empty') };\n        }\n    },\n\n    jsonSchema(schema, res, mode, options) {\n\n        const noEmpty = !schema._valids?.has('') && !schema._flags.only;\n        if (noEmpty) {\n            const min = schema.$_getRule('min');\n            const length = schema.$_getRule('length');\n\n            if ((!min || min.args.limit > 0) &&\n                (!length || length.args.limit > 0)) {\n\n                res.minLength = 1;\n            }\n        }\n\n        return res;\n    },\n\n    rules: {\n\n        alphanum: {\n            method() {\n\n                return this.$_addRule('alphanum');\n            },\n            validate(value, helpers) {\n\n                if (/^[a-zA-Z0-9]+$/.test(value)) {\n                    return value;\n                }\n\n                return helpers.error('string.alphanum');\n            }\n        },\n\n        base64: {\n            method(options = {}) {\n\n                Common.assertOptions(options, ['paddingRequired', 'urlSafe']);\n\n                options = { urlSafe: false, paddingRequired: true, ...options };\n                assert(typeof options.paddingRequired === 'boolean', 'paddingRequired must be boolean');\n                assert(typeof options.urlSafe === 'boolean', 'urlSafe must be boolean');\n\n                return this.$_addRule({ name: 'base64', args: { options } });\n            },\n            validate(value, helpers, { options }) {\n\n                const regex = internals.base64Regex[options.paddingRequired][options.urlSafe];\n                if (regex.test(value)) {\n                    return value;\n                }\n\n                return helpers.error('string.base64');\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'base64';\n                return res;\n            }\n        },\n\n        case: {\n            method(direction) {\n\n                assert(['lower', 'upper'].includes(direction), 'Invalid case:', direction);\n\n                return this.$_addRule({ name: 'case', args: { direction } });\n            },\n            validate(value, helpers, { direction }) {\n\n                if (direction === 'lower' && value === value.toLocaleLowerCase() ||\n                    direction === 'upper' && value === value.toLocaleUpperCase()) {\n\n                    return value;\n                }\n\n                return helpers.error(`string.${direction}case`);\n            },\n            convert: true\n        },\n\n        creditCard: {\n            method() {\n\n                return this.$_addRule('creditCard');\n            },\n            validate(value, helpers) {\n\n                let i = value.length;\n                let sum = 0;\n                let mul = 1;\n\n                while (i--) {\n                    const char = value.charAt(i) * mul;\n                    sum = sum + (char - (char > 9) * 9);\n                    mul = mul ^ 3;\n                }\n\n                if (sum > 0 &&\n                    sum % 10 === 0) {\n\n                    return value;\n                }\n\n                return helpers.error('string.creditCard');\n            }\n        },\n\n        dataUri: {\n            method(options = {}) {\n\n                Common.assertOptions(options, ['paddingRequired']);\n\n                options = { paddingRequired: true, ...options };\n                assert(typeof options.paddingRequired === 'boolean', 'paddingRequired must be boolean');\n\n                return this.$_addRule({ name: 'dataUri', args: { options } });\n            },\n            validate(value, helpers, { options }) {\n\n                const matches = value.match(internals.dataUriRegex);\n\n                if (matches) {\n                    if (!matches[2]) {\n                        return value;\n                    }\n\n                    if (matches[2] !== 'base64') {\n                        return value;\n                    }\n\n                    const base64regex = internals.base64Regex[options.paddingRequired].false;\n                    if (base64regex.test(matches[3])) {\n                        return value;\n                    }\n                }\n\n                return helpers.error('string.dataUri');\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'data-uri';\n                return res;\n            }\n        },\n\n        domain: {\n            method(options) {\n\n                if (options) {\n                    Common.assertOptions(options, ['allowFullyQualified', 'allowUnicode', 'allowUnderscore', 'maxDomainSegments', 'minDomainSegments', 'tlds']);\n                }\n\n                const address = internals.addressOptions(options);\n                return this.$_addRule({ name: 'domain', args: { options }, address });\n            },\n            validate(value, helpers, args, { address }) {\n\n                if (isDomainValid(value, address)) {\n                    return value;\n                }\n\n                return helpers.error('string.domain');\n            }\n        },\n\n        email: {\n            method(options = {}) {\n\n                Common.assertOptions(options, ['allowFullyQualified', 'allowUnicode', 'ignoreLength', 'maxDomainSegments', 'minDomainSegments', 'multiple', 'separator', 'tlds']);\n                assert(options.multiple === undefined || typeof options.multiple === 'boolean', 'multiple option must be an boolean');\n\n                const address = internals.addressOptions(options);\n                const regex = new RegExp(`\\\\s*[${options.separator ? escapeRegex(options.separator) : ','}]\\\\s*`);\n\n                return this.$_addRule({ name: 'email', args: { options }, regex, address });\n            },\n            validate(value, helpers, { options }, { regex, address }) {\n\n                const emails = options.multiple ? value.split(regex) : [value];\n                const invalids = [];\n                for (const email of emails) {\n                    if (!isEmailValid(email, address)) {\n                        invalids.push(email);\n                    }\n                }\n\n                if (!invalids.length) {\n                    return value;\n                }\n\n                return helpers.error('string.email', { value, invalids });\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'email';\n                return res;\n            }\n        },\n\n        guid: {\n            alias: 'uuid',\n            method(options = {}) {\n\n                Common.assertOptions(options, ['version', 'separator', 'wrapper']);\n\n                assert(\n                    options.wrapper === undefined ||\n                    typeof options.wrapper === 'boolean' ||\n                    (typeof options.wrapper === 'string' && typeof internals.guidBrackets[options.wrapper] === 'string'),\n                    `\"wrapper\" must be true, false, or one of \"${Object.keys(internals.guidBrackets).filter(Boolean).join('\", \"')}\"`\n                );\n\n                let versionNumbers = '';\n\n                if (options.version) {\n                    const versions = [].concat(options.version);\n\n                    assert(versions.length >= 1, 'version must have at least 1 valid version specified');\n                    const set = new Set();\n\n                    for (let i = 0; i < versions.length; ++i) {\n                        const version = versions[i];\n                        assert(typeof version === 'string', 'version at position ' + i + ' must be a string');\n                        const versionNumber = internals.guidVersions[version.toLowerCase()];\n                        assert(versionNumber, 'version at position ' + i + ' must be one of ' + Object.keys(internals.guidVersions).join(', '));\n                        assert(!set.has(versionNumber), 'version at position ' + i + ' must not be a duplicate');\n\n                        versionNumbers += versionNumber;\n                        set.add(versionNumber);\n                    }\n                }\n\n                assert(internals.guidSeparators.has(options.separator), 'separator must be one of true, false, \"-\", or \":\"');\n                const separator = options.separator === undefined ? '[:-]?' :\n                    options.separator === true ? '[:-]' :\n                        options.separator === false ? '[]?' : `\\\\${options.separator}`;\n\n                let wrapperStart;\n                let wrapperEnd;\n\n                if (options.wrapper === undefined) {\n                    wrapperStart = '[\\\\[{\\\\(]?';\n                    wrapperEnd = '[\\\\]}\\\\)]?';\n                }\n                else if (options.wrapper === true) {\n                    wrapperStart = '[\\\\[{\\\\(]';\n                    wrapperEnd = '[\\\\]}\\\\)]';\n                }\n                else if (options.wrapper === false) {\n                    wrapperStart = '';\n                    wrapperEnd = '';\n                }\n                else {\n                    wrapperStart = escapeRegex(options.wrapper);\n                    wrapperEnd = escapeRegex(internals.guidBrackets[options.wrapper]);\n                }\n\n                const regex = new RegExp(\n                    `^(${wrapperStart})[0-9A-F]{8}(${separator})[0-9A-F]{4}\\\\2?[${\n                        versionNumbers || '0-9A-F'\n                    }][0-9A-F]{3}\\\\2?[${\n                        versionNumbers ? '89AB' : '0-9A-F'\n                    }][0-9A-F]{3}\\\\2?[0-9A-F]{12}(${wrapperEnd})$`,\n                    'i'\n                );\n\n                return this.$_addRule({ name: 'guid', args: { options }, regex });\n            },\n\n            validate(value, helpers, args, { regex }) {\n\n                const results = regex.exec(value);\n\n                if (!results) {\n                    return helpers.error('string.guid');\n                }\n\n                const open = results[1];\n                const close = results[results.length - 1];\n\n                if ((open || close) && internals.guidBrackets[open] !== close) {\n                    return helpers.error('string.guid');\n                }\n\n                return value;\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'uuid';\n                return res;\n            }\n        },\n\n        hex: {\n            method(options = {}) {\n\n                Common.assertOptions(options, ['byteAligned', 'prefix']);\n\n                options = { byteAligned: false, prefix: false, ...options };\n                assert(typeof options.byteAligned === 'boolean', 'byteAligned must be boolean');\n                assert(typeof options.prefix === 'boolean' || options.prefix === 'optional', 'prefix must be boolean or \"optional\"');\n\n                return this.$_addRule({ name: 'hex', args: { options } });\n            },\n            validate(value, helpers, { options }) {\n\n                const re = options.prefix === 'optional' ?\n                    internals.hexRegex.withOptionalPrefix :\n                    options.prefix === true ?\n                        internals.hexRegex.withPrefix :\n                        internals.hexRegex.withoutPrefix;\n                if (!re.test(value)) {\n                    return helpers.error('string.hex');\n                }\n\n                if (options.byteAligned &&\n                    value.length % 2 !== 0) {\n\n                    return helpers.error('string.hexAlign');\n                }\n\n                return value;\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'hex';\n                return res;\n            }\n        },\n\n        hostname: {\n            method() {\n\n                return this.$_addRule('hostname');\n            },\n            validate(value, helpers) {\n\n                if (isDomainValid(value, { minDomainSegments: 1 }) ||\n                    internals.ipRegex.test(value)) {\n\n                    return value;\n                }\n\n                return helpers.error('string.hostname');\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'hostname';\n                return res;\n            }\n        },\n\n        insensitive: {\n            method() {\n\n                return this.$_setFlag('insensitive', true);\n            }\n        },\n\n        ip: {\n            method(options = {}) {\n\n                Common.assertOptions(options, ['cidr', 'version']);\n\n                const { cidr, versions, regex } = ipRegex(options);\n                const version = options.version ? versions : undefined;\n                return this.$_addRule({ name: 'ip', args: { options: { cidr, version } }, regex });\n            },\n            validate(value, helpers, { options }, { regex }) {\n\n                if (regex.test(value)) {\n                    return value;\n                }\n\n                if (options.version) {\n                    return helpers.error('string.ipVersion', { value, cidr: options.cidr, version: options.version });\n                }\n\n                return helpers.error('string.ip', { value, cidr: options.cidr });\n            },\n            jsonSchema(rule, res) {\n\n                const version = rule.args.options.version;\n                if (version && version.length === 1) {\n                    res.format = version[0];\n                }\n                else {\n                    res.format = 'ip';\n                }\n\n                return res;\n            }\n        },\n\n        isoDate: {\n            method() {\n\n                return this.$_addRule('isoDate');\n            },\n            validate(value, { error }) {\n\n                if (internals.isoDate(value)) {\n                    return value;\n                }\n\n                return error('string.isoDate');\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'date-time';\n                return res;\n            }\n        },\n\n        isoDuration: {\n            method() {\n\n                return this.$_addRule('isoDuration');\n            },\n            validate(value, helpers) {\n\n                if (internals.isoDurationRegex.test(value)) {\n                    return value;\n                }\n\n                return helpers.error('string.isoDuration');\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'duration';\n                return res;\n            }\n        },\n\n        length: {\n            method(limit, encoding) {\n\n                return internals.length(this, 'length', limit, '=', encoding);\n            },\n            validate(value, helpers, { limit, encoding }, { name, operator, args }) {\n\n                const length = encoding ? Buffer && Buffer.byteLength(value, encoding) : value.length;      // $lab:coverage:ignore$\n                if (Common.compare(length, limit, operator)) {\n                    return value;\n                }\n\n                return helpers.error('string.' + name, { limit: args.limit, value, encoding });\n            },\n            jsonSchema(rule, res) {\n\n                res.minLength = rule.args.limit;\n                res.maxLength = rule.args.limit;\n                return res;\n            },\n            args: [\n                {\n                    name: 'limit',\n                    ref: true,\n                    assert: Common.limit,\n                    message: 'must be a positive integer'\n                },\n                'encoding'\n            ]\n        },\n\n        lowercase: {\n            method() {\n\n                return this.case('lower');\n            }\n        },\n\n        max: {\n            method(limit, encoding) {\n\n                return internals.length(this, 'max', limit, '<=', encoding);\n            },\n            jsonSchema(rule, res) {\n\n                res.maxLength = rule.args.limit;\n                return res;\n            },\n            args: ['limit', 'encoding']\n        },\n\n        min: {\n            method(limit, encoding) {\n\n                return internals.length(this, 'min', limit, '>=', encoding);\n            },\n            jsonSchema(rule, res) {\n\n                if (rule.args.limit > 0) {\n\n                    res.minLength = rule.args.limit;\n                }\n\n                return res;\n            },\n            args: ['limit', 'encoding']\n        },\n\n        normalize: {\n            method(form = 'NFC') {\n\n                assert(internals.normalizationForms.includes(form), 'normalization form must be one of ' + internals.normalizationForms.join(', '));\n\n                return this.$_addRule({ name: 'normalize', args: { form } });\n            },\n            validate(value, { error }, { form }) {\n\n                if (value === value.normalize(form)) {\n                    return value;\n                }\n\n                return error('string.normalize', { value, form });\n            },\n            convert: true\n        },\n\n        pattern: {\n            alias: 'regex',\n            method(regex, options = {}) {\n\n                assert(regex instanceof RegExp, 'regex must be a RegExp');\n                assert(!regex.flags.includes('g') && !regex.flags.includes('y'), 'regex should not use global or sticky mode');\n\n                if (typeof options === 'string') {\n                    options = { name: options };\n                }\n\n                Common.assertOptions(options, ['invert', 'name']);\n\n                const errorCode = ['string.pattern', options.invert ? '.invert' : '', options.name ? '.name' : '.base'].join('');\n                return this.$_addRule({ name: 'pattern', args: { regex, options }, errorCode });\n            },\n            validate(value, helpers, { regex, options }, { errorCode }) {\n\n                const patternMatch = regex.test(value);\n\n                if (patternMatch ^ options.invert) {\n                    return value;\n                }\n\n                return helpers.error(errorCode, { name: options.name, regex, value });\n            },\n            jsonSchema(rule, res) {\n\n                res.pattern = rule.args.regex.source;\n                return res;\n            },\n            args: ['regex', 'options'],\n            multi: true\n        },\n\n        replace: {\n            method(pattern, replacement) {\n\n                if (typeof pattern === 'string') {\n                    pattern = new RegExp(escapeRegex(pattern), 'g');\n                }\n\n                assert(pattern instanceof RegExp, 'pattern must be a RegExp');\n                assert(typeof replacement === 'string', 'replacement must be a String');\n\n                const obj = this.clone();\n\n                if (!obj.$_terms.replacements) {\n                    obj.$_terms.replacements = [];\n                }\n\n                obj.$_terms.replacements.push({ pattern, replacement });\n                return obj;\n            }\n        },\n\n        token: {\n            method() {\n\n                return this.$_addRule('token');\n            },\n            validate(value, helpers) {\n\n                if (/^\\w+$/.test(value)) {\n                    return value;\n                }\n\n                return helpers.error('string.token');\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'token';\n                return res;\n            }\n        },\n\n        trim: {\n            method(enabled = true) {\n\n                assert(typeof enabled === 'boolean', 'enabled must be a boolean');\n\n                return this.$_addRule({ name: 'trim', args: { enabled } });\n            },\n            validate(value, helpers, { enabled }) {\n\n                if (!enabled ||\n                    value === value.trim()) {\n\n                    return value;\n                }\n\n                return helpers.error('string.trim');\n            },\n            convert: true\n        },\n\n        truncate: {\n            method(enabled = true) {\n\n                assert(typeof enabled === 'boolean', 'enabled must be a boolean');\n\n                return this.$_setFlag('truncate', enabled);\n            }\n        },\n\n        uppercase: {\n            method() {\n\n                return this.case('upper');\n            }\n        },\n\n        uri: {\n            method(options = {}) {\n\n                Common.assertOptions(options, ['allowRelative', 'allowQuerySquareBrackets', 'domain', 'relativeOnly', 'scheme', 'encodeUri']);\n\n                if (options.domain) {\n                    Common.assertOptions(options.domain, ['allowFullyQualified', 'allowUnicode', 'maxDomainSegments', 'minDomainSegments', 'tlds']);\n                }\n\n                const { regex, scheme } = uriRegex(options);\n                const domain = options.domain ? internals.addressOptions(options.domain) : null;\n                return this.$_addRule({ name: 'uri', args: { options }, regex, domain, scheme });\n            },\n            validate(value, helpers, { options }, { regex, domain, scheme }) {\n\n                if (['http:/', 'https:/'].includes(value)) {            // scheme:/ is technically valid but makes no sense\n                    return helpers.error('string.uri');\n                }\n\n                let match = regex.exec(value);\n\n                if (!match && helpers.prefs.convert && options.encodeUri) {\n                    const encoded = encodeURI(value);\n                    match = regex.exec(encoded);\n                    if (match) {\n                        value = encoded;\n                    }\n                }\n\n                if (match) {\n                    const matched = match[1] || match[2];\n                    if (domain &&\n                        (!options.allowRelative || matched) &&\n                        !isDomainValid(matched, domain)) {\n\n                        return helpers.error('string.domain', { value: matched });\n                    }\n\n                    return value;\n                }\n\n                if (options.relativeOnly) {\n                    return helpers.error('string.uriRelativeOnly');\n                }\n\n                if (options.scheme) {\n                    return helpers.error('string.uriCustomScheme', { scheme, value });\n                }\n\n                return helpers.error('string.uri');\n            },\n            jsonSchema(rule, res) {\n\n                res.format = 'uri';\n                return res;\n            }\n        }\n    },\n\n    manifest: {\n\n        build(obj, desc) {\n\n            if (desc.replacements) {\n                for (const { pattern, replacement } of desc.replacements) {\n                    obj = obj.replace(pattern, replacement);\n                }\n            }\n\n            return obj;\n        }\n    },\n\n    messages: {\n        'string.alphanum': '{{#label}} must only contain alpha-numeric characters',\n        'string.base': '{{#label}} must be a string',\n        'string.base64': '{{#label}} must be a valid base64 string',\n        'string.creditCard': '{{#label}} must be a credit card',\n        'string.dataUri': '{{#label}} must be a valid dataUri string',\n        'string.domain': '{{#label}} must contain a valid domain name',\n        'string.email': '{{#label}} must be a valid email',\n        'string.empty': '{{#label}} is not allowed to be empty',\n        'string.guid': '{{#label}} must be a valid GUID',\n        'string.hex': '{{#label}} must only contain hexadecimal characters',\n        'string.hexAlign': '{{#label}} hex decoded representation must be byte aligned',\n        'string.hostname': '{{#label}} must be a valid hostname',\n        'string.ip': '{{#label}} must be a valid ip address with a {{#cidr}} CIDR',\n        'string.ipVersion': '{{#label}} must be a valid ip address of one of the following versions {{#version}} with a {{#cidr}} CIDR',\n        'string.isoDate': '{{#label}} must be in iso format',\n        'string.isoDuration': '{{#label}} must be a valid ISO 8601 duration',\n        'string.length': '{{#label}} length must be {{#limit}} characters long',\n        'string.lowercase': '{{#label}} must only contain lowercase characters',\n        'string.max': '{{#label}} length must be less than or equal to {{#limit}} characters long',\n        'string.min': '{{#label}} length must be at least {{#limit}} characters long',\n        'string.normalize': '{{#label}} must be unicode normalized in the {{#form}} form',\n        'string.token': '{{#label}} must only contain alpha-numeric and underscore characters',\n        'string.pattern.base': '{{#label}} with value {:[.]} fails to match the required pattern: {{#regex}}',\n        'string.pattern.name': '{{#label}} with value {:[.]} fails to match the {{#name}} pattern',\n        'string.pattern.invert.base': '{{#label}} with value {:[.]} matches the inverted pattern: {{#regex}}',\n        'string.pattern.invert.name': '{{#label}} with value {:[.]} matches the inverted {{#name}} pattern',\n        'string.trim': '{{#label}} must not have leading or trailing whitespace',\n        'string.uri': '{{#label}} must be a valid uri',\n        'string.uriCustomScheme': '{{#label}} must be a valid uri with a scheme matching the {{#scheme}} pattern',\n        'string.uriRelativeOnly': '{{#label}} must be a valid relative uri',\n        'string.uppercase': '{{#label}} must only contain uppercase characters'\n    }\n});\n\n\n// Helpers\n\ninternals.addressOptions = function (options) {\n\n    if (!options) {\n        return internals.tlds || options;      // $lab:coverage:ignore$\n    }\n\n    // minDomainSegments\n\n    assert(options.minDomainSegments === undefined ||\n        Number.isSafeInteger(options.minDomainSegments) && options.minDomainSegments > 0, 'minDomainSegments must be a positive integer');\n\n    // maxDomainSegments\n\n    assert(options.maxDomainSegments === undefined ||\n        Number.isSafeInteger(options.maxDomainSegments) && options.maxDomainSegments > 0, 'maxDomainSegments must be a positive integer');\n\n    // tlds\n\n    if (options.tlds === false) {\n        return options;\n    }\n\n    if (options.tlds === true ||\n        options.tlds === undefined) {\n\n        assert(internals.tlds, 'Built-in TLD list disabled');\n        return Object.assign({}, options, internals.tlds);\n    }\n\n    assert(typeof options.tlds === 'object', 'tlds must be true, false, or an object');\n\n    const deny = options.tlds.deny;\n    if (deny) {\n        if (Array.isArray(deny)) {\n            options = Object.assign({}, options, { tlds: { deny: new Set(deny) } });\n        }\n\n        assert(options.tlds.deny instanceof Set, 'tlds.deny must be an array, Set, or boolean');\n        assert(!options.tlds.allow, 'Cannot specify both tlds.allow and tlds.deny lists');\n        internals.validateTlds(options.tlds.deny, 'tlds.deny');\n        return options;\n    }\n\n    const allow = options.tlds.allow;\n    if (!allow) {\n        return { ...options, tlds: false };\n    }\n\n    if (allow === true) {\n        assert(internals.tlds, 'Built-in TLD list disabled');\n        return Object.assign({}, options, internals.tlds);\n    }\n\n    if (Array.isArray(allow)) {\n        options = Object.assign({}, options, { tlds: { allow: new Set(allow) } });\n    }\n\n    assert(options.tlds.allow instanceof Set, 'tlds.allow must be an array, Set, or boolean');\n    internals.validateTlds(options.tlds.allow, 'tlds.allow');\n    return options;\n};\n\n\ninternals.validateTlds = function (set, source) {\n\n    for (const tld of set) {\n        assert(isDomainValid(tld, { minDomainSegments: 1, maxDomainSegments: 1 }), `${source} must contain valid top level domain names`);\n    }\n};\n\n\ninternals.isoDate = function (value) {\n\n    if (!Common.isIsoDate(value)) {\n        return null;\n    }\n\n    if (/.*T.*[+-]\\d\\d$/.test(value)) {             // Add missing trailing zeros to timeshift\n        value += '00';\n    }\n\n    const date = new Date(value);\n    if (isNaN(date.getTime())) {\n        return null;\n    }\n\n    return date.toISOString();\n};\n\n\ninternals.length = function (schema, name, limit, operator, encoding) {\n\n    assert(!encoding || Buffer && Buffer.isEncoding(encoding), 'Invalid encoding:', encoding);      // $lab:coverage:ignore$\n\n    return schema.$_addRule({ name, method: 'length', args: { limit, encoding }, operator });\n};\n","'use strict';\n\nconst { assert } = require('@hapi/hoek');\n\nconst Any = require('./any');\n\n\nconst internals = {};\n\n\ninternals.Map = class extends Map {\n\n    slice() {\n\n        return new internals.Map(this);\n    }\n};\n\n\nmodule.exports = Any.extend({\n\n    type: 'symbol',\n\n    terms: {\n\n        map: { init: new internals.Map() }\n    },\n\n    coerce: {\n        method(value, { schema, error }) {\n\n            const lookup = schema.$_terms.map.get(value);\n            if (lookup) {\n                value = lookup;\n            }\n\n            if (!schema._flags.only ||\n                typeof value === 'symbol') {\n\n                return { value };\n            }\n\n            return { value, errors: error('symbol.map', { map: schema.$_terms.map }) };\n        }\n    },\n\n    validate(value, { error }) {\n\n        if (typeof value !== 'symbol') {\n            return { value, errors: error('symbol.base') };\n        }\n    },\n\n    rules: {\n        map: {\n            method(iterable) {\n\n                if (iterable &&\n                    !iterable[Symbol.iterator] &&\n                    typeof iterable === 'object') {\n\n                    iterable = Object.entries(iterable);\n                }\n\n                assert(iterable && iterable[Symbol.iterator], 'Iterable must be an iterable or object');\n\n                const obj = this.clone();\n\n                const symbols = [];\n                for (const entry of iterable) {\n                    assert(entry && entry[Symbol.iterator], 'Entry must be an iterable');\n                    const [key, value] = entry;\n\n                    assert(typeof key !== 'object' && typeof key !== 'function' && typeof key !== 'symbol', 'Key must not be of type object, function, or Symbol');\n                    assert(typeof value === 'symbol', 'Value must be a Symbol');\n\n                    obj.$_terms.map.set(key, value);\n                    symbols.push(value);\n                }\n\n                return obj.valid(...symbols);\n            }\n        }\n    },\n\n    manifest: {\n\n        build(obj, desc) {\n\n            if (desc.map) {\n                obj = obj.map(desc.map);\n            }\n\n            return obj;\n        }\n    },\n\n    jsonSchema(schema, json, mode, options) {\n\n        const map = schema.$_terms.map;\n        if (!map.size) {\n            return {};\n        }\n\n        return {\n            anyOf: Array.from(map.keys()).map((key) => ({ const: key }))\n        };\n    },\n\n    messages: {\n        'symbol.base': '{{#label}} must be a symbol',\n        'symbol.map': '{{#label}} must be one of {{#map}}'\n    }\n});\n","'use strict';\n\nconst { assert, clone } = require('@hapi/hoek');\n\nconst Cache = require('./cache');\nconst Common = require('./common');\nconst Compile = require('./compile');\nconst Errors = require('./errors');\nconst Extend = require('./extend');\nconst Manifest = require('./manifest');\nconst Ref = require('./ref');\nconst Template = require('./template');\nconst Trace = require('./trace');\n\nlet Schemas;\n\n\nconst internals = {\n    types: {\n        alternatives: require('./types/alternatives'),\n        any: require('./types/any'),\n        array: require('./types/array'),\n        boolean: require('./types/boolean'),\n        date: require('./types/date'),\n        function: require('./types/function'),\n        link: require('./types/link'),\n        number: require('./types/number'),\n        object: require('./types/object'),\n        string: require('./types/string'),\n        symbol: require('./types/symbol')\n    },\n    aliases: {\n        alt: 'alternatives',\n        bool: 'boolean',\n        func: 'function'\n    }\n};\n\n\nif (Buffer) {                                                           // $lab:coverage:ignore$\n    internals.types.binary = require('./types/binary');\n}\n\n\ninternals.root = function () {\n\n    const root = {\n        _types: new Set(Object.keys(internals.types))\n    };\n\n    // Types\n\n    for (const type of root._types) {\n        root[type] = function (...args) {\n\n            assert(!args.length || ['alternatives', 'link', 'object'].includes(type), 'The', type, 'type does not allow arguments');\n            return internals.generate(this, internals.types[type], args);\n        };\n    }\n\n    // Shortcuts\n\n    for (const method of ['allow', 'custom', 'disallow', 'equal', 'exist', 'forbidden', 'invalid', 'not', 'only', 'optional', 'options', 'prefs', 'preferences', 'required', 'strip', 'valid', 'when']) {\n        root[method] = function (...args) {\n\n            return this.any()[method](...args);\n        };\n    }\n\n    // Methods\n\n    Object.assign(root, internals.methods);\n\n    // Aliases\n\n    for (const alias in internals.aliases) {\n        const target = internals.aliases[alias];\n        root[alias] = root[target];\n    }\n\n    root.x = root.expression;\n\n    // Trace\n\n    if (Trace.setup) {                                          // $lab:coverage:ignore$\n        Trace.setup(root);\n    }\n\n    return root;\n};\n\n\ninternals.methods = {\n\n    ValidationError: Errors.ValidationError,\n    version: Common.version,\n    cache: Cache.provider,\n\n    assert(value, schema, ...args /* [message], [options] */) {\n\n        internals.assert(value, schema, true, args);\n    },\n\n    attempt(value, schema, ...args /* [message], [options] */) {\n\n        return internals.assert(value, schema, false, args);\n    },\n\n    build(desc) {\n\n        assert(typeof Manifest.build === 'function', 'Manifest functionality disabled');\n        return Manifest.build(this, desc);\n    },\n\n    checkPreferences(prefs) {\n\n        Common.checkPreferences(prefs);\n    },\n\n    compile(schema, options) {\n\n        return Compile.compile(this, schema, options);\n    },\n\n    defaults(modifier) {\n\n        assert(typeof modifier === 'function', 'modifier must be a function');\n\n        const joi = Object.assign({}, this);\n        for (const type of joi._types) {\n            const schema = modifier(joi[type]());\n            assert(Common.isSchema(schema), 'modifier must return a valid schema object');\n\n            joi[type] = function (...args) {\n\n                return internals.generate(this, schema, args);\n            };\n        }\n\n        return joi;\n    },\n\n    expression(...args) {\n\n        return new Template(...args);\n    },\n\n    extend(...extensions) {\n\n        Common.verifyFlat(extensions, 'extend');\n\n        Schemas = Schemas || require('./schemas');\n\n        assert(extensions.length, 'You need to provide at least one extension');\n        this.assert(extensions, Schemas.extensions);\n\n        const joi = Object.assign({}, this);\n        joi._types = new Set(joi._types);\n\n        for (let extension of extensions) {\n            if (typeof extension === 'function') {\n                extension = extension(joi);\n            }\n\n            this.assert(extension, Schemas.extension);\n\n            const expanded = internals.expandExtension(extension, joi);\n            for (const item of expanded) {\n                assert(joi[item.type] === undefined || joi._types.has(item.type), 'Cannot override name', item.type);\n\n                const base = item.base || this.any();\n                const schema = Extend.type(base, item);\n\n                joi._types.add(item.type);\n                joi[item.type] = function (...args) {\n\n                    return internals.generate(this, schema, args);\n                };\n            }\n        }\n\n        return joi;\n    },\n\n    isError: Errors.ValidationError.isError,\n    isExpression: Template.isTemplate,\n    isRef: Ref.isRef,\n    isSchema: Common.isSchema,\n\n    in(...args) {\n\n        return Ref.in(...args);\n    },\n\n    override: Common.symbols.override,\n\n    ref(...args) {\n\n        return Ref.create(...args);\n    },\n\n    types() {\n\n        const types = {};\n        for (const type of this._types) {\n            types[type] = this[type]();\n        }\n\n        for (const target in internals.aliases) {\n            types[target] = this[target]();\n        }\n\n        return types;\n    }\n};\n\n\n// Helpers\n\ninternals.assert = function (value, schema, annotate, args /* [message], [options] */) {\n\n    const message = args[0] instanceof Error || typeof args[0] === 'string' ? args[0] : null;\n    const options = message !== null ? args[1] : args[0];\n    const result = schema.validate(value, Common.preferences({ errors: { stack: true } }, options || {}));\n\n    let error = result.error;\n    if (!error) {\n        return result.value;\n    }\n\n    if (message instanceof Error) {\n        throw message;\n    }\n\n    const display = annotate && typeof error.annotate === 'function' ? error.annotate() : error.message;\n\n    if (error instanceof Errors.ValidationError === false) {\n        error = clone(error);\n    }\n\n    error.message = message ? `${message} ${display}` : display;\n    throw error;\n};\n\n\ninternals.generate = function (root, schema, args) {\n\n    assert(root, 'Must be invoked on a Joi instance.');\n\n    schema.$_root = root;\n\n    if (!schema._definition.args ||\n        !args.length) {\n\n        return schema;\n    }\n\n    return schema._definition.args(schema, ...args);\n};\n\n\ninternals.expandExtension = function (extension, joi) {\n\n    if (typeof extension.type === 'string') {\n        return [extension];\n    }\n\n    const extended = [];\n    for (const type of joi._types) {\n        if (extension.type.test(type)) {\n            const item = Object.assign({}, extension);\n            item.type = type;\n            item.base = joi[type]();\n            extended.push(item);\n        }\n    }\n\n    return extended;\n};\n\n\nmodule.exports = internals.root();\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16,35,41,42,43,44,45,46,47],"mappings":"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"}