{"version":3,"file":"menu-BHN315YA.js","names":[],"sources":["../../node_modules/@tingdahl/tsutils/dist/ui/pagemanager.js","../../node_modules/protobufjs/src/util/patterns.js","../../node_modules/protobufjs/src/util/codegen.js","../../__vite-browser-external","../../node_modules/protobufjs/src/util/fs.js","../../node_modules/protobufjs/src/util/fetch.js","../../node_modules/protobufjs/src/util/path.js","../../node_modules/protobufjs/src/namespace.js","../../node_modules/protobufjs/src/mapfield.js","../../node_modules/protobufjs/src/method.js","../../node_modules/protobufjs/src/service.js","../../node_modules/protobufjs/src/message.js","../../node_modules/protobufjs/src/decoder.js","../../node_modules/protobufjs/src/verifier.js","../../node_modules/protobufjs/src/converter.js","../../node_modules/protobufjs/src/wrappers.js","../../node_modules/protobufjs/src/type.js","../../node_modules/protobufjs/src/root.js","../../node_modules/protobufjs/src/util.js","../../node_modules/protobufjs/src/types.js","../../node_modules/protobufjs/src/field.js","../../node_modules/protobufjs/src/oneof.js","../../node_modules/protobufjs/src/object.js","../../node_modules/protobufjs/src/enum.js","../../node_modules/protobufjs/src/encoder.js","../../node_modules/protobufjs/src/index-light.js","../../node_modules/protobufjs/src/tokenize.js","../../node_modules/protobufjs/src/parse.js","../../node_modules/protobufjs/src/common.js","../../node_modules/protobufjs/src/index.js","../../node_modules/protobufjs/index.js","../../src/auth-icons.ts","../../src/core/auth.ts","../../node_modules/@tingdahl/tsutils/dist/net/signed_url.js","../../src/core/entitlement_utils.ts","../../src/core/menu.ts"],"sourcesContent":["export class PanelHandler {\n    id;\n    async refresh() {\n    }\n    constructor(id) {\n        this.id = id;\n    }\n    async init() {\n        return Promise.resolve();\n    }\n}\nexport class PageManager {\n    parentElementId;\n    panels;\n    activePanelId = null;\n    onPanelShown;\n    constructor(parentElementId) {\n        this.parentElementId = parentElementId;\n        this.panels = new Map();\n    }\n    /**\n     * Registers a pre-instantiated panel handler.\n     */\n    addPanel(panel) {\n        this.panels.set(panel.id, {\n            instance: panel,\n            isInitialized: false,\n        });\n    }\n    /**\n     * Registers a lazily loaded panel with a loader function that imports and instantiates the panel.\n     */\n    registerPage(id, loader) {\n        this.panels.set(id, {\n            loader,\n            isInitialized: false,\n        });\n    }\n    /**\n     * Initializes any pre-instantiated panels that have been added via addPanel.\n     * Lazy panels will be initialized on first demand in showPanel.\n     */\n    async init() {\n        const initPromises = [];\n        for (const entry of this.panels.values()) {\n            if (entry.instance && !entry.isInitialized) {\n                entry.isInitialized = true;\n                initPromises.push(entry.instance.init());\n            }\n        }\n        await Promise.all(initPromises);\n    }\n    /**\n     * Shows the specified panel by ID, loading and initializing its module if needed.\n     */\n    async showPanel(id) {\n        this.activePanelId = id;\n        const entry = this.panels.get(id);\n        if (!entry) {\n            console.warn(`PageManager: No panel registered with ID \"${id}\"`);\n            this.updateDomVisibility(id);\n            if (this.onPanelShown) {\n                this.onPanelShown(id);\n            }\n            return;\n        }\n        try {\n            // Load instance if not yet instantiated\n            if (!entry.instance) {\n                if (!entry.loader) {\n                    throw new Error(`PageManager: Panel \"${id}\" has neither an instance nor a loader`);\n                }\n                if (!entry.loadPromise) {\n                    entry.loadPromise = entry.loader();\n                }\n                entry.instance = await entry.loadPromise;\n            }\n            // Initialize once if not already initialized\n            if (!entry.isInitialized) {\n                entry.isInitialized = true;\n                await entry.instance.init();\n            }\n            // Refresh panel data/UI\n            await entry.instance.refresh();\n            // Guard against race conditions (user clicked another tab while loading)\n            if (this.activePanelId === id) {\n                this.updateDomVisibility(id);\n                if (this.onPanelShown) {\n                    this.onPanelShown(id);\n                }\n            }\n        }\n        catch (error) {\n            console.error(`PageManager: Failed to show panel \"${id}\":`, error);\n        }\n    }\n    getActivePanelId() {\n        return this.activePanelId;\n    }\n    async refreshActivePanel() {\n        if (!this.activePanelId)\n            return;\n        const entry = this.panels.get(this.activePanelId);\n        if (entry?.instance && entry.isInitialized) {\n            try {\n                await entry.instance.refresh();\n            }\n            catch (error) {\n                console.error(`PageManager: Failed to refresh active panel \"${this.activePanelId}\":`, error);\n            }\n        }\n    }\n    updateDomVisibility(id) {\n        if (typeof document === 'undefined')\n            return;\n        const parentElement = document.getElementById(this.parentElementId);\n        if (parentElement) {\n            for (const child of Array.from(parentElement.children)) {\n                const htmlChild = child;\n                if (!this.panels.has(htmlChild.id) && htmlChild.id !== id) {\n                    continue;\n                }\n                const isCurrent = htmlChild.id === id;\n                htmlChild.hidden = !isCurrent;\n                htmlChild.style.display = isCurrent ? 'block' : 'none';\n            }\n        }\n        else {\n            console.error(`PageManager: Could not find parent element with ID ${this.parentElementId}`);\n        }\n    }\n}\n//# sourceMappingURL=pagemanager.js.map","\"use strict\";\n\nvar patterns = exports;\n\npatterns.numberRe    = /^(?![eE])[0-9]*(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/;\npatterns.typeRefRe   = /^(?:\\.?[a-zA-Z_][a-zA-Z_0-9]*)(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*$/;\npatterns.reservedRe  = /^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$/;\n","\"use strict\";\nmodule.exports = codegen;\n\nvar patterns = require(\"./patterns\");\nvar reservedRe = patterns.reservedRe;\n\n/**\n * Begins generating a function.\n * @memberof util\n * @param {string[]} functionParams Function parameter names\n * @param {string} [functionName] Function name if not anonymous\n * @returns {Codegen} Appender that appends code to the function's body\n */\nfunction codegen(functionParams, functionName) {\n\n    /* istanbul ignore if */\n    if (typeof functionParams === \"string\") {\n        functionName = functionParams;\n        functionParams = undefined;\n    }\n\n    var body = [];\n\n    /**\n     * Appends code to the function's body or finishes generation.\n     * @typedef Codegen\n     * @type {function}\n     * @param {string|Object.<string,*>} [formatStringOrScope] Format string or, to finish the function, an object of additional scope variables, if any\n     * @param {...*} [formatParams] Format parameters\n     * @returns {Codegen|Function} Itself or the generated function if finished\n     * @throws {Error} If format parameter counts do not match\n     */\n\n    function Codegen(formatStringOrScope) {\n        // note that explicit array handling below makes this ~50% faster\n\n        // finish the function\n        if (typeof formatStringOrScope !== \"string\") {\n            var source = toString();\n            if (codegen.verbose)\n                console.log(\"codegen: \" + source); // eslint-disable-line no-console\n            source = \"return \" + source;\n            if (formatStringOrScope) {\n                var scopeKeys   = Object.keys(formatStringOrScope),\n                    scopeParams = new Array(scopeKeys.length + 1),\n                    scopeValues = new Array(scopeKeys.length),\n                    scopeOffset = 0;\n                while (scopeOffset < scopeKeys.length) {\n                    scopeParams[scopeOffset] = scopeKeys[scopeOffset];\n                    scopeValues[scopeOffset] = formatStringOrScope[scopeKeys[scopeOffset++]];\n                }\n                scopeParams[scopeOffset] = source;\n                return Function.apply(null, scopeParams).apply(null, scopeValues); // eslint-disable-line no-new-func\n            }\n            return Function(source)(); // eslint-disable-line no-new-func\n        }\n\n        // otherwise append to body\n        var formatParams = new Array(arguments.length - 1),\n            formatOffset = 0;\n        while (formatOffset < formatParams.length)\n            formatParams[formatOffset] = arguments[++formatOffset];\n        formatOffset = 0;\n        formatStringOrScope = formatStringOrScope.replace(/%([%dfijs])/g, function replace($0, $1) {\n            var value = formatParams[formatOffset++];\n            switch ($1) {\n                case \"d\": case \"f\":\n                    value = Number(value);\n                    return Object.is(value, -0) ? \"-0\" : String(value);\n                case \"i\": return String(Math.floor(value));\n                case \"j\": return JSON.stringify(value);\n                case \"s\": return String(value);\n            }\n            return \"%\";\n        });\n        if (formatOffset !== formatParams.length)\n            throw Error(\"parameter count mismatch\");\n        body.push(formatStringOrScope);\n        return Codegen;\n    }\n\n    function toString(functionNameOverride) {\n        return \"function \" + safeFunctionName(functionNameOverride || functionName) + \"(\" + (functionParams && functionParams.join(\",\") || \"\") + \"){\\n  \" + body.join(\"\\n  \") + \"\\n}\";\n    }\n\n    Object.defineProperty(Codegen, \"toString\", {\n        value: toString,\n        writable: true,\n        enumerable: true,\n        configurable: true\n    });\n    return Codegen;\n}\n\n/**\n * Begins generating a function.\n * @memberof util\n * @function codegen\n * @param {string} [functionName] Function name if not anonymous\n * @returns {Codegen} Appender that appends code to the function's body\n * @variation 2\n */\n\n/**\n * When set to `true`, codegen will log generated code to console. Useful for debugging.\n * @name util.codegen.verbose\n * @type {boolean}\n */\ncodegen.verbose = false;\n\nfunction safeFunctionName(name) {\n    if (!name)\n        return \"\";\n    name = String(name).replace(/[^\\w$]/g, \"\");\n    if (!name)\n        return \"\";\n    if (/^\\d/.test(name))\n        name = \"_\" + name;\n    return reservedRe.test(name) ? name + \"_\" : name;\n}\n","module.exports = {}","\"use strict\";\n\nvar fs = null;\ntry {\n    fs = require(/* webpackIgnore: true */ \"fs\");\n    if (!fs || !fs.readFile || !fs.readFileSync)\n        fs = null;\n} catch (e) {\n    // `fs` is unavailable in browsers and browser-like bundles.\n}\nmodule.exports = fs;\n","\"use strict\";\nmodule.exports = fetch;\n\nvar asPromise = require(\"./aspromise\"),\n    fs        = require(\"./fs\");\n\n/**\n * Node-style callback as used by {@link util.fetch}.\n * @typedef FetchCallback\n * @type {function}\n * @param {?Error} error Error, if any, otherwise `null`\n * @param {string} [contents] File contents, if there hasn't been an error\n * @returns {undefined}\n */\n\n/**\n * Options as used by {@link util.fetch}.\n * @interface IFetchOptions\n * @property {boolean} [binary=false] Whether expecting a binary response\n * @property {boolean} [xhr=false] If `true`, forces the use of XMLHttpRequest\n */\n\n/**\n * Fetches the contents of a file.\n * @memberof util\n * @param {string} filename File path or url\n * @param {IFetchOptions} options Fetch options\n * @param {FetchCallback} callback Callback function\n * @returns {undefined}\n */\nfunction fetch(filename, options, callback) {\n    if (typeof options === \"function\") {\n        callback = options;\n        options = {};\n    } else if (!options)\n        options = {};\n\n    if (!callback)\n        return asPromise(fetch, this, filename, options); // eslint-disable-line no-invalid-this\n\n    // if a node-like filesystem is present, try it first but fall back to XHR if nothing is found.\n    if (!options.xhr && fs && fs.readFile)\n        return fs.readFile(filename, function fetchReadFileCallback(err, contents) {\n            return err && typeof XMLHttpRequest !== \"undefined\"\n                ? fetch.xhr(filename, options, callback)\n                : err\n                ? callback(err)\n                : callback(null, options.binary ? contents : contents.toString(\"utf8\"));\n        });\n\n    // use the XHR version otherwise.\n    return fetch.xhr(filename, options, callback);\n}\n\n/**\n * Fetches the contents of a file.\n * @name util.fetch\n * @function\n * @param {string} path File path or url\n * @param {FetchCallback} callback Callback function\n * @returns {undefined}\n * @variation 2\n */\n\n/**\n * Fetches the contents of a file.\n * @name util.fetch\n * @function\n * @param {string} path File path or url\n * @param {IFetchOptions} [options] Fetch options\n * @returns {Promise<string|Uint8Array>} Promise\n * @variation 3\n */\n\n/**/\nfetch.xhr = function fetch_xhr(filename, options, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.onreadystatechange /* works everywhere */ = function fetchOnReadyStateChange() {\n\n        if (xhr.readyState !== 4)\n            return undefined;\n\n        // local cors security errors return status 0 / empty string, too. afaik this cannot be\n        // reliably distinguished from an actually empty file for security reasons. feel free\n        // to send a pull request if you are aware of a solution.\n        if (xhr.status !== 0 && xhr.status !== 200)\n            return callback(Error(\"status \" + xhr.status));\n\n        // if binary data is expected, make sure that some sort of array is returned, even if\n        // ArrayBuffers are not supported. the binary string fallback, however, is unsafe.\n        if (options.binary) {\n            var buffer = xhr.response;\n            if (!buffer) {\n                buffer = [];\n                for (var i = 0; i < xhr.responseText.length; ++i)\n                    buffer.push(xhr.responseText.charCodeAt(i) & 255);\n            }\n            return callback(null, typeof Uint8Array !== \"undefined\" ? new Uint8Array(buffer) : buffer);\n        }\n        return callback(null, xhr.responseText);\n    };\n\n    if (options.binary) {\n        // ref: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data#Receiving_binary_data_in_older_browsers\n        if (\"overrideMimeType\" in xhr)\n            xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n        xhr.responseType = \"arraybuffer\";\n    }\n\n    xhr.open(\"GET\", filename);\n    xhr.send();\n};\n","\"use strict\";\n\n/**\n * A minimal path module to resolve Unix, Windows and URL paths alike.\n * @memberof util\n * @namespace\n */\nvar path = exports;\n\nvar urlRe = /^[a-zA-Z][a-zA-Z0-9+.-]+:\\/\\//;\n\nfunction normalizeUrl(path) {\n    if (typeof URL === \"undefined\" || !urlRe.test(path))\n        return null;\n    try {\n        return new URL(path).href;\n    } catch (e) {\n        return null;\n    }\n}\n\nfunction resolveUrl(originPath, includePath) {\n    if (typeof URL === \"undefined\" || !urlRe.test(originPath) || urlRe.test(includePath))\n        return null;\n    try {\n        return new URL(includePath, originPath).href;\n    } catch (e) {\n        return null;\n    }\n}\n\nvar isAbsolute =\n/**\n * Tests if the specified path is absolute.\n * @param {string} path Path to test\n * @returns {boolean} `true` if path is absolute\n */\npath.isAbsolute = function isAbsolute(path) {\n    return /^(?:\\/|\\w+:|\\\\\\\\\\w+)/.test(path);\n};\n\nvar normalize =\n/**\n * Normalizes the specified path.\n * @param {string} path Path to normalize\n * @returns {string} Normalized path\n */\npath.normalize = function normalize(path) {\n    var normalizedUrl = normalizeUrl(path);\n    if (normalizedUrl)\n        return normalizedUrl;\n    var firstTwoCharacters = path.substring(0,2);\n    var uncPrefix = \"\";\n    if (firstTwoCharacters === \"\\\\\\\\\") {\n        uncPrefix = firstTwoCharacters;\n        path = path.substring(2);\n    }\n\n    path = path.replace(/\\\\/g, \"/\")\n               .replace(/\\/{2,}/g, \"/\");\n    var parts    = path.split(\"/\"),\n        absolute = isAbsolute(path),\n        prefix   = \"\";\n    if (absolute)\n        prefix = parts.shift() + \"/\";\n    for (var i = 0; i < parts.length;) {\n        if (parts[i] === \"..\") {\n            if (i > 0 && parts[i - 1] !== \"..\")\n                parts.splice(--i, 2);\n            else if (absolute)\n                parts.splice(i, 1);\n            else\n                ++i;\n        } else if (parts[i] === \".\")\n            parts.splice(i, 1);\n        else\n            ++i;\n    }\n    return uncPrefix + prefix + parts.join(\"/\");\n};\n\n/**\n * Resolves the specified include path against the specified origin path.\n * @param {string} originPath Path to the origin file\n * @param {string} includePath Include path relative to origin path\n * @param {boolean} [alreadyNormalized=false] `true` if both paths are already known to be normalized\n * @returns {string} Path to the include file\n */\npath.resolve = function resolve(originPath, includePath, alreadyNormalized) {\n    var resolvedUrl = resolveUrl(originPath, includePath);\n    if (resolvedUrl)\n        return resolvedUrl;\n    if (!alreadyNormalized)\n        includePath = normalize(includePath); // path or absolute url\n    if (isAbsolute(includePath))\n        return includePath;\n    if (!alreadyNormalized)\n        originPath = normalize(originPath);\n    return (originPath = originPath.replace(/(?:\\/|^)[^/]+$/, \"\")).length ? normalize(originPath + \"/\" + includePath) : includePath;\n};\n","\"use strict\";\nmodule.exports = Namespace;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\nNamespace.prototype = Object.create(ReflectionObject.prototype, {\n    constructor: {\n        value: Namespace,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nNamespace.className = \"Namespace\";\n\nvar Field    = require(\"./field\"),\n    util     = require(\"./util\"),\n    OneOf    = require(\"./oneof\");\n\nvar Type,    // cyclic\n    Service,\n    Enum;\n\n/**\n * Constructs a new namespace instance.\n * @name Namespace\n * @classdesc Reflected namespace.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Namespace name\n * @param {Object.<string,*>} [options] Declared options\n */\n\n/**\n * Constructs a namespace from JSON.\n * @memberof Namespace\n * @function\n * @param {string} name Namespace name\n * @param {Object.<string,*>} json JSON object\n * @param {number} [depth] Current nesting depth, defaults to `0`\n * @returns {Namespace} Created namespace\n * @throws {TypeError} If arguments are invalid\n */\nNamespace.fromJSON = function fromJSON(name, json, depth) {\n    if (depth === undefined)\n        depth = 0;\n    if (depth > util.recursionLimit)\n        throw Error(\"max depth exceeded\");\n    return new Namespace(name, json.options).addJSON(json.nested, depth);\n};\n\n/**\n * Converts an array of reflection objects to JSON.\n * @memberof Namespace\n * @param {ReflectionObject[]} array Object array\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {Object.<string,*>|undefined} JSON object or `undefined` when array is empty\n */\nfunction arrayToJSON(array, toJSONOptions) {\n    if (!(array && array.length))\n        return undefined;\n    var obj = {};\n    for (var i = 0; i < array.length; ++i)\n        obj[array[i].name] = array[i].toJSON(toJSONOptions);\n    return obj;\n}\n\nNamespace.arrayToJSON = arrayToJSON;\n\n/**\n * Tests if the specified id is reserved.\n * @param {Array.<number[]|string>|undefined} reserved Array of reserved ranges and names\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nNamespace.isReservedId = function isReservedId(reserved, id) {\n    if (reserved)\n        for (var i = 0; i < reserved.length; ++i)\n            if (typeof reserved[i] !== \"string\" && reserved[i][0] <= id && reserved[i][1] >= id)\n                return true;\n    return false;\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {Array.<number[]|string>|undefined} reserved Array of reserved ranges and names\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nNamespace.isReservedName = function isReservedName(reserved, name) {\n    if (reserved)\n        for (var i = 0; i < reserved.length; ++i)\n            if (reserved[i] === name)\n                return true;\n    return false;\n};\n\n/**\n * Not an actual constructor. Use {@link Namespace} instead.\n * @classdesc Base class of all reflection objects containing nested objects. This is not an actual class but here for the sake of having consistent type definitions.\n * @exports NamespaceBase\n * @extends ReflectionObject\n * @abstract\n * @constructor\n * @param {string} name Namespace name\n * @param {Object.<string,*>} [options] Declared options\n * @see {@link Namespace}\n */\nfunction Namespace(name, options) {\n    ReflectionObject.call(this, name, options);\n\n    /**\n     * Nested objects by name.\n     * @type {Object.<string,ReflectionObject>|undefined}\n     */\n    this.nested = undefined; // toJSON\n\n    /**\n     * Cached nested objects as an array.\n     * @type {ReflectionObject[]|null}\n     * @private\n     */\n    this._nestedArray = null;\n\n    /**\n     * Cache lookup calls for any objects contains anywhere under this namespace.\n     * This drastically speeds up resolve for large cross-linked protos where the same\n     * types are looked up repeatedly.\n     * @type {Object.<string,ReflectionObject|null>}\n     * @private\n     */\n    this._lookupCache = Object.create(null);\n\n    /**\n     * Whether or not objects contained in this namespace need feature resolution.\n     * @type {boolean}\n     * @protected\n     */\n    this._needsRecursiveFeatureResolution = true;\n\n    /**\n     * Whether or not objects contained in this namespace need a resolve.\n     * @type {boolean}\n     * @protected\n     */\n    this._needsRecursiveResolve = true;\n}\n\nfunction clearCache(namespace) {\n    namespace._nestedArray = null;\n    namespace._lookupCache = Object.create(null);\n\n    // Also clear parent caches, since they include nested lookups.\n    var parent = namespace;\n    while(parent = parent.parent) {\n        parent._lookupCache = Object.create(null);\n    }\n    return namespace;\n}\n\n/**\n * Nested objects of this namespace as an array for iteration.\n * @name NamespaceBase#nestedArray\n * @type {ReflectionObject[]}\n * @readonly\n */\nObject.defineProperty(Namespace.prototype, \"nestedArray\", {\n    get: function() {\n        return this._nestedArray || (this._nestedArray = util.toArray(this.nested));\n    }\n});\n\n/**\n * Namespace descriptor.\n * @interface INamespace\n * @property {Object.<string,*>} [options] Namespace options\n * @property {Object.<string,AnyNestedObject>} [nested] Nested object descriptors\n */\n\n/**\n * Any extension field descriptor.\n * @typedef AnyExtensionField\n * @type {IExtensionField|IExtensionMapField}\n */\n\n/**\n * Any nested object descriptor.\n * @typedef AnyNestedObject\n * @type {IEnum|IType|IService|AnyExtensionField|INamespace|IOneOf}\n */\n\n/**\n * Converts this namespace to a namespace descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {INamespace} Namespace descriptor\n */\nNamespace.prototype.toJSON = function toJSON(toJSONOptions) {\n    return util.toObject([\n        \"options\" , this.options,\n        \"nested\"  , arrayToJSON(this.nestedArray, toJSONOptions)\n    ]);\n};\n\n/**\n * Adds nested objects to this namespace from nested object descriptors.\n * @param {Object.<string,AnyNestedObject>} nestedJson Any nested object descriptors\n * @param {number} [depth] Current nesting depth, defaults to `0`\n * @returns {Namespace} `this`\n */\nNamespace.prototype.addJSON = function addJSON(nestedJson, depth) {\n    if (depth === undefined)\n        depth = 0;\n    if (depth > util.recursionLimit)\n        throw Error(\"max depth exceeded\");\n    var ns = this;\n    /* istanbul ignore else */\n    if (nestedJson) {\n        for (var names = Object.keys(nestedJson), i = 0, nested; i < names.length; ++i) {\n            nested = nestedJson[names[i]];\n            ns.add( // most to least likely\n                ( nested.fields !== undefined\n                ? Type.fromJSON\n                : nested.values !== undefined\n                ? Enum.fromJSON\n                : nested.methods !== undefined\n                ? Service.fromJSON\n                : nested.id !== undefined\n                ? Field.fromJSON\n                : Namespace.fromJSON )(names[i], nested, depth + 1)\n            );\n        }\n    }\n    return this;\n};\n\n/**\n * Gets the nested object of the specified name.\n * @param {string} name Nested object name\n * @returns {ReflectionObject|null} The reflection object or `null` if it doesn't exist\n */\nNamespace.prototype.get = function get(name) {\n    return this.nested && Object.prototype.hasOwnProperty.call(this.nested, name)\n        ? this.nested[name]\n        : null;\n};\n\n/**\n * Gets the values of the nested {@link Enum|enum} of the specified name.\n * This methods differs from {@link Namespace#get|get} in that it returns an enum's values directly and throws instead of returning `null`.\n * @param {string} name Nested enum name\n * @returns {Object.<string,number>} Enum values\n * @throws {Error} If there is no such enum\n */\nNamespace.prototype.getEnum = function getEnum(name) {\n    if (this.nested && Object.prototype.hasOwnProperty.call(this.nested, name) && this.nested[name] instanceof Enum)\n        return this.nested[name].values;\n    throw Error(\"no such enum: \" + name);\n};\n\n/**\n * Adds a nested object to this namespace.\n * @param {ReflectionObject} object Nested object to add\n * @returns {Namespace} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a nested object with this name\n */\nNamespace.prototype.add = function add(object) {\n\n    if (!(object instanceof Field && object.extend !== undefined || object instanceof Type  || object instanceof OneOf || object instanceof Enum || object instanceof Service || object instanceof Namespace))\n        throw TypeError(\"object must be a valid nested object\");\n\n    if (object.name === \"__proto__\")\n        return this;\n\n    if (!this.nested)\n        this.nested = {};\n    else {\n        var prev = this.get(object.name);\n        if (prev) {\n            if (prev instanceof Namespace && object instanceof Namespace && !(prev instanceof Type || prev instanceof Service)) {\n                // replace plain namespace but keep existing nested elements and options\n                var nested = prev.nestedArray;\n                for (var i = 0; i < nested.length; ++i)\n                    object.add(nested[i]);\n                this.remove(prev);\n                if (!this.nested)\n                    this.nested = {};\n                object.setOptions(prev.options, true);\n\n            } else\n                throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n        }\n    }\n    this.nested[object.name] = object;\n\n    if (!(this instanceof Type || this instanceof Service || this instanceof Enum || this instanceof Field)) {\n        // This is a package or a root namespace.\n        if (!object._edition) {\n            // Make sure that some edition is set if it hasn't already been specified.\n            object._edition = object._defaultEdition;\n        }\n    }\n\n    this._needsRecursiveFeatureResolution = true;\n    this._needsRecursiveResolve = true;\n\n    // Also clear parent caches, since they need to recurse down.\n    var parent = this;\n    while(parent = parent.parent) {\n        parent._needsRecursiveFeatureResolution = true;\n        parent._needsRecursiveResolve = true;\n    }\n\n    object.onAdd(this);\n    return clearCache(this);\n};\n\n/**\n * Removes a nested object from this namespace.\n * @param {ReflectionObject} object Nested object to remove\n * @returns {Namespace} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `object` is not a member of this namespace\n */\nNamespace.prototype.remove = function remove(object) {\n\n    if (!(object instanceof ReflectionObject))\n        throw TypeError(\"object must be a ReflectionObject\");\n    if (object.parent !== this)\n        throw Error(object + \" is not a member of \" + this);\n\n    if (!util.remove(this.nested, object, object.name))\n        throw Error(object + \" is not a member of \" + this);\n    if (!Object.keys(this.nested).length)\n        this.nested = undefined;\n\n    object.onRemove(this);\n    return clearCache(this);\n};\n\n/**\n * Defines additial namespaces within this one if not yet existing.\n * @param {string|string[]} path Path to create\n * @param {*} [json] Nested types to create from JSON\n * @returns {Namespace} Pointer to the last namespace created or `this` if path is empty\n */\nNamespace.prototype.define = function define(path, json) {\n\n    if (util.isString(path))\n        path = path.split(\".\");\n    else if (!Array.isArray(path))\n        throw TypeError(\"illegal path\");\n    if (path && path.length && path[0] === \"\")\n        throw Error(\"path must be relative\");\n    if (path.length > util.recursionLimit)\n        throw Error(\"max depth exceeded\");\n\n    var ptr = this;\n    while (path.length > 0) {\n        var part = path.shift();\n        if (ptr.nested && ptr.nested[part]) {\n            ptr = ptr.nested[part];\n            if (!(ptr instanceof Namespace))\n                throw Error(\"path conflicts with non-namespace objects\");\n        } else\n            ptr.add(ptr = new Namespace(part));\n    }\n    if (json)\n        ptr.addJSON(json);\n    return ptr;\n};\n\n/**\n * Resolves this namespace's and all its nested objects' type references. Useful to validate a reflection tree, but comes at a cost.\n * @returns {Namespace} `this`\n */\nNamespace.prototype.resolveAll = function resolveAll() {\n    if (!this._needsRecursiveResolve) return this;\n\n    if (this._needsRecursiveFeatureResolution)\n        this._resolveFeaturesRecursive(this._edition);\n\n    var nested = this.nestedArray, i = 0;\n    this.resolve();\n    while (i < nested.length)\n        if (nested[i] instanceof Namespace)\n            nested[i++].resolveAll();\n        else\n            nested[i++].resolve();\n    this._needsRecursiveResolve = false;\n    return this;\n};\n\n/**\n * @override\n */\nNamespace.prototype._resolveFeaturesRecursive = function _resolveFeaturesRecursive(edition) {\n    if (!this._needsRecursiveFeatureResolution) return this;\n    this._needsRecursiveFeatureResolution = false;\n\n    edition = this._edition || edition;\n\n    ReflectionObject.prototype._resolveFeaturesRecursive.call(this, edition);\n    this.nestedArray.forEach(nested => {\n        nested._resolveFeaturesRecursive(edition);\n    });\n    return this;\n};\n\n/**\n * Recursively looks up the reflection object matching the specified path in the scope of this namespace.\n * @param {string|string[]} path Path to look up\n * @param {*|Array.<*>} filterTypes Filter types, any combination of the constructors of `protobuf.Type`, `protobuf.Enum`, `protobuf.Service` etc.\n * @param {boolean} [parentAlreadyChecked=false] If known, whether the parent has already been checked\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n */\nNamespace.prototype.lookup = function lookup(path, filterTypes, parentAlreadyChecked) {\n    /* istanbul ignore next */\n    if (typeof filterTypes === \"boolean\") {\n        parentAlreadyChecked = filterTypes;\n        filterTypes = undefined;\n    } else if (filterTypes && !Array.isArray(filterTypes))\n        filterTypes = [ filterTypes ];\n\n    if (util.isString(path) && path.length) {\n        if (path === \".\")\n            return this.root;\n        path = path.split(\".\");\n    } else if (!path.length)\n        return this;\n\n    var flatPath = path.join(\".\");\n\n    // Start at root if path is absolute\n    if (path[0] === \"\")\n        return this.root.lookup(path.slice(1), filterTypes);\n\n    // Lookup at this namespace and below\n    var found = this._lookupImpl(path, flatPath);\n    if (found && (!filterTypes || filterTypes.indexOf(found.constructor) > -1)) {\n        return found;\n    }\n\n    // Fall back to respective absolute path once relative scope has been checked (non-standard)\n    found = this.root._fullyQualifiedObjects && this.root._fullyQualifiedObjects[\".\" + flatPath];\n    if (found && (!filterTypes || filterTypes.indexOf(found.constructor) > -1)) {\n        return found;\n    }\n\n    if (parentAlreadyChecked)\n        return null;\n\n    // If there hasn't been a match, walk up the tree and look more broadly\n    var current = this;\n    while (current.parent) {\n        found = current.parent._lookupImpl(path, flatPath);\n        if (found && (!filterTypes || filterTypes.indexOf(found.constructor) > -1)) {\n            return found;\n        }\n        current = current.parent;\n    }\n    return null;\n};\n\n/**\n * Internal helper for lookup that handles searching just at this namespace and below along with caching.\n * @param {string[]} path Path to look up\n * @param {string} flatPath Flattened version of the path to use as a cache key\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n * @private\n */\nNamespace.prototype._lookupImpl = function lookup(path, flatPath) {\n    if(Object.prototype.hasOwnProperty.call(this._lookupCache, flatPath)) {\n        return this._lookupCache[flatPath];\n    }\n\n    // Test if the first part matches any nested object, and if so, traverse if path contains more\n    var found = this.get(path[0]);\n    var exact = null;\n    if (found) {\n        if (path.length === 1) {\n            exact = found;\n        } else if (found instanceof Namespace) {\n            path = path.slice(1);\n            exact = found._lookupImpl(path, path.join(\".\"));\n        }\n\n    // Otherwise try each nested namespace\n    } else {\n        for (var i = 0; i < this.nestedArray.length; ++i)\n            if (this._nestedArray[i] instanceof Namespace && (found = this._nestedArray[i]._lookupImpl(path, flatPath))) {\n                exact = found;\n                break;\n            }\n    }\n\n    // Set this even when null, so that when we walk up the tree we can quickly bail on repeated checks back down.\n    this._lookupCache[flatPath] = exact;\n    return exact;\n};\n\n/**\n * Looks up the reflection object at the specified path, relative to this namespace.\n * @name NamespaceBase#lookup\n * @function\n * @param {string|string[]} path Path to look up\n * @param {boolean} [parentAlreadyChecked=false] Whether the parent has already been checked\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n * @variation 2\n */\n// lookup(path: string, [parentAlreadyChecked: boolean])\n\n/**\n * Looks up the {@link Type|type} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Type} Looked up type\n * @throws {Error} If `path` does not point to a type\n */\nNamespace.prototype.lookupType = function lookupType(path) {\n    var found = this.lookup(path, [ Type ]);\n    if (!found)\n        throw Error(\"no such type: \" + path);\n    return found;\n};\n\n/**\n * Looks up the values of the {@link Enum|enum} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Enum} Looked up enum\n * @throws {Error} If `path` does not point to an enum\n */\nNamespace.prototype.lookupEnum = function lookupEnum(path) {\n    var found = this.lookup(path, [ Enum ]);\n    if (!found)\n        throw Error(\"no such Enum '\" + path + \"' in \" + this);\n    return found;\n};\n\n/**\n * Looks up the {@link Type|type} or {@link Enum|enum} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Type} Looked up type or enum\n * @throws {Error} If `path` does not point to a type or enum\n */\nNamespace.prototype.lookupTypeOrEnum = function lookupTypeOrEnum(path) {\n    var found = this.lookup(path, [ Type, Enum ]);\n    if (!found)\n        throw Error(\"no such Type or Enum '\" + path + \"' in \" + this);\n    return found;\n};\n\n/**\n * Looks up the {@link Service|service} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Service} Looked up service\n * @throws {Error} If `path` does not point to a service\n */\nNamespace.prototype.lookupService = function lookupService(path) {\n    var found = this.lookup(path, [ Service ]);\n    if (!found)\n        throw Error(\"no such Service '\" + path + \"' in \" + this);\n    return found;\n};\n\n// Sets up cyclic dependencies (called in index-light)\nNamespace._configure = function(Type_, Service_, Enum_) {\n    Type    = Type_;\n    Service = Service_;\n    Enum    = Enum_;\n};\n","\"use strict\";\nmodule.exports = MapField;\n\n// extends Field\nvar Field = require(\"./field\");\nMapField.prototype = Object.create(Field.prototype, {\n    constructor: {\n        value: MapField,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nMapField.className = \"MapField\";\n\nvar types   = require(\"./types\"),\n    util    = require(\"./util\");\n\n/**\n * Constructs a new map field instance.\n * @classdesc Reflected map field.\n * @extends FieldBase\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} keyType Key type\n * @param {string} type Value type\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction MapField(name, id, keyType, type, options, comment) {\n    Field.call(this, name, id, type, undefined, undefined, options, comment);\n\n    /* istanbul ignore if */\n    if (!util.isString(keyType))\n        throw TypeError(\"keyType must be a string\");\n\n    /**\n     * Key type.\n     * @type {string}\n     */\n    this.keyType = keyType; // toJSON, marker\n\n    /**\n     * Resolved key type if not a basic type.\n     * @type {ReflectionObject|null}\n     */\n    this.resolvedKeyType = null;\n\n    // Overrides Field#map\n    this.map = true;\n}\n\n/**\n * Map field descriptor.\n * @interface IMapField\n * @extends {IField}\n * @property {string} keyType Key type\n */\n\n/**\n * Extension map field descriptor.\n * @interface IExtensionMapField\n * @extends IMapField\n * @property {string} extend Extended type\n */\n\n/**\n * Constructs a map field from a map field descriptor.\n * @param {string} name Field name\n * @param {IMapField} json Map field descriptor\n * @returns {MapField} Created map field\n * @throws {TypeError} If arguments are invalid\n */\nMapField.fromJSON = function fromJSON(name, json) {\n    var field = new MapField(name, json.id, json.keyType, json.type, json.options, json.comment);\n    if (json.protoName)\n        field.protoName = json.protoName;\n    if (json.jsonName !== undefined)\n        field.jsonName = json.jsonName;\n    else if (json.options && json.options.json_name !== undefined)\n        field.jsonName = json.options.json_name;\n    return field;\n};\n\n/**\n * Converts this map field to a map field descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IMapField} Map field descriptor\n */\nMapField.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"keyType\"      , this.keyType,\n        \"type\"         , this.type,\n        \"id\"           , this.id,\n        \"extend\"       , this.extend,\n        \"protoName\"    , this.protoName !== this.name ? this.protoName : undefined,\n        \"jsonName\"     , this.jsonName !== util.jsonName(this.protoName || this.name) ? this.jsonName : undefined,\n        \"options\"      , this.options,\n        \"comment\"      , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * @override\n */\nMapField.prototype.resolve = function resolve() {\n    if (this.resolved)\n        return this;\n\n    // Besides a value type, map fields have a key type that may be \"any scalar type except for floating point types and bytes\"\n    if (types.mapKey[this.keyType] === undefined)\n        throw Error(\"invalid key type: \" + this.keyType);\n\n    return Field.prototype.resolve.call(this);\n};\n\n/**\n * Map field decorator (TypeScript).\n * @name MapField.d\n * @function\n * @param {number} fieldId Field id\n * @param {\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"bool\"|\"string\"} fieldKeyType Field key type\n * @param {\"double\"|\"float\"|\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"bool\"|\"string\"|\"bytes\"|Object|Constructor<{}>} fieldValueType Field value type\n * @returns {FieldDecorator} Decorator function\n * @template T extends { [key: string]: number | Long | string | boolean | Uint8Array | Buffer | number[] | Message<{}> }\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\nMapField.d = function decorateMapField(fieldId, fieldKeyType, fieldValueType) {\n\n    // submessage value: decorate the submessage and use its name as the type\n    if (typeof fieldValueType === \"function\")\n        fieldValueType = util.decorateType(fieldValueType).name;\n\n    // enum reference value: create a reflected copy of the enum and keep reuseing it\n    else if (fieldValueType && typeof fieldValueType === \"object\")\n        fieldValueType = util.decorateEnum(fieldValueType).name;\n\n    return function mapFieldDecorator(prototype, fieldName) {\n        util.decorateType(prototype.constructor)\n            .add(new MapField(fieldName, fieldId, fieldKeyType, fieldValueType));\n    };\n};\n","\"use strict\";\nmodule.exports = Method;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\nMethod.prototype = Object.create(ReflectionObject.prototype, {\n    constructor: {\n        value: Method,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nMethod.className = \"Method\";\n\nvar util = require(\"./util\");\n\n/**\n * Constructs a new service method instance.\n * @classdesc Reflected service method.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Method name\n * @param {string|undefined} type Method type, usually `\"rpc\"`\n * @param {string} requestType Request message type\n * @param {string} responseType Response message type\n * @param {boolean|Object.<string,*>} [requestStream] Whether the request is streamed\n * @param {boolean|Object.<string,*>} [responseStream] Whether the response is streamed\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] The comment for this method\n * @param {Array.<Object.<string,*>>} [parsedOptions] Declared options, properly parsed into objects\n */\nfunction Method(name, type, requestType, responseType, requestStream, responseStream, options, comment, parsedOptions) {\n\n    /* istanbul ignore next */\n    if (util.isObject(requestStream)) {\n        options = requestStream;\n        requestStream = responseStream = undefined;\n    } else if (util.isObject(responseStream)) {\n        options = responseStream;\n        responseStream = undefined;\n    }\n\n    /* istanbul ignore if */\n    if (!(type === undefined || util.isString(type)))\n        throw TypeError(\"type must be a string\");\n\n    /* istanbul ignore if */\n    if (!util.isString(requestType))\n        throw TypeError(\"requestType must be a string\");\n\n    /* istanbul ignore if */\n    if (!util.isString(responseType))\n        throw TypeError(\"responseType must be a string\");\n\n    ReflectionObject.call(this, name, options);\n\n    /**\n     * Method type.\n     * @type {string}\n     */\n    this.type = type || \"rpc\"; // toJSON\n\n    /**\n     * Request type.\n     * @type {string}\n     */\n    this.requestType = requestType; // toJSON, marker\n\n    /**\n     * Whether requests are streamed or not.\n     * @type {true|undefined}\n     */\n    this.requestStream = requestStream ? true : undefined; // toJSON\n\n    /**\n     * Response type.\n     * @type {string}\n     */\n    this.responseType = responseType; // toJSON\n\n    /**\n     * Whether responses are streamed or not.\n     * @type {true|undefined}\n     */\n    this.responseStream = responseStream ? true : undefined; // toJSON\n\n    /**\n     * gRPC-style method path.\n     * @type {string}\n     */\n    this.path = \"/\" + this.name;\n\n    /**\n     * Resolved request type.\n     * @type {Type|null}\n     */\n    this.resolvedRequestType = null;\n\n    /**\n     * Resolved response type.\n     * @type {Type|null}\n     */\n    this.resolvedResponseType = null;\n\n    /**\n     * Comment for this method\n     * @type {string|null}\n     */\n    this.comment = comment;\n\n    /**\n     * Options properly parsed into objects\n     * @type {Array.<Object.<string,*>>|undefined}\n     */\n    this.parsedOptions = parsedOptions;\n}\n\n/**\n * Method descriptor.\n * @interface IMethod\n * @property {string} [type=\"rpc\"] Method type\n * @property {string} requestType Request type\n * @property {string} responseType Response type\n * @property {boolean} [requestStream=false] Whether requests are streamed\n * @property {boolean} [responseStream=false] Whether responses are streamed\n * @property {Object.<string,*>} [options] Method options\n * @property {string|null} [comment] Method comment\n * @property {Array.<Object.<string,*>>} [parsedOptions] Method options properly parsed into objects\n */\n\n/**\n * Constructs a method from a method descriptor.\n * @param {string} name Method name\n * @param {IMethod} json Method descriptor\n * @returns {Method} Created method\n * @throws {TypeError} If arguments are invalid\n */\nMethod.fromJSON = function fromJSON(name, json) {\n    return new Method(name, json.type, json.requestType, json.responseType, json.requestStream, json.responseStream, json.options, json.comment, json.parsedOptions);\n};\n\n/**\n * Converts this method to a method descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IMethod} Method descriptor\n */\nMethod.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"type\"           , this.type !== \"rpc\" && /* istanbul ignore next */ this.type || undefined,\n        \"requestType\"    , this.requestType,\n        \"requestStream\"  , this.requestStream,\n        \"responseType\"   , this.responseType,\n        \"responseStream\" , this.responseStream,\n        \"options\"        , this.options,\n        \"comment\"        , keepComments ? this.comment : undefined,\n        \"parsedOptions\"  , this.parsedOptions,\n    ]);\n};\n\n/**\n * @override\n */\nMethod.prototype.resolve = function resolve() {\n\n    /* istanbul ignore if */\n    if (this.resolved)\n        return this;\n\n    if (this.parent) {\n        var serviceName = this.parent.fullName;\n        if (serviceName.charAt(0) === \".\")\n            serviceName = serviceName.substring(1);\n        this.path = \"/\" + serviceName + \"/\" + this.name;\n    } else\n        this.path = \"/\" + this.name;\n\n    this.resolvedRequestType = this.parent.lookupType(this.requestType);\n    this.resolvedResponseType = this.parent.lookupType(this.responseType);\n\n    return ReflectionObject.prototype.resolve.call(this);\n};\n","\"use strict\";\nmodule.exports = Service;\n\n// extends Namespace\nvar Namespace = require(\"./namespace\");\nService.prototype = Object.create(Namespace.prototype, {\n    constructor: {\n        value: Service,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nService.className = \"Service\";\n\nvar Method = require(\"./method\"),\n    util   = require(\"./util\"),\n    rpc    = require(\"./rpc\");\n\n/**\n * Constructs a new service instance.\n * @classdesc Reflected service.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Service name\n * @param {Object.<string,*>} [options] Service options\n * @throws {TypeError} If arguments are invalid\n */\nfunction Service(name, options) {\n    Namespace.call(this, name, options);\n\n    /**\n     * Service methods.\n     * @type {Object.<string,Method>}\n     */\n    this.methods = {}; // toJSON, marker\n\n    /**\n     * Cached methods as an array.\n     * @type {Method[]|null}\n     * @private\n     */\n    this._methodsArray = null;\n}\n\n/**\n * Service descriptor.\n * @interface IService\n * @extends INamespace\n * @property {string} [edition] Edition\n * @property {Object.<string,IMethod>} methods Method descriptors\n * @property {string|null} [comment] Service comment\n */\n\n/**\n * Constructs a service from a service descriptor.\n * @param {string} name Service name\n * @param {IService} json Service descriptor\n * @param {number} [depth] Current nesting depth, defaults to `0`\n * @returns {Service} Created service\n * @throws {TypeError} If arguments are invalid\n */\nService.fromJSON = function fromJSON(name, json, depth) {\n    if (depth === undefined)\n        depth = 0;\n    if (depth > util.recursionLimit)\n        throw Error(\"max depth exceeded\");\n    var service = new Service(name, json.options);\n    /* istanbul ignore else */\n    if (json.methods)\n        for (var names = Object.keys(json.methods), i = 0; i < names.length; ++i)\n            service.add(Method.fromJSON(names[i], json.methods[names[i]]));\n    if (json.nested)\n        service.addJSON(json.nested, depth);\n    if (json.edition)\n        service._edition = json.edition;\n    service.comment = json.comment;\n    service._defaultEdition = \"proto3\";  // For backwards-compatibility.\n    return service;\n};\n\n/**\n * Converts this service to a service descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IService} Service descriptor\n */\nService.prototype.toJSON = function toJSON(toJSONOptions) {\n    var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions);\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"edition\" , this._editionToJSON(),\n        \"options\" , inherited && inherited.options || undefined,\n        \"methods\" , Namespace.arrayToJSON(this.methodsArray, toJSONOptions) || /* istanbul ignore next */ {},\n        \"nested\"  , inherited && inherited.nested || undefined,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Methods of this service as an array for iteration.\n * @name Service#methodsArray\n * @type {Method[]}\n * @readonly\n */\nObject.defineProperty(Service.prototype, \"methodsArray\", {\n    get: function() {\n        return this._methodsArray || (this._methodsArray = util.toArray(this.methods));\n    }\n});\n\nfunction clearCache(service) {\n    service._methodsArray = null;\n    return service;\n}\n\n/**\n * @override\n */\nService.prototype.get = function get(name) {\n    return Object.prototype.hasOwnProperty.call(this.methods, name)\n        ? this.methods[name]\n        : Namespace.prototype.get.call(this, name);\n};\n\n/**\n * @override\n */\nService.prototype.resolveAll = function resolveAll() {\n    if (!this._needsRecursiveResolve) return this;\n\n    Namespace.prototype.resolve.call(this);\n    var methods = this.methodsArray;\n    for (var i = 0; i < methods.length; ++i)\n        methods[i].resolve();\n    return this;\n};\n\n/**\n * @override\n */\nService.prototype._resolveFeaturesRecursive = function _resolveFeaturesRecursive(edition) {\n    if (!this._needsRecursiveFeatureResolution) return this;\n\n    edition = this._edition || edition;\n\n    Namespace.prototype._resolveFeaturesRecursive.call(this, edition);\n    this.methodsArray.forEach(method => {\n        method._resolveFeaturesRecursive(edition);\n    });\n    return this;\n};\n\n/**\n * @override\n */\nService.prototype.add = function add(object) {\n    /* istanbul ignore if */\n    if (this.get(object.name))\n        throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n\n    if (object instanceof Method) {\n        if (object.name === \"__proto__\")\n            return this;\n        this.methods[object.name] = object;\n        object.parent = this;\n        return clearCache(this);\n    }\n    return Namespace.prototype.add.call(this, object);\n};\n\n/**\n * @override\n */\nService.prototype.remove = function remove(object) {\n    if (object instanceof Method) {\n\n        /* istanbul ignore if */\n        if (this.methods[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.methods[object.name];\n        object.parent = null;\n        return clearCache(this);\n    }\n    return Namespace.prototype.remove.call(this, object);\n};\n\n/**\n * Creates a runtime service using the specified rpc implementation.\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n * @returns {rpc.Service} RPC service. Useful where requests and/or responses are streamed.\n */\nService.prototype.create = function create(rpcImpl, requestDelimited, responseDelimited) {\n    var rpcService = new rpc.Service(rpcImpl, requestDelimited, responseDelimited);\n    for (var i = 0, method; i < /* initializes */ this.methodsArray.length; ++i) {\n        var methodName = util.lcFirst((method = this._methodsArray[i]).resolve().name).replace(/[^$\\w_]/g, \"\");\n        rpcService[methodName] = (function(method, requestType, responseType) {\n            return function rpcMethod(request, callback) {\n                return rpc.Service.prototype.rpcCall.call(this, method, requestType, responseType, request, callback);\n            };\n        })(method, method.resolvedRequestType.ctor, method.resolvedResponseType.ctor);\n    }\n    return rpcService;\n};\n","\"use strict\";\nmodule.exports = Message;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new message instance.\n * @classdesc Abstract runtime message.\n * @constructor\n * @param {Properties<T>} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n * @template T extends object = object\n */\nfunction Message(properties) {\n    // not used internally\n    if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n                this[keys[i]] = properties[keys[i]];\n}\n\n/**\n * Reference to the reflected type.\n * @name Message.$type\n * @type {Type}\n * @readonly\n */\n\n/**\n * Reference to the reflected type.\n * @name Message#$type\n * @type {Type}\n * @readonly\n */\n\n/**\n * Creates a new message of this type using the specified properties.\n * @param {Object.<string,*>} [properties] Properties to set\n * @returns {T} Message instance\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.create = function create(properties) {\n    return this.$type.create(properties);\n};\n\n/**\n * Encodes a message of this type.\n * @param {T|Object.<string,*>} message Message to encode\n * @param {Writer} [writer] Writer to use\n * @returns {Writer} Writer\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.encode = function encode(message, writer) {\n    return this.$type.encode(message, writer);\n};\n\n/**\n * Encodes a message of this type preceeded by its length as a varint.\n * @param {T|Object.<string,*>} message Message to encode\n * @param {Writer} [writer] Writer to use\n * @returns {Writer} Writer\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.encodeDelimited = function encodeDelimited(message, writer) {\n    return this.$type.encodeDelimited(message, writer);\n};\n\n/**\n * Decodes a message of this type.\n * @name Message.decode\n * @function\n * @param {Reader|Uint8Array} reader Reader or buffer to decode\n * @returns {T} Decoded message\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.decode = function decode(reader) {\n    return this.$type.decode(reader);\n};\n\n/**\n * Decodes a message of this type preceeded by its length as a varint.\n * @name Message.decodeDelimited\n * @function\n * @param {Reader|Uint8Array} reader Reader or buffer to decode\n * @returns {T} Decoded message\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.decodeDelimited = function decodeDelimited(reader) {\n    return this.$type.decodeDelimited(reader);\n};\n\n/**\n * Verifies a message of this type.\n * @name Message.verify\n * @function\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\nMessage.verify = function verify(message) {\n    return this.$type.verify(message);\n};\n\n/**\n * Creates a new message of this type from a plain object. Also converts values to their respective internal types.\n * @param {Object.<string,*>} object Plain object\n * @returns {T} Message instance\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.fromObject = function fromObject(object) {\n    return this.$type.fromObject(object);\n};\n\n/**\n * Creates a plain object from a message of this type. Also converts values to other types if specified.\n * @param {T} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.toObject = function toObject(message, options) {\n    return this.$type.toObject(message, options);\n};\n\n/**\n * Converts this message to JSON.\n * @returns {Object.<string,*>} JSON object\n */\nMessage.prototype.toJSON = function toJSON() {\n    return this.$type.toObject(this, util.toJSONOptions);\n};\n","\"use strict\";\nmodule.exports = decoder;\n\nvar Enum    = require(\"./enum\"),\n    types   = require(\"./types\"),\n    util    = require(\"./util\");\n\nfunction missing(field) {\n    return \"missing required '\" + field.name + \"'\";\n}\n\nfunction stringMethod(field) {\n    return field._features.utf8_validation === \"VERIFY\" ? \"stringVerify\" : \"string\";\n}\n\nfunction genPreserveUnknown(gen, ref) {\n    /* eslint-disable no-unexpected-multiline */\n    return gen\n        (\"if(!r.discardUnknown){\")\n            (\"util.makeProp(m,\\\"$unknowns\\\",false);\")\n            (\"(m.$unknowns||(m.$unknowns=[])).push(%s)\", ref)\n        (\"}\");\n    /* eslint-enable no-unexpected-multiline */\n}\n\n/**\n * Generates a decoder specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction decoder(mtype) {\n    /* eslint-disable no-unexpected-multiline */\n    var hasMapField = false,\n        needsValueVar = false,\n        i = 0;\n    for (; i < mtype.fieldsArray.length; ++i) {\n        var pfield = mtype._fieldsArray[i];\n        if (pfield.map)\n            hasMapField = true;\n        if (pfield.resolvedType instanceof Enum || !pfield.repeated && !pfield.map && !pfield.hasPresence)\n            needsValueVar = true;\n    }\n    var gen = util.codegen([\"r\", \"l\", \"z\", \"q\", \"g\"])\n    (\"if(!(r instanceof Reader))\")\n        (\"r=Reader.create(r)\")\n    (\"if(q===undefined)q=0\")\n    (\"if(q>Reader.recursionLimit)\")\n        (\"throw Error(\\\"max depth exceeded\\\")\")\n    (\"var c,m\" + (hasMapField ? \",k,v\" : needsValueVar ? \",v\" : \"\"))\n    (\"if(l===undefined)\")\n        (\"c=r.len\")\n    (\"else{\")\n        (\"c=r.pos+l\")\n        (\"if(c>r.len)\")\n            (\"throw RangeError(\\\"index out of range\\\")\")\n        (\"l=r.len\")\n        (\"r.len=c\")\n    (\"}\")\n    (\"m=g||new C\")\n    (\"while(r.pos<c){\")\n        (\"var s=r.pos\")\n        (\"var t=r.tag()\")\n        (\"if(t===z){\")\n            (\"z=undefined\")\n            (\"break\")\n        (\"}\");\n    if (mtype.fieldsArray.length) gen\n        (\"var u=t&7\")\n        (\"switch(t>>>=3){\");\n    for (i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {\n        var field  = mtype._fieldsArray[i].resolve(),\n            type   = field.resolvedType instanceof Enum ? \"int32\" : field.type,\n            ref    = \"m\" + util.safeProp(field.name),\n            closed = field.resolvedType instanceof Enum && field.resolvedType._features.enum_type === \"CLOSED\";\n\n        // Map fields\n        if (field.map) {\n            gen\n            (\"case %i:{\", field.id)\n                (\"if(u!==2)\")\n                    (\"break\");\n            if (!closed) gen\n                (\"if(%s===util.emptyObject)\", ref)\n                    (\"%s={}\", ref);\n            gen\n                (\"var c2=r.uint32()+r.pos\")\n                (\"if(c2>r.len)\")\n                    (\"throw RangeError(\\\"index out of range\\\")\")\n                (\"r.len=c2\");\n\n            if (types.defaults[field.keyType] !== undefined) gen\n                (\"k=%j\", types.defaults[field.keyType]);\n            else gen\n                (\"k=null\");\n\n            if (types.long[type] !== undefined) gen\n                (\"v=util.Long?util.Long.fromNumber(0,%j):0\", type === \"uint64\" || type === \"fixed64\");\n            else if (types.defaults[type] !== undefined) gen\n                (\"v=%j\", types.defaults[type]);\n            else gen\n                (\"v=null\");\n\n            gen\n                (\"while(r.pos<c2){\")\n                    (\"var t2=r.tag()\")\n                    (\"u=t2&7\")\n                    (\"switch(t2>>>=3){\")\n                        (\"case 1:\")\n                            (\"if(u!==%i)\", types.mapKey[field.keyType])\n                                (\"break\")\n                            (\"k=r.%s()\", field.keyType === \"string\" ? stringMethod(field) : field.keyType)\n                            (\"continue\")\n                        (\"case 2:\")\n                            (\"if(u!==%i)\", types.basic[type] === undefined ? 2 : types.basic[type])\n                                (\"break\");\n\n            if (types.basic[type] === undefined) gen\n                            (\"v=types[%i].decode(r,r.uint32(),undefined,q+1,v)\", i); // can't be groups\n            else gen\n                            (\"v=r.%s()\", type === \"string\" ? stringMethod(field) : type);\n\n            gen\n                            (\"continue\")\n                    (\"}\")\n                    (\"r.skipType(u,q,t2)\")\n                (\"}\");\n            gen\n                (\"if(r.pos!==c2)\")\n                    (\"throw RangeError(\\\"index out of range\\\")\")\n                (\"r.len=c\");\n\n            if (closed) { gen\n                (\"if(types[%i].valuesById[v]===undefined){\", i);\n                    genPreserveUnknown(gen, \"r.raw(s,r.pos)\")\n                    (\"continue\")\n                (\"}\")\n                (\"if(%s===util.emptyObject)\", ref)\n                    (\"%s={}\", ref);\n            }\n\n            var val = types.basic[type] === undefined ? \"v||new types[\" + i + \"].ctor\" : \"v\";\n            if (types.long[field.keyType] !== undefined) gen\n                (\"%s[typeof k===\\\"object\\\"?util.longToHash(k):k]=%s\", ref, val);\n            else {\n                if (field.keyType === \"string\") gen\n                (\"if(k===\\\"__proto__\\\")\")\n                    (\"util.makeProp(%s,k)\", ref);\n                gen\n                (\"%s[k]=%s\", ref, val);\n            }\n\n        // Repeated fields\n        } else if (field.repeated) { gen\n            (\"case %i:\", field.id)\n            (\"{\");\n\n            // Packable (always check for forward and backward compatiblity)\n            if (types.packed[type] !== undefined) {\n                gen\n                (\"if(u===2){\");\n                if (closed) {\n                    gen\n                    (\"var c2=r.uint32()+r.pos\")\n                    (\"if(c2>r.len)\")\n                        (\"throw RangeError(\\\"index out of range\\\")\")\n                    (\"r.len=c2\")\n                    (\"while(r.pos<c2){\")\n                        (\"s=r.pos\")\n                        (\"v=r.%s()\", type)\n                        (\"if(types[%i].valuesById[v]!==undefined){\", i)\n                            (\"if(!(%s&&%s.length))\", ref, ref)\n                                (\"%s=[]\", ref)\n                            (\"%s.push(v)\", ref)\n                        (\"}else\");\n                            genPreserveUnknown(gen, \"util.rawField(\" + field.id + \",0,r.raw(s,r.pos))\")\n                    (\"}\");\n                    gen\n                    (\"if(r.pos!==c2)\")\n                        (\"throw RangeError(\\\"index out of range\\\")\")\n                    (\"r.len=c\");\n                } else gen\n                    (\"if(!(%s&&%s.length))\", ref, ref)\n                        (\"%s=[]\", ref)\n                    (\"r.%ss(%s)\", type, ref);\n                gen\n                    (\"continue\")\n                (\"}\");\n            }\n\n            // Non-packed\n            gen\n                (\"if(u!==%i)\", types.basic[type] === undefined ? field.delimited ? 3 : 2 : types.basic[type])\n                    (\"break\");\n            if (!closed) gen\n                (\"if(!(%s&&%s.length))\", ref, ref)\n                    (\"%s=[]\", ref);\n            if (types.basic[type] === undefined) {\n                if (field.delimited) gen\n                    (\"%s.push(types[%i].decode(r,undefined,%i,q+1))\", ref, i, field.id * 8 + 4);\n                else gen\n                    (\"%s.push(types[%i].decode(r,r.uint32(),undefined,q+1))\", ref, i);\n            } else if (closed) { gen\n                    (\"v=r.%s()\", type)\n                    (\"if(types[%i].valuesById[v]!==undefined){\", i)\n                        (\"if(!(%s&&%s.length))\", ref, ref)\n                            (\"%s=[]\", ref)\n                        (\"%s.push(v)\", ref)\n                    (\"}else\");\n                        genPreserveUnknown(gen, \"r.raw(s,r.pos)\");\n            } else gen\n                    (\"%s.push(r.%s())\", ref, type === \"string\" ? stringMethod(field) : type);\n\n        // Non-repeated\n        } else if (types.basic[type] === undefined) {\n            gen\n            (\"case %i:{\", field.id)\n                (\"if(u!==%i)\", field.delimited ? 3 : 2)\n                    (\"break\");\n            if (field.delimited) gen\n                (\"%s=types[%i].decode(r,undefined,%i,q+1,%s)\", ref, i, field.id * 8 + 4, ref);\n            else gen\n                (\"%s=types[%i].decode(r,r.uint32(),undefined,q+1,%s)\", ref, i, ref);\n        }\n        else if (field.hasPresence) {\n            gen\n            (\"case %i:{\", field.id)\n                (\"if(u!==%i)\", types.basic[type])\n                    (\"break\");\n            if (closed) { gen\n                (\"v=r.%s()\", type)\n                (\"if(types[%i].valuesById[v]!==undefined){\", i)\n                    (\"%s=v\", ref);\n                if (field.partOf) gen\n                    (\"m%s=%j\", util.safeProp(field.partOf.name), field.name);\n                gen\n                (\"}else\");\n                    genPreserveUnknown(gen, \"r.raw(s,r.pos)\");\n            } else gen\n                (\"%s=r.%s()\", ref, type === \"string\" ? stringMethod(field) : type);\n        } else {\n            gen\n            (\"case %i:{\", field.id)\n                (\"if(u!==%i)\", types.basic[type])\n                    (\"break\");\n            if (closed) { gen\n                (\"v=r.%s()\", type)\n                (\"if(types[%i].valuesById[v]!==undefined){\", i)\n                    (\"if(v!==%j)\", field.typeDefault)\n                        (\"%s=v\", ref)\n                    (\"else\")\n                        (\"delete %s\", ref)\n                (\"}else{\");\n                    genPreserveUnknown(gen, \"r.raw(s,r.pos)\")\n                (\"}\");\n            } else {\n                if (field.resolvedType instanceof Enum && field.typeDefault !== 0) gen\n                    // TODO: Protoc rejects open enums whose first value is not zero.\n                    // We should do the same, but for v8 this would be a regression.\n                    (\"if((v=r.%s())!==%j)\", type, field.typeDefault);\n                else if (type === \"string\") gen\n                    (\"if((v=r.%s()).length)\", stringMethod(field));\n                else if (type === \"bytes\") gen\n                    (\"if((v=r.%s()).length)\", type);\n                else if (types.long[type] !== undefined) gen\n                    (\"if(typeof(v=r.%s())===\\\"object\\\"?v.low||v.high:v!==0)\", type);\n                else if (type === \"double\" || type === \"float\") gen\n                    (\"if(!Object.is(v=r.%s(),0))\", type);\n                else gen\n                    (\"if(v=r.%s())\", type);\n                gen\n                        (\"%s=v\", ref)\n                    (\"else\")\n                        (\"delete %s\", ref); // rare/odd case: later default clears earlier non-default\n            }\n        }\n        if (field.partOf && !closed) gen\n                (\"m%s=%j\", util.safeProp(field.partOf.name), field.name);\n        gen\n                (\"continue\")\n            (\"}\");\n    }\n    if (i) gen\n        (\"}\");\n    // Unknown fields\n    gen\n        (\"r.skipType(%s,q,t)\", i ? \"u\" : \"t&7\");\n    genPreserveUnknown(gen, \"r.raw(s,r.pos)\")\n    (\"}\")\n    (\"if(l!==undefined){\")\n        (\"if(r.pos!==c)\")\n            (\"throw RangeError(\\\"index out of range\\\")\")\n        (\"r.len=l\")\n    (\"}\")\n    (\"if(z!==undefined)\")\n        (\"throw Error(\\\"missing end group\\\")\");\n\n    // Field presence\n    for (i = 0; i < mtype._fieldsArray.length; ++i) {\n        var rfield = mtype._fieldsArray[i];\n        if (rfield.required) gen\n    (\"if(!Object.hasOwnProperty.call(m,%j))\", rfield.name)\n        (\"throw util.ProtocolError(%j,{instance:m})\", missing(rfield));\n    }\n\n    return gen\n    (\"return m\");\n    /* eslint-enable no-unexpected-multiline */\n}\n","\"use strict\";\nmodule.exports = verifier;\n\nvar Enum      = require(\"./enum\"),\n    util      = require(\"./util\");\n\nfunction invalid(field, expected) {\n    return field.name + \": \" + expected + (field.repeated && expected !== \"array\" ? \"[]\" : field.map && expected !== \"object\" ? \"{k:\"+field.keyType+\"}\" : \"\") + \" expected\";\n}\n\n/**\n * Generates a partial value verifier.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genVerifyValue(gen, field, fieldIndex, ref) {\n    /* eslint-disable no-unexpected-multiline */\n    var resolvedType = field.resolvedType;\n    if (resolvedType) {\n        if (resolvedType instanceof Enum) {\n            if (resolvedType._features.enum_type === \"CLOSED\") { gen\n                (\"switch(%s){\", ref)\n                    (\"default:\")\n                        (\"return%j\", invalid(field, \"enum value\"));\n                for (var keys = Object.keys(resolvedType.values), j = 0; j < keys.length; ++j) gen\n                    (\"case %i:\", resolvedType.values[keys[j]]);\n                gen\n                        (\"break\")\n                (\"}\");\n            } else gen\n                (\"if(typeof %s!==\\\"number\\\"||(%s|0)!==%s)\", ref, ref, ref)\n                    (\"return%j\", invalid(field, \"enum value\"));\n        } else {\n            gen\n            (\"{\")\n                (\"var e=types[%i].verify(%s,q+1);\", fieldIndex, ref)\n                (\"if(e)\")\n                    (\"return%j+e\", field.name + \".\")\n            (\"}\");\n        }\n    } else {\n        switch (field.type) {\n            case \"int32\":\n            case \"uint32\":\n            case \"sint32\":\n            case \"fixed32\":\n            case \"sfixed32\": gen\n                (\"if(!util.isInteger(%s))\", ref)\n                    (\"return%j\", invalid(field, \"integer\"));\n                break;\n            case \"int64\":\n            case \"uint64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\": gen\n                (\"if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))\", ref, ref, ref, ref)\n                    (\"return%j\", invalid(field, \"integer|Long\"));\n                break;\n            case \"float\":\n            case \"double\": gen\n                (\"if(typeof %s!==\\\"number\\\")\", ref)\n                    (\"return%j\", invalid(field, \"number\"));\n                break;\n            case \"bool\": gen\n                (\"if(typeof %s!==\\\"boolean\\\")\", ref)\n                    (\"return%j\", invalid(field, \"boolean\"));\n                break;\n            case \"string\": gen\n                (\"if(!util.isString(%s))\", ref)\n                    (\"return%j\", invalid(field, \"string\"));\n                break;\n            case \"bytes\": gen\n                (\"if(!(%s&&typeof %s.length===\\\"number\\\"||util.isString(%s)))\", ref, ref, ref)\n                    (\"return%j\", invalid(field, \"buffer\"));\n                break;\n        }\n    }\n    return gen;\n    /* eslint-enable no-unexpected-multiline */\n}\n\n/**\n * Generates a partial key verifier.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genVerifyKey(gen, field, ref) {\n    /* eslint-disable no-unexpected-multiline */\n    switch (field.keyType) {\n        case \"int32\":\n        case \"uint32\":\n        case \"sint32\":\n        case \"fixed32\":\n        case \"sfixed32\": gen\n            (\"if(!util.key32Re.test(%s))\", ref)\n                (\"return%j\", invalid(field, \"integer key\"));\n            break;\n        case \"int64\":\n        case \"uint64\":\n        case \"sint64\":\n        case \"fixed64\":\n        case \"sfixed64\": gen\n            (\"if(!util.key64Re.test(%s))\", ref) // see comment above: x is ok, d is not\n                (\"return%j\", invalid(field, \"integer|Long key\"));\n            break;\n        case \"bool\": gen\n            (\"if(!util.key2Re.test(%s))\", ref)\n                (\"return%j\", invalid(field, \"boolean key\"));\n            break;\n    }\n    return gen;\n    /* eslint-enable no-unexpected-multiline */\n}\n\n/**\n * Generates a verifier specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction verifier(mtype) {\n    /* eslint-disable no-unexpected-multiline */\n\n    var gen = util.codegen([\"m\", \"q\"])\n    (\"if(typeof m!==\\\"object\\\"||m===null)\")\n        (\"return%j\", \"object expected\")\n    (\"if(q===undefined)q=0\")\n    (\"if(q>util.recursionLimit)\")\n        (\"return%j\", \"max depth exceeded\");\n    var oneofs = mtype.oneofsArray,\n        seenFirstField = {};\n    if (oneofs.length) gen\n    (\"var p={}\");\n\n    for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {\n        var field = mtype._fieldsArray[i].resolve(),\n            ref   = \"m\" + util.safeProp(field.name);\n\n        if (field.optional) gen\n        (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)){\", ref, field.name); // !== undefined && !== null\n\n        // map fields\n        if (field.map) { gen\n            (\"if(!util.isObject(%s))\", ref)\n                (\"return%j\", invalid(field, \"object\"))\n            (\"var k=Object.keys(%s)\", ref)\n            (\"for(var i=0;i<k.length;++i){\");\n                genVerifyKey(gen, field, \"k[i]\");\n                genVerifyValue(gen, field, i, ref + \"[k[i]]\")\n            (\"}\");\n\n        // repeated fields\n        } else if (field.repeated) { gen\n            (\"if(!Array.isArray(%s))\", ref)\n                (\"return%j\", invalid(field, \"array\"))\n            (\"for(var i=0;i<%s.length;++i){\", ref);\n                genVerifyValue(gen, field, i, ref + \"[i]\")\n            (\"}\");\n\n        // required or present fields\n        } else {\n            if (field.partOf) {\n                var oneofProp = util.safeProp(field.partOf.name);\n                if (seenFirstField[field.partOf.name] === 1) gen\n            (\"if(p%s===1)\", oneofProp)\n                (\"return%j\", field.partOf.name + \": multiple values\");\n                seenFirstField[field.partOf.name] = 1;\n                gen\n            (\"p%s=1\", oneofProp);\n            }\n            genVerifyValue(gen, field, i, ref);\n        }\n        if (field.optional) gen\n        (\"}\");\n    }\n    return gen\n    (\"return null\");\n    /* eslint-enable no-unexpected-multiline */\n}\n","\"use strict\";\n/**\n * Runtime message from/to plain object converters.\n * @namespace\n */\nvar converter = exports;\n\nvar Enum  = require(\"./enum\"),\n    types = require(\"./types\"),\n    util  = require(\"./util\");\n\n/**\n * Generates a partial value fromObject conveter.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} prop Property reference\n * @param {string} [dstProp] Repeated destination property reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genValuePartial_fromObject(gen, field, fieldIndex, prop, dstProp) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    if (field.resolvedType) {\n        if (field.resolvedType instanceof Enum) {\n            var dst = dstProp\n                ? \"m\" + dstProp + \"[m\" + dstProp + \".length]\"\n                : \"m\" + prop;\n            gen\n            (\"switch(d%s){\", prop);\n            for (var values = field.resolvedType.values, keys = Object.keys(values), i = 0; i < keys.length; ++i) { gen\n                (\"case%j:\", keys[i])\n                (\"case %i:\", values[keys[i]])\n                    (\"%s=%j\", dst, values[keys[i]])\n                    (\"break\");\n            }\n            gen\n                (\"default:\");\n            if (field.resolvedType._features.enum_type !== \"CLOSED\") {\n                gen\n                    (\"if(typeof d%s===\\\"number\\\"&&(d%s|0)===d%s)\", prop, prop, prop)\n                        (\"%s=d%s\", dst, prop);\n            }\n            gen\n            (\"}\");\n        } else gen\n            (\"if(!util.isObject(d%s))\", prop)\n                (\"throw TypeError(%j)\", field.fullName + \": object expected\")\n            (\"m%s=types[%i].fromObject(d%s,q+1)\", prop, fieldIndex, prop);\n    } else {\n        var isUnsigned = false;\n        switch (field.type) {\n            case \"double\":\n            case \"float\": gen\n                (\"m%s=Number(d%s)\", prop, prop); // also catches \"NaN\", \"Infinity\"\n                break;\n            case \"uint32\":\n            case \"fixed32\": gen\n                (\"m%s=d%s>>>0\", prop, prop);\n                break;\n            case \"int32\":\n            case \"sint32\":\n            case \"sfixed32\": gen\n                (\"m%s=d%s|0\", prop, prop);\n                break;\n            case \"uint64\":\n            case \"fixed64\":\n                isUnsigned = true;\n                // eslint-disable-next-line no-fallthrough\n            case \"int64\":\n            case \"sint64\":\n            case \"sfixed64\": gen\n                (\"if(util.Long)\")\n                    (\"m%s=util.Long.fromValue(d%s,%j)\", prop, prop, isUnsigned)\n                (\"else if(typeof d%s===\\\"string\\\")\", prop)\n                    (\"m%s=parseInt(d%s,10)\", prop, prop)\n                (\"else if(typeof d%s===\\\"number\\\")\", prop)\n                    (\"m%s=d%s\", prop, prop)\n                (\"else if(typeof d%s===\\\"object\\\")\", prop)\n                    (\"m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)\", prop, prop, prop, isUnsigned ? \"true\" : \"\");\n                break;\n            case \"bytes\": gen\n                (\"if(typeof d%s===\\\"string\\\")\", prop)\n                    (\"util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)\", prop, prop, prop)\n                (\"else if(d%s.length>=0)\", prop)\n                    (\"m%s=d%s\", prop, prop);\n                break;\n            case \"string\": gen\n                (\"m%s=String(d%s)\", prop, prop);\n                break;\n            case \"bool\": gen\n                (\"m%s=Boolean(d%s)\", prop, prop);\n                break;\n            /* default: gen\n                (\"m%s=d%s\", prop, prop);\n                break; */\n        }\n    }\n    return gen;\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n\n/**\n * Generates a plain object to runtime message converter specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nconverter.fromObject = function fromObject(mtype) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    var fields = mtype.fieldsArray;\n    var gen = util.codegen([\"d\", \"q\"])\n    (\"if(d instanceof C)\")\n        (\"return d\")\n    (\"if(!util.isObject(d))\")\n        (\"throw TypeError(%j)\", mtype.fullName + \": object expected\")\n    (\"if(q===undefined)q=0\")\n    (\"if(q>util.recursionLimit)\")\n        (\"throw Error(\\\"max depth exceeded\\\")\");\n    if (!fields.length) return gen\n    (\"return new C\");\n    gen\n    (\"var m=new C\");\n    for (var i = 0; i < fields.length; ++i) {\n        var field  = fields[i].resolve(),\n            prop   = util.safeProp(field.name),\n            implicitPresence = !field.hasPresence && !field.repeated && !field.map\n                && (field.resolvedType instanceof Enum || types.basic[field.type] !== undefined);\n\n        // Map fields\n        if (field.map) { gen\n    (\"if(d%s){\", prop)\n        (\"if(!util.isObject(d%s))\", prop)\n            (\"throw TypeError(%j)\", field.fullName + \": object expected\")\n        (\"m%s={}\", prop)\n        (\"for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){\", prop);\n            gen\n        (\"if(ks[i]===\\\"__proto__\\\")\")\n            (\"util.makeProp(m%s,ks[i])\", prop);\n            genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + \"[ks[i]]\")\n        (\"}\")\n    (\"}\");\n\n        // Repeated fields\n        } else if (field.repeated) { gen\n    (\"if(d%s){\", prop)\n        (\"if(!Array.isArray(d%s))\", prop)\n            (\"throw TypeError(%j)\", field.fullName + \": array expected\");\n            if (field.resolvedType instanceof Enum) gen\n        (\"m%s=[]\", prop);\n            else gen\n        (\"m%s=Array(d%s.length)\", prop, prop);\n            gen\n        (\"for(var i=0;i<d%s.length;++i){\", prop);\n            genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + \"[i]\", field.resolvedType instanceof Enum ? prop : undefined)\n        (\"}\")\n    (\"}\");\n\n        // Non-repeated fields\n        } else {\n            if (!(field.resolvedType instanceof Enum)) gen // no need to test for null/undefined if an enum (uses switch)\n    (\"if(d%s!=null){\", prop); // !== undefined && !== null\n            if (implicitPresence) {\n                if (field.resolvedType instanceof Enum) gen\n    (\"if(d%s!==%j&&(typeof d%s!==\\\"string\\\"||types[%i].values[d%s]!==%j)){\", prop, field.typeDefault, prop, i, prop, field.typeDefault);\n                else if (field.type === \"string\") gen\n    (\"if(typeof d%s!==\\\"string\\\"||d%s.length){\", prop, prop);\n                else if (field.type === \"bytes\") gen\n    (\"if(d%s.length){\", prop);\n                else if (field.type === \"bool\") gen\n    (\"if(d%s){\", prop);\n                else if (field.type === \"double\" || field.type === \"float\") gen\n    (\"if(!Object.is(Number(d%s),0)){\", prop);\n                else if (types.long[field.type] !== undefined) gen\n    (\"if(typeof d%s===\\\"object\\\"?d%s.low||d%s.high:Number(d%s)!==0){\", prop, prop, prop, prop);\n                else gen\n    (\"if(Number(d%s)!==0){\", prop);\n            }\n        genValuePartial_fromObject(gen, field, /* not sorted */ i, prop);\n            if (implicitPresence) gen\n    (\"}\");\n            if (!(field.resolvedType instanceof Enum)) gen\n    (\"}\");\n        }\n    } return gen\n    (\"return m\");\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n};\n\n/**\n * Generates a partial value toObject converter.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} dstProp Destination property reference\n * @param {string} [srcProp] Source property reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genValuePartial_toObject(gen, field, fieldIndex, dstProp, srcProp) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    if (!srcProp)\n        srcProp = dstProp;\n    if (field.resolvedType) {\n        if (field.resolvedType instanceof Enum) gen\n            (\"d%s=o.enums===String?(types[%i].values[m%s]===undefined?m%s:types[%i].values[m%s]):m%s\", dstProp, fieldIndex, srcProp, srcProp, fieldIndex, srcProp, srcProp);\n        else gen\n            (\"d%s=types[%i].toObject(m%s,o,q+1)\", dstProp, fieldIndex, srcProp);\n    } else {\n        var isUnsigned = false;\n        switch (field.type) {\n            case \"double\":\n            case \"float\": gen\n            (\"d%s=o.json&&!isFinite(m%s)?String(m%s):m%s\", dstProp, srcProp, srcProp, srcProp);\n                break;\n            case \"uint64\":\n            case \"fixed64\":\n                isUnsigned = true;\n                // eslint-disable-next-line no-fallthrough\n            case \"int64\":\n            case \"sint64\":\n            case \"sfixed64\": gen\n            (\"if(typeof BigInt!==\\\"undefined\\\"&&o.longs===BigInt)\")\n                (\"d%s=typeof m%s===\\\"number\\\"?BigInt(m%s):util.Long.fromBits(m%s.low>>>0,m%s.high>>>0,%j).toBigInt()\", dstProp, srcProp, srcProp, srcProp, srcProp, isUnsigned)\n            (\"else if(typeof m%s===\\\"number\\\")\", srcProp)\n                (\"d%s=o.longs===String?String(m%s):m%s\", dstProp, srcProp, srcProp)\n            (\"else\") // Long-like\n                (\"d%s=o.longs===String?util.Long.prototype.toString.call(m%s):o.longs===Number?new util.LongBits(m%s.low>>>0,m%s.high>>>0).toNumber(%s):m%s\", dstProp, srcProp, srcProp, srcProp, isUnsigned ? \"true\": \"\", srcProp);\n                break;\n            case \"bytes\": gen\n            (\"d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s\", dstProp, srcProp, srcProp, srcProp, srcProp);\n                break;\n            default: gen\n            (\"d%s=m%s\", dstProp, srcProp);\n                break;\n        }\n    }\n    return gen;\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n\n/**\n * Generates a runtime message to plain object converter specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nconverter.toObject = function toObject(mtype) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById);\n    if (!fields.length)\n        return util.codegen()(\"return {}\");\n    var gen = util.codegen([\"m\", \"o\", \"q\"])\n    (\"if(!o)\")\n        (\"o={}\")\n    (\"if(q===undefined)q=0\")\n    (\"if(q>util.recursionLimit)\")\n        (\"throw Error(\\\"max depth exceeded\\\")\")\n    (\"var d={}\");\n\n    var repeatedFields = [],\n        mapFields = [],\n        normalFields = [],\n        i = 0;\n    for (; i < fields.length; ++i)\n        if (!fields[i].partOf)\n            ( fields[i].resolve().repeated ? repeatedFields\n            : fields[i].map ? mapFields\n            : normalFields).push(fields[i]);\n\n    if (repeatedFields.length) { gen\n    (\"if(o.arrays||o.defaults){\");\n        for (i = 0; i < repeatedFields.length; ++i) gen\n        (\"d%s=[]\", util.safeProp(repeatedFields[i].name));\n        gen\n    (\"}\");\n    }\n\n    if (mapFields.length) { gen\n    (\"if(o.objects||o.defaults){\");\n        for (i = 0; i < mapFields.length; ++i) gen\n        (\"d%s={}\", util.safeProp(mapFields[i].name));\n        gen\n    (\"}\");\n    }\n\n    if (normalFields.length) { gen\n    (\"if(o.defaults){\");\n        for (i = 0; i < normalFields.length; ++i) {\n            var field = normalFields[i],\n                prop  = util.safeProp(field.name);\n            if (field.resolvedType instanceof Enum) gen\n        (\"d%s=o.enums===String?%j:%j\", prop, field.resolvedType.valuesById[field.typeDefault], field.typeDefault);\n            else if (field.long) gen\n        (\"if(util.Long){\")\n            (\"var n=new util.Long(%i,%i,%j)\", field.typeDefault.low, field.typeDefault.high, field.typeDefault.unsigned)\n            (\"d%s=o.longs===String?n.toString():o.longs===Number?n.toNumber():typeof BigInt!==\\\"undefined\\\"&&o.longs===BigInt?n.toBigInt():n\", prop)\n        (\"}else\")\n            (\"d%s=o.longs===String?%j:typeof BigInt!==\\\"undefined\\\"&&o.longs===BigInt?BigInt(%j):%i\", prop, field.typeDefault.toString(), field.typeDefault.toString(), field.typeDefault.toNumber());\n            else if (field.bytes) {\n                var arrayDefault = Array.prototype.slice.call(field.typeDefault);\n                gen\n        (\"if(o.bytes===String)d%s=%j\", prop, util.base64.encode(field.typeDefault, 0, field.typeDefault.length))\n        (\"else{\")\n            (\"d%s=%j\", prop, arrayDefault)\n            (\"if(o.bytes!==Array)d%s=util.newBuffer(d%s)\", prop, prop)\n        (\"}\");\n            } else if ((field.type === \"double\" || field.type === \"float\") && typeof field.typeDefault === \"number\"\n                    && (!isFinite(field.typeDefault) || Object.is(field.typeDefault, -0))) gen\n        (\"d%s=%f\", prop, field.typeDefault)\n        (\"if(o.json&&!isFinite(d%s))d%s=String(d%s)\", prop, prop, prop);\n            else gen\n        (\"d%s=%j\", prop, field.typeDefault); // also messages (=null)\n        } gen\n    (\"}\");\n    }\n    var hasKs2 = false;\n    for (i = 0; i < fields.length; ++i) {\n        var field = fields[i],\n            index = mtype._fieldsArray.indexOf(field),\n            prop  = util.safeProp(field.name);\n        if (field.map) {\n            if (!hasKs2) { hasKs2 = true; gen\n    (\"var ks2\");\n            } gen\n    (\"if(m%s&&(ks2=Object.keys(m%s)).length){\", prop, prop)\n        (\"d%s={}\", prop);\n            var longKey = types.long[field.keyType] !== undefined,\n                srcProp = prop + \"[ks2[j]]\";\n            gen\n        (\"for(var j=0;j<ks2.length;++j){\");\n            if (longKey) gen\n            (\"var k2=util.longFromKey(ks2[j],%j).toString()\", field.keyType === \"uint64\" || field.keyType === \"fixed64\");\n            gen\n        (\"if(ks2[j]===\\\"__proto__\\\")\")\n            (\"util.makeProp(d%s,ks2[j])\", prop);\n            genValuePartial_toObject(gen, field, /* sorted */ index, longKey ? prop + \"[k2]\" : srcProp, srcProp)\n        (\"}\");\n        } else if (field.repeated) { gen\n    (\"if(m%s&&m%s.length){\", prop, prop)\n        (\"d%s=Array(m%s.length)\", prop, prop)\n        (\"for(var j=0;j<m%s.length;++j){\", prop);\n            genValuePartial_toObject(gen, field, /* sorted */ index, prop + \"[j]\")\n        (\"}\");\n        } else { gen\n    (\"if(m%s!=null&&Object.hasOwnProperty.call(m,%j)){\", prop, field.name); // !== undefined && !== null\n        genValuePartial_toObject(gen, field, /* sorted */ index, prop);\n        if (field.partOf && !field.partOf.isProto3Optional) gen\n        (\"if(o.oneofs)\")\n            (\"d%s=%j\", util.safeProp(field.partOf.name), field.name);\n        }\n        gen\n    (\"}\");\n    }\n    return gen\n    (\"return d\");\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n};\n","\"use strict\";\n\n/**\n * Wrappers for common types.\n * @type {Object.<string,IWrapper>}\n * @const\n */\nvar wrappers = exports;\n\nvar Message = require(\"./message\"),\n    util    = require(\"./util/minimal\");\n\n/**\n * From object converter part of an {@link IWrapper}.\n * @typedef WrapperFromObjectConverter\n * @type {function}\n * @param {Object.<string,*>} object Plain object\n * @returns {Message<{}>} Message instance\n * @this Type\n */\n\n/**\n * To object converter part of an {@link IWrapper}.\n * @typedef WrapperToObjectConverter\n * @type {function}\n * @param {Message<{}>} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n * @this Type\n */\n\n/**\n * Common type wrapper part of {@link wrappers}.\n * @interface IWrapper\n * @property {WrapperFromObjectConverter} [fromObject] From object converter\n * @property {WrapperToObjectConverter} [toObject] To object converter\n */\n\n// Custom wrapper for Any\nwrappers[\".google.protobuf.Any\"] = {\n\n    fromObject: function(object, depth) {\n        if (depth === undefined)\n            depth = 0;\n        if (depth > util.recursionLimit)\n            throw Error(\"max depth exceeded\");\n\n        // unwrap value type if mapped\n        if (object && object[\"@type\"]) {\n             // Only use fully qualified type name after the last '/'\n            var name = object[\"@type\"].substring(object[\"@type\"].lastIndexOf(\"/\") + 1);\n            var type = this.lookup(name, [ this.constructor ]);\n            /* istanbul ignore else */\n            if (type) {\n                // type_url does not accept leading \".\"\n                var type_url = object[\"@type\"].charAt(0) === \".\" ?\n                    object[\"@type\"].slice(1) : object[\"@type\"];\n                // type_url prefix is optional, but path seperator is required\n                if (type_url.indexOf(\"/\") === -1) {\n                    type_url = \"/\" + type_url;\n                }\n                return this.create({\n                    type_url: type_url,\n                    value: type.encode(type.fromObject(object, depth + 1)).finish()\n                });\n            }\n        }\n\n        return this.fromObject(object, depth);\n    },\n\n    toObject: function(message, options, depth) {\n        if (depth === undefined)\n            depth = 0;\n        if (depth > util.recursionLimit)\n            throw Error(\"max depth exceeded\");\n\n        // Default prefix\n        var googleApi = \"type.googleapis.com/\";\n        var prefix = \"\";\n        var name = \"\";\n        // decode value if requested and unmapped\n        if (options && options.json && message.type_url && message.value) {\n            // Only use fully qualified type name after the last '/'\n            name = message.type_url.substring(message.type_url.lastIndexOf(\"/\") + 1);\n            // Separate the prefix used\n            prefix = message.type_url.substring(0, message.type_url.lastIndexOf(\"/\") + 1);\n            var type = this.lookup(name, [ this.constructor ]);\n            /* istanbul ignore else */\n            if (type)\n                message = type.decode(message.value, undefined, undefined, depth + 1);\n        }\n\n        // wrap value if unmapped\n        if (!(message instanceof this.ctor) && message instanceof Message) {\n            var object = message.$type.toObject(message, options, depth + 1);\n            var messageName = message.$type.fullName[0] === \".\" ?\n                message.$type.fullName.slice(1) : message.$type.fullName;\n            // Default to type.googleapis.com prefix if no prefix is used\n            if (prefix === \"\") {\n                prefix = googleApi;\n            }\n            name = prefix + messageName;\n            object[\"@type\"] = name;\n            return object;\n        }\n\n        return this.toObject(message, options, depth);\n    }\n};\n","\"use strict\";\nmodule.exports = Type;\n\n// extends Namespace\nvar Namespace = require(\"./namespace\");\nType.prototype = Object.create(Namespace.prototype, {\n    constructor: {\n        value: Type,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nType.className = \"Type\";\n\nvar Enum      = require(\"./enum\"),\n    OneOf     = require(\"./oneof\"),\n    Field     = require(\"./field\"),\n    MapField  = require(\"./mapfield\"),\n    Service   = require(\"./service\"),\n    Message   = require(\"./message\"),\n    Reader    = require(\"./reader\"),\n    Writer    = require(\"./writer\"),\n    util      = require(\"./util\"),\n    encoder   = require(\"./encoder\"),\n    decoder   = require(\"./decoder\"),\n    verifier  = require(\"./verifier\"),\n    converter = require(\"./converter\"),\n    wrappers  = require(\"./wrappers\");\n\n/**\n * Constructs a new reflected message type instance.\n * @classdesc Reflected message type.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Message name\n * @param {Object.<string,*>} [options] Declared options\n */\nfunction Type(name, options) {\n    name = name.replace(/\\W/g, \"\");\n    Namespace.call(this, name, options);\n\n    /**\n     * Message fields.\n     * @type {Object.<string,Field>}\n     */\n    this.fields = {};  // toJSON, marker\n\n    /**\n     * Oneofs declared within this namespace, if any.\n     * @type {Object.<string,OneOf>}\n     */\n    this.oneofs = undefined; // toJSON\n\n    /**\n     * Extension ranges, if any.\n     * @type {number[][]}\n     */\n    this.extensions = undefined; // toJSON\n\n    /**\n     * Reserved ranges, if any.\n     * @type {Array.<number[]|string>}\n     */\n    this.reserved = undefined; // toJSON\n\n    /*?\n     * Whether this type is a legacy group.\n     * @type {boolean|undefined}\n     */\n    this.group = undefined; // toJSON\n\n    /**\n     * Declared symbol visibility, if any.\n     * @type {\"local\"|\"export\"|undefined}\n     */\n    this.visibility = undefined; // toJSON\n\n    /**\n     * Cached fields by id.\n     * @type {Object.<number,Field>|null}\n     * @private\n     */\n    this._fieldsById = null;\n\n    /**\n     * Cached fields as an array.\n     * @type {Field[]|null}\n     * @private\n     */\n    this._fieldsArray = null;\n\n    /**\n     * Cached oneofs as an array.\n     * @type {OneOf[]|null}\n     * @private\n     */\n    this._oneofsArray = null;\n\n    /**\n     * Cached constructor.\n     * @type {Constructor<{}>}\n     * @private\n     */\n    this._ctor = null;\n\n    /**\n     * Cached fields by JSON name.\n     * @type {Object.<string,Field>|null}\n     * @private\n     */\n    this._fieldsByJsonName = null; // used by ext/protojson\n}\n\nObject.defineProperties(Type.prototype, {\n\n    /**\n     * Message fields by id.\n     * @name Type#fieldsById\n     * @type {Object.<number,Field>}\n     * @readonly\n     */\n    fieldsById: {\n        get: function() {\n\n            /* istanbul ignore if */\n            if (this._fieldsById)\n                return this._fieldsById;\n\n            this._fieldsById = {};\n            for (var names = Object.keys(this.fields), i = 0; i < names.length; ++i) {\n                var field = this.fields[names[i]],\n                    id = field.id;\n\n                /* istanbul ignore if */\n                if (this._fieldsById[id])\n                    throw Error(\"duplicate id \" + id + \" in \" + this);\n\n                this._fieldsById[id] = field;\n            }\n            return this._fieldsById;\n        }\n    },\n\n    /**\n     * Fields of this message as an array for iteration.\n     * @name Type#fieldsArray\n     * @type {Field[]}\n     * @readonly\n     */\n    fieldsArray: {\n        get: function() {\n            return this._fieldsArray || (this._fieldsArray = util.toArray(this.fields));\n        }\n    },\n\n    /**\n     * Oneofs of this message as an array for iteration.\n     * @name Type#oneofsArray\n     * @type {OneOf[]}\n     * @readonly\n     */\n    oneofsArray: {\n        get: function() {\n            return this._oneofsArray || (this._oneofsArray = util.toArray(this.oneofs));\n        }\n    },\n\n    /**\n     * The registered constructor, if any registered, otherwise a generic constructor.\n     * Assigning a function replaces the internal constructor. If the function does not extend {@link Message} yet, its prototype will be setup accordingly and static methods will be populated. If it already extends {@link Message}, it will just replace the internal constructor.\n     * When assigning manually, add the type to its parent namespace/root first if fields reference other reflected types, because constructor setup resolves field defaults.\n     * @name Type#ctor\n     * @type {Constructor<{}>}\n     */\n    ctor: {\n        get: function() {\n            return this._ctor || (this.ctor = Type.generateConstructor(this)());\n        },\n        set: function(ctor) {\n\n            // Ensure proper prototype\n            var prototype = ctor.prototype;\n            if (!(prototype instanceof Message)) {\n                ctor.prototype = new Message();\n                Object.defineProperty(ctor.prototype, \"constructor\", {\n                    value: ctor,\n                    writable: true,\n                    enumerable: false,\n                    configurable: true\n                });\n                util.merge(ctor.prototype, prototype);\n            }\n\n            // Classes and messages reference their reflected type\n            ctor.$type = ctor.prototype.$type = this;\n\n            // Mix in static methods\n            util.merge(ctor, Message, true);\n\n            this._ctor = ctor;\n            delete this.decode;\n            delete this.fromObject;\n\n            // Messages have non-enumerable default values on their prototype\n            var i = 0;\n            for (var field; i < /* initializes */ this.fieldsArray.length; ++i) {\n                field = this._fieldsArray[i].resolve(); // ensures a proper value\n                ctor.prototype[field.name] = field.defaultValue;\n            }\n\n            // Messages have non-enumerable getters and setters for each virtual oneof field\n            var ctorProperties = {};\n            for (i = 0; i < /* initializes */ this.oneofsArray.length; ++i)\n                ctorProperties[this._oneofsArray[i].resolve().name] = {\n                    get: util.oneOfGetter(this._oneofsArray[i].oneof),\n                    set: util.oneOfSetter(this._oneofsArray[i].oneof)\n                };\n            if (i)\n                Object.defineProperties(ctor.prototype, ctorProperties);\n        }\n    }\n});\n\n/**\n * Generates a constructor function for the specified type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nType.generateConstructor = function generateConstructor(mtype) {\n    /* eslint-disable no-unexpected-multiline */\n    var gen = util.codegen([\"p\"]);\n    // explicitly initialize mutable object/array fields so that these aren't just inherited from the prototype\n    for (var i = 0, field; i < mtype.fieldsArray.length; ++i)\n        if ((field = mtype._fieldsArray[i]).map) gen\n            (\"this%s={}\", util.safeProp(field.name));\n        else if (field.repeated) gen\n            (\"this%s=[]\", util.safeProp(field.name));\n    return gen\n    (\"if(p)for(var ks=Object.keys(p),i=0;i<ks.length;++i)if(p[ks[i]]!=null&&ks[i]!==\\\"__proto__\\\")\") // omit undefined or null\n        (\"this[ks[i]]=p[ks[i]]\");\n    /* eslint-enable no-unexpected-multiline */\n};\n\nfunction clearCache(type) {\n    type._fieldsById = type._fieldsArray = type._oneofsArray = type._fieldsByJsonName = null;\n    delete type.encode;\n    delete type.decode;\n    delete type.verify;\n    return type;\n}\n\n/**\n * Message type descriptor.\n * @interface IType\n * @extends INamespace\n * @property {string} [edition] Edition\n * @property {Object.<string,IOneOf>} [oneofs] Oneof descriptors\n * @property {Object.<string,IField>} fields Field descriptors\n * @property {number[][]} [extensions] Extension ranges\n * @property {Array.<number[]|string>} [reserved] Reserved ranges\n * @property {boolean} [group=false] Whether a legacy group or not\n * @property {\"local\"|\"export\"} [visibility] Declared symbol visibility\n * @property {string|null} [comment] Message type comment\n */\n\n/**\n * Creates a message type from a message type descriptor.\n * @param {string} name Message name\n * @param {IType} json Message type descriptor\n * @param {number} [depth] Current nesting depth, defaults to `0`\n * @returns {Type} Created message type\n */\nType.fromJSON = function fromJSON(name, json, depth) {\n    if (depth === undefined)\n        depth = 0;\n    if (depth > util.nestingLimit)\n        throw Error(\"max depth exceeded\");\n    var type = new Type(name, json.options);\n    type.extensions = json.extensions;\n    type.reserved = json.reserved;\n    var names = Object.keys(json.fields),\n        i = 0;\n    for (; i < names.length; ++i)\n        type.add(\n            ( typeof json.fields[names[i]].keyType !== \"undefined\"\n            ? MapField.fromJSON\n            : Field.fromJSON )(names[i], json.fields[names[i]])\n        );\n    if (json.oneofs)\n        for (names = Object.keys(json.oneofs), i = 0; i < names.length; ++i)\n            type.add(OneOf.fromJSON(names[i], json.oneofs[names[i]]));\n    if (json.nested)\n        for (names = Object.keys(json.nested), i = 0; i < names.length; ++i) {\n            var nested = json.nested[names[i]];\n            type.add( // most to least likely\n                ( nested.id !== undefined\n                ? Field.fromJSON\n                : nested.fields !== undefined\n                ? Type.fromJSON\n                : nested.values !== undefined\n                ? Enum.fromJSON\n                : nested.methods !== undefined\n                ? Service.fromJSON\n                : Namespace.fromJSON )(names[i], nested, depth + 1)\n            );\n        }\n    if (json.extensions && json.extensions.length)\n        type.extensions = json.extensions;\n    if (json.reserved && json.reserved.length)\n        type.reserved = json.reserved;\n    if (json.group)\n        type.group = true;\n    if (json.visibility)\n        type.visibility = json.visibility;\n    if (json.comment)\n        type.comment = json.comment;\n    if (json.edition)\n        type._edition = json.edition;\n    type._defaultEdition = \"proto3\";  // For backwards-compatibility.\n    return type;\n};\n\n/**\n * Converts this message type to a message type descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IType} Message type descriptor\n */\nType.prototype.toJSON = function toJSON(toJSONOptions) {\n    var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions);\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"edition\"    , this._editionToJSON(),\n        \"options\"    , inherited && inherited.options || undefined,\n        \"oneofs\"     , Namespace.arrayToJSON(this.oneofsArray, toJSONOptions),\n        \"fields\"     , Namespace.arrayToJSON(this.fieldsArray.filter(function(obj) { return !obj.declaringField; }), toJSONOptions) || {},\n        \"extensions\" , this.extensions && this.extensions.length ? this.extensions : undefined,\n        \"reserved\"   , this.reserved && this.reserved.length ? this.reserved : undefined,\n        \"group\"      , this.group || undefined,\n        \"visibility\" , this.visibility,\n        \"nested\"     , inherited && inherited.nested || undefined,\n        \"comment\"    , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * @override\n */\nType.prototype.resolveAll = function resolveAll() {\n    if (!this._needsRecursiveResolve) return this;\n\n    Namespace.prototype.resolveAll.call(this);\n    var oneofs = this.oneofsArray; i = 0;\n    while (i < oneofs.length)\n        oneofs[i++].resolve();\n    var fields = this.fieldsArray, i = 0;\n    while (i < fields.length)\n        fields[i++].resolve();\n    return this;\n};\n\n/**\n * @override\n */\nType.prototype._resolveFeaturesRecursive = function _resolveFeaturesRecursive(edition) {\n    if (!this._needsRecursiveFeatureResolution) return this;\n\n    edition = this._edition || edition;\n\n    Namespace.prototype._resolveFeaturesRecursive.call(this, edition);\n    this.oneofsArray.forEach(oneof => {\n        oneof._resolveFeatures(edition);\n    });\n    this.fieldsArray.forEach(field => {\n        field._resolveFeatures(edition);\n    });\n    return this;\n};\n\n/**\n * @override\n */\nType.prototype.get = function get(name) {\n    if (Object.prototype.hasOwnProperty.call(this.fields, name))\n        return this.fields[name];\n    if (this.oneofs && Object.prototype.hasOwnProperty.call(this.oneofs, name))\n        return this.oneofs[name];\n    if (this.nested && Object.prototype.hasOwnProperty.call(this.nested, name))\n        return this.nested[name];\n    return null;\n};\n\n/**\n * Adds a nested object to this type.\n * @param {ReflectionObject} object Nested object to add\n * @returns {Type} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a nested object with this name or, if a field, when there is already a field with this id\n */\nType.prototype.add = function add(object) {\n    if (this.get(object.name))\n        throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n\n    if (object instanceof Field && object.extend === undefined) {\n        // NOTE: Extension fields aren't actual fields on the declaring type, but nested objects.\n        // The root object takes care of adding distinct sister-fields to the respective extended\n        // type instead.\n\n        // avoids calling the getter if not absolutely necessary because it's called quite frequently\n        if (this._fieldsById ? /* istanbul ignore next */ this._fieldsById[object.id] : this.fieldsById[object.id])\n            throw Error(\"duplicate id \" + object.id + \" in \" + this);\n        if (this.isReservedId(object.id))\n            throw Error(\"id \" + object.id + \" is reserved in \" + this);\n        if (this.isReservedName(object.name) || object.name.charAt(0) === \"$\")\n            throw Error(\"name '\" + object.name + \"' is reserved in \" + this);\n        if (object.name === \"__proto__\")\n            return this;\n\n        if (object.parent)\n            object.parent.remove(object);\n        this.fields[object.name] = object;\n        object.message = this;\n        object.onAdd(this);\n        return clearCache(this);\n    }\n    if (object instanceof OneOf) {\n        if (object.name.charAt(0) === \"$\")\n            throw Error(\"name '\" + object.name + \"' is reserved in \" + this);\n        if (object.name === \"__proto__\")\n            return this;\n        if (!this.oneofs)\n            this.oneofs = {};\n        this.oneofs[object.name] = object;\n        object.onAdd(this);\n        return clearCache(this);\n    }\n    return Namespace.prototype.add.call(this, object);\n};\n\n/**\n * Removes a nested object from this type.\n * @param {ReflectionObject} object Nested object to remove\n * @returns {Type} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `object` is not a member of this type\n */\nType.prototype.remove = function remove(object) {\n    if (object instanceof Field && object.extend === undefined) {\n        // See Type#add for the reason why extension fields are excluded here.\n\n        /* istanbul ignore if */\n        if (!util.remove(this.fields, object, object.name))\n            throw Error(object + \" is not a member of \" + this);\n\n        object.parent = null;\n        object.onRemove(this);\n        return clearCache(this);\n    }\n    if (object instanceof OneOf) {\n\n        /* istanbul ignore if */\n        if (!util.remove(this.oneofs, object, object.name))\n            throw Error(object + \" is not a member of \" + this);\n\n        object.parent = null;\n        object.onRemove(this);\n        return clearCache(this);\n    }\n    return Namespace.prototype.remove.call(this, object);\n};\n\n/**\n * Tests if the specified id is reserved.\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nType.prototype.isReservedId = function isReservedId(id) {\n    return Namespace.isReservedId(this.reserved, id);\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nType.prototype.isReservedName = function isReservedName(name) {\n    return Namespace.isReservedName(this.reserved, name);\n};\n\n/**\n * Creates a new message of this type using the specified properties.\n * @param {Object.<string,*>} [properties] Properties to set\n * @returns {ReflectedMessage} Message instance\n */\nType.prototype.create = function create(properties) {\n    return new this.ctor(properties);\n};\n\n/**\n * Sets up {@link Type#encode|encode}, {@link Type#decode|decode} and {@link Type#verify|verify}.\n * @returns {Type} `this`\n */\nType.prototype.setup = function setup() {\n    // Sets up everything at once so that the prototype chain does not have to be re-evaluated\n    // multiple times (V8, soft-deopt prototype-check).\n\n    // Resolve feature defaults incl. field presence before generating codecs\n    var root = this.root;\n    if (root && root._needsRecursiveFeatureResolution) {\n        var edition = root._edition || this._edition;\n        if (edition)\n            root._resolveFeaturesRecursive(edition);\n    }\n\n    var fullName = this.fullName,\n        types    = [];\n    for (var i = 0; i < /* initializes */ this.fieldsArray.length; ++i)\n        types.push(this._fieldsArray[i].resolve().resolvedType);\n\n    // Replace setup methods with type-specific generated functions\n    this.encode = encoder(this)({\n        Writer : Writer,\n        types  : types,\n        util   : util\n    });\n    this.decode = decoder(this)({\n        Reader : Reader,\n        types  : types,\n        util   : util,\n        C      : this.ctor\n    });\n    this.verify = verifier(this)({\n        types : types,\n        util  : util\n    });\n    this.fromObject = converter.fromObject(this)({\n        types : types,\n        util  : util,\n        C     : this.ctor\n    });\n    this.toObject = converter.toObject(this)({\n        types : types,\n        util  : util\n    });\n\n    // Inject custom wrappers for common types\n    var wrapper = wrappers[fullName];\n    if (wrapper) {\n        var wrapperThis = Object.create(this);\n        // Reuse this type's runtime constructor in wrapper fromObject/toObject\n        wrapperThis._ctor = this.ctor;\n        wrapperThis.fromObject = this.fromObject;\n        this.fromObject = wrapper.fromObject.bind(wrapperThis);\n        wrapperThis.toObject = this.toObject;\n        this.toObject = wrapper.toObject.bind(wrapperThis);\n    }\n\n    return this;\n};\n\n/**\n * Encodes a message of this type. Does not implicitly {@link Type#verify|verify} messages.\n * @param {Message<{}>|Object.<string,*>} message Message instance or plain object\n * @param {Writer} [writer] Writer to encode to\n * @returns {Writer} writer\n */\nType.prototype.encode = function encode_setup(message, writer) { // eslint-disable-line no-unused-vars\n    return this.setup().encode.apply(this, arguments); // overrides this method\n};\n\n/**\n * Encodes a message of this type preceeded by its byte length as a varint. Does not implicitly {@link Type#verify|verify} messages.\n * @param {Message<{}>|Object.<string,*>} message Message instance or plain object\n * @param {Writer} [writer] Writer to encode to\n * @returns {Writer} writer\n */\nType.prototype.encodeDelimited = function encodeDelimited(message, writer) {\n    return this.encode(message, (writer || Writer.create()).fork()).ldelim();\n};\n\n/**\n * Decodes a message of this type.\n * @param {Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Length of the message, if known beforehand\n * @returns {ReflectedMessage} Decoded message\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {util.ProtocolError<{}>} If required fields are missing\n */\nType.prototype.decode = function decode_setup(reader, length) { // eslint-disable-line no-unused-vars\n    return this.setup().decode.apply(this, arguments); // overrides this method\n};\n\n/**\n * Decodes a message of this type preceeded by its byte length as a varint.\n * @param {Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {ReflectedMessage} Decoded message\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {util.ProtocolError} If required fields are missing\n */\nType.prototype.decodeDelimited = function decodeDelimited(reader) {\n    if (!(reader instanceof Reader))\n        reader = Reader.create(reader);\n    return this.decode(reader, reader.uint32());\n};\n\n/**\n * Verifies that field values are valid and that required fields are present.\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {null|string} `null` if valid, otherwise the reason why it is not\n */\nType.prototype.verify = function verify_setup(message) { // eslint-disable-line no-unused-vars\n    return this.setup().verify.apply(this, arguments); // overrides this method\n};\n\n/**\n * Creates a new message of this type from a plain object. Also converts values to their respective internal types.\n * @param {Object.<string,*>} object Plain object to convert\n * @returns {ReflectedMessage} Message instance\n */\nType.prototype.fromObject = function fromObject(object) { // eslint-disable-line no-unused-vars\n    return this.setup().fromObject.apply(this, arguments);\n};\n\n/**\n * Conversion options as used by {@link Type#toObject} and {@link Message.toObject}.\n * @interface IConversionOptions\n * @property {Function} [longs] Long conversion type.\n * Valid values are `BigInt`, `String` and `Number` (the global types).\n * Defaults to copy the present value, which is a possibly unsafe number without and a {@link Long} with a long library.\n * @property {Function} [enums] Enum value conversion type.\n * Only valid value is `String` (the global type).\n * Defaults to copy the present value, which is the numeric id.\n * @property {Function} [bytes] Bytes value conversion type.\n * Valid values are `Array` and (a base64 encoded) `String` (the global types).\n * Defaults to copy the present value, which usually is a Buffer under node and an Uint8Array in the browser.\n * @property {boolean} [defaults=false] Also sets default values on the resulting object\n * @property {boolean} [arrays=false] Sets empty arrays for missing repeated fields even if `defaults=false`\n * @property {boolean} [objects=false] Sets empty objects for missing map fields even if `defaults=false`\n * @property {boolean} [oneofs=false] Includes virtual oneof properties set to the present field's name, if any\n * @property {boolean} [json=false] Performs additional JSON compatibility conversions, i.e. NaN and Infinity to strings\n */\n\n/**\n * Creates a plain object from a message of this type. Also converts values to other types if specified.\n * @param {Message<{}>} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n */\nType.prototype.toObject = function toObject(message, options) { // eslint-disable-line no-unused-vars\n    return this.setup().toObject.apply(this, arguments);\n};\n\n/**\n * Gets the type url for this type.\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\nType.prototype.getTypeUrl = function getTypeUrl(prefix) {\n    if (prefix === undefined)\n        prefix = \"type.googleapis.com\";\n    var fullName = this.fullName;\n    return prefix + \"/\" + (fullName.charAt(0) === \".\" ? fullName.substring(1) : fullName);\n};\n\n/**\n * Decorator function as returned by {@link Type.d} (TypeScript).\n * @typedef TypeDecorator\n * @type {function}\n * @param {Constructor<T>} target Target constructor\n * @returns {undefined}\n * @template T extends Message<T>\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\n\n/**\n * Type decorator (TypeScript).\n * @param {string} [typeName] Type name, defaults to the constructor's name\n * @returns {TypeDecorator<T>} Decorator function\n * @template T extends Message<T>\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\nType.d = function decorateType(typeName) {\n    return function typeDecorator(target) {\n        util.decorateType(target, typeName);\n    };\n};\n","\"use strict\";\nmodule.exports = Root;\n\n// extends Namespace\nvar Namespace = require(\"./namespace\");\nRoot.prototype = Object.create(Namespace.prototype, {\n    constructor: {\n        value: Root,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nRoot.className = \"Root\";\n\nvar Field   = require(\"./field\"),\n    Enum    = require(\"./enum\"),\n    OneOf   = require(\"./oneof\"),\n    util    = require(\"./util\");\n\nvar Type,   // cyclic\n    parse,  // might be excluded\n    common; // \"\n\n/**\n * Constructs a new root namespace instance.\n * @classdesc Root namespace wrapping all types, enums, services, sub-namespaces etc. that belong together.\n * @extends NamespaceBase\n * @constructor\n * @param {Object.<string,*>} [options] Top level options\n */\nfunction Root(options) {\n    Namespace.call(this, \"\", options);\n\n    /**\n     * Deferred extension fields.\n     * @type {Field[]}\n     */\n    this.deferred = [];\n\n    /**\n     * Resolved file names of loaded files.\n     * @type {string[]}\n     */\n    this.files = [];\n\n    /**\n     * Edition, defaults to proto2 if unspecified.\n     * @type {string}\n     * @private\n     */\n    this._edition = \"proto2\";\n\n    /**\n     * Global lookup cache of fully qualified names.\n     * @type {Object.<string,ReflectionObject>}\n     * @private\n     */\n    this._fullyQualifiedObjects = {};\n}\n\n/**\n * Loads a namespace descriptor into a root namespace.\n * @param {INamespace} json Namespace descriptor\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted\n * @param {number} [depth] Current nesting depth, defaults to `0`\n * @returns {Root} Root namespace\n */\nRoot.fromJSON = function fromJSON(json, root, depth) {\n    if (depth === undefined)\n        depth = 0;\n    if (depth > util.recursionLimit)\n        throw Error(\"max depth exceeded\");\n    if (!root)\n        root = new Root();\n    if (json.options)\n        root.setOptions(json.options);\n    return root.addJSON(json.nested, depth).resolveAll();\n};\n\n/**\n * Resolves the path of an imported file, relative to the importing origin.\n * This method exists so you can override it with your own logic in case your imports are scattered over multiple directories.\n * @function\n * @param {string} origin The file name of the importing file\n * @param {string} target The file name being imported\n * @returns {string|null} Resolved path to `target` or `null` to skip the file\n */\nRoot.prototype.resolvePath = util.path.resolve;\n\n/**\n * Fetch content from file path or url\n * This method exists so you can override it with your own logic.\n * @function\n * @param {string} path File path or url\n * @param {FetchCallback} callback Callback function\n * @returns {undefined}\n */\nRoot.prototype.fetch = util.fetch;\n\n// A symbol-like function to safely signal synchronous loading\n/* istanbul ignore next */\nfunction SYNC() {} // eslint-disable-line no-empty-function\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} options Parse options\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n */\nRoot.prototype.load = function load(filename, options, callback) {\n    if (typeof options === \"function\") {\n        callback = options;\n        options = undefined;\n    }\n    var self = this;\n    if (!callback) {\n        return util.asPromise(load, self, filename, options);\n    }\n\n    var sync = callback === SYNC; // undocumented\n\n    // Finishes loading by calling the callback (exactly once)\n    function finish(err, root) {\n        /* istanbul ignore if */\n        if (!callback) {\n            return;\n        }\n        if (sync) {\n            throw err;\n        }\n        if (root) {\n            root.resolveAll();\n        }\n        var cb = callback;\n        callback = null;\n        cb(err, root);\n    }\n\n    // Bundled definition existence checking\n    function getBundledFileName(filename) {\n        var idx = filename.lastIndexOf(\"google/protobuf/\");\n        if (idx > -1) {\n            var altname = filename.substring(idx);\n            if (Object.prototype.hasOwnProperty.call(common, altname)) return altname;\n        }\n        if (Object.prototype.hasOwnProperty.call(common, filename)) return filename;\n        return null;\n    }\n\n    // Processes a single file\n    function process(filename, source, depth) {\n        if (depth === undefined)\n            depth = 0;\n        try {\n            if (depth > util.recursionLimit)\n                throw Error(\"max depth exceeded\");\n            if (util.isString(source) && source.charAt(0) === \"{\")\n                source = JSON.parse(source);\n            if (!util.isString(source))\n                self.setOptions(source.options).addJSON(source.nested);\n            else {\n                parse.filename = filename;\n                var parsed = parse(source, self, options),\n                    resolved,\n                    i = 0;\n                if (parsed.imports)\n                    for (; i < parsed.imports.length; ++i)\n                        if (resolved = getBundledFileName(parsed.imports[i]) || self.resolvePath(filename, parsed.imports[i]))\n                            fetch(resolved, false, depth + 1);\n                if (parsed.weakImports)\n                    for (i = 0; i < parsed.weakImports.length; ++i)\n                        if (resolved = getBundledFileName(parsed.weakImports[i]) || self.resolvePath(filename, parsed.weakImports[i]))\n                            fetch(resolved, true, depth + 1);\n            }\n        } catch (err) {\n            finish(err);\n        }\n        if (!sync && !queued) {\n            finish(null, self); // only once anyway\n        }\n    }\n\n    // Fetches a single file\n    function fetch(filename, weak, depth) {\n        if (depth === undefined)\n            depth = 0;\n        filename = getBundledFileName(filename) || filename;\n\n        // Skip if already loaded / attempted\n        if (self.files.indexOf(filename) > -1) {\n            return;\n        }\n        self.files.push(filename);\n\n        // Shortcut bundled definitions\n        if (Object.prototype.hasOwnProperty.call(common, filename)) {\n            if (sync) {\n                process(filename, common[filename], depth);\n            } else {\n                ++queued;\n                setTimeout(function() {\n                    --queued;\n                    process(filename, common[filename], depth);\n                });\n            }\n            return;\n        }\n\n        // Otherwise fetch from disk or network\n        if (sync) {\n            var source;\n            try {\n                source = util.fs.readFileSync(filename).toString(\"utf8\");\n            } catch (err) {\n                if (!weak)\n                    finish(err);\n                return;\n            }\n            process(filename, source, depth);\n        } else {\n            ++queued;\n            self.fetch(filename, function(err, source) {\n                --queued;\n                /* istanbul ignore if */\n                if (!callback) {\n                    return; // terminated meanwhile\n                }\n                if (err) {\n                    /* istanbul ignore else */\n                    if (!weak)\n                        finish(err);\n                    else if (!queued) // can't be covered reliably\n                        finish(null, self);\n                    return;\n                }\n                process(filename, source, depth);\n            });\n        }\n    }\n    var queued = 0;\n\n    // Assembling the root namespace doesn't require working type\n    // references anymore, so we can load everything in parallel\n    if (util.isString(filename)) {\n        filename = [ filename ];\n    }\n    for (var i = 0, resolved; i < filename.length; ++i)\n        if (resolved = self.resolvePath(\"\", filename[i]))\n            fetch(resolved);\n    if (sync) {\n        self.resolveAll();\n        return self;\n    }\n    if (!queued) {\n        finish(null, self);\n    }\n\n    return self;\n};\n// function load(filename:string, options:IParseOptions, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.\n * @function Root#load\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @variation 2\n */\n// function load(filename:string, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and returns a promise.\n * @function Root#load\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {Promise<Root>} Promise\n * @variation 3\n */\n// function load(filename:string, [options:IParseOptions]):Promise<Root>\n\n/**\n * Synchronously loads one or multiple .proto or preprocessed .json files into this root namespace (node only).\n * @function Root#loadSync\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {Root} Root namespace\n * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid\n */\nRoot.prototype.loadSync = function loadSync(filename, options) {\n    if (!util.isNode)\n        throw Error(\"not supported\");\n    return this.load(filename, options, SYNC);\n};\n\n/**\n * @override\n */\nRoot.prototype.resolveAll = function resolveAll() {\n    if (!this._needsRecursiveResolve) return this;\n\n    if (this.deferred.length)\n        throw Error(\"unresolvable extensions: \" + this.deferred.map(function(field) {\n            return \"'extend \" + field.extend + \"' in \" + field.parent.fullName;\n        }).join(\", \"));\n    return Namespace.prototype.resolveAll.call(this);\n};\n\n// only uppercased (and thus conflict-free) children are exposed, see below\nvar exposeRe = /^[A-Z]/;\n\n/**\n * Handles a deferred declaring extension field by creating a sister field to represent it within its extended type.\n * @param {Root} root Root instance\n * @param {Field} field Declaring extension field witin the declaring type\n * @returns {boolean} `true` if successfully added to the extended type, `false` otherwise\n * @inner\n * @ignore\n */\nfunction tryHandleExtension(root, field) {\n    var extendedType = field.parent.lookup(field.extend);\n    if (extendedType) {\n        var sisterField = new Field(field.fullName, field.id, field.type, field.rule, undefined, field.options);\n        //do not allow to extend same field twice to prevent the error\n        if (extendedType.get(sisterField.name)) {\n            return true;\n        }\n        sisterField.declaringField = field;\n        field.extensionField = sisterField;\n        extendedType.add(sisterField);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Called when any object is added to this root or its sub-namespaces.\n * @param {ReflectionObject} object Object added\n * @returns {undefined}\n * @private\n */\nRoot.prototype._handleAdd = function _handleAdd(object) {\n    if (object instanceof Field) {\n\n        if (/* an extension field (implies not part of a oneof) */ object.extend !== undefined && /* not already handled */ !object.extensionField)\n            if (!tryHandleExtension(this, object))\n                this.deferred.push(object);\n\n    } else if (object instanceof Enum) {\n\n        if (exposeRe.test(object.name))\n            object.parent[object.name] = object.values; // expose enum values as property of its parent\n\n    } else if (!(object instanceof OneOf)) /* everything else is a namespace */ {\n\n        if (object instanceof Type) // Try to handle any deferred extensions\n            for (var i = 0; i < this.deferred.length;)\n                if (tryHandleExtension(this, this.deferred[i]))\n                    this.deferred.splice(i, 1);\n                else\n                    ++i;\n        for (var j = 0; j < /* initializes */ object.nestedArray.length; ++j) // recurse into the namespace\n            this._handleAdd(object._nestedArray[j]);\n        if (exposeRe.test(object.name))\n            object.parent[object.name] = object; // expose namespace as property of its parent\n    }\n\n    if (object instanceof Type || object instanceof Enum || object instanceof Field) {\n        // Only store types and enums for quick lookup during resolve.\n        this._fullyQualifiedObjects[object.fullName] = object;\n    }\n\n    // The above also adds uppercased (and thus conflict-free) nested types, services and enums as\n    // properties of namespaces just like static code does. This allows using a .d.ts generated for\n    // a static module with reflection-based solutions where the condition is met.\n};\n\n/**\n * Called when any object is removed from this root or its sub-namespaces.\n * @param {ReflectionObject} object Object removed\n * @returns {undefined}\n * @private\n */\nRoot.prototype._handleRemove = function _handleRemove(object) {\n    if (object instanceof Field) {\n\n        if (/* an extension field */ object.extend !== undefined) {\n            if (/* already handled */ object.extensionField) { // remove its sister field\n                object.extensionField.parent.remove(object.extensionField);\n                object.extensionField = null;\n            } else { // cancel the extension\n                var index = this.deferred.indexOf(object);\n                /* istanbul ignore else */\n                if (index > -1)\n                    this.deferred.splice(index, 1);\n            }\n        }\n\n    } else if (object instanceof Enum) {\n\n        if (exposeRe.test(object.name))\n            delete object.parent[object.name]; // unexpose enum values\n\n    } else if (object instanceof Namespace) {\n\n        for (var i = 0; i < /* initializes */ object.nestedArray.length; ++i) // recurse into the namespace\n            this._handleRemove(object._nestedArray[i]);\n\n        if (exposeRe.test(object.name))\n            delete object.parent[object.name]; // unexpose namespaces\n\n    }\n\n    delete this._fullyQualifiedObjects[object.fullName];\n};\n\n// Sets up cyclic dependencies (called in index-light)\nRoot._configure = function(Type_, parse_, common_) {\n    Type   = Type_;\n    parse  = parse_;\n    common = common_;\n};\n","\"use strict\";\n\n/**\n * Various utility functions.\n * @namespace\n */\nvar util = module.exports = require(\"./util/minimal\");\n\nvar roots = require(\"./roots\");\n\nvar Type, // cyclic\n    Enum;\n\nutil.codegen  = require(\"./util/codegen\");\nutil.fetch    = require(\"./util/fetch\");\nutil.path     = require(\"./util/path\");\nutil.patterns = require(\"./util/patterns\");\n\nvar reservedRe = util.patterns.reservedRe;\n\n/**\n * Node's fs module if available.\n * @type {Object.<string,*>}\n */\nutil.fs = require(\"./util/fs\");\n\n/**\n * Converts an object's values to an array.\n * @param {Object.<string,*>} object Object to convert\n * @returns {Array.<*>} Converted array\n */\nutil.toArray = function toArray(object) {\n    if (object) {\n        var keys  = Object.keys(object),\n            array = new Array(keys.length),\n            index = 0;\n        while (index < keys.length)\n            array[index] = object[keys[index++]];\n        return array;\n    }\n    return [];\n};\n\n/**\n * Converts an array of keys immediately followed by their respective value to an object, omitting undefined values.\n * @param {Array.<*>} array Array to convert\n * @returns {Object.<string,*>} Converted object\n */\nutil.toObject = function toObject(array) {\n    var object = {},\n        index  = 0;\n    while (index < array.length) {\n        var key = array[index++],\n            val = array[index++];\n        if (val !== undefined)\n            object[key] = val;\n    }\n    return object;\n};\n\n/**\n * Removes the first matching value from an object.\n * @param {Object.<string,*>|undefined} object Object to remove from\n * @param {*} value Value to remove\n * @param {string} [key] Optional key for fast path removal\n * @returns {boolean} `true` if removed, otherwise `false`\n */\nutil.remove = function remove(object, value, key) {\n    if (!object)\n        return false;\n    if (key !== undefined && Object.prototype.hasOwnProperty.call(object, key) && object[key] === value) {\n        delete object[key];\n        return true;\n    }\n    for (var names = Object.keys(object), i = 0; i < names.length; ++i)\n        if (object[names[i]] === value) {\n            delete object[names[i]];\n            return true;\n        }\n    return false;\n};\n\n/**\n * Tests whether the specified name is a reserved word in JS.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nutil.isReserved = function isReserved(name) {\n    return reservedRe.test(name);\n};\n\n/**\n * Returns a safe property accessor for the specified property name.\n * @param {string} prop Property name\n * @returns {string} Safe accessor\n */\nutil.safeProp = function safeProp(prop) {\n    if (!/^[$\\w_]+$/.test(prop) || reservedRe.test(prop))\n        return \"[\" + JSON.stringify(prop) + \"]\";\n    return \".\" + prop;\n};\n\n/**\n * Converts the first character of a string to upper case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.ucFirst = function ucFirst(str) {\n    return str.charAt(0).toUpperCase() + str.substring(1);\n};\n\nvar camelCaseRe = /_([a-z])/g;\n\n/**\n * Converts a string to camel case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n * @deprecated Use {@link util.jsonName} for protobuf field JSON names.\n */\nutil.camelCase = function camelCase(str) {\n    return str.substring(0, 1)\n         + str.substring(1)\n               .replace(camelCaseRe, function($0, $1) { return $1.toUpperCase(); });\n};\n\n/**\n * Converts a proto field name to its protoc-compatible JSON name.\n * @param {string} str Proto field name\n * @returns {string} JSON name\n */\nutil.jsonName = function jsonName(str) {\n    var result = \"\",\n        upperNext = false,\n        i = 0;\n    for (; i < str.length; ++i) {\n        var ch = str.charAt(i);\n        if (ch === \"_\")\n            upperNext = true;\n        else if (upperNext) {\n            result += ch.toUpperCase();\n            upperNext = false;\n        } else\n            result += ch;\n    }\n    return result;\n};\n\n/**\n * Compares reflected fields by id.\n * @param {Field} a First field\n * @param {Field} b Second field\n * @returns {number} Comparison value\n */\nutil.compareFieldsById = function compareFieldsById(a, b) {\n    return a.id - b.id;\n};\n\n/**\n * Decorator helper for types (TypeScript).\n * @param {Constructor<T>} ctor Constructor function\n * @param {string} [typeName] Type name, defaults to the constructor's name\n * @returns {Type} Reflected type\n * @template T extends Message<T>\n * @property {Root} root Decorators root\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\nutil.decorateType = function decorateType(ctor, typeName) {\n\n    /* istanbul ignore if */\n    if (ctor.$type) {\n        if (typeName && ctor.$type.name !== typeName) {\n            util.decorateRoot.remove(ctor.$type);\n            ctor.$type.name = typeName;\n            util.decorateRoot.add(ctor.$type);\n        }\n        return ctor.$type;\n    }\n\n    /* istanbul ignore next */\n    if (!Type)\n        Type = require(\"./type\");\n\n    var type = new Type(typeName || ctor.name);\n    util.decorateRoot.add(type);\n    type.ctor = ctor; // sets up .encode, .decode etc.\n    Object.defineProperty(ctor, \"$type\", { value: type, enumerable: false });\n    Object.defineProperty(ctor.prototype, \"$type\", { value: type, enumerable: false });\n    return type;\n};\n\nvar decorateEnumIndex = 0;\n\n/**\n * Decorator helper for enums (TypeScript).\n * @param {Object} object Enum object\n * @returns {Enum} Reflected enum\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\nutil.decorateEnum = function decorateEnum(object) {\n\n    /* istanbul ignore if */\n    if (object.$type)\n        return object.$type;\n\n    /* istanbul ignore next */\n    if (!Enum)\n        Enum = require(\"./enum\");\n\n    var enm = new Enum(\"Enum\" + decorateEnumIndex++, object);\n    util.decorateRoot.add(enm);\n    Object.defineProperty(object, \"$type\", { value: enm, enumerable: false });\n    return enm;\n};\n\n\n/**\n * Sets the value of a property by property path. If a value already exists, it is turned to an array\n * @param {Object.<string,*>} dst Destination object\n * @param {string} path dot '.' delimited path of the property to set\n * @param {Object} value the value to set\n * @param {boolean|undefined} [ifNotSet] Sets the option only if it isn't currently set\n * @returns {Object.<string,*>} Destination object\n */\nutil.setProperty = function setProperty(dst, path, value, ifNotSet) {\n    function setProp(dst, path, value) {\n        var part = path.shift();\n        if (util.isUnsafeProperty(part))\n            return dst;\n        if (path.length > 0) {\n            dst[part] = setProp(dst[part] || {}, path, value);\n        } else {\n            var prevValue = dst[part];\n            if (prevValue && ifNotSet)\n                return dst;\n            if (prevValue)\n                value = [].concat(prevValue).concat(value);\n            dst[part] = value;\n        }\n        return dst;\n    }\n\n    if (typeof dst !== \"object\")\n        throw TypeError(\"dst must be an object\");\n    if (!path)\n        throw TypeError(\"path must be specified\");\n\n    path = path.split(\".\");\n    if (path.length > util.recursionLimit)\n        throw Error(\"max depth exceeded\");\n    return setProp(dst, path, value);\n};\n\n/**\n * Decorator root (TypeScript).\n * @name util.decorateRoot\n * @type {Root}\n * @readonly\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\nObject.defineProperty(util, \"decorateRoot\", {\n    get: function() {\n        return roots[\"decorated\"] || (roots[\"decorated\"] = new (require(\"./root\"))());\n    }\n});\n","\"use strict\";\n\n/**\n * Common type constants.\n * @namespace\n */\nvar types = exports;\n\nvar util = require(\"./util\");\n\nvar s = [\n    \"double\",   // 0\n    \"float\",    // 1\n    \"int32\",    // 2\n    \"uint32\",   // 3\n    \"sint32\",   // 4\n    \"fixed32\",  // 5\n    \"sfixed32\", // 6\n    \"int64\",    // 7\n    \"uint64\",   // 8\n    \"sint64\",   // 9\n    \"fixed64\",  // 10\n    \"sfixed64\", // 11\n    \"bool\",     // 12\n    \"string\",   // 13\n    \"bytes\"     // 14\n];\n\nfunction bake(values, offset) {\n    var i = 0, o = Object.create(null);\n    offset |= 0;\n    while (i < values.length) o[s[i + offset]] = values[i++];\n    return o;\n}\n\n/**\n * Basic type wire types.\n * @type {Object.<string,number>}\n * @const\n * @property {number} double=1 Fixed64 wire type\n * @property {number} float=5 Fixed32 wire type\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n * @property {number} string=2 Ldelim wire type\n * @property {number} bytes=2 Ldelim wire type\n */\ntypes.basic = bake([\n    /* double   */ 1,\n    /* float    */ 5,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0,\n    /* string   */ 2,\n    /* bytes    */ 2\n]);\n\n/**\n * Basic type defaults.\n * @type {Object.<string,*>}\n * @const\n * @property {number} double=0 Double default\n * @property {number} float=0 Float default\n * @property {number} int32=0 Int32 default\n * @property {number} uint32=0 Uint32 default\n * @property {number} sint32=0 Sint32 default\n * @property {number} fixed32=0 Fixed32 default\n * @property {number} sfixed32=0 Sfixed32 default\n * @property {number} int64=0 Int64 default\n * @property {number} uint64=0 Uint64 default\n * @property {number} sint64=0 Sint32 default\n * @property {number} fixed64=0 Fixed64 default\n * @property {number} sfixed64=0 Sfixed64 default\n * @property {boolean} bool=false Bool default\n * @property {string} string=\"\" String default\n * @property {Array.<number>} bytes=Array(0) Bytes default\n * @property {null} message=null Message default\n */\ntypes.defaults = bake([\n    /* double   */ 0,\n    /* float    */ 0,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 0,\n    /* sfixed32 */ 0,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 0,\n    /* sfixed64 */ 0,\n    /* bool     */ false,\n    /* string   */ \"\",\n    /* bytes    */ util.emptyArray,\n    /* message  */ null\n]);\n\n/**\n * Basic long type wire types.\n * @type {Object.<string,number>}\n * @const\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n */\ntypes.long = bake([\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1\n], 7);\n\n/**\n * Allowed types for map keys with their associated wire type.\n * @type {Object.<string,number>}\n * @const\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n * @property {number} string=2 Ldelim wire type\n */\ntypes.mapKey = bake([\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0,\n    /* string   */ 2\n], 2);\n\n/**\n * Allowed types for packed repeated fields with their associated wire type.\n * @type {Object.<string,number>}\n * @const\n * @property {number} double=1 Fixed64 wire type\n * @property {number} float=5 Fixed32 wire type\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n */\ntypes.packed = bake([\n    /* double   */ 1,\n    /* float    */ 5,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0\n]);\n","\"use strict\";\nmodule.exports = Field;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\nField.prototype = Object.create(ReflectionObject.prototype, {\n    constructor: {\n        value: Field,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nField.className = \"Field\";\n\nvar Enum  = require(\"./enum\"),\n    types = require(\"./types\"),\n    util  = require(\"./util\");\n\nvar Type; // cyclic\n\nvar ruleRe = /^(?:required|optional|repeated)$/;\n\n/**\n * Constructs a new message field instance. Note that {@link MapField|map fields} have their own class.\n * @name Field\n * @classdesc Reflected message field.\n * @extends FieldBase\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} type Value type\n * @param {string|Object.<string,*>} [rule=\"optional\"] Field rule\n * @param {string|Object.<string,*>} [extend] Extended type if different from parent\n * @param {Object.<string,*>} [options] Declared options\n */\n\n/**\n * Constructs a field from a field descriptor.\n * @param {string} name Field name\n * @param {IField} json Field descriptor\n * @returns {Field} Created field\n * @throws {TypeError} If arguments are invalid\n */\nField.fromJSON = function fromJSON(name, json) {\n    var field = new Field(name, json.id, json.type, json.rule, json.extend, json.options, json.comment);\n    if (json.edition)\n        field._edition = json.edition;\n    if (json.protoName)\n        field.protoName = json.protoName;\n    if (json.jsonName !== undefined)\n        field.jsonName = json.jsonName;\n    else if (json.options && json.options.json_name !== undefined)\n        field.jsonName = json.options.json_name;\n    field._defaultEdition = \"proto3\";  // For backwards-compatibility.\n    return field;\n};\n\n/**\n * Not an actual constructor. Use {@link Field} instead.\n * @classdesc Base class of all reflected message fields. This is not an actual class but here for the sake of having consistent type definitions.\n * @exports FieldBase\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} type Value type\n * @param {string|Object.<string,*>} [rule=\"optional\"] Field rule\n * @param {string|Object.<string,*>} [extend] Extended type if different from parent\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction Field(name, id, type, rule, extend, options, comment) {\n\n    if (util.isObject(rule)) {\n        comment = extend;\n        options = rule;\n        rule = extend = undefined;\n    } else if (util.isObject(extend)) {\n        comment = options;\n        options = extend;\n        extend = undefined;\n    }\n\n    ReflectionObject.call(this, name, options);\n\n    if (!util.isInteger(id) || id < 0)\n        throw TypeError(\"id must be a non-negative integer\");\n\n    if (!util.isString(type))\n        throw TypeError(\"type must be a string\");\n\n    if (rule !== undefined && !ruleRe.test(rule = rule.toString().toLowerCase()))\n        throw TypeError(\"rule must be a string rule\");\n\n    if (extend !== undefined && !util.isString(extend))\n        throw TypeError(\"extend must be a string\");\n\n    /**\n     * Field rule, if any.\n     * @type {string|undefined}\n     */\n    this.rule = rule && rule !== \"optional\" ? rule : undefined; // toJSON\n\n    /**\n     * Field type.\n     * @type {string}\n     */\n    this.type = type; // toJSON\n\n    /**\n     * Unique field id.\n     * @type {number}\n     */\n    this.id = id; // toJSON, marker\n\n    /**\n     * Extended type if different from parent.\n     * @type {string|undefined}\n     */\n    this.extend = extend || undefined; // toJSON\n\n    /**\n     * Whether this field is repeated.\n     * @type {boolean}\n     */\n    this.repeated = rule === \"repeated\";\n\n    /**\n     * Whether this field is a map or not.\n     * @type {boolean}\n     */\n    this.map = false;\n\n    /**\n     * Message this field belongs to.\n     * @type {Type|null}\n     */\n    this.message = null;\n\n    /**\n     * OneOf this field belongs to, if any,\n     * @type {OneOf|null}\n     */\n    this.partOf = null;\n\n    /**\n     * The field type's default value.\n     * @type {*}\n     */\n    this.typeDefault = null;\n\n    /**\n     * The field's default value on prototypes.\n     * @type {*}\n     */\n    this.defaultValue = null;\n\n    /**\n     * Whether this field's value should be treated as a long.\n     * @type {boolean}\n     */\n    this.long = util.Long ? types.long[type] !== undefined : /* istanbul ignore next */ false;\n\n    /**\n     * Whether this field's value is a buffer.\n     * @type {boolean}\n     */\n    this.bytes = type === \"bytes\";\n\n    /**\n     * Resolved type if not a basic type.\n     * @type {Type|Enum|null}\n     */\n    this.resolvedType = null;\n\n    /**\n     * Sister-field within the extended type if a declaring extension field.\n     * @type {Field|null}\n     */\n    this.extensionField = null;\n\n    /**\n     * Sister-field within the declaring namespace if an extended field.\n     * @type {Field|null}\n     */\n    this.declaringField = null;\n\n    /**\n     * Comment for this field.\n     * @type {string|null}\n     */\n    this.comment = comment;\n\n    /**\n     * Field name as declared in the .proto source, if different from `name`.\n     * @type {string|undefined}\n     */\n    this.protoName = undefined;\n\n    /**\n     * JSON name, if different from the derived default.\n     * @type {string|undefined}\n     */\n    this.jsonName = undefined;\n}\n\n/**\n * Determines whether this field is required.\n * @name Field#required\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"required\", {\n    get: function() {\n        return this._features.field_presence === \"LEGACY_REQUIRED\";\n    }\n});\n\n/**\n * Determines whether this field is not required.\n * @name Field#optional\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"optional\", {\n    get: function() {\n        return !this.required;\n    }\n});\n\n/**\n * Determines whether this field uses tag-delimited encoding.  In proto2 this\n * corresponded to group syntax.\n * @name Field#delimited\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"delimited\", {\n    get: function() {\n        return this.resolvedType instanceof Type &&\n            this._features.message_encoding === \"DELIMITED\";\n    }\n});\n\n/**\n * Determines whether this field is packed. Only relevant when repeated.\n * @name Field#packed\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"packed\", {\n    get: function() {\n        return this._features.repeated_field_encoding === \"PACKED\";\n    }\n});\n\n/**\n * Determines whether this field tracks presence.\n * @name Field#hasPresence\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"hasPresence\", {\n    get: function() {\n        if (this.repeated || this.map) {\n            return false;\n        }\n        return this.partOf || // oneofs\n            this.declaringField || this.extensionField || // extensions\n            this._features.field_presence !== \"IMPLICIT\";\n    }\n});\n\n/**\n * The field name as declared in the .proto source (snake_case). Populated on resolve,\n * falling back to `name`. Mirrors `FieldDescriptorProto.name`.\n * @name Field#protoName\n * @type {string}\n * @readonly\n */\n\n/**\n * The JSON name of this field (lowerCamelCase per protoc's `ToJsonName`, or an\n * explicit `[json_name]`). Populated on resolve. This is the key used on ProtoJSON output.\n * @name Field#jsonName\n * @type {string}\n * @readonly\n */\n\n/**\n * @override\n */\nField.prototype.setOption = function setOption(name, value, ifNotSet) {\n    return ReflectionObject.prototype.setOption.call(this, name, value, ifNotSet);\n};\n\n/**\n * Field descriptor.\n * @interface IField\n * @property {string} [edition] Edition\n * @property {string} [rule=\"optional\"] Field rule\n * @property {string} type Field type\n * @property {number} id Field id\n * @property {Object.<string,*>} [options] Field options\n * @property {string|null} [comment] Field comment\n */\n\n/**\n * Extension field descriptor.\n * @interface IExtensionField\n * @extends IField\n * @property {string} extend Extended type\n */\n\n/**\n * Converts this field to a field descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IField} Field descriptor\n */\nField.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"edition\"      , this._editionToJSON(),\n        \"rule\"         , this.rule !== \"optional\" && this.rule || undefined,\n        \"type\"         , this.type,\n        \"id\"           , this.id,\n        \"extend\"       , this.extend,\n        \"protoName\"    , this.protoName !== this.name ? this.protoName : undefined,\n        \"jsonName\"     , this.jsonName !== util.jsonName(this.protoName || this.name) ? this.jsonName : undefined,\n        \"options\"      , this.options,\n        \"comment\"      , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Resolves this field's type references.\n * @returns {Field} `this`\n * @throws {Error} If any reference cannot be resolved\n */\nField.prototype.resolve = function resolve() {\n\n    if (this.resolved)\n        return this;\n\n    if ((this.typeDefault = types.defaults[this.type]) === undefined) { // if not a basic type, resolve it\n        this.resolvedType = (this.declaringField ? this.declaringField.parent : this.parent).lookupTypeOrEnum(this.type);\n        if (this.resolvedType instanceof Type)\n            this.typeDefault = null;\n        else // instanceof Enum\n            this.typeDefault = this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]; // first defined\n    } else if (this.options && this.options.proto3_optional) {\n        // proto3 scalar value marked optional; should default to null\n        this.typeDefault = null;\n    }\n\n    // use explicitly set default value if present\n    if (this.options && this.options[\"default\"] != null) {\n        this.typeDefault = this.options[\"default\"];\n        if (this.resolvedType instanceof Enum && typeof this.typeDefault === \"string\")\n            this.typeDefault = this.resolvedType.values[this.typeDefault];\n    }\n\n    // remove unnecessary options\n    if (this.options) {\n        if (this.options.packed !== undefined && this.resolvedType && !(this.resolvedType instanceof Enum))\n            delete this.options.packed;\n        if (!Object.keys(this.options).length)\n            this.options = undefined;\n    }\n\n    // convert to internal data type if necesssary\n    if (this.long) {\n        var unsigned = this.type === \"uint64\" || this.type === \"fixed64\";\n        this.typeDefault = typeof this.typeDefault === \"string\"\n            ? util.Long.fromString(this.typeDefault, unsigned)\n            : util.Long.fromNumber(this.typeDefault, unsigned);\n\n        /* istanbul ignore else */\n        if (Object.freeze)\n            Object.freeze(this.typeDefault); // long instances are meant to be immutable anyway (i.e. use small int cache that even requires it)\n\n    } else if (types.long[this.type] !== undefined && typeof this.typeDefault === \"string\") {\n        this.typeDefault = parseInt(this.typeDefault, 10);\n    } else if (this.bytes && typeof this.typeDefault === \"string\") {\n        var buf;\n        if (util.base64.test(this.typeDefault))\n            util.base64.decode(this.typeDefault, buf = util.newBuffer(util.base64.length(this.typeDefault)), 0);\n        else\n            util.utf8.write(this.typeDefault, buf = util.newBuffer(util.utf8.length(this.typeDefault)), 0);\n        this.typeDefault = buf;\n    }\n\n    // take special care of maps and repeated fields\n    if (this.map)\n        this.defaultValue = util.emptyObject;\n    else if (this.repeated)\n        this.defaultValue = util.emptyArray;\n    else\n        this.defaultValue = this.typeDefault;\n\n    // ensure proper value on prototype\n    if (this.parent instanceof Type && this.parent._ctor)\n        this.parent._ctor.prototype[this.name] = this.defaultValue;\n\n    // derive the proto/JSON names\n    if (this.protoName === undefined)\n        this.protoName = this.name;\n    if (this.jsonName === undefined)\n        this.jsonName = util.jsonName(this.protoName);\n\n    return ReflectionObject.prototype.resolve.call(this);\n};\n\n/**\n * Infers field features from legacy syntax that may have been specified differently.\n * in older editions.\n * @param {string|undefined} edition The edition this proto is on, or undefined if pre-editions\n * @returns {object} The feature values to override\n */\nField.prototype._inferLegacyProtoFeatures = function _inferLegacyProtoFeatures(edition) {\n    if (edition !== \"proto2\" && edition !== \"proto3\") {\n        return {};\n    }\n\n    var features = {};\n\n    if (this.rule === \"required\") {\n        features.field_presence = \"LEGACY_REQUIRED\";\n    }\n    if (this.parent && types.defaults[this.type] === undefined) {\n        // We can't use resolvedType because types may not have been resolved yet.  However,\n        // legacy groups are always in the same scope as the field so we don't have to do a\n        // full scan of the tree.\n        var type = this.parent.get(this.type.split(\".\").pop());\n        if (type && type instanceof Type && type.group) {\n            features.message_encoding = \"DELIMITED\";\n        }\n    }\n    if (this.getOption(\"packed\") === true) {\n        features.repeated_field_encoding = \"PACKED\";\n    } else if (this.getOption(\"packed\") === false) {\n        features.repeated_field_encoding = \"EXPANDED\";\n    }\n    return features;\n};\n\n/**\n * @override\n */\nField.prototype._resolveFeatures = function _resolveFeatures(edition) {\n    return ReflectionObject.prototype._resolveFeatures.call(this, this._edition || edition);\n};\n\n/**\n * Decorator function as returned by {@link Field.d} and {@link MapField.d} (TypeScript).\n * @typedef FieldDecorator\n * @type {function}\n * @param {Object} prototype Target prototype\n * @param {string} fieldName Field name\n * @returns {undefined}\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\n\n/**\n * Field decorator (TypeScript).\n * @name Field.d\n * @function\n * @param {number} fieldId Field id\n * @param {\"double\"|\"float\"|\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"string\"|\"bool\"|\"bytes\"|Object} fieldType Field type\n * @param {\"optional\"|\"required\"|\"repeated\"} [fieldRule=\"optional\"] Field rule\n * @param {T} [defaultValue] Default value\n * @returns {FieldDecorator} Decorator function\n * @template T extends number | number[] | Long | Long[] | string | string[] | boolean | boolean[] | Uint8Array | Uint8Array[] | Buffer | Buffer[]\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\nField.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) {\n\n    // submessage: decorate the submessage and use its name as the type\n    if (typeof fieldType === \"function\")\n        fieldType = util.decorateType(fieldType).name;\n\n    // enum reference: create a reflected copy of the enum and keep reuseing it\n    else if (fieldType && typeof fieldType === \"object\")\n        fieldType = util.decorateEnum(fieldType).name;\n\n    return function fieldDecorator(prototype, fieldName) {\n        util.decorateType(prototype.constructor)\n            .add(new Field(fieldName, fieldId, fieldType, fieldRule, { \"default\": defaultValue }));\n    };\n};\n\n// Sets up cyclic dependencies (called in index-light)\nField._configure = function configure(Type_) {\n    Type = Type_;\n};\n\n/**\n * Field decorator (TypeScript).\n * @name Field.d\n * @function\n * @param {number} fieldId Field id\n * @param {Constructor<T>|string} fieldType Field type\n * @param {\"optional\"|\"required\"|\"repeated\"} [fieldRule=\"optional\"] Field rule\n * @returns {FieldDecorator} Decorator function\n * @template T extends Message<T>\n * @variation 2\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\n// like Field.d but without a default value\n","\"use strict\";\nmodule.exports = OneOf;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\nOneOf.prototype = Object.create(ReflectionObject.prototype, {\n    constructor: {\n        value: OneOf,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nOneOf.className = \"OneOf\";\n\nvar Field = require(\"./field\"),\n    util  = require(\"./util\");\n\n/**\n * Constructs a new oneof instance.\n * @classdesc Reflected oneof.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Oneof name\n * @param {string[]|Object.<string,*>} [fieldNames] Field names\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction OneOf(name, fieldNames, options, comment) {\n    if (!Array.isArray(fieldNames)) {\n        options = fieldNames;\n        fieldNames = undefined;\n    }\n    ReflectionObject.call(this, name, options);\n\n    /* istanbul ignore if */\n    if (!(fieldNames === undefined || Array.isArray(fieldNames)))\n        throw TypeError(\"fieldNames must be an Array\");\n\n    /**\n     * Field names that belong to this oneof.\n     * @type {string[]}\n     */\n    this.oneof = fieldNames || []; // toJSON, marker\n\n    /**\n     * Fields that belong to this oneof as an array for iteration.\n     * @type {Field[]}\n     * @readonly\n     */\n    this.fieldsArray = []; // declared readonly for conformance, possibly not yet added to parent\n\n    /**\n     * Comment for this field.\n     * @type {string|null}\n     */\n    this.comment = comment;\n}\n\n/**\n * Oneof descriptor.\n * @interface IOneOf\n * @property {Array.<string>} oneof Oneof field names\n * @property {Object.<string,*>} [options] Oneof options\n * @property {string|null} [comment] Oneof comment\n */\n\n/**\n * Constructs a oneof from a oneof descriptor.\n * @param {string} name Oneof name\n * @param {IOneOf} json Oneof descriptor\n * @returns {OneOf} Created oneof\n * @throws {TypeError} If arguments are invalid\n */\nOneOf.fromJSON = function fromJSON(name, json) {\n    return new OneOf(name, json.oneof, json.options, json.comment);\n};\n\n/**\n * Converts this oneof to a oneof descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IOneOf} Oneof descriptor\n */\nOneOf.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"options\" , this.options,\n        \"oneof\"   , this.oneof,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Adds the fields of the specified oneof to the parent if not already done so.\n * @param {OneOf} oneof The oneof\n * @returns {undefined}\n * @inner\n * @ignore\n */\nfunction addFieldsToParent(oneof) {\n    if (oneof.parent)\n        for (var i = 0; i < oneof.fieldsArray.length; ++i)\n            if (!oneof.fieldsArray[i].parent)\n                oneof.parent.add(oneof.fieldsArray[i]);\n}\n\n/**\n * Adds a field to this oneof and removes it from its current parent, if any.\n * @param {Field} field Field to add\n * @returns {OneOf} `this`\n */\nOneOf.prototype.add = function add(field) {\n\n    /* istanbul ignore if */\n    if (!(field instanceof Field))\n        throw TypeError(\"field must be a Field\");\n\n    if (field.parent && field.parent !== this.parent)\n        field.parent.remove(field);\n    this.oneof.push(field.name);\n    this.fieldsArray.push(field);\n    field.partOf = this; // field.parent remains null\n    addFieldsToParent(this);\n    return this;\n};\n\n/**\n * Removes a field from this oneof and puts it back to the oneof's parent.\n * @param {Field} field Field to remove\n * @returns {OneOf} `this`\n */\nOneOf.prototype.remove = function remove(field) {\n\n    /* istanbul ignore if */\n    if (!(field instanceof Field))\n        throw TypeError(\"field must be a Field\");\n\n    var index = this.fieldsArray.indexOf(field);\n\n    /* istanbul ignore if */\n    if (index < 0)\n        throw Error(field + \" is not a member of \" + this);\n\n    this.fieldsArray.splice(index, 1);\n    index = this.oneof.indexOf(field.name);\n\n    /* istanbul ignore else */\n    if (index > -1) // theoretical\n        this.oneof.splice(index, 1);\n\n    field.partOf = null;\n    return this;\n};\n\n/**\n * @override\n */\nOneOf.prototype.onAdd = function onAdd(parent) {\n    ReflectionObject.prototype.onAdd.call(this, parent);\n    var self = this;\n    // Collect present fields\n    for (var i = 0; i < this.oneof.length; ++i) {\n        var field = parent.get(this.oneof[i]);\n        if (field && !field.partOf) {\n            field.partOf = self;\n            self.fieldsArray.push(field);\n        }\n    }\n    // Add not yet present fields\n    addFieldsToParent(this);\n};\n\n/**\n * @override\n */\nOneOf.prototype.onRemove = function onRemove(parent) {\n    for (var i = 0, field; i < this.fieldsArray.length; ++i)\n        if ((field = this.fieldsArray[i]).parent)\n            field.parent.remove(field);\n    ReflectionObject.prototype.onRemove.call(this, parent);\n};\n\n/**\n * Determines whether this field corresponds to a synthetic oneof created for\n * a proto3 optional field.  No behavioral logic should depend on this, but it\n * can be relevant for reflection.\n * @name OneOf#isProto3Optional\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(OneOf.prototype, \"isProto3Optional\", {\n    get: function() {\n        if (this.fieldsArray == null || this.fieldsArray.length !== 1) {\n            return false;\n        }\n\n        var field = this.fieldsArray[0];\n        return field.options != null && field.options[\"proto3_optional\"] === true;\n    }\n});\n\n/**\n * Decorator function as returned by {@link OneOf.d} (TypeScript).\n * @typedef OneOfDecorator\n * @type {function}\n * @param {Object} prototype Target prototype\n * @param {string} oneofName OneOf name\n * @returns {undefined}\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\n\n/**\n * OneOf decorator (TypeScript).\n * @function\n * @param {...string} fieldNames Field names\n * @returns {OneOfDecorator} Decorator function\n * @template T extends string\n * @deprecated Legacy TypeScript decorator support. Will be removed in a future release.\n */\nOneOf.d = function decorateOneOf() {\n    var fieldNames = new Array(arguments.length),\n        index = 0;\n    while (index < arguments.length)\n        fieldNames[index] = arguments[index++];\n    return function oneOfDecorator(prototype, oneofName) {\n        util.decorateType(prototype.constructor)\n            .add(new OneOf(oneofName, fieldNames));\n        Object.defineProperty(prototype, oneofName, {\n            get: util.oneOfGetter(fieldNames),\n            set: util.oneOfSetter(fieldNames)\n        });\n    };\n};\n","\"use strict\";\nmodule.exports = ReflectionObject;\n\nReflectionObject.className = \"ReflectionObject\";\n\nconst OneOf = require(\"./oneof\");\nvar util = require(\"./util\");\n\nvar Root; // cyclic\n\n/* eslint-disable no-warning-comments */\n// TODO: Replace with embedded proto.\nvar proto2Defaults = {enum_type: \"CLOSED\", field_presence: \"EXPLICIT\", json_format: \"LEGACY_BEST_EFFORT\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"EXPANDED\", utf8_validation: \"NONE\", enforce_naming_style: \"STYLE_LEGACY\", default_symbol_visibility: \"EXPORT_ALL\" };\nvar proto3Defaults = {enum_type: \"OPEN\", field_presence: \"IMPLICIT\", json_format: \"ALLOW\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"PACKED\", utf8_validation: \"VERIFY\", enforce_naming_style: \"STYLE_LEGACY\", default_symbol_visibility: \"EXPORT_ALL\" };\nvar editions2023Defaults = {enum_type: \"OPEN\", field_presence: \"EXPLICIT\", json_format: \"ALLOW\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"PACKED\", utf8_validation: \"VERIFY\", enforce_naming_style: \"STYLE_LEGACY\", default_symbol_visibility: \"EXPORT_ALL\" };\nvar editions2024Defaults = {enum_type: \"OPEN\", field_presence: \"EXPLICIT\", json_format: \"ALLOW\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"PACKED\", utf8_validation: \"VERIFY\", enforce_naming_style: \"STYLE2024\", default_symbol_visibility: \"EXPORT_TOP_LEVEL\" };\nvar editions2026Defaults = {enum_type: \"OPEN\", field_presence: \"EXPLICIT\", json_format: \"ALLOW\", message_encoding: \"LENGTH_PREFIXED\", repeated_field_encoding: \"PACKED\", utf8_validation: \"VERIFY\", enforce_naming_style: \"STYLE2026\", default_symbol_visibility: \"STRICT\", enforce_proto_limits: \"PROTO_LIMITS2026\" };\n\n/**\n * Constructs a new reflection object instance.\n * @classdesc Base class of all reflection objects.\n * @constructor\n * @param {string} name Object name\n * @param {Object.<string,*>} [options] Declared options\n * @abstract\n */\nfunction ReflectionObject(name, options) {\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    if (options && !util.isObject(options))\n        throw TypeError(\"options must be an object\");\n\n    /**\n     * Options.\n     * @type {Object.<string,*>|undefined}\n     */\n    this.options = options; // toJSON\n\n    /**\n     * Parsed Options.\n     * @type {Array.<Object.<string,*>>|undefined}\n     */\n    this.parsedOptions = null;\n\n    /**\n     * Unique name within its namespace.\n     * @type {string}\n     */\n    this.name = name;\n\n    /**\n     * The edition specified for this object.  Only relevant for top-level objects.\n     * @type {string}\n     * @private\n     */\n    this._edition = null;\n\n    /**\n     * The default edition to use for this object if none is specified.  For legacy reasons,\n     * this is proto2 except in the JSON parsing case where it was proto3.\n     * @type {string}\n     * @private\n     */\n    this._defaultEdition = \"proto2\";\n\n    /**\n     * Resolved Features.\n     * @type {object}\n     * @private\n     */\n    this._features = {};\n\n    /**\n     * Whether or not features have been resolved.\n     * @type {boolean}\n     * @private\n     */\n    this._featuresResolved = false;\n\n    /**\n     * Parent namespace.\n     * @type {Namespace|null}\n     */\n    this.parent = null;\n\n    /**\n     * Whether already resolved or not.\n     * @type {boolean}\n     */\n    this.resolved = false;\n\n    /**\n     * Comment text, if any.\n     * @type {string|null}\n     */\n    this.comment = null;\n\n    /**\n     * Defining file name.\n     * @type {string|null}\n     */\n    this.filename = null;\n}\n\nObject.defineProperties(ReflectionObject.prototype, {\n\n    /**\n     * Reference to the root namespace.\n     * @name ReflectionObject#root\n     * @type {Root}\n     * @readonly\n     */\n    root: {\n        get: function() {\n            var ptr = this;\n            while (ptr.parent !== null)\n                ptr = ptr.parent;\n            return ptr;\n        }\n    },\n\n    /**\n     * Full name including leading dot.\n     * @name ReflectionObject#fullName\n     * @type {string}\n     * @readonly\n     */\n    fullName: {\n        get: function() {\n            var path = [ this.name ],\n                ptr = this.parent;\n            while (ptr) {\n                path.unshift(ptr.name);\n                ptr = ptr.parent;\n            }\n            return path.join(\".\");\n        }\n    }\n});\n\n/**\n * Converts this reflection object to its descriptor representation.\n * @returns {Object.<string,*>} Descriptor\n */\nReflectionObject.prototype.toJSON = /* istanbul ignore next */ function toJSON() {\n    throw Error(); // not implemented, shouldn't happen\n};\n\n/**\n * Called when this object is added to a parent.\n * @param {ReflectionObject} parent Parent added to\n * @returns {undefined}\n */\nReflectionObject.prototype.onAdd = function onAdd(parent) {\n    if (this.parent && this.parent !== parent)\n        this.parent.remove(this);\n    this.parent = parent;\n    this.resolved = false;\n    var root = parent.root;\n    if (root instanceof Root)\n        root._handleAdd(this);\n};\n\n/**\n * Called when this object is removed from a parent.\n * @param {ReflectionObject} parent Parent removed from\n * @returns {undefined}\n */\nReflectionObject.prototype.onRemove = function onRemove(parent) {\n    var root = parent.root;\n    if (root instanceof Root)\n        root._handleRemove(this);\n    this.parent = null;\n    this.resolved = false;\n};\n\n/**\n * Resolves this objects type references.\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.resolve = function resolve() {\n    if (this.resolved)\n        return this;\n    if (this.root instanceof Root)\n        this.resolved = true; // only if part of a root\n    return this;\n};\n\n/**\n * Resolves this objects editions features.\n * @param {string} edition The edition we're currently resolving for.\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype._resolveFeaturesRecursive = function _resolveFeaturesRecursive(edition) {\n    return this._resolveFeatures(this._edition || edition);\n};\n\n/**\n * Resolves child features from parent features\n * @param {string} edition The edition we're currently resolving for.\n * @returns {undefined}\n */\nReflectionObject.prototype._resolveFeatures = function _resolveFeatures(edition) {\n    if (this._featuresResolved) {\n        return;\n    }\n\n    var defaults = {};\n\n    /* istanbul ignore if */\n    if (!edition) {\n        throw new Error(\"Unknown edition for \" + this.fullName);\n    }\n\n    var protoFeatures = util.merge({}, this.options && this.options.features,\n        this._inferLegacyProtoFeatures(edition));\n\n    if (this._edition) {\n        // For a namespace marked with a specific edition, reset defaults.\n        /* istanbul ignore else */\n        if (edition === \"proto2\") {\n            defaults = Object.assign({}, proto2Defaults);\n        } else if (edition === \"proto3\") {\n            defaults = Object.assign({}, proto3Defaults);\n        } else if (edition === \"2023\") {\n            defaults = Object.assign({}, editions2023Defaults);\n        } else if (edition === \"2024\") {\n            defaults = Object.assign({}, editions2024Defaults);\n        } else if (edition === \"2026\") {\n            defaults = Object.assign({}, editions2026Defaults);\n        } else {\n            throw new Error(\"Unknown edition: \" + edition);\n        }\n        this._features = util.merge(defaults, protoFeatures);\n    } else {\n        // fields in Oneofs aren't actually children of them, so we have to\n        // special-case it\n        /* istanbul ignore else */\n        if (this.partOf instanceof OneOf) {\n            var lexicalParentFeaturesCopy = util.merge({}, this.partOf._features);\n            this._features = util.merge(lexicalParentFeaturesCopy, protoFeatures);\n        } else if (this.declaringField) {\n            // Skip feature resolution of sister fields.\n        } else if (this.parent) {\n            var parentFeaturesCopy = util.merge({}, this.parent._features);\n            this._features = util.merge(parentFeaturesCopy, protoFeatures);\n        } else {\n            throw new Error(\"Unable to find a parent for \" + this.fullName);\n        }\n    }\n    if (this.extensionField) {\n        // Sister fields should have the same features as their extensions.\n        this.extensionField._features = this._features;\n    }\n    this._featuresResolved = true;\n};\n\n/**\n * Infers features from legacy syntax that may have been specified differently.\n * in older editions.\n * @param {string|undefined} edition The edition this proto is on, or undefined if pre-editions\n * @returns {object} The feature values to override\n */\nReflectionObject.prototype._inferLegacyProtoFeatures = function _inferLegacyProtoFeatures(/*edition*/) {\n    return {};\n};\n\n/**\n * Gets an option value.\n * @param {string} name Option name\n * @returns {*} Option value or `undefined` if not set\n */\nReflectionObject.prototype.getOption = function getOption(name) {\n    if (this.options && Object.prototype.hasOwnProperty.call(this.options, name))\n        return this.options[name];\n    return undefined;\n};\n\n/**\n * Sets an option.\n * @param {string} name Option name\n * @param {*} value Option value\n * @param {boolean|undefined} [ifNotSet] Sets the option only if it isn't currently set\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setOption = function setOption(name, value, ifNotSet) {\n    if (name === \"__proto__\")\n        return this;\n    if (!this.options)\n        this.options = {};\n    if (/^features\\./.test(name)) {\n        util.setProperty(this.options, name, value, ifNotSet);\n    } else {\n        var prev = this.getOption(name);\n        if (!ifNotSet || prev === undefined) {\n            if (prev !== value) this.resolved = false;\n            this.options[name] = value;\n        }\n    }\n\n    return this;\n};\n\n/**\n * Sets a parsed option.\n * @param {string} name parsed Option name\n * @param {*} value Option value\n * @param {string} propName dot '.' delimited full path of property within the option to set. if undefined\\empty, will add a new option with that value\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setParsedOption = function setParsedOption(name, value, propName) {\n    if (name === \"__proto__\")\n        return this;\n    if (!this.parsedOptions) {\n        this.parsedOptions = [];\n    }\n    var parsedOptions = this.parsedOptions;\n    if (propName) {\n        // If setting a sub property of an option then try to merge it\n        // with an existing option\n        var opt = parsedOptions.find(function (opt) {\n            return Object.prototype.hasOwnProperty.call(opt, name);\n        });\n        if (opt) {\n            // If we found an existing option - just merge the property value\n            // (If it's a feature, will just write over)\n            var newValue = opt[name];\n            util.setProperty(newValue, propName, value);\n        } else {\n            // otherwise, create a new option, set its property and add it to the list\n            opt = {};\n            opt[name] = util.setProperty({}, propName, value);\n            parsedOptions.push(opt);\n        }\n    } else {\n        // Always create a new option when setting the value of the option itself\n        var newOpt = {};\n        newOpt[name] = value;\n        parsedOptions.push(newOpt);\n    }\n\n    return this;\n};\n\n/**\n * Sets multiple options.\n * @param {Object.<string,*>} options Options to set\n * @param {boolean} [ifNotSet] Sets an option only if it isn't currently set\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setOptions = function setOptions(options, ifNotSet) {\n    if (options)\n        for (var keys = Object.keys(options), i = 0; i < keys.length; ++i)\n            this.setOption(keys[i], options[keys[i]], ifNotSet);\n    return this;\n};\n\n/**\n * Converts this instance to its string representation.\n * @name ReflectionObject#toString\n * @function\n * @returns {string} Class name[, space, full name]\n */\nObject.defineProperty(ReflectionObject.prototype, \"toString\", {\n    value: function toString() {\n        var className = this.constructor.className,\n            fullName  = this.fullName;\n        if (fullName.length)\n            return className + \" \" + fullName;\n        return className;\n    },\n    writable: true,\n    enumerable: false,\n    configurable: true\n});\n\n/**\n * Converts the edition this object is pinned to for JSON format.\n * @returns {string|undefined} The edition string for JSON representation\n */\nReflectionObject.prototype._editionToJSON = function _editionToJSON() {\n    if (!this._edition || this._edition === \"proto3\") {\n        // Avoid emitting proto3 since we need to default to it for backwards\n        // compatibility anyway.\n        return undefined;\n    }\n    return this._edition;\n};\n\n// Sets up cyclic dependencies (called in index-light)\nReflectionObject._configure = function(Root_) {\n    Root = Root_;\n};\n","\"use strict\";\nmodule.exports = Enum;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\nEnum.prototype = Object.create(ReflectionObject.prototype, {\n    constructor: {\n        value: Enum,\n        writable: true,\n        enumerable: false,\n        configurable: true\n    }\n});\nEnum.className = \"Enum\";\n\nvar Namespace = require(\"./namespace\"),\n    util = require(\"./util\");\n\n/**\n * Constructs a new enum instance.\n * @classdesc Reflected enum.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {Object.<string,number>} [values] Enum values as an object, by name\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] The comment for this enum\n * @param {Object.<string,string|null>} [comments] The value comments for this enum\n * @param {Object.<string,Object<string,*>>|undefined} [valuesOptions] The value options for this enum\n */\nfunction Enum(name, values, options, comment, comments, valuesOptions) {\n    ReflectionObject.call(this, name, options);\n\n    if (values && typeof values !== \"object\")\n        throw TypeError(\"values must be an object\");\n\n    /**\n     * Enum values by id.\n     * @type {Object.<number,string>}\n     */\n    this.valuesById = Object.create(null);\n\n    /**\n     * Enum values by name.\n     * @type {Object.<string,number>}\n     */\n    this.values = Object.create(this.valuesById); // toJSON, marker\n\n    /**\n     * Enum comment text.\n     * @type {string|null}\n     */\n    this.comment = comment;\n\n    /**\n     * Value comment texts, if any.\n     * @type {Object.<string,string|null>}\n     */\n    this.comments = comments || {};\n\n    /**\n     * Values options, if any\n     * @type {Object<string, Object<string, *>>|undefined}\n     */\n    this.valuesOptions = valuesOptions;\n\n    /**\n     * Resolved values features, if any\n     * @type {Object<string, Object<string, *>>|undefined}\n     */\n    this._valuesFeatures = {};\n\n    /**\n     * Reserved ranges, if any.\n     * @type {Array.<number[]|string>}\n     */\n    this.reserved = undefined; // toJSON\n\n    /**\n     * Declared symbol visibility, if any.\n     * @type {\"local\"|\"export\"|undefined}\n     */\n    this.visibility = undefined; // toJSON\n\n    // Note that values inherit valuesById on their prototype which makes them a TypeScript-\n    // compatible enum. This is used by pbts to write actual enum definitions that work for\n    // static and reflection code alike instead of emitting generic object definitions.\n\n    if (values)\n        for (var keys = Object.keys(values), i = 0; i < keys.length; ++i)\n            if (keys[i] !== \"__proto__\" && typeof values[keys[i]] === \"number\") { // use forward entries only\n                this.values[keys[i]] = values[keys[i]];\n                if (this.valuesById[values[keys[i]]] === undefined)\n                    this.valuesById[values[keys[i]]] = keys[i];\n            }\n}\n\n/**\n * @override\n */\nEnum.prototype._resolveFeatures = function _resolveFeatures(edition) {\n    edition = this._edition || edition;\n    ReflectionObject.prototype._resolveFeatures.call(this, edition);\n\n    Object.keys(this.values).forEach(key => {\n        var parentFeaturesCopy = util.merge({}, this._features);\n        this._valuesFeatures[key] = util.merge(parentFeaturesCopy, this.valuesOptions && this.valuesOptions[key] && this.valuesOptions[key].features || {});\n    });\n\n    return this;\n};\n\n/**\n * Enum descriptor.\n * @interface IEnum\n * @property {string} [edition] Edition\n * @property {Object.<string,number>} values Enum values\n * @property {Object.<string,*>} [options] Enum options\n * @property {Object.<string,Object.<string,*>>} [valuesOptions] Enum value options\n * @property {Array.<number[]|string>} [reserved] Reserved ranges\n * @property {\"local\"|\"export\"} [visibility] Declared symbol visibility\n * @property {string|null} [comment] Enum comment\n * @property {Object.<string,string|null>} [comments] Value comments\n */\n\n/**\n * Constructs an enum from an enum descriptor.\n * @param {string} name Enum name\n * @param {IEnum} json Enum descriptor\n * @returns {Enum} Created enum\n * @throws {TypeError} If arguments are invalid\n */\nEnum.fromJSON = function fromJSON(name, json) {\n    var enm = new Enum(name, json.values, json.options, json.comment, json.comments, json.valuesOptions);\n    enm.reserved = json.reserved;\n    if (json.visibility)\n        enm.visibility = json.visibility;\n    if (json.edition)\n        enm._edition = json.edition;\n    enm._defaultEdition = \"proto3\";  // For backwards-compatibility.\n    return enm;\n};\n\n/**\n * Converts this enum to an enum descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IEnum} Enum descriptor\n */\nEnum.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"edition\"       , this._editionToJSON(),\n        \"options\"       , this.options,\n        \"valuesOptions\" , this.valuesOptions,\n        \"values\"        , this.values,\n        \"reserved\"      , this.reserved && this.reserved.length ? this.reserved : undefined,\n        \"visibility\"    , this.visibility,\n        \"comment\"       , keepComments ? this.comment : undefined,\n        \"comments\"      , keepComments ? this.comments : undefined\n    ]);\n};\n\n/**\n * Adds a value to this enum.\n * @param {string} name Value name\n * @param {number} id Value id\n * @param {string} [comment] Comment, if any\n * @param {Object.<string, *>|undefined} [options] Options, if any\n * @returns {Enum} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a value with this name or id\n */\nEnum.prototype.add = function add(name, id, comment, options) {\n    // utilized by the parser but not by .fromJSON\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    if (!util.isInteger(id))\n        throw TypeError(\"id must be an integer\");\n\n    if (name === \"__proto__\")\n        return this;\n\n    if (this.values[name] !== undefined)\n        throw Error(\"duplicate name '\" + name + \"' in \" + this);\n\n    if (this.isReservedId(id))\n        throw Error(\"id \" + id + \" is reserved in \" + this);\n\n    if (this.isReservedName(name))\n        throw Error(\"name '\" + name + \"' is reserved in \" + this);\n\n    if (this.valuesById[id] !== undefined) {\n        if (!(this.options && this.options.allow_alias))\n            throw Error(\"duplicate id \" + id + \" in \" + this);\n        this.values[name] = id;\n    } else\n        this.valuesById[this.values[name] = id] = name;\n\n    if (options) {\n        if (this.valuesOptions === undefined)\n            this.valuesOptions = {};\n        this.valuesOptions[name] = options || null;\n    }\n\n    this.comments[name] = comment || null;\n    return this;\n};\n\n/**\n * Removes a value from this enum\n * @param {string} name Value name\n * @returns {Enum} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `name` is not a name of this enum\n */\nEnum.prototype.remove = function remove(name) {\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    var val = this.values[name];\n    if (val == null)\n        throw Error(\"name '\" + name + \"' does not exist in \" + this);\n\n    delete this.valuesById[val];\n    delete this.values[name];\n    delete this.comments[name];\n    if (this.valuesOptions)\n        delete this.valuesOptions[name];\n\n    return this;\n};\n\n/**\n * Tests if the specified id is reserved.\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nEnum.prototype.isReservedId = function isReservedId(id) {\n    return Namespace.isReservedId(this.reserved, id);\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nEnum.prototype.isReservedName = function isReservedName(name) {\n    return Namespace.isReservedName(this.reserved, name);\n};\n","\"use strict\";\nmodule.exports = encoder;\n\nvar Enum     = require(\"./enum\"),\n    types    = require(\"./types\"),\n    util     = require(\"./util\");\n\n/**\n * Generates a partial message type encoder.\n * @param {Codegen} gen Codegen instance\n * @param {Field} field Reflected field\n * @param {number} fieldIndex Field index\n * @param {string} ref Variable reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genTypePartial(gen, field, fieldIndex, ref) {\n    return field.delimited\n        ? gen(\"types[%i].encode(%s,w.uint32(%i),q+1).uint32(%i)\", fieldIndex, ref, (field.id << 3 | 3) >>> 0, (field.id << 3 | 4) >>> 0)\n        : gen(\"types[%i].encode(%s,w.uint32(%i).fork(),q+1).ldelim()\", fieldIndex, ref, (field.id << 3 | 2) >>> 0);\n}\n\n/**\n * Generates an encoder specific to the specified message type.\n * @param {Type} mtype Message type\n * @returns {Codegen} Codegen instance\n */\nfunction encoder(mtype) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    var gen = util.codegen([\"m\", \"w\", \"q\"])\n    (\"if(!w)\")\n        (\"w=Writer.create()\")\n    (\"if(q===undefined)q=0\")\n    (\"if(q>util.recursionLimit)\")\n        (\"throw Error(\\\"max depth exceeded\\\")\");\n\n    var i, ref;\n\n    // \"when a message is serialized its known fields should be written sequentially by field number\"\n    var fields = /* initializes */ mtype.fieldsArray.slice().sort(util.compareFieldsById);\n\n    for (var i = 0; i < fields.length; ++i) {\n        var field    = fields[i].resolve(),\n            index    = mtype._fieldsArray.indexOf(field),\n            type     = field.resolvedType instanceof Enum ? \"int32\" : field.type,\n            wireType = types.basic[type];\n            ref      = \"m\" + util.safeProp(field.name);\n\n        // Map fields\n        if (field.map) {\n            gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)){\", ref, field.name) // !== undefined && !== null\n        (\"for(var ks=Object.keys(%s),i=0;i<ks.length;++i){\", ref);\n            if (field.keyType === \"bool\") gen\n            (\"w.uint32(%i).fork().uint32(%i).bool(util.boolFromKey(ks[i]))\", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType]);\n            else if (types.long[field.keyType] !== undefined) gen\n            (\"w.uint32(%i).fork().uint32(%i).%s(util.longFromKey(ks[i],%j))\", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType, field.keyType === \"uint64\" || field.keyType === \"fixed64\");\n            else gen\n            (\"w.uint32(%i).fork().uint32(%i).%s(ks[i])\", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType);\n            if (wireType === undefined) gen\n            (\"types[%i].encode(%s[ks[i]],w.uint32(18).fork(),q+1).ldelim().ldelim()\", index, ref); // can't be groups\n            else gen\n            (\".uint32(%i).%s(%s[ks[i]]).ldelim()\", 16 | wireType, type, ref);\n            gen\n        (\"}\")\n    (\"}\");\n\n            // Repeated fields\n        } else if (field.repeated) { gen\n    (\"if(%s!=null&&%s.length){\", ref, ref); // !== undefined && !== null\n\n            // Packed repeated\n            if (field.packed && types.packed[type] !== undefined) { gen\n\n        (\"w.uint32(%i).%ss(%s)\", (field.id << 3 | 2) >>> 0, type, ref);\n\n            // Non-packed\n            } else { gen\n\n        (\"for(var i=0;i<%s.length;++i)\", ref);\n                if (wireType === undefined)\n            genTypePartial(gen, field, index, ref + \"[i]\");\n                else gen\n            (\"w.uint32(%i).%s(%s[i])\", (field.id << 3 | wireType) >>> 0, type, ref);\n\n            } gen\n    (\"}\");\n\n        // Non-repeated\n        } else {\n            if (!field.required)\n                if (field.hasPresence || !(field.resolvedType instanceof Enum || types.basic[type] !== undefined)) gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j))\", ref, field.name); // !== undefined && !== null\n                else if (field.resolvedType instanceof Enum) gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)&&%s!==%j)\", ref, field.name, ref, field.typeDefault);\n                else if (type === \"bool\") gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)&&%s!==false)\", ref, field.name, ref);\n                else if (type === \"string\") gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)&&%s!==\\\"\\\")\", ref, field.name, ref);\n                else if (type === \"bytes\") gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)&&%s.length)\", ref, field.name, ref);\n                else if (type === \"double\" || type === \"float\") gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)&&!Object.is(%s,0))\", ref, field.name, ref);\n                else if (types.long[type] !== undefined) gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)&&(typeof %s===\\\"object\\\"?%s.low||%s.high:%s!==0))\", ref, field.name, ref, ref, ref, ref);\n                else gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j)&&%s!==0)\", ref, field.name, ref);\n\n            if (wireType === undefined)\n        genTypePartial(gen, field, index, ref);\n            else gen\n        (\"w.uint32(%i).%s(%s)\", (field.id << 3 | wireType) >>> 0, type, ref);\n\n        }\n    }\n\n    return gen\n    (\"if(m.$unknowns!=null&&Object.hasOwnProperty.call(m,\\\"$unknowns\\\"))\")\n        (\"for(var i=0;i<m.$unknowns.length;++i)\")\n            (\"w.raw(m.$unknowns[i])\")\n    (\"return w\");\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n","\"use strict\";\nexports = module.exports = require(\"./index-minimal\");\n\nexports.build = \"light\";\n\n/**\n * A node-style callback as used by {@link load} and {@link Root#load}.\n * @typedef LoadCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Root} [root] Root, if there hasn't been an error\n * @returns {undefined}\n */\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and calls the callback.\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} root Root namespace, defaults to create a new one if omitted.\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @see {@link Root#load}\n */\nfunction load(filename, root, callback) {\n    if (typeof root === \"function\") {\n        callback = root;\n        root = new exports.Root();\n    } else if (!root)\n        root = new exports.Root();\n    return root.load(filename, callback);\n}\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and calls the callback.\n * @name load\n * @function\n * @param {string|string[]} filename One or multiple files to load\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @see {@link Root#load}\n * @variation 2\n */\n// function load(filename:string, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into a common root namespace and returns a promise.\n * @name load\n * @function\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted.\n * @returns {Promise<Root>} Promise\n * @see {@link Root#load}\n * @variation 3\n */\n// function load(filename:string, [root:Root]):Promise<Root>\n\nexports.load = load;\n\n/**\n * Synchronously loads one or multiple .proto or preprocessed .json files into a common root namespace (node only).\n * @param {string|string[]} filename One or multiple files to load\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted.\n * @returns {Root} Root namespace\n * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid\n * @see {@link Root#loadSync}\n */\nfunction loadSync(filename, root) {\n    if (!root)\n        root = new exports.Root();\n    return root.loadSync(filename);\n}\n\nexports.loadSync = loadSync;\n\n// Serialization\nexports.encoder          = require(\"./encoder\");\nexports.decoder          = require(\"./decoder\");\nexports.verifier         = require(\"./verifier\");\nexports.converter        = require(\"./converter\");\n\n// Reflection\nexports.ReflectionObject = require(\"./object\");\nexports.Namespace        = require(\"./namespace\");\nexports.Root             = require(\"./root\");\nexports.Enum             = require(\"./enum\");\nexports.Type             = require(\"./type\");\nexports.Field            = require(\"./field\");\nexports.OneOf            = require(\"./oneof\");\nexports.MapField         = require(\"./mapfield\");\nexports.Service          = require(\"./service\");\nexports.Method           = require(\"./method\");\n\n// Runtime\nexports.Message          = require(\"./message\");\nexports.wrappers         = require(\"./wrappers\");\n\n// Utility\nexports.types            = require(\"./types\");\nexports.util             = require(\"./util\");\n\n// Set up possibly cyclic reflection dependencies\nexports.ReflectionObject._configure(exports.Root);\nexports.Namespace._configure(exports.Type, exports.Service, exports.Enum);\nexports.Root._configure(exports.Type, undefined, {});\nexports.Field._configure(exports.Type);\n","\"use strict\";\nmodule.exports = tokenize;\n\nvar delimRe        = /[\\s{}=;:[\\],'\"()<>]/g,\n    stringDoubleRe = /(?:\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")/g,\n    stringSingleRe = /(?:'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)')/g;\n\nvar setCommentRe = /^ *[*/]+ */,\n    setCommentAltRe = /^\\s*\\*?\\/*/,\n    setCommentSplitRe = /\\n/g,\n    whitespaceRe = /\\s/,\n    unescapeRe = /\\\\(.?)/g;\n\nvar unescapeMap = {\n    \"0\": \"\\0\",\n    \"r\": \"\\r\",\n    \"n\": \"\\n\",\n    \"t\": \"\\t\"\n};\n\n/**\n * Unescapes a string.\n * @param {string} str String to unescape\n * @returns {string} Unescaped string\n * @property {Object.<string,string>} map Special characters map\n * @memberof tokenize\n */\nfunction unescape(str) {\n    return str.replace(unescapeRe, function($0, $1) {\n        switch ($1) {\n            case \"\\\\\":\n            case \"\":\n                return $1;\n            default:\n                return unescapeMap[$1] || \"\";\n        }\n    });\n}\n\ntokenize.unescape = unescape;\n\n/**\n * Gets the next token and advances.\n * @typedef TokenizerHandleNext\n * @type {function}\n * @returns {string|null} Next token or `null` on eof\n */\n\n/**\n * Peeks for the next token.\n * @typedef TokenizerHandlePeek\n * @type {function}\n * @returns {string|null} Next token or `null` on eof\n */\n\n/**\n * Pushes a token back to the stack.\n * @typedef TokenizerHandlePush\n * @type {function}\n * @param {string} token Token\n * @returns {undefined}\n */\n\n/**\n * Skips the next token.\n * @typedef TokenizerHandleSkip\n * @type {function}\n * @param {string} expected Expected token\n * @param {boolean} [optional=false] If optional\n * @returns {boolean} Whether the token matched\n * @throws {Error} If the token didn't match and is not optional\n */\n\n/**\n * Gets the comment on the previous line or, alternatively, the line comment on the specified line.\n * @typedef TokenizerHandleCmnt\n * @type {function}\n * @param {number} [line] Line number\n * @returns {string|null} Comment text or `null` if none\n */\n\n/**\n * Handle object returned from {@link tokenize}.\n * @interface ITokenizerHandle\n * @property {TokenizerHandleNext} next Gets the next token and advances (`null` on eof)\n * @property {TokenizerHandlePeek} peek Peeks for the next token (`null` on eof)\n * @property {TokenizerHandlePush} push Pushes a token back to the stack\n * @property {TokenizerHandleSkip} skip Skips a token, returns its presence and advances or, if non-optional and not present, throws\n * @property {TokenizerHandleCmnt} cmnt Gets the comment on the previous line or the line comment on the specified line, if any\n * @property {number} line Current line number\n */\n\n/**\n * Tokenizes the given .proto source and returns an object with useful utility functions.\n * @param {string} source Source contents\n * @param {boolean} alternateCommentMode Whether we should activate alternate comment parsing mode.\n * @returns {ITokenizerHandle} Tokenizer handle\n */\nfunction tokenize(source, alternateCommentMode) {\n    /* eslint-disable callback-return */\n    source = source.toString();\n\n    var offset = 0,\n        length = source.length,\n        line = 1,\n        lastCommentLine = 0,\n        comments = {};\n\n    var stack = [];\n\n    var stringDelim = null;\n\n    /* istanbul ignore next */\n    /**\n     * Creates an error for illegal syntax.\n     * @param {string} subject Subject\n     * @returns {Error} Error created\n     * @inner\n     */\n    function illegal(subject) {\n        return Error(\"illegal \" + subject + \" (line \" + line + \")\");\n    }\n\n    /**\n     * Reads a string till its end.\n     * @returns {string} String read\n     * @inner\n     */\n    function readString() {\n        var re = stringDelim === \"'\" ? stringSingleRe : stringDoubleRe;\n        re.lastIndex = offset - 1;\n        var match = re.exec(source);\n        if (!match)\n            throw illegal(\"string\");\n        offset = re.lastIndex;\n        push(stringDelim);\n        stringDelim = null;\n        return unescape(match[1]);\n    }\n\n    /**\n     * Gets the character at `pos` within the source.\n     * @param {number} pos Position\n     * @returns {string} Character\n     * @inner\n     */\n    function charAt(pos) {\n        return source.charAt(pos);\n    }\n\n    /**\n     * Sets the current comment text.\n     * @param {number} start Start offset\n     * @param {number} end End offset\n     * @param {boolean} isLeading set if a leading comment\n     * @returns {undefined}\n     * @inner\n     */\n    function setComment(start, end, isLeading) {\n        var comment = {\n            type: source.charAt(start++),\n            lineEmpty: false,\n            leading: isLeading,\n        };\n        var lookback;\n        if (alternateCommentMode) {\n            lookback = 2;  // alternate comment parsing: \"//\" or \"/*\"\n        } else {\n            lookback = 3;  // \"///\" or \"/**\"\n        }\n        var commentOffset = start - lookback,\n            c;\n        do {\n            if (--commentOffset < 0 ||\n                    (c = source.charAt(commentOffset)) === \"\\n\") {\n                comment.lineEmpty = true;\n                break;\n            }\n        } while (c === \" \" || c === \"\\t\");\n        var lines = source\n            .substring(start, end)\n            .split(setCommentSplitRe);\n        for (var i = 0; i < lines.length; ++i)\n            lines[i] = lines[i]\n                .replace(alternateCommentMode ? setCommentAltRe : setCommentRe, \"\")\n                .trim();\n        comment.text = lines\n            .join(\"\\n\")\n            .trim();\n\n        comments[line] = comment;\n        lastCommentLine = line;\n    }\n\n    function isDoubleSlashCommentLine(startOffset) {\n        var endOffset = findEndOfLine(startOffset);\n\n        // see if remaining line matches comment pattern\n        var lineText = source.substring(startOffset, endOffset);\n        var isComment = /^\\s*\\/\\//.test(lineText);\n        return isComment;\n    }\n\n    function findEndOfLine(cursor) {\n        // find end of cursor's line\n        var endOffset = cursor;\n        while (endOffset < length && charAt(endOffset) !== \"\\n\") {\n            endOffset++;\n        }\n        return endOffset;\n    }\n\n    /**\n     * Obtains the next token.\n     * @returns {string|null} Next token or `null` on eof\n     * @inner\n     */\n    function next() {\n        if (stack.length > 0)\n            return stack.shift();\n        if (stringDelim)\n            return readString();\n        var repeat,\n            prev,\n            curr,\n            start,\n            isDoc,\n            nextLineIsComment,\n            isLeadingComment = offset === 0;\n        do {\n            if (offset === length)\n                return null;\n            repeat = false;\n            while (whitespaceRe.test(curr = charAt(offset))) {\n                if (curr === \"\\n\") {\n                    isLeadingComment = true;\n                    ++line;\n                }\n                if (++offset === length)\n                    return null;\n            }\n\n            if (charAt(offset) === \"/\") {\n                if (++offset === length) {\n                    throw illegal(\"comment\");\n                }\n                if (charAt(offset) === \"/\") { // Line\n                    if (!alternateCommentMode) {\n                        // check for triple-slash comment\n                        isDoc = charAt(start = offset + 1) === \"/\";\n\n                        while (charAt(++offset) !== \"\\n\") {\n                            if (offset === length) {\n                                return null;\n                            }\n                        }\n                        ++offset;\n                        if (isDoc) {\n                            setComment(start, offset - 1, isLeadingComment);\n                            // Trailing comment cannot not be multi-line,\n                            // so leading comment state should be reset to handle potential next comments\n                            isLeadingComment = true;\n                        }\n                        ++line;\n                        repeat = true;\n                    } else {\n                        // check for double-slash comments, consolidating consecutive lines\n                        start = offset;\n                        isDoc = false;\n                        if (isDoubleSlashCommentLine(offset - 1)) {\n                            isDoc = true;\n                            do {\n                                offset = findEndOfLine(offset);\n                                if (offset === length) {\n                                    break;\n                                }\n                                offset++;\n                                if (!isLeadingComment) {\n                                    // Trailing comment cannot not be multi-line\n                                    break;\n                                }\n                                nextLineIsComment = isDoubleSlashCommentLine(offset);\n                                if (nextLineIsComment) {\n                                    line++;\n                                }\n                            } while (nextLineIsComment);\n                        } else {\n                            offset = Math.min(length, findEndOfLine(offset) + 1);\n                        }\n                        if (isDoc) {\n                            setComment(start, offset, isLeadingComment);\n                            isLeadingComment = true;\n                        }\n                        line++;\n                        repeat = true;\n                    }\n                } else if ((curr = charAt(offset)) === \"*\") { /* Block */\n                    // check for /** (regular comment mode) or /* (alternate comment mode)\n                    start = offset + 1;\n                    isDoc = alternateCommentMode || charAt(start) === \"*\";\n                    do {\n                        if (curr === \"\\n\") {\n                            ++line;\n                        }\n                        if (++offset === length) {\n                            throw illegal(\"comment\");\n                        }\n                        prev = curr;\n                        curr = charAt(offset);\n                    } while (prev !== \"*\" || curr !== \"/\");\n                    ++offset;\n                    if (isDoc) {\n                        setComment(start, offset - 2, isLeadingComment);\n                        isLeadingComment = true;\n                    }\n                    repeat = true;\n                } else {\n                    return \"/\";\n                }\n            }\n        } while (repeat);\n\n        // offset !== length if we got here\n\n        var end = offset;\n        delimRe.lastIndex = 0;\n        var delim = delimRe.test(charAt(end++));\n        if (!delim)\n            while (end < length && !delimRe.test(charAt(end)))\n                ++end;\n        var token = source.substring(offset, offset = end);\n        if (token === \"\\\"\" || token === \"'\")\n            stringDelim = token;\n        return token;\n    }\n\n    /**\n     * Pushes a token back to the stack.\n     * @param {string} token Token\n     * @returns {undefined}\n     * @inner\n     */\n    function push(token) {\n        stack.push(token);\n    }\n\n    /**\n     * Peeks for the next token.\n     * @returns {string|null} Token or `null` on eof\n     * @inner\n     */\n    function peek() {\n        if (!stack.length) {\n            var token = next();\n            if (token === null)\n                return null;\n            push(token);\n        }\n        return stack[0];\n    }\n\n    /**\n     * Skips a token.\n     * @param {string} expected Expected token\n     * @param {boolean} [optional=false] Whether the token is optional\n     * @returns {boolean} `true` when skipped, `false` if not\n     * @throws {Error} When a required token is not present\n     * @inner\n     */\n    function skip(expected, optional) {\n        var actual = peek(),\n            equals = actual === expected;\n        if (equals) {\n            next();\n            return true;\n        }\n        if (!optional)\n            throw illegal(\"token '\" + actual + \"', '\" + expected + \"' expected\");\n        return false;\n    }\n\n    /**\n     * Gets a comment.\n     * @param {number} [trailingLine] Line number if looking for a trailing comment\n     * @returns {string|null} Comment text\n     * @inner\n     */\n    function cmnt(trailingLine) {\n        var ret = null;\n        var comment;\n        if (trailingLine === undefined) {\n            comment = comments[line - 1];\n            delete comments[line - 1];\n            if (comment && (alternateCommentMode || comment.type === \"*\" || comment.lineEmpty)) {\n                ret = comment.leading ? comment.text : null;\n            }\n        } else {\n            /* istanbul ignore else */\n            if (lastCommentLine < trailingLine) {\n                peek();\n            }\n            comment = comments[trailingLine];\n            delete comments[trailingLine];\n            if (comment && !comment.lineEmpty && (alternateCommentMode || comment.type === \"/\")) {\n                ret = comment.leading ? null : comment.text;\n            }\n        }\n        return ret;\n    }\n\n    return Object.defineProperty({\n        next: next,\n        peek: peek,\n        push: push,\n        skip: skip,\n        cmnt: cmnt\n    }, \"line\", {\n        get: function() { return line; }\n    });\n    /* eslint-enable callback-return */\n}\n","\"use strict\";\nmodule.exports = parse;\n\nparse.filename = null;\nparse.defaults = { keepCase: false };\n\nvar tokenize  = require(\"./tokenize\"),\n    Root      = require(\"./root\"),\n    Type      = require(\"./type\"),\n    Field     = require(\"./field\"),\n    MapField  = require(\"./mapfield\"),\n    OneOf     = require(\"./oneof\"),\n    Enum      = require(\"./enum\"),\n    Service   = require(\"./service\"),\n    Method    = require(\"./method\"),\n    ReflectionObject = require(\"./object\"),\n    types     = require(\"./types\"),\n    util      = require(\"./util\");\n\nvar base10Re    = /^[1-9][0-9]*$/,\n    base10NegRe = /^-?[1-9][0-9]*$/,\n    base16Re    = /^0[x][0-9a-fA-F]+$/,\n    base16NegRe = /^-?0[x][0-9a-fA-F]+$/,\n    base8Re     = /^0[0-7]+$/,\n    base8NegRe  = /^-?0[0-7]+$/,\n    integerTypeRe = /^(?:u?int|sint|s?fixed)(?:32|64)$/,\n    unsignedTypeRe = /^(?:uint|fixed)(?:32|64)$/,\n    numberRe    = util.patterns.numberRe,\n    nameRe      = /^[a-zA-Z_][a-zA-Z_0-9]*$/,\n    typeRefRe   = util.patterns.typeRefRe;\n\nvar maxFieldId = 536870911, // 2^29 - 1\n    maxEnumId = 2147483647; // 2^31 - 1\n\n/**\n * Result object returned from {@link parse}.\n * @interface IParserResult\n * @property {string|undefined} package Package name, if declared\n * @property {string[]|undefined} imports Imports, if any\n * @property {string[]|undefined} weakImports Weak imports, if any\n * @property {Root} root Populated root instance\n */\n\n/**\n * Options modifying the behavior of {@link parse}.\n * @interface IParseOptions\n * @property {boolean} [keepCase=false] Keeps field casing instead of converting to camel case\n * @property {boolean} [alternateCommentMode=false] Recognize double-slash comments in addition to doc-block comments.\n * @property {boolean} [preferTrailingComment=false] Use trailing comment when both leading comment and trailing comment exist.\n */\n\n/**\n * Options modifying the behavior of JSON serialization.\n * @interface IToJSONOptions\n * @property {boolean} [keepComments=false] Serializes comments.\n */\n\n/**\n * Parses the given .proto source and returns an object with the parsed contents.\n * @param {string} source Source contents\n * @param {Root} root Root to populate\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {IParserResult} Parser result\n * @property {string} filename=null Currently processing file name for error reporting, if known\n * @property {IParseOptions} defaults Default {@link IParseOptions}\n */\nfunction parse(source, root, options) {\n    /* eslint-disable callback-return */\n    if (!(root instanceof Root)) {\n        options = root;\n        root = new Root();\n    }\n    if (!options)\n        options = parse.defaults;\n\n    var preferTrailingComment = options.preferTrailingComment || false;\n    var tn = tokenize(source, options.alternateCommentMode || false),\n        next = tn.next,\n        push = tn.push,\n        peek = tn.peek,\n        skip = tn.skip,\n        cmnt = tn.cmnt;\n\n    var head = true,\n        pkg,\n        imports,\n        weakImports,\n        edition = \"proto2\";\n\n    var ptr = root;\n\n    var topLevelObjects = [];\n    var topLevelOptions = {};\n\n    var applyCase = options.keepCase ? function(name) { return name; } : util.camelCase;\n\n    function resolveFileFeatures() {\n        topLevelObjects.forEach(obj => {\n            obj._edition = edition;\n            Object.keys(topLevelOptions).forEach(opt => {\n                if (obj.getOption(opt) !== undefined) return;\n                obj.setOption(opt, topLevelOptions[opt], true);\n            });\n        });\n    }\n\n    /* istanbul ignore next */\n    function illegal(token, name, insideTryCatch) {\n        var filename = parse.filename;\n        if (!insideTryCatch)\n            parse.filename = null;\n        return Error(\"illegal \" + (name || \"token\") + \" '\" + token + \"' (\" + (filename ? filename + \", \" : \"\") + \"line \" + tn.line + \")\");\n    }\n\n    function readString() {\n        var values = [],\n            token;\n        do {\n            /* istanbul ignore if */\n            if ((token = next()) !== \"\\\"\" && token !== \"'\")\n                throw illegal(token);\n\n            values.push(next());\n            skip(token);\n            token = peek();\n        } while (token === \"\\\"\" || token === \"'\");\n        return values.join(\"\");\n    }\n\n    function readValue(acceptTypeRef) {\n        var token = next();\n        switch (token) {\n            case \"'\":\n            case \"\\\"\":\n                push(token);\n                return readString();\n            case \"true\": case \"TRUE\":\n                return true;\n            case \"false\": case \"FALSE\":\n                return false;\n        }\n        try {\n            return parseNumber(token, /* insideTryCatch */ true);\n        } catch (e) {\n            /* istanbul ignore else */\n            if (acceptTypeRef && typeRefRe.test(token))\n                return token;\n\n            /* istanbul ignore next */\n            throw illegal(token, \"value\");\n        }\n    }\n\n    function readRanges(target, acceptStrings, max, acceptNegative) {\n        var token, start;\n        do {\n            if (acceptStrings && ((token = peek()) === \"\\\"\" || token === \"'\")) {\n                var str = readString();\n                target.push(str);\n                if (edition >= 2023) {\n                    throw illegal(str, \"id\");\n                }\n            } else {\n                try {\n                    target.push([ start = parseId(next(), acceptNegative, max), skip(\"to\", true) ? parseId(next(), acceptNegative, max) : start ]);\n                } catch (err) {\n                    if (acceptStrings && typeRefRe.test(token) && edition >= 2023) {\n                        target.push(token);\n                    } else {\n                        throw err;\n                    }\n                }\n            }\n        } while (skip(\",\", true));\n        var dummy = {options: undefined};\n        dummy.setOption = function(name, value) {\n          if (this.options === undefined) this.options = {};\n          this.options[name] = value;\n        };\n        ifBlock(\n            dummy,\n            function parseRange_block(token) {\n              /* istanbul ignore else */\n              if (token === \"option\") {\n                parseOption(dummy, token);  // skip\n                skip(\";\");\n              } else\n                throw illegal(token);\n            },\n            function parseRange_line() {\n              parseInlineOptions(dummy);  // skip\n            });\n    }\n\n    function parseNumber(token, insideTryCatch) {\n        var sign = 1;\n        if (token.charAt(0) === \"-\") {\n            sign = -1;\n            token = token.substring(1);\n        }\n        switch (token) {\n            case \"inf\": case \"INF\": case \"Inf\":\n                return sign * Infinity;\n            case \"nan\": case \"NAN\": case \"Nan\": case \"NaN\":\n                return NaN;\n            case \"0\":\n                return sign * 0;\n        }\n        if (base10Re.test(token))\n            return sign * parseInt(token, 10);\n        if (base16Re.test(token))\n            return sign * parseInt(token, 16);\n        if (base8Re.test(token))\n            return sign * parseInt(token, 8);\n\n        /* istanbul ignore else */\n        if (numberRe.test(token))\n            return sign * parseFloat(token);\n\n        /* istanbul ignore next */\n        throw illegal(token, \"number\", insideTryCatch);\n    }\n\n    function parseInteger(token, acceptNegative, name) {\n        if (token === null)\n            throw illegal(token, \"end of input\");\n        if (!acceptNegative && token.charAt(0) === \"-\")\n            throw illegal(token, name || \"integer\");\n        if (token === \"0\" || token === \"-0\")\n            return 0;\n        var value;\n        if (base10NegRe.test(token))\n            value = parseInt(token, 10);\n        else if (base16NegRe.test(token))\n            value = parseInt(token, 16);\n        else if (base8NegRe.test(token))\n            value = parseInt(token, 8);\n        else\n            throw illegal(token, name || \"integer\");\n        return value || 0;\n    }\n\n    function parseId(token, acceptNegative, max) {\n        switch (token) {\n            case \"max\": case \"MAX\": case \"Max\":\n                return max || maxFieldId;\n        }\n        return parseInteger(token, acceptNegative, \"id\");\n    }\n\n    function parsePackage() {\n        /* istanbul ignore if */\n        if (pkg !== undefined)\n            throw illegal(\"package\");\n\n        pkg = next();\n\n        /* istanbul ignore if */\n        if (pkg === null || !typeRefRe.test(pkg))\n            throw illegal(pkg, \"name\");\n\n        ptr = ptr.define(pkg);\n\n        skip(\";\");\n    }\n\n    function parseImport() {\n        var token = peek();\n        var whichImports;\n        switch (token) {\n            case \"option\":\n                if (edition < \"2024\") {\n                    throw illegal(\"option\");\n                }\n                // Import options are only used for resolving options, which we don't\n                // do.  We can just throw them out.\n                next();\n                readString();\n                skip(\";\");\n                return;\n            case \"weak\":\n                whichImports = weakImports || (weakImports = []);\n                next();\n                break;\n            case \"public\":\n                next();\n                // eslint-disable-next-line no-fallthrough\n            default:\n                whichImports = imports || (imports = []);\n                break;\n        }\n        token = readString();\n        skip(\";\");\n        whichImports.push(token);\n    }\n\n    function parseSyntax() {\n        skip(\"=\");\n        edition = readString();\n\n        /* istanbul ignore if */\n        if (edition < 2023)\n            throw illegal(edition, \"syntax\");\n\n        skip(\";\");\n    }\n\n    function parseEdition() {\n        skip(\"=\");\n        edition = readString();\n        const supportedEditions = [\"2023\", \"2024\", \"2026\"];\n\n        /* istanbul ignore if */\n        if (!supportedEditions.includes(edition))\n            throw illegal(edition, \"edition\");\n\n        skip(\";\");\n    }\n\n\n    function parseCommon(parent, token, depth) {\n        if (depth === undefined)\n            depth = 0;\n        // depth is checked by dispatched functions\n        switch (token) {\n\n            case \"option\":\n                parseOption(parent, token);\n                skip(\";\");\n                return true;\n\n            case \"message\":\n                parseType(parent, token, depth + 1);\n                return true;\n\n            case \"enum\":\n                parseEnum(parent, token);\n                return true;\n\n            case \"export\":\n            case \"local\":\n                if (edition < \"2024\") {\n                    return false;\n                }\n                var visibility = token;\n                token = next();\n                if (token === \"export\" || token === \"local\") {\n                    return false;\n                }\n                if (token !== \"message\" && token !== \"enum\") {\n                    return false;\n                }\n                (token === \"message\"\n                    ? parseType(parent, token, depth + 1)\n                    : parseEnum(parent, token)\n                ).visibility = visibility;\n                return true;\n\n            case \"service\":\n                parseService(parent, token, depth + 1);\n                return true;\n\n            case \"extend\":\n                parseExtension(parent, token, depth);\n                return true;\n        }\n        return false;\n    }\n\n    function ifBlock(obj, fnIf, fnElse) {\n        var trailingLine = tn.line;\n        if (obj) {\n            if(typeof obj.comment !== \"string\") {\n              obj.comment = cmnt(); // try block-type comment\n            }\n            obj.filename = parse.filename;\n        }\n        if (skip(\"{\", true)) {\n            var token;\n            while ((token = next()) !== \"}\")\n                fnIf(token);\n            skip(\";\", true);\n        } else {\n            if (fnElse)\n                fnElse();\n            skip(\";\");\n            if (obj && (typeof obj.comment !== \"string\" || preferTrailingComment))\n                obj.comment = cmnt(trailingLine) || obj.comment; // try line-type comment\n        }\n    }\n\n    function parseType(parent, token, depth) {\n        if (depth === undefined)\n            depth = 0;\n        if (depth > util.nestingLimit)\n            throw Error(\"max depth exceeded\");\n\n        /* istanbul ignore if */\n        if ((token = next()) === null || !nameRe.test(token))\n            throw illegal(token, \"type name\");\n\n        var type = new Type(token);\n        ifBlock(type, function parseType_block(token) {\n            if (parseCommon(type, token, depth))\n                return;\n\n            switch (token) {\n\n                case \";\":\n                    break;\n\n                case \"map\":\n                    parseMapField(type, token);\n                    break;\n\n                case \"required\":\n                    if (edition !== \"proto2\")\n                        throw illegal(token);\n                /* eslint-disable no-fallthrough */\n                case \"repeated\":\n                    parseField(type, token, undefined, depth + 1);\n                    break;\n\n                case \"optional\":\n                    /* istanbul ignore if */\n                    if (edition === \"proto3\") {\n                        parseField(type, \"proto3_optional\", undefined, depth + 1);\n                    } else if (edition !== \"proto2\") {\n                        throw illegal(token);\n                    } else {\n                        parseField(type, \"optional\", undefined, depth + 1);\n                    }\n                    break;\n\n                case \"oneof\":\n                    parseOneOf(type, token, depth + 1);\n                    break;\n\n                case \"extensions\":\n                    readRanges(type.extensions || (type.extensions = []));\n                    break;\n\n                case \"reserved\":\n                    readRanges(type.reserved || (type.reserved = []), true);\n                    break;\n\n                default:\n                    /* istanbul ignore if */\n                    if (edition === \"proto2\" || !typeRefRe.test(token)) {\n                        throw illegal(token);\n                    }\n\n                    push(token);\n                    parseField(type, \"optional\", undefined, depth + 1);\n                    break;\n            }\n        });\n        parent.add(type);\n        if (parent === ptr) {\n            topLevelObjects.push(type);\n        }\n        return type;\n    }\n\n    function parseField(parent, rule, extend, depth) {\n        var type = next();\n        if (type === null) {\n            throw illegal(type, \"end of input\");\n        }\n        if (type === \"group\") {\n            parseGroup(parent, rule, extend, depth);\n            return;\n        }\n        // Type names can consume multiple tokens, in multiple variants:\n        //    package.subpackage   field       tokens: \"package.subpackage\" [TYPE NAME ENDS HERE] \"field\"\n        //    package . subpackage field       tokens: \"package\" \".\" \"subpackage\" [TYPE NAME ENDS HERE] \"field\"\n        //    package.  subpackage field       tokens: \"package.\" \"subpackage\" [TYPE NAME ENDS HERE] \"field\"\n        //    package  .subpackage field       tokens: \"package\" \".subpackage\" [TYPE NAME ENDS HERE] \"field\"\n        // Keep reading tokens until we get a type name with no period at the end,\n        // and the next token does not start with a period.\n        while (type.endsWith(\".\") || (peek() || \"\").startsWith(\".\")) {\n            var part = next();\n            if (part === null) {\n                throw illegal(part, \"end of input\");\n            }\n            type += part;\n        }\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(type))\n            throw illegal(type, \"type\");\n\n        var name = next();\n        if (name === null) {\n            throw illegal(name, \"end of input\");\n        }\n\n        /* istanbul ignore if */\n\n        if (!nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        var protoName = name;\n        name = applyCase(name);\n        skip(\"=\");\n\n        var field = new Field(name, parseId(next()), type, rule === \"proto3_optional\" ? \"optional\" : rule, extend);\n        if (protoName !== name)\n            field.protoName = protoName;\n\n        ifBlock(field, function parseField_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(field, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseField_line() {\n            parseInlineOptions(field);\n        });\n\n        if (rule === \"proto3_optional\") {\n            // for proto3 optional fields, we create a single-member Oneof to mimic \"optional\" behavior\n            var oneof = new OneOf(\"_\" + name);\n            field.setOption(\"proto3_optional\", true);\n            oneof.add(field);\n            parent.add(oneof);\n        } else {\n            parent.add(field);\n        }\n        if (parent === ptr) {\n            topLevelObjects.push(field);\n        }\n    }\n\n    function parseGroup(parent, rule, extend, depth) {\n        if (depth === undefined)\n            depth = 0;\n        if (depth > util.nestingLimit)\n            throw Error(\"max depth exceeded\");\n        if (edition >= 2023) {\n            throw illegal(\"group\");\n        }\n        var name = next();\n\n        /* istanbul ignore if */\n        if (name === null || !nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        var fieldName = util.lcFirst(name);\n        if (name === fieldName)\n            name = util.ucFirst(name);\n        skip(\"=\");\n        var id = parseId(next());\n        var type = new Type(name);\n        type.group = true;\n        var field = new Field(fieldName, id, name, rule, extend);\n        field.filename = parse.filename;\n        ifBlock(type, function parseGroup_block(token) {\n            switch (token) {\n\n                case \";\":\n                    break;\n\n                case \"map\":\n                    parseMapField(type);\n                    break;\n\n                case \"option\":\n                    parseOption(type, token);\n                    skip(\";\");\n                    break;\n                case \"required\":\n                case \"repeated\":\n                    parseField(type, token, undefined, depth + 1);\n                    break;\n\n                case \"optional\":\n                    /* istanbul ignore if */\n                    if (edition === \"proto3\") {\n                        parseField(type, \"proto3_optional\", undefined, depth + 1);\n                    } else {\n                        parseField(type, \"optional\", undefined, depth + 1);\n                    }\n                    break;\n\n                case \"message\":\n                    parseType(type, token, depth + 1);\n                    break;\n\n                case \"enum\":\n                    parseEnum(type, token);\n                    break;\n\n                case \"reserved\":\n                    readRanges(type.reserved || (type.reserved = []), true);\n                    break;\n\n                case \"export\":\n                case \"local\":\n                    if (edition < \"2024\") {\n                        throw illegal(token);\n                    }\n                    token = next();\n                    switch (token) {\n                        case \"message\":\n                            parseType(type, token, depth + 1);\n                            break;\n                        case \"enum\":\n                            parseType(type, token, depth + 1);\n                            break;\n                        default:\n                            throw illegal(token);\n                    }\n                    break;\n\n                /* istanbul ignore next */\n                default:\n                    throw illegal(token); // there are no groups with proto3 semantics\n            }\n        });\n        parent.add(type)\n              .add(field);\n        if (parent === ptr) {\n            topLevelObjects.push(type);\n            topLevelObjects.push(field);\n        }\n    }\n\n    function parseMapField(parent) {\n        skip(\"<\");\n        var keyType = next();\n\n        /* istanbul ignore if */\n        if (types.mapKey[keyType] === undefined)\n            throw illegal(keyType, \"type\");\n\n        skip(\",\");\n        var valueType = next();\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(valueType))\n            throw illegal(valueType, \"type\");\n\n        skip(\">\");\n        var name = next();\n\n        /* istanbul ignore if */\n        if (name === null || !nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        skip(\"=\");\n        var protoName = name;\n        name = applyCase(name);\n        var field = new MapField(name, parseId(next()), keyType, valueType);\n        if (protoName !== name)\n            field.protoName = protoName;\n        ifBlock(field, function parseMapField_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(field, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseMapField_line() {\n            parseInlineOptions(field);\n        });\n        parent.add(field);\n    }\n\n    function parseOneOf(parent, token, depth) {\n\n        /* istanbul ignore if */\n        if ((token = next()) === null || !nameRe.test(token))\n            throw illegal(token, \"name\");\n\n        var oneof = new OneOf(applyCase(token));\n        ifBlock(oneof, function parseOneOf_block(token) {\n            if (token === \"option\") {\n                parseOption(oneof, token);\n                skip(\";\");\n            } else {\n                push(token);\n                parseField(oneof, \"optional\", undefined, depth);\n            }\n        });\n        parent.add(oneof);\n    }\n\n    function parseEnum(parent, token) {\n\n        /* istanbul ignore if */\n        if ((token = next()) === null || !nameRe.test(token))\n            throw illegal(token, \"name\");\n\n        var enm = new Enum(token),\n            values = [];\n        ifBlock(enm, function parseEnum_block(token) {\n          switch(token) {\n            case \";\":\n              break;\n\n            case \"option\":\n              parseOption(enm, token);\n              skip(\";\");\n              break;\n\n            case \"reserved\":\n              readRanges(enm.reserved || (enm.reserved = []), true, maxEnumId, true);\n              if(enm.reserved === undefined) enm.reserved = [];\n              break;\n\n            default:\n              values.push(parseEnumValue(token));\n          }\n        });\n        for (var i = 0; i < values.length; ++i)\n            enm.add(values[i].name, values[i].id, values[i].comment, values[i].options);\n        parent.add(enm);\n        if (parent === ptr) {\n            topLevelObjects.push(enm);\n        }\n        return enm;\n    }\n\n    function parseEnumValue(token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token))\n            throw illegal(token, \"name\");\n\n        skip(\"=\");\n        var value = parseId(next(), true),\n            dummy = {\n                options: undefined\n            };\n        dummy.getOption = function(name) {\n            return this.options[name];\n        };\n        dummy.setOption = function(name, value) {\n            ReflectionObject.prototype.setOption.call(dummy, name, value);\n        };\n        dummy.setParsedOption = function() {\n            return undefined;\n        };\n        ifBlock(dummy, function parseEnumValue_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(dummy, token); // skip\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseEnumValue_line() {\n            parseInlineOptions(dummy); // skip\n        });\n        return {\n            name: token,\n            id: value,\n            comment: dummy.comment,\n            options: dummy.parsedOptions || dummy.options\n        };\n    }\n\n    function parseOption(parent, token) {\n            var option;\n            var propName;\n            var isOption = true;\n            if (token === \"option\") {\n                token = next();\n            }\n\n            while (token !== \"=\") {\n                if (token === null) {\n                    throw illegal(token, \"end of input\");\n                }\n                if (token === \"(\") {\n                    var parensValue = next();\n                    skip(\")\");\n                    token = \"(\" + parensValue + \")\";\n                }\n                if (isOption) {\n                    isOption = false;\n                    if (token.includes(\".\") && !token.includes(\"(\")) {\n                        var tokens = token.split(\".\");\n                        option = tokens[0] + \".\";\n                        token = tokens[1];\n                        continue;\n                    }\n                    option = token;\n                } else {\n                    propName = propName ? propName += token : token;\n                }\n                token = next();\n            }\n            var name = propName ? option.concat(propName) : option;\n            var optionValue = parseOptionValue(parent, name);\n            propName = propName && propName[0] === \".\" ? propName.slice(1) : propName;\n            option = option && option[option.length - 1] === \".\" ? option.slice(0, -1) : option;\n            setParsedOption(parent, option, optionValue, propName);\n    }\n\n    function parseOptionValue(parent, name, depth) {\n        if (depth === undefined)\n            depth = 0;\n        if (depth > util.recursionLimit)\n            throw Error(\"max depth exceeded\");\n        // { a: \"foo\" b { c: \"bar\" } }\n        if (skip(\"{\", true)) {\n            var objectResult = {};\n\n            while (!skip(\"}\", true)) {\n                token = next();\n                var propName;\n                if (token === null)\n                    throw illegal(token, \"end of input\");\n                if (token === \"[\") {\n                    token = next();\n                    // Extension name or, for Any, a type URL: \"<prefix>/<fully.qualified.Type>\".\n                    var slash = token === null ? -1 : token.lastIndexOf(\"/\");\n                    if (token === null || !typeRefRe.test(slash < 0 ? token : token.slice(slash + 1)))\n                        throw illegal(token, \"name\");\n                    propName = \"[\" + token + \"]\";\n                    skip(\"]\");\n                } else {\n                    /* istanbul ignore if */\n                    if (!nameRe.test(token)) {\n                        throw illegal(token, \"name\");\n                    }\n                    propName = token;\n                }\n\n                var value;\n\n                skip(\":\", true);\n\n                if (peek() === \"{\") {\n                    // option (my_option) = {\n                    //     repeated_value: [ \"foo\", \"bar\" ]\n                    // };\n                    value = parseOptionValue(parent, name + \".\" + propName, depth + 1);\n                } else if (peek() === \"[\") {\n                    value = [];\n                    var lastValue,\n                        lastValueIsAggregate;\n                    if (skip(\"[\", true)) {\n                        if (!skip(\"]\", true)) {\n                            do {\n                                lastValueIsAggregate = peek() === \"{\";\n                                lastValue = lastValueIsAggregate\n                                    ? parseOptionValue(parent, name + \".\" + propName, depth + 1)\n                                    : readValue(true);\n                                value.push(lastValue);\n                            } while (skip(\",\", true));\n                            skip(\"]\");\n                            if (typeof lastValue !== \"undefined\") {\n                                if (!lastValueIsAggregate)\n                                    setOption(parent, name + \".\" + propName, lastValue);\n                            }\n                        }\n                    }\n                } else {\n                    value = readValue(true);\n                    setOption(parent, name + \".\" + propName, value);\n                }\n\n                var prevValue = Object.prototype.hasOwnProperty.call(objectResult, propName)\n                    ? objectResult[propName]\n                    : undefined;\n\n                if (prevValue)\n                    value = [].concat(prevValue).concat(value);\n\n                if (propName !== \"__proto__\")\n                    objectResult[propName] = value;\n\n                // Semicolons and commas can be optional\n                skip(\",\", true);\n                skip(\";\", true);\n            }\n\n            return objectResult;\n        }\n\n        var simpleValue = name === \"default\" && parent instanceof Field && integerTypeRe.test(parent.type)\n            ? parseInteger(next(), !unsignedTypeRe.test(parent.type))\n            : readValue(true);\n        setOption(parent, name, simpleValue);\n        return simpleValue;\n        // Does not enforce a delimiter to be universal\n    }\n\n    function setOption(parent, name, value) {\n        if (ptr === parent && /^features\\./.test(name)) {\n            topLevelOptions[name] = value;\n            return;\n        }\n        // lift json_name onto Field\n        if (name === \"json_name\" && parent instanceof Field) {\n            parent.jsonName = value;\n        }\n        if (parent.setOption)\n            parent.setOption(name, value);\n    }\n\n    function setParsedOption(parent, name, value, propName) {\n        if (parent.setParsedOption)\n            parent.setParsedOption(name, value, propName);\n    }\n\n    function parseInlineOptions(parent) {\n        if (skip(\"[\", true)) {\n            do {\n                parseOption(parent, \"option\");\n            } while (skip(\",\", true));\n            skip(\"]\");\n        }\n        return parent;\n    }\n\n    function parseService(parent, token, depth) {\n        if (depth === undefined)\n            depth = 0;\n        if (depth > util.recursionLimit)\n            throw Error(\"max depth exceeded\");\n\n        /* istanbul ignore if */\n        if ((token = next()) === null || !nameRe.test(token))\n            throw illegal(token, \"service name\");\n\n        var service = new Service(token);\n        ifBlock(service, function parseService_block(token) {\n            if (parseCommon(service, token, depth)) {\n                return;\n            }\n\n            /* istanbul ignore else */\n            if (token === \";\")\n                return;\n            if (token === \"rpc\")\n                parseMethod(service, token);\n            else\n                throw illegal(token);\n        });\n        parent.add(service);\n        if (parent === ptr) {\n            topLevelObjects.push(service);\n        }\n    }\n\n    function parseMethod(parent, token) {\n        // Get the comment of the preceding line now (if one exists) in case the\n        // method is defined across multiple lines.\n        var commentText = cmnt();\n\n        var type = token;\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var name = token,\n            requestType, requestStream,\n            responseType, responseStream;\n\n        skip(\"(\");\n        if (skip(\"stream\", true))\n            requestStream = true;\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token);\n\n        requestType = token;\n        skip(\")\"); skip(\"returns\"); skip(\"(\");\n        if (skip(\"stream\", true))\n            responseStream = true;\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token);\n\n        responseType = token;\n        skip(\")\");\n\n        var method = new Method(name, type, requestType, responseType, requestStream, responseStream);\n        method.comment = commentText;\n        ifBlock(method, function parseMethod_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \";\")\n                return;\n            if (token === \"option\") {\n                parseOption(method, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        });\n        parent.add(method);\n    }\n\n    function parseExtension(parent, token, depth) {\n\n        /* istanbul ignore if */\n        if ((token = next()) === null || !typeRefRe.test(token))\n            throw illegal(token, \"reference\");\n\n        var reference = token;\n        ifBlock(null, function parseExtension_block(token) {\n            switch (token) {\n\n                case \"required\":\n                case \"repeated\":\n                    parseField(parent, token, reference, depth + 1);\n                    break;\n\n                case \"optional\":\n                    /* istanbul ignore if */\n                    if (edition === \"proto3\") {\n                        parseField(parent, \"proto3_optional\", reference, depth + 1);\n                    } else {\n                        parseField(parent, \"optional\", reference, depth + 1);\n                    }\n                    break;\n\n                default:\n                    /* istanbul ignore if */\n                    if (edition === \"proto2\" || !typeRefRe.test(token))\n                        throw illegal(token);\n                    push(token);\n                    parseField(parent, \"optional\", reference, depth + 1);\n                    break;\n            }\n        });\n    }\n\n    var token;\n    while ((token = next()) !== null) {\n        switch (token) {\n\n            case \";\":\n                break;\n\n            case \"package\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parsePackage();\n                break;\n\n            case \"import\":\n\n                parseImport();\n                break;\n\n            case \"syntax\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parseSyntax();\n                break;\n\n            case \"edition\":\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n                parseEdition();\n                break;\n\n            case \"option\":\n                parseOption(ptr, token);\n                skip(\";\", true);\n                break;\n\n            default:\n\n                /* istanbul ignore else */\n                if (parseCommon(ptr, token, 0)) {\n                    head = false;\n                    continue;\n                }\n\n                /* istanbul ignore next */\n                throw illegal(token);\n        }\n    }\n\n    resolveFileFeatures();\n\n    parse.filename = null;\n    return {\n        \"package\"     : pkg,\n        \"imports\"     : imports,\n         weakImports  : weakImports,\n         root         : root\n    };\n}\n\n/**\n * Parses the given .proto source and returns an object with the parsed contents.\n * @name parse\n * @function\n * @param {string} source Source contents\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {IParserResult} Parser result\n * @property {string} filename=null Currently processing file name for error reporting, if known\n * @property {IParseOptions} defaults Default {@link IParseOptions}\n * @variation 2\n */\n","\"use strict\";\nmodule.exports = common;\n\nvar commonRe = /\\/|\\./;\n\n/**\n * Provides common type definitions.\n * Can also be used to provide additional google types or your own custom types.\n * @param {string} name Short name as in `google/protobuf/[name].proto` or full file name\n * @param {Object.<string,*>} json JSON definition within `google.protobuf` if a short name, otherwise the file's root definition\n * @returns {undefined}\n * @property {INamespace} google/protobuf/any.proto Any\n * @property {INamespace} google/protobuf/duration.proto Duration\n * @property {INamespace} google/protobuf/empty.proto Empty\n * @property {INamespace} google/protobuf/field_mask.proto FieldMask\n * @property {INamespace} google/protobuf/struct.proto Struct, Value, NullValue and ListValue\n * @property {INamespace} google/protobuf/timestamp.proto Timestamp\n * @property {INamespace} google/protobuf/wrappers.proto Wrappers\n * @example\n * // manually provides descriptor.proto (assumes google/protobuf/ namespace and .proto extension)\n * protobuf.common(\"descriptor\", descriptorJson);\n *\n * // manually provides a custom definition (uses my.foo namespace)\n * protobuf.common(\"my/foo/bar.proto\", myFooBarJson);\n */\nfunction common(name, json) {\n    if (!commonRe.test(name)) {\n        name = \"google/protobuf/\" + name + \".proto\";\n        json = { nested: { google: { nested: { protobuf: { nested: json } } } } };\n    }\n    common[name] = json;\n}\n\n// Not provided because of limited use (feel free to discuss or to provide yourself):\n//\n// google/protobuf/descriptor.proto\n// google/protobuf/source_context.proto\n// google/protobuf/type.proto\n//\n// Stripped and pre-parsed versions of these non-bundled files are instead available as part of\n// the repository or package within the google/protobuf directory.\n\ncommon(\"any\", {\n\n    /**\n     * Properties of a google.protobuf.Any message.\n     * @interface IAny\n     * @type {Object}\n     * @property {string} [typeUrl]\n     * @property {Uint8Array} [bytes]\n     * @memberof common\n     */\n    Any: {\n        fields: {\n            type_url: {\n                type: \"string\",\n                id: 1\n            },\n            value: {\n                type: \"bytes\",\n                id: 2\n            }\n        }\n    }\n});\n\nvar timeType;\n\ncommon(\"duration\", {\n\n    /**\n     * Properties of a google.protobuf.Duration message.\n     * @interface IDuration\n     * @type {Object}\n     * @property {number|Long} [seconds]\n     * @property {number} [nanos]\n     * @memberof common\n     */\n    Duration: timeType = {\n        fields: {\n            seconds: {\n                type: \"int64\",\n                id: 1\n            },\n            nanos: {\n                type: \"int32\",\n                id: 2\n            }\n        }\n    }\n});\n\ncommon(\"timestamp\", {\n\n    /**\n     * Properties of a google.protobuf.Timestamp message.\n     * @interface ITimestamp\n     * @type {Object}\n     * @property {number|Long} [seconds]\n     * @property {number} [nanos]\n     * @memberof common\n     */\n    Timestamp: timeType\n});\n\ncommon(\"empty\", {\n\n    /**\n     * Properties of a google.protobuf.Empty message.\n     * @interface IEmpty\n     * @memberof common\n     */\n    Empty: {\n        fields: {}\n    }\n});\n\ncommon(\"struct\", {\n\n    /**\n     * Properties of a google.protobuf.Struct message.\n     * @interface IStruct\n     * @type {Object}\n     * @property {Object.<string,IValue>} [fields]\n     * @memberof common\n     */\n    Struct: {\n        fields: {\n            fields: {\n                keyType: \"string\",\n                type: \"Value\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Value message.\n     * @interface IValue\n     * @type {Object}\n     * @property {string} [kind]\n     * @property {0} [nullValue]\n     * @property {number} [numberValue]\n     * @property {string} [stringValue]\n     * @property {boolean} [boolValue]\n     * @property {IStruct} [structValue]\n     * @property {IListValue} [listValue]\n     * @memberof common\n     */\n    Value: {\n        oneofs: {\n            kind: {\n                oneof: [\n                    \"nullValue\",\n                    \"numberValue\",\n                    \"stringValue\",\n                    \"boolValue\",\n                    \"structValue\",\n                    \"listValue\"\n                ]\n            }\n        },\n        fields: {\n            nullValue: {\n                type: \"NullValue\",\n                id: 1,\n                protoName: \"null_value\"\n            },\n            numberValue: {\n                type: \"double\",\n                id: 2,\n                protoName: \"number_value\"\n            },\n            stringValue: {\n                type: \"string\",\n                id: 3,\n                protoName: \"string_value\"\n            },\n            boolValue: {\n                type: \"bool\",\n                id: 4,\n                protoName: \"bool_value\"\n            },\n            structValue: {\n                type: \"Struct\",\n                id: 5,\n                protoName: \"struct_value\"\n            },\n            listValue: {\n                type: \"ListValue\",\n                id: 6,\n                protoName: \"list_value\"\n            }\n        }\n    },\n\n    NullValue: {\n        values: {\n            NULL_VALUE: 0\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.ListValue message.\n     * @interface IListValue\n     * @type {Object}\n     * @property {Array.<IValue>} [values]\n     * @memberof common\n     */\n    ListValue: {\n        fields: {\n            values: {\n                rule: \"repeated\",\n                type: \"Value\",\n                id: 1\n            }\n        }\n    }\n});\n\ncommon(\"wrappers\", {\n\n    /**\n     * Properties of a google.protobuf.DoubleValue message.\n     * @interface IDoubleValue\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    DoubleValue: {\n        fields: {\n            value: {\n                type: \"double\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.FloatValue message.\n     * @interface IFloatValue\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    FloatValue: {\n        fields: {\n            value: {\n                type: \"float\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Int64Value message.\n     * @interface IInt64Value\n     * @type {Object}\n     * @property {number|Long} [value]\n     * @memberof common\n     */\n    Int64Value: {\n        fields: {\n            value: {\n                type: \"int64\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.UInt64Value message.\n     * @interface IUInt64Value\n     * @type {Object}\n     * @property {number|Long} [value]\n     * @memberof common\n     */\n    UInt64Value: {\n        fields: {\n            value: {\n                type: \"uint64\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Int32Value message.\n     * @interface IInt32Value\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    Int32Value: {\n        fields: {\n            value: {\n                type: \"int32\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.UInt32Value message.\n     * @interface IUInt32Value\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    UInt32Value: {\n        fields: {\n            value: {\n                type: \"uint32\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.BoolValue message.\n     * @interface IBoolValue\n     * @type {Object}\n     * @property {boolean} [value]\n     * @memberof common\n     */\n    BoolValue: {\n        fields: {\n            value: {\n                type: \"bool\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.StringValue message.\n     * @interface IStringValue\n     * @type {Object}\n     * @property {string} [value]\n     * @memberof common\n     */\n    StringValue: {\n        fields: {\n            value: {\n                type: \"string\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.BytesValue message.\n     * @interface IBytesValue\n     * @type {Object}\n     * @property {Uint8Array} [value]\n     * @memberof common\n     */\n    BytesValue: {\n        fields: {\n            value: {\n                type: \"bytes\",\n                id: 1\n            }\n        }\n    }\n});\n\ncommon(\"field_mask\", {\n\n    /**\n     * Properties of a google.protobuf.FieldMask message.\n     * @interface IFieldMask\n     * @type {Object}\n     * @property {string[]} [paths]\n     * @memberof common\n     */\n    FieldMask: {\n        fields: {\n            paths: {\n                rule: \"repeated\",\n                type: \"string\",\n                id: 1\n            }\n        }\n    }\n});\n\n/**\n * Gets the root definition of the specified common proto file.\n *\n * Bundled definitions are:\n * - google/protobuf/any.proto\n * - google/protobuf/duration.proto\n * - google/protobuf/empty.proto\n * - google/protobuf/field_mask.proto\n * - google/protobuf/struct.proto\n * - google/protobuf/timestamp.proto\n * - google/protobuf/wrappers.proto\n *\n * @param {string} file Proto file name\n * @returns {INamespace|null} Root definition or `null` if not defined\n */\ncommon.get = function get(file) {\n    return common[file] || null;\n};\n","\"use strict\";\nexports = module.exports = require(\"./index-light\");\n\nexports.build = \"full\";\n\n// Parser\nexports.tokenize         = require(\"./tokenize\");\nexports.parse            = require(\"./parse\");\nexports.common           = require(\"./common\");\n\n// Configure parser\nexports.Root._configure(exports.Type, exports.parse, exports.common);\n","// full library entry point.\n\n\"use strict\";\nmodule.exports = require(\"./src/index\");\n","export const GOOGLE_SVG_ICON = `<svg class=\"sso-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M17.64 9.2c0-.637-.057-1.251-.164-1.84H9v3.481h4.844c-.209 1.125-.843 2.078-1.796 2.717v2.258h2.908c1.702-1.567 2.684-3.874 2.684-6.616z\" fill=\"#4285F4\"/><path d=\"M9 18c2.43 0 4.467-.806 5.956-2.184l-2.908-2.258c-.806.54-1.837.86-3.048.86-2.344 0-4.328-1.584-5.036-3.711H.957v2.332A8.997 8.997 0 0 0 9 18z\" fill=\"#34A853\"/><path d=\"M3.964 10.707c-.18-.54-.282-1.117-.282-1.707 0-.59.102-1.167.282-1.707V4.961H.957A8.996 8.996 0 0 0 0 9c0 1.452.348 2.827.957 4.039l3.007-2.332z\" fill=\"#FBBC05\"/><path d=\"M9 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.463.891 11.426 0 9 0A8.997 8.997 0 0 0 .957 4.961L3.964 7.293C4.672 5.166 6.656 3.58 9 3.58z\" fill=\"#EA4335\"/></svg>`;\n\nexport const MICROSOFT_SVG_ICON = `<svg class=\"sso-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 21 21\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"1\" y=\"1\" width=\"9\" height=\"9\" fill=\"#f25022\"/><rect x=\"11\" y=\"1\" width=\"9\" height=\"9\" fill=\"#7fba00\"/><rect x=\"1\" y=\"11\" width=\"9\" height=\"9\" fill=\"#00a4ef\"/><rect x=\"11\" y=\"11\" width=\"9\" height=\"9\" fill=\"#ffb900\"/></svg>`;\n\nexport const SSO_GENERIC_SVG_ICON = `<svg class=\"sso-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/></svg>`;\n\nexport function getProviderIconSVG(iconName?: string, providerId?: string): string {\n  const key = (iconName || providerId || '').toLowerCase();\n  if (key.includes('google')) return GOOGLE_SVG_ICON;\n  if (key.includes('microsoft') || key.includes('azure') || key.includes('entra')) return MICROSOFT_SVG_ICON;\n  if (iconName) {\n    if (iconName.startsWith('<svg')) return iconName;\n    if (iconName.startsWith('http://') || iconName.startsWith('https://') || iconName.startsWith('/') || iconName.startsWith('data:image')) {\n      return `<img src=\"${iconName}\" alt=\"\" class=\"sso-icon\" width=\"18\" height=\"18\" />`;\n    }\n  }\n  return SSO_GENERIC_SVG_ICON;\n}\n","import { PanelHandler } from '@tingdahl/tsutils/ui';\nimport { apiUrl, fetchWithAuth, getAuthToken, setAuthToken, getDeviceToken, setDeviceToken } from '../api-config';\nimport { util } from 'protobufjs';\nimport { users, devices } from '../proto/compiled_proto';\nimport { getProviderIconSVG } from '../auth-icons';\nimport { t } from '../i18n';\nimport { PARAM_TOKEN, PARAM_DEVICE_ENROLL, STORAGE_DEVICE_INFO } from './strings';\n\nexport interface DeviceSessionInfo {\n  deviceId: string;\n  tenantId: number;\n  tenantName: string;\n  channelName?: string;\n  label: string;\n  expiresAtUnixMs: number;\n}\n\nexport interface AuthProvider {\n  id: string;\n  name: string;\n  icon?: string;\n}\n\nexport class AuthManager {\n  private user: users.UserProtoRow | null = null;\n  private onAuthChangedCallback?: (user: users.UserProtoRow | null) => void;\n\n  constructor(onAuthChanged?: (user: users.UserProtoRow | null) => void) {\n    this.onAuthChangedCallback = onAuthChanged;\n  }\n\n  public onAuthChanged(cb: (user: users.UserProtoRow | null) => void): void {\n    this.onAuthChangedCallback = cb;\n  }\n\n  private lastAuthError: string | null = null;\n\n  public getLastAuthError(): string | null {\n    return this.lastAuthError;\n  }\n\n  public clearLastAuthError(): void {\n    this.lastAuthError = null;\n  }\n\n  public checkUrlForToken(): boolean {\n    return this.extractTokenFromUrl();\n  }\n\n  public extractTokenFromUrl(): boolean {\n    const url = new URL(window.location.href);\n    const token = url.searchParams.get(PARAM_TOKEN);\n    const authError = url.searchParams.get('auth_error');\n\n    if (authError) {\n      this.lastAuthError = authError;\n      setAuthToken(null);\n      url.searchParams.delete('auth_error');\n      url.searchParams.delete(PARAM_TOKEN);\n      window.history.replaceState({}, document.title, url.toString());\n      return false;\n    }\n\n    if (token) {\n      setAuthToken(token);\n      this.clearDeviceSession();\n      this.sessionExpired = false;\n      url.searchParams.delete(PARAM_TOKEN);\n      window.history.replaceState({}, document.title, url.toString());\n      return true;\n    }\n\n    return false;\n  }\n\n  private sessionExpired: boolean = false;\n  private renewalTimer: number | null = null;\n\n  public isSessionExpired(): boolean {\n    return this.sessionExpired;\n  }\n\n  public setSessionExpired(expired: boolean): void {\n    this.sessionExpired = expired;\n  }\n\n  public handleSessionExpired(): void {\n    this.sessionExpired = true;\n    this.stopTokenRenewalCheck();\n    setAuthToken(null);\n    this.user = null;\n    if (this.onAuthChangedCallback) {\n      this.onAuthChangedCallback(null);\n    }\n  }\n\n  public async fetchCurrentUser(): Promise<users.UserProtoRow | null> {\n    try {\n      const resp = await fetchWithAuth('/api/me');\n      if (resp.ok) {\n        const buffer = await resp.arrayBuffer();\n        this.user = users.UserProtoRow.decode(new Uint8Array(buffer));\n        const normalizedRoles: { [k: string]: users.Role } = {};\n        if (this.user.tenantRoles) {\n          for (const [key, val] of Object.entries(this.user.tenantRoles)) {\n            if (/^\\d+$/.test(key)) {\n              normalizedRoles[key] = val;\n            } else {\n              try {\n                normalizedRoles[util.longFromHash(key).toString()] = val;\n              } catch {\n                normalizedRoles[key] = val;\n              }\n            }\n          }\n        }\n        this.user.tenantRoles = normalizedRoles;\n        this.sessionExpired = false;\n        this.startTokenRenewalCheck();\n        if (this.onAuthChangedCallback) {\n          this.onAuthChangedCallback(this.user);\n        }\n        return this.user;\n      } else if (resp.status === 401 || resp.status === 403) {\n        this.handleSessionExpired();\n        return null;\n      }\n    } catch (e) {\n      console.warn('Could not fetch user profile:', e);\n    }\n    this.user = null;\n    return null;\n  }\n\n  public getUser(): users.UserProtoRow | null {\n    return this.user;\n  }\n\n  public async getBroadcasterTerms(): Promise<{ type: string; version: string; content: string } | null> {\n    try {\n      const resp = await fetchWithAuth('/api/legal/terms/broadcaster');\n      if (resp.ok) {\n        return await resp.json();\n      }\n    } catch (e) {\n      console.warn('Failed to load broadcaster terms:', e);\n    }\n    return null;\n  }\n\n  public async acceptTerms(version: string): Promise<users.UserProtoRow | null> {\n    try {\n      const resp = await fetchWithAuth('/api/me/terms', {\n        method: 'PUT',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ version }),\n      });\n      if (resp.ok) {\n        const buffer = await resp.arrayBuffer();\n        const updated = users.UserProtoRow.decode(new Uint8Array(buffer));\n        if (this.user && this.user.tenantRoles) {\n          updated.tenantRoles = this.user.tenantRoles;\n        }\n        this.user = updated;\n        return this.user;\n      }\n    } catch (e) {\n      console.error('Failed to accept terms:', e);\n    }\n    return null;\n  }\n\n\n  public async getProviders(): Promise<AuthProvider[]> {\n    try {\n      const resp = await fetch(apiUrl('/api/auth/providers'));\n      if (resp.ok) {\n        return await resp.json();\n      }\n    } catch (e) {\n      console.warn('Failed to load auth providers:', e);\n    }\n    return [];\n  }\n\n  public getDeviceToken(): string | null {\n    return getDeviceToken();\n  }\n\n  public getDeviceInfo(): DeviceSessionInfo | null {\n    const raw = localStorage.getItem(STORAGE_DEVICE_INFO);\n    if (!raw) return null;\n    try {\n      return JSON.parse(raw);\n    } catch {\n      return null;\n    }\n  }\n\n  public isDeviceSession(): boolean {\n    return !!this.getDeviceToken() && !this.user;\n  }\n\n  public setDeviceSession(token: string, info: DeviceSessionInfo): void {\n    setDeviceToken(token);\n    setAuthToken(null);\n    this.user = null;\n    localStorage.setItem(STORAGE_DEVICE_INFO, JSON.stringify(info));\n  }\n\n  public clearDeviceSession(): void {\n    setDeviceToken(null);\n    localStorage.removeItem(STORAGE_DEVICE_INFO);\n  }\n\n  public checkUrlForEnrollmentToken(): string | null {\n    const url = new URL(window.location.href);\n    const enrollToken = url.searchParams.get(PARAM_DEVICE_ENROLL);\n    if (enrollToken) {\n      url.searchParams.delete(PARAM_DEVICE_ENROLL);\n      window.history.replaceState({}, document.title, url.toString());\n      return enrollToken;\n    }\n    return null;\n  }\n\n  public async enrollDevice(enrollmentToken: string, label?: string): Promise<DeviceSessionInfo> {\n    const body: Record<string, string> = { enrollment_token: enrollmentToken };\n    if (label) {\n      body.label = label;\n    }\n    const resp = await fetch(apiUrl('/api/devices/enroll'), {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n    });\n    if (!resp.ok) {\n      const err = await resp.json().catch(() => ({}));\n      throw new Error(err.error || 'Failed to enroll booth device');\n    }\n    const buffer = await resp.arrayBuffer();\n    const data = devices.DeviceEnrollmentResultProto.decode(new Uint8Array(buffer));\n    const info: DeviceSessionInfo = {\n      deviceId: data.deviceId,\n      tenantId: Number(data.tenantId),\n      tenantName: data.tenantName,\n      channelName: data.channelName || undefined,\n      label: data.label,\n      expiresAtUnixMs: Number(data.expiresAtUnixMs),\n    };\n    this.setDeviceSession(data.deviceToken, info);\n    return info;\n  }\n\n  public getTokenExp(): number | null {\n    const token = getAuthToken();\n    if (!token) return null;\n    const parts = token.split('.');\n    if (parts.length !== 3) return null;\n    try {\n      const payload = JSON.parse(atob(parts[1].replace(/-/g, '+').replace(/_/g, '/')));\n      return typeof payload.exp === 'number' ? payload.exp : null;\n    } catch {\n      return null;\n    }\n  }\n\n  public async refreshToken(): Promise<boolean> {\n    try {\n      const resp = await fetchWithAuth('/api/auth/refresh', { method: 'POST' });\n      if (resp.ok) {\n        const data = await resp.json().catch(() => null);\n        if (data && data.token) {\n          setAuthToken(data.token);\n        }\n        return true;\n      }\n    } catch (e) {\n      console.warn('Failed to refresh session token:', e);\n    }\n    return false;\n  }\n\n  public startTokenRenewalCheck(intervalMs: number = 5 * 60 * 1000): void {\n    if (this.renewalTimer !== null) return;\n    this.checkAndRenewToken();\n    this.renewalTimer = window.setInterval(() => {\n      this.checkAndRenewToken();\n    }, intervalMs);\n  }\n\n  public stopTokenRenewalCheck(): void {\n    if (this.renewalTimer !== null) {\n      clearInterval(this.renewalTimer);\n      this.renewalTimer = null;\n    }\n  }\n\n  private async checkAndRenewToken(): Promise<void> {\n    if (!getAuthToken()) return;\n    const exp = this.getTokenExp();\n    if (!exp) return;\n    const remainingSec = exp - Math.floor(Date.now() / 1000);\n    // If remaining validity is <= 4 hours (and not already expired), refresh token\n    if (remainingSec > 0 && remainingSec <= 4 * 3600) {\n      await this.refreshToken();\n    }\n  }\n\n  public logout(): void {\n    this.stopTokenRenewalCheck();\n    setAuthToken(null);\n    this.user = null;\n    this.clearDeviceSession();\n    window.location.href = '/broadcast.html';\n  }\n}\n\nexport class SignInPanelHandler extends PanelHandler {\n  private authManager: AuthManager;\n\n  constructor(authManager: AuthManager) {\n    super('sign-in-panel');\n    this.authManager = authManager;\n  }\n\n  async refresh(): Promise<void> {\n    await super.refresh();\n    const el = document.getElementById(this.id);\n    if (!el) return;\n\n    const providers = await this.authManager.getProviders();\n\n    const rawTitle = t('auth.signInTitle');\n    const titleText = (!rawTitle || rawTitle.startsWith('auth.')) ? 'Console Sign In' : rawTitle;\n    const rawDesc = t('auth.signInDesc');\n    const descText = (!rawDesc || rawDesc.startsWith('auth.')) ? 'Sign in with your organization account to access the audio console and broadcast live captions.' : rawDesc;\n\n    const authError = this.authManager.getLastAuthError();\n    let errorBannerHtml = '';\n    if (authError === 'invite_only') {\n      errorBannerHtml = `\n        <div class=\"auth-notice-banner auth-notice-warning\" role=\"alert\" style=\"margin-bottom: 20px; padding: 12px 16px; border-radius: var(--radius-sm); background: rgba(245, 158, 11, 0.12); border: 1px solid var(--accent-warning); color: var(--accent-warning); font-size: 0.875rem; line-height: 1.45; text-align: left;\">\n          <strong style=\"display: block; margin-bottom: 4px; font-weight: 600;\">Registration is Invite-Only</strong>\n          New registrations are currently restricted. If your organization invited you, please sign in with the email address that received the invitation.\n        </div>\n      `;\n    } else if (authError) {\n      errorBannerHtml = `\n        <div class=\"auth-notice-banner auth-notice-error\" role=\"alert\" style=\"margin-bottom: 20px; padding: 12px 16px; border-radius: var(--radius-sm); background: rgba(244, 63, 94, 0.12); border: 1px solid var(--accent-danger); color: var(--accent-danger); font-size: 0.875rem; line-height: 1.45; text-align: left;\">\n          <strong style=\"display: block; margin-bottom: 4px; font-weight: 600;\">Sign-In Failed</strong>\n          We could not complete your sign-in. Please try again.\n        </div>\n      `;\n    }\n\n    el.innerHTML = `\n      <div class=\"auth-container\">\n        <div class=\"card auth-card\">\n          <div class=\"brand auth-brand\">\n            <span>${t('common.appName')}</span>\n            <span class=\"brand-badge\">${t('broadcaster.fohConsole')}</span>\n          </div>\n          <h2 class=\"auth-title\">\n            ${titleText}\n          </h2>\n          <p class=\"auth-desc\">\n            ${descText}\n          </p>\n          ${errorBannerHtml}\n\n          <div class=\"auth-providers-list\">\n            ${providers.length > 0 ? providers.map(p => `\n              <a href=\"${apiUrl(`/api/auth/${p.id}/login?return_to=${encodeURIComponent(window.location.href)}`)}\"\n                 class=\"btn btn-outline auth-provider-btn\">\n                ${getProviderIconSVG(p.icon, p.id)}\n                <span>${t('auth.continueWith', { name: p.name })}</span>\n              </a>\n            `).join('') : `\n              <p class=\"auth-no-providers\">\n                ${t('auth.noProviders')}\n              </p>\n            `}\n          </div>\n\n          <div class=\"auth-footer\">\n            ${t('auth.audienceNotice', { homeLink: '<a href=\"/\" class=\"text-primary-var\">fluent.church</a>' })}\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n","/**\n * Fetches a presigned URL from an API endpoint returning { url: string }.\n * Returns the URL string or null if the request failed or no URL was returned.\n */\nexport async function fetchSignedUrl(endpoint, options) {\n    try {\n        const fetcher = options?.fetchFn || (typeof window !== 'undefined' ? window.fetch.bind(window) : fetch);\n        const resp = await fetcher(endpoint);\n        if (!resp.ok)\n            return null;\n        const data = (await resp.json());\n        return data?.url || null;\n    }\n    catch {\n        return null;\n    }\n}\n/**\n * Fetches raw binary content from a signed URL endpoint.\n * First queries the endpoint for { url: string }, then fetches the binary payload from storage.\n */\nexport async function fetchSignedBinary(endpoint, options) {\n    const url = await fetchSignedUrl(endpoint, options);\n    if (!url)\n        return null;\n    try {\n        const fetcher = options?.fetchFn || (typeof window !== 'undefined' ? window.fetch.bind(window) : fetch);\n        const resp = await fetcher(url);\n        if (!resp.ok)\n            return null;\n        const buffer = await resp.arrayBuffer();\n        return new Uint8Array(buffer);\n    }\n    catch {\n        return null;\n    }\n}\n/**\n * Fetches and decodes a protobuf document from a signed URL endpoint.\n * Takes a protobuf decode function (e.g. MyProto.decode) and returns the typed message or null.\n */\nexport async function fetchSignedProto(endpoint, decodeFn, options) {\n    const bytes = await fetchSignedBinary(endpoint, options);\n    if (!bytes)\n        return null;\n    try {\n        return decodeFn(bytes);\n    }\n    catch (err) {\n        console.warn(`[tsutils/net] Failed to decode protobuf from ${endpoint}:`, err);\n        return null;\n    }\n}\n/**\n * Fetches and parses a JSON document from a signed URL endpoint.\n */\nexport async function fetchSignedJson(endpoint, options) {\n    const url = await fetchSignedUrl(endpoint, options);\n    if (!url)\n        return null;\n    try {\n        const fetcher = options?.fetchFn || (typeof window !== 'undefined' ? window.fetch.bind(window) : fetch);\n        const resp = await fetcher(url);\n        if (!resp.ok)\n            return null;\n        return (await resp.json());\n    }\n    catch {\n        return null;\n    }\n}\n//# sourceMappingURL=signed_url.js.map","import { fetchSignedProto } from '@tingdahl/tsutils/net';\nimport { fetchWithAuth } from '../api-config';\nimport { entitlement } from '../proto/compiled_proto';\n\nexport const DIM_KEY_STREAMING_SECONDS = 'streaming_seconds';\nexport const DIM_KEY_PAID_UNTIL = 'paid_until';\n\nexport interface ActiveSessionInfo {\n  sessionId: string;\n  channelName: string;\n  sessionSeconds: number;\n  effectiveAtUnixMs: number;\n  expiresAtUnixMs: number;\n  remainingSeconds: number;\n}\n\nexport interface TenantEntitlementSummary {\n  totalBalanceSeconds: number;\n  availableSeconds: number;\n  isSubscribed: boolean;\n  subscribedUntilUnixMs: number;\n  activeSessions: Map<string, ActiveSessionInfo>;\n  transactions: entitlement.IEntitlementTransactionProto[];\n}\n\nexport function toNumeric(val: any): number {\n  if (val == null) return 0;\n  if (typeof val === 'number') return val;\n  if (typeof val === 'object') {\n    if (typeof val.toNumber === 'function') return val.toNumber();\n    if (typeof val.low === 'number') return val.low + (val.high || 0) * 4294967296;\n  }\n  return Number(val) || 0;\n}\n\n\nexport function computeEntitlementSummary(\n  protoDoc: entitlement.EntitlementProto | null,\n  now: number = Date.now()\n): TenantEntitlementSummary {\n  let streamingDimId: number | null = null;\n  let paidUntilDimId: number | null = null;\n\n  if (protoDoc?.dimensions) {\n    for (const [idStr, dim] of Object.entries(protoDoc.dimensions)) {\n      if (dim?.name === DIM_KEY_STREAMING_SECONDS) {\n        streamingDimId = Number(idStr);\n      } else if (dim?.name === DIM_KEY_PAID_UNTIL) {\n        paidUntilDimId = Number(idStr);\n      }\n    }\n  }\n  if (streamingDimId === null) streamingDimId = 1;\n  if (paidUntilDimId === null) paidUntilDimId = 2;\n\n  const values: Record<number, number> = {};\n  if (protoDoc?.dimensions) {\n    for (const dimKey of Object.keys(protoDoc.dimensions)) {\n      values[Number(dimKey)] = 0;\n    }\n  }\n\n  const activeSessions = new Map<string, ActiveSessionInfo>();\n  const txs = protoDoc?.transactions || [];\n\n  for (const tx of txs) {\n    const txType = tx.transactionType;\n    const expiresAt = toNumeric(tx.expiresAtUnixMs);\n\n    if (txType === entitlement.EntitlementTransactionType.ENTITLEMENT_TRANSACTION_TYPE_LEASE) {\n      if (expiresAt > now) {\n        const chName = tx.labels?.channel;\n        const dimVal = tx.dimensionValues?.[streamingDimId] ?? tx.dimensionValues?.[String(streamingDimId)];\n        const sessionSec = Math.abs(toNumeric(dimVal));\n        const remSec = Math.max(0, Math.floor((expiresAt - now) / 1000));\n        const sId = String(toNumeric(tx.transactionId));\n\n        if (chName) {\n          activeSessions.set(chName, {\n            sessionId: sId,\n            channelName: chName,\n            sessionSeconds: sessionSec,\n            effectiveAtUnixMs: toNumeric(tx.effectiveAtUnixMs),\n            expiresAtUnixMs: expiresAt,\n            remainingSeconds: remSec,\n          });\n        }\n      }\n    }\n\n    for (const [dimKeyStr, val] of Object.entries(tx.dimensionValues || {})) {\n      const dimKey = Number(dimKeyStr);\n      const numVal = toNumeric(val);\n      if (txType === entitlement.EntitlementTransactionType.ENTITLEMENT_TRANSACTION_TYPE_REPLACING) {\n        values[dimKey] = numVal;\n      } else {\n        values[dimKey] = (values[dimKey] || 0) + numVal;\n      }\n    }\n  }\n\n  const availableSeconds = Math.max(0, values[streamingDimId] || 0);\n  let totalBalanceSeconds = availableSeconds;\n  for (const session of activeSessions.values()) {\n    totalBalanceSeconds += session.sessionSeconds;\n  }\n\n  const paidUntilMs = values[paidUntilDimId] || 0;\n  const isSubscribed = paidUntilMs === 0 || paidUntilMs > now;\n\n  return {\n    totalBalanceSeconds,\n    availableSeconds,\n    isSubscribed,\n    subscribedUntilUnixMs: paidUntilMs,\n    activeSessions,\n    transactions: txs,\n  };\n}\n\nexport async function fetchTenantEntitlements(\n  tenantId: number | string | any\n): Promise<entitlement.EntitlementProto | null> {\n  const tid = String(tenantId);\n  try {\n    return await fetchSignedProto<entitlement.EntitlementProto>(\n      `/api/tenants/${tid}/entitlements`,\n      (bytes) => entitlement.EntitlementProto.decode(bytes),\n      { fetchFn: fetchWithAuth }\n    );\n  } catch (err) {\n    console.warn(`Failed to fetch entitlements for tenant ${tenantId}:`, err);\n    return null;\n  }\n}\n\nexport function getDimensionValue(dimValues: Record<string | number, any> | null | undefined, key: number | null): number {\n  if (!dimValues || key === null) return 0;\n  const val = dimValues[key] !== undefined ? dimValues[key] : dimValues[String(key)];\n  return toNumeric(val);\n}\n\nexport function formatDurationDelta(seconds: number): string {\n  const isPositive = seconds > 0;\n  const abs = Math.round(Math.abs(seconds));\n  const h = Math.floor(abs / 3600);\n  const m = Math.floor((abs % 3600) / 60);\n  const s = abs % 60;\n  const hh = String(h).padStart(2, '0');\n  const mm = String(m).padStart(2, '0');\n  const ss = String(s).padStart(2, '0');\n  const formatted = `${hh}:${mm}:${ss}`;\n  if (seconds === 0) return formatted;\n  return isPositive ? `+${formatted}` : `-${formatted}`;\n}\n\nexport function formatDateTime(unixMs: number): string {\n  if (!unixMs) return '—';\n  const d = new Date(unixMs);\n  return d.toLocaleDateString(undefined, {\n    month: 'short',\n    day: 'numeric',\n    year: 'numeric',\n    hour: '2-digit',\n    minute: '2-digit',\n  });\n}\n\n","import {\n  EVENT_CLICK,\n  EVENT_KEYDOWN,\n  EVENT_RESIZE,\n  CLASS_OPEN,\n  CLASS_HIDDEN,\n  CLASS_ACTIVE,\n  CLASS_MENU_DISABLED,\n  ATTR_PAGE,\n  ATTR_ARIA_EXPANDED,\n  VALUE_TRUE,\n  VALUE_FALSE,\n  KEY_ESCAPE,\n} from './strings';\n\nexport type MenuItemClickedCallback = (itemId: string) => void;\n\nexport class MenuManager {\n  private menuItems!: NodeListOf<HTMLAnchorElement>;\n  private mobileMenuToggle: HTMLButtonElement | null = null;\n  private mobileMenuClose: HTMLButtonElement | null = null;\n  private sidebarBackdrop: HTMLElement | null = null;\n  private sidebarContainer: HTMLElement | null = null;\n  private isDisabled: boolean = false;\n  private isMobileMenuOpen: boolean = false;\n  private menuItemClickedCallback?: MenuItemClickedCallback;\n\n  constructor() {}\n\n  public init(): void {\n    this.menuItems = document.querySelectorAll(`.sidebar-link[${ATTR_PAGE}]`);\n    this.mobileMenuToggle = document.getElementById('mobile-menu-toggle') as HTMLButtonElement | null;\n    this.mobileMenuClose = document.getElementById('mobile-menu-close') as HTMLButtonElement | null;\n    this.sidebarBackdrop = document.getElementById('sidebar-backdrop');\n    this.sidebarContainer = document.getElementById('sidebar-container');\n\n    this.menuItems.forEach(item => {\n      item.addEventListener(EVENT_CLICK, (event) => this.handleItemClick(event, item));\n    });\n\n    this.initMobileNavigation();\n  }\n\n  private initMobileNavigation(): void {\n    if (this.mobileMenuToggle) {\n      this.mobileMenuToggle.addEventListener(EVENT_CLICK, (e) => {\n        e.preventDefault();\n        this.toggleMobileMenu();\n      });\n    }\n\n    if (this.mobileMenuClose) {\n      this.mobileMenuClose.addEventListener(EVENT_CLICK, (e) => {\n        e.preventDefault();\n        this.closeMobileMenu();\n      });\n    }\n\n    if (this.sidebarBackdrop) {\n      this.sidebarBackdrop.addEventListener(EVENT_CLICK, (e) => {\n        e.preventDefault();\n        this.closeMobileMenu();\n      });\n    }\n\n    document.addEventListener(EVENT_KEYDOWN, (e: KeyboardEvent) => {\n      if (e.key === KEY_ESCAPE && this.isMobileMenuOpen) {\n        this.closeMobileMenu();\n      }\n    });\n\n    window.addEventListener(EVENT_RESIZE, () => {\n      if (window.innerWidth >= 768 && this.isMobileMenuOpen) {\n        this.closeMobileMenu();\n      }\n    });\n  }\n\n  public openMobileMenu(): void {\n    this.isMobileMenuOpen = true;\n    if (this.sidebarContainer) {\n      this.sidebarContainer.classList.add(CLASS_OPEN);\n    }\n    if (this.sidebarBackdrop) {\n      this.sidebarBackdrop.classList.remove(CLASS_HIDDEN);\n      this.sidebarBackdrop.classList.add(CLASS_OPEN);\n    }\n    if (this.mobileMenuToggle) {\n      this.mobileMenuToggle.setAttribute(ATTR_ARIA_EXPANDED, VALUE_TRUE);\n    }\n  }\n\n  public closeMobileMenu(): void {\n    this.isMobileMenuOpen = false;\n    if (this.sidebarContainer) {\n      this.sidebarContainer.classList.remove(CLASS_OPEN);\n    }\n    if (this.sidebarBackdrop) {\n      this.sidebarBackdrop.classList.remove(CLASS_OPEN);\n      this.sidebarBackdrop.classList.add(CLASS_HIDDEN);\n    }\n    if (this.mobileMenuToggle) {\n      this.mobileMenuToggle.setAttribute(ATTR_ARIA_EXPANDED, VALUE_FALSE);\n    }\n  }\n\n  public toggleMobileMenu(): void {\n    if (this.isMobileMenuOpen) {\n      this.closeMobileMenu();\n    } else {\n      this.openMobileMenu();\n    }\n  }\n\n  public setMenuItemClickedCallback(callback: MenuItemClickedCallback): void {\n    this.menuItemClickedCallback = callback;\n  }\n\n  public setSelectedItem(pageId: string): void {\n    this.menuItems.forEach(item => {\n      if (item.getAttribute(ATTR_PAGE) === pageId) {\n        item.classList.add(CLASS_ACTIVE);\n      } else {\n        item.classList.remove(CLASS_ACTIVE);\n      }\n    });\n  }\n\n  public disableMenus(disabled: boolean): void {\n    this.isDisabled = disabled;\n    const sidebarContainer = document.getElementById('sidebar-container');\n    if (sidebarContainer) {\n      if (disabled) {\n        sidebarContainer.classList.add(CLASS_MENU_DISABLED);\n      } else {\n        sidebarContainer.classList.remove(CLASS_MENU_DISABLED);\n      }\n    }\n    if (disabled) {\n      this.closeMobileMenu();\n    }\n  }\n\n  private handleItemClick(event: Event, item: HTMLAnchorElement): void {\n    event.preventDefault();\n\n    if (this.isDisabled) return;\n\n    const pageId = item.getAttribute(ATTR_PAGE);\n    if (pageId && this.menuItemClickedCallback) {\n      this.menuItemClickedCallback(pageId);\n    }\n\n    if (window.innerWidth < 768) {\n      this.closeMobileMenu();\n    }\n  }\n}\n"],"x_google_ignoreList":[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,33],"mappings":"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"}