{"version":3,"sources":["lib/prelude.js","../node_modules/@protobufjs/aspromise/index.js","../node_modules/@protobufjs/base64/index.js","../node_modules/@protobufjs/codegen/index.js","../node_modules/@protobufjs/eventemitter/index.js","../node_modules/@protobufjs/fetch/index.js","../node_modules/@protobufjs/float/index.js","../node_modules/@protobufjs/inquire/index.js","../node_modules/@protobufjs/path/index.js","../node_modules/@protobufjs/pool/index.js","../node_modules/@protobufjs/utf8/index.js","../src/converter.js","../src/decoder.js","../src/encoder.js","../src/enum.js","../src/field.js","../src/index-light","../src/index-minimal.js","../src/mapfield.js","../src/message.js","../src/method.js","../src/namespace.js","../src/object.js","../src/oneof.js","../src/reader.js","../src/reader_buffer.js","../src/root.js","../src/roots.js","../src/rpc.js","../src/rpc/service.js","../src/service.js","../src/type.js","../src/types.js","../src/util.js","../src/util/longbits.js","../src/util/minimal.js","../src/verifier.js","../src/wrappers.js","../src/writer.js","../src/writer_buffer.js"],"names":["undefined","modules","cache","entries","protobuf","$require","name","$module","call","exports","util","global","define","amd","Long","isLong","configure","module","1","require","fn","ctx","params","Array","arguments","length","offset","index","pending","Promise","resolve","reject","err","apply","base64","string","p","n","Math","ceil","b64","s64","i","encode","buffer","start","end","t","parts","chunk","j","b","push","String","fromCharCode","slice","join","invalidEncoding","decode","c","charCodeAt","Error","test","codegen","functionParams","functionName","body","Codegen","formatStringOrScope","source","toString","verbose","console","log","scopeKeys","Object","keys","scopeParams","scopeValues","scopeOffset","Function","formatParams","formatOffset","replace","$0","$1","value","Number","floor","JSON","stringify","functionNameOverride","EventEmitter","this","_listeners","prototype","on","evt","off","listeners","splice","emit","args","fetch","asPromise","fs","filename","options","callback","xhr","readFile","contents","XMLHttpRequest","binary","onreadystatechange","readyState","status","response","responseText","Uint8Array","overrideMimeType","responseType","open","send","factory","writeFloat_ieee754","writeUint","val","buf","pos","sign","isNaN","round","exponent","LN2","pow","readFloat_ieee754","readUint","uint","mantissa","NaN","Infinity","writeFloat_f32_cpy","f32","f8b","writeFloat_f32_rev","readFloat_f32_cpy","readFloat_f32_rev","f64","le","writeDouble_ieee754","off0","off1","readDouble_ieee754","lo","hi","writeDouble_f64_cpy","writeDouble_f64_rev","readDouble_f64_cpy","readDouble_f64_rev","Float32Array","writeFloatLE","writeFloatBE","readFloatLE","readFloatBE","bind","writeUintLE","writeUintBE","readUintLE","readUintBE","Float64Array","writeDoubleLE","writeDoubleBE","readDoubleLE","readDoubleBE","inquire","moduleName","self","trustedTypes","createPolicy","escapeScriptPolicy","createScript","safeScript","mod","eval","e","isAbsolute","path","normalize","split","absolute","prefix","shift","originPath","includePath","alreadyNormalized","alloc","size","SIZE","MAX","slab","utf8","len","read","write","c1","c2","Enum","genValuePartial_fromObject","gen","field","fieldIndex","prop","resolvedType","values","repeated","typeDefault","fullName","isUnsigned","type","genValuePartial_toObject","converter","fromObject","mtype","fields","fieldsArray","safeProp","map","toObject","sort","compareFieldsById","repeatedFields","mapFields","normalFields","partOf","arrayDefault","valuesById","long","low","high","unsigned","toNumber","bytes","hasKs2","_fieldsArray","indexOf","filter","group","ref","id","types","defaults","keyType","basic","packed","rfield","required","wireType","mapKey","genTypePartial","optional","ReflectionObject","Namespace","create","constructor","className","comment","comments","TypeError","reserved","fromJSON","json","enm","toJSON","toJSONOptions","keepComments","Boolean","add","isString","isInteger","isReservedId","isReservedName","allow_alias","remove","Field","Type","ruleRe","rule","extend","isObject","toLowerCase","message","defaultValue","extensionField","declaringField","_packed","defineProperty","get","getOption","setOption","ifNotSet","resolved","parent","lookupTypeOrEnum","fromNumber","freeze","newBuffer","emptyObject","emptyArray","ctor","d","fieldId","fieldType","fieldRule","decorateType","decorateEnum","fieldName","default","_configure","Type_","build","load","root","Root","loadSync","encoder","decoder","verifier","OneOf","MapField","Service","Method","Message","wrappers","Writer","BufferWriter","Reader","BufferReader","rpc","roots","resolvedKeyType","fieldKeyType","fieldValueType","properties","$type","writer","encodeDelimited","reader","decodeDelimited","verify","object","requestType","requestStream","responseStream","parsedOptions","resolvedRequestType","resolvedResponseType","lookupType","arrayToJSON","array","obj","nested","_nestedArray","clearCache","namespace","addJSON","toArray","nestedArray","nestedJson","names","methods","getEnum","prev","setOptions","onAdd","onRemove","isArray","ptr","part","resolveAll","lookup","filterTypes","parentAlreadyChecked","found","lookupEnum","lookupService","Service_","Enum_","defineProperties","unshift","_handleAdd","_handleRemove","setParsedOption","propName","opt","newOpt","find","hasOwnProperty","newValue","setProperty","Root_","fieldNames","oneof","addFieldsToParent","oneofName","oneOfGetter","set","oneOfSetter","LongBits","indexOutOfRange","writeLength","RangeError","Buffer","isBuffer","create_array","readLongVarint","bits","readFixed32_end","readFixed64","_slice","subarray","uint32","int32","sint32","bool","fixed32","sfixed32","float","double","skip","skipType","BufferReader_","merge","int64","uint64","sint64","zzDecode","fixed64","sfixed64","utf8Slice","min","parse","common","deferred","files","SYNC","resolvePath","sync","finish","cb","getBundledFileName","idx","lastIndexOf","altname","substring","process","parsed","imports","weakImports","queued","weak","setTimeout","readFileSync","isNode","exposeRe","tryHandleExtension","sisterField","extendedType","parse_","common_","rpcImpl","requestDelimited","responseDelimited","rpcCall","method","requestCtor","responseCtor","request","endedByRPC","_methodsArray","service","inherited","methodsArray","rpcService","methodName","lcFirst","isReserved","m","q","s","oneofs","extensions","_fieldsById","_oneofsArray","_ctor","fieldsById","oneofsArray","generateConstructor","ctorProperties","setup","originalThis","wrapper","fork","ldelim","typeName","target","bake","o","safePropBackslashRe","key","safePropQuoteRe","camelCaseRe","ucFirst","str","toUpperCase","decorateEnumIndex","camelCase","a","decorateRoot","enumerable","dst","setProp","prevValue","concat","zero","zzEncode","zeroHash","from","parseInt","fromString","toLong","fromHash","hash","toHash","mask","part0","part1","part2","src","newError","CustomError","captureStackTrace","stack","pool","versions","node","window","isFinite","isset","isSet","utf8Write","_Buffer_from","_Buffer_allocUnsafe","sizeOrArray","dcodeIO","key2Re","key32Re","key64Re","longToHash","longFromHash","fromBits","ProtocolError","fieldMap","longs","enums","encoding","allocUnsafe","seenFirstField","oneofProp","invalid","genVerifyValue","expected","type_url","substr","messageName","Op","next","noop","State","head","tail","states","writeByte","VarintOp","writeVarint64","writeFixed32","_push","writeBytes","reset","BufferWriter_","writeStringBuffer","writeBytesBuffer","copy","byteLength"],"mappings":"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","file":"protobuf.min.js","sourcesContent":["(function prelude(modules, cache, entries) {\n\n    // This is the prelude used to bundle protobuf.js for the browser. Wraps up the CommonJS\n    // sources through a conflict-free require shim and is again wrapped within an iife that\n    // provides a minification-friendly `undefined` var plus a global \"use strict\" directive\n    // so that minification can remove the directives of each module.\n\n    function $require(name) {\n        var $module = cache[name];\n        if (!$module)\n            modules[name][0].call($module = cache[name] = { exports: {} }, $require, $module, $module.exports);\n        return $module.exports;\n    }\n\n    var protobuf = $require(entries[0]);\n\n    // Expose globally\n    protobuf.util.global.protobuf = protobuf;\n\n    // Be nice to AMD\n    if (typeof define === \"function\" && define.amd)\n        define([\"long\"], function(Long) {\n            if (Long && Long.isLong) {\n                protobuf.util.Long = Long;\n                protobuf.configure();\n            }\n            return protobuf;\n        });\n\n    // Be nice to CommonJS\n    if (typeof module === \"object\" && module && module.exports)\n        module.exports = protobuf;\n\n})/* end of prelude */","\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n    var params  = new Array(arguments.length - 1),\r\n        offset  = 0,\r\n        index   = 2,\r\n        pending = true;\r\n    while (index < arguments.length)\r\n        params[offset++] = arguments[index++];\r\n    return new Promise(function executor(resolve, reject) {\r\n        params[offset] = function callback(err/*, varargs */) {\r\n            if (pending) {\r\n                pending = false;\r\n                if (err)\r\n                    reject(err);\r\n                else {\r\n                    var params = new Array(arguments.length - 1),\r\n                        offset = 0;\r\n                    while (offset < params.length)\r\n                        params[offset++] = arguments[offset];\r\n                    resolve.apply(null, params);\r\n                }\r\n            }\r\n        };\r\n        try {\r\n            fn.apply(ctx || null, params);\r\n        } catch (err) {\r\n            if (pending) {\r\n                pending = false;\r\n                reject(err);\r\n            }\r\n        }\r\n    });\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n    var p = string.length;\r\n    if (!p)\r\n        return 0;\r\n    var n = 0;\r\n    while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n        ++n;\r\n    return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n    s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n    var parts = null,\r\n        chunk = [];\r\n    var i = 0, // output index\r\n        j = 0, // goto index\r\n        t;     // temporary\r\n    while (start < end) {\r\n        var b = buffer[start++];\r\n        switch (j) {\r\n            case 0:\r\n                chunk[i++] = b64[b >> 2];\r\n                t = (b & 3) << 4;\r\n                j = 1;\r\n                break;\r\n            case 1:\r\n                chunk[i++] = b64[t | b >> 4];\r\n                t = (b & 15) << 2;\r\n                j = 2;\r\n                break;\r\n            case 2:\r\n                chunk[i++] = b64[t | b >> 6];\r\n                chunk[i++] = b64[b & 63];\r\n                j = 0;\r\n                break;\r\n        }\r\n        if (i > 8191) {\r\n            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n            i = 0;\r\n        }\r\n    }\r\n    if (j) {\r\n        chunk[i++] = b64[t];\r\n        chunk[i++] = 61;\r\n        if (j === 1)\r\n            chunk[i++] = 61;\r\n    }\r\n    if (parts) {\r\n        if (i)\r\n            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n        return parts.join(\"\");\r\n    }\r\n    return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n    var start = offset;\r\n    var j = 0, // goto index\r\n        t;     // temporary\r\n    for (var i = 0; i < string.length;) {\r\n        var c = string.charCodeAt(i++);\r\n        if (c === 61 && j > 1)\r\n            break;\r\n        if ((c = s64[c]) === undefined)\r\n            throw Error(invalidEncoding);\r\n        switch (j) {\r\n            case 0:\r\n                t = c;\r\n                j = 1;\r\n                break;\r\n            case 1:\r\n                buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n                t = c;\r\n                j = 2;\r\n                break;\r\n            case 2:\r\n                buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n                t = c;\r\n                j = 3;\r\n                break;\r\n            case 3:\r\n                buffer[offset++] = (t & 3) << 6 | c;\r\n                j = 0;\r\n                break;\r\n        }\r\n    }\r\n    if (j === 1)\r\n        throw Error(invalidEncoding);\r\n    return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n    return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n","\"use strict\";\r\nmodule.exports = codegen;\r\n\r\n/**\r\n * Begins generating a function.\r\n * @memberof util\r\n * @param {string[]} functionParams Function parameter names\r\n * @param {string} [functionName] Function name if not anonymous\r\n * @returns {Codegen} Appender that appends code to the function's body\r\n */\r\nfunction codegen(functionParams, functionName) {\r\n\r\n    /* istanbul ignore if */\r\n    if (typeof functionParams === \"string\") {\r\n        functionName = functionParams;\r\n        functionParams = undefined;\r\n    }\r\n\r\n    var body = [];\r\n\r\n    /**\r\n     * Appends code to the function's body or finishes generation.\r\n     * @typedef Codegen\r\n     * @type {function}\r\n     * @param {string|Object.<string,*>} [formatStringOrScope] Format string or, to finish the function, an object of additional scope variables, if any\r\n     * @param {...*} [formatParams] Format parameters\r\n     * @returns {Codegen|Function} Itself or the generated function if finished\r\n     * @throws {Error} If format parameter counts do not match\r\n     */\r\n\r\n    function Codegen(formatStringOrScope) {\r\n        // note that explicit array handling below makes this ~50% faster\r\n\r\n        // finish the function\r\n        if (typeof formatStringOrScope !== \"string\") {\r\n            var source = toString();\r\n            if (codegen.verbose)\r\n                console.log(\"codegen: \" + source); // eslint-disable-line no-console\r\n            source = \"return \" + source;\r\n            if (formatStringOrScope) {\r\n                var scopeKeys   = Object.keys(formatStringOrScope),\r\n                    scopeParams = new Array(scopeKeys.length + 1),\r\n                    scopeValues = new Array(scopeKeys.length),\r\n                    scopeOffset = 0;\r\n                while (scopeOffset < scopeKeys.length) {\r\n                    scopeParams[scopeOffset] = scopeKeys[scopeOffset];\r\n                    scopeValues[scopeOffset] = formatStringOrScope[scopeKeys[scopeOffset++]];\r\n                }\r\n                scopeParams[scopeOffset] = source;\r\n                return Function.apply(null, scopeParams).apply(null, scopeValues); // eslint-disable-line no-new-func\r\n            }\r\n            return Function(source)(); // eslint-disable-line no-new-func\r\n        }\r\n\r\n        // otherwise append to body\r\n        var formatParams = new Array(arguments.length - 1),\r\n            formatOffset = 0;\r\n        while (formatOffset < formatParams.length)\r\n            formatParams[formatOffset] = arguments[++formatOffset];\r\n        formatOffset = 0;\r\n        formatStringOrScope = formatStringOrScope.replace(/%([%dfijs])/g, function replace($0, $1) {\r\n            var value = formatParams[formatOffset++];\r\n            switch ($1) {\r\n                case \"d\": case \"f\": return String(Number(value));\r\n                case \"i\": return String(Math.floor(value));\r\n                case \"j\": return JSON.stringify(value);\r\n                case \"s\": return String(value);\r\n            }\r\n            return \"%\";\r\n        });\r\n        if (formatOffset !== formatParams.length)\r\n            throw Error(\"parameter count mismatch\");\r\n        body.push(formatStringOrScope);\r\n        return Codegen;\r\n    }\r\n\r\n    function toString(functionNameOverride) {\r\n        return \"function \" + (functionNameOverride || functionName || \"\") + \"(\" + (functionParams && functionParams.join(\",\") || \"\") + \"){\\n  \" + body.join(\"\\n  \") + \"\\n}\";\r\n    }\r\n\r\n    Codegen.toString = toString;\r\n    return Codegen;\r\n}\r\n\r\n/**\r\n * Begins generating a function.\r\n * @memberof util\r\n * @function codegen\r\n * @param {string} [functionName] Function name if not anonymous\r\n * @returns {Codegen} Appender that appends code to the function's body\r\n * @variation 2\r\n */\r\n\r\n/**\r\n * When set to `true`, codegen will log generated code to console. Useful for debugging.\r\n * @name util.codegen.verbose\r\n * @type {boolean}\r\n */\r\ncodegen.verbose = false;\r\n","\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n    /**\r\n     * Registered listeners.\r\n     * @type {Object.<string,*>}\r\n     * @private\r\n     */\r\n    this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n    (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n        fn  : fn,\r\n        ctx : ctx || this\r\n    });\r\n    return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n    if (evt === undefined)\r\n        this._listeners = {};\r\n    else {\r\n        if (fn === undefined)\r\n            this._listeners[evt] = [];\r\n        else {\r\n            var listeners = this._listeners[evt];\r\n            for (var i = 0; i < listeners.length;)\r\n                if (listeners[i].fn === fn)\r\n                    listeners.splice(i, 1);\r\n                else\r\n                    ++i;\r\n        }\r\n    }\r\n    return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n    var listeners = this._listeners[evt];\r\n    if (listeners) {\r\n        var args = [],\r\n            i = 1;\r\n        for (; i < arguments.length;)\r\n            args.push(arguments[i++]);\r\n        for (i = 0; i < listeners.length;)\r\n            listeners[i].fn.apply(listeners[i++].ctx, args);\r\n    }\r\n    return this;\r\n};\r\n","\"use strict\";\r\nmodule.exports = fetch;\r\n\r\nvar asPromise = require(1),\r\n    inquire   = require(7);\r\n\r\nvar fs = inquire(\"fs\");\r\n\r\n/**\r\n * Node-style callback as used by {@link util.fetch}.\r\n * @typedef FetchCallback\r\n * @type {function}\r\n * @param {?Error} error Error, if any, otherwise `null`\r\n * @param {string} [contents] File contents, if there hasn't been an error\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Options as used by {@link util.fetch}.\r\n * @typedef FetchOptions\r\n * @type {Object}\r\n * @property {boolean} [binary=false] Whether expecting a binary response\r\n * @property {boolean} [xhr=false] If `true`, forces the use of XMLHttpRequest\r\n */\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @memberof util\r\n * @param {string} filename File path or url\r\n * @param {FetchOptions} options Fetch options\r\n * @param {FetchCallback} callback Callback function\r\n * @returns {undefined}\r\n */\r\nfunction fetch(filename, options, callback) {\r\n    if (typeof options === \"function\") {\r\n        callback = options;\r\n        options = {};\r\n    } else if (!options)\r\n        options = {};\r\n\r\n    if (!callback)\r\n        return asPromise(fetch, this, filename, options); // eslint-disable-line no-invalid-this\r\n\r\n    // if a node-like filesystem is present, try it first but fall back to XHR if nothing is found.\r\n    if (!options.xhr && fs && fs.readFile)\r\n        return fs.readFile(filename, function fetchReadFileCallback(err, contents) {\r\n            return err && typeof XMLHttpRequest !== \"undefined\"\r\n                ? fetch.xhr(filename, options, callback)\r\n                : err\r\n                ? callback(err)\r\n                : callback(null, options.binary ? contents : contents.toString(\"utf8\"));\r\n        });\r\n\r\n    // use the XHR version otherwise.\r\n    return fetch.xhr(filename, options, callback);\r\n}\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @name util.fetch\r\n * @function\r\n * @param {string} path File path or url\r\n * @param {FetchCallback} callback Callback function\r\n * @returns {undefined}\r\n * @variation 2\r\n */\r\n\r\n/**\r\n * Fetches the contents of a file.\r\n * @name util.fetch\r\n * @function\r\n * @param {string} path File path or url\r\n * @param {FetchOptions} [options] Fetch options\r\n * @returns {Promise<string|Uint8Array>} Promise\r\n * @variation 3\r\n */\r\n\r\n/**/\r\nfetch.xhr = function fetch_xhr(filename, options, callback) {\r\n    var xhr = new XMLHttpRequest();\r\n    xhr.onreadystatechange /* works everywhere */ = function fetchOnReadyStateChange() {\r\n\r\n        if (xhr.readyState !== 4)\r\n            return undefined;\r\n\r\n        // local cors security errors return status 0 / empty string, too. afaik this cannot be\r\n        // reliably distinguished from an actually empty file for security reasons. feel free\r\n        // to send a pull request if you are aware of a solution.\r\n        if (xhr.status !== 0 && xhr.status !== 200)\r\n            return callback(Error(\"status \" + xhr.status));\r\n\r\n        // if binary data is expected, make sure that some sort of array is returned, even if\r\n        // ArrayBuffers are not supported. the binary string fallback, however, is unsafe.\r\n        if (options.binary) {\r\n            var buffer = xhr.response;\r\n            if (!buffer) {\r\n                buffer = [];\r\n                for (var i = 0; i < xhr.responseText.length; ++i)\r\n                    buffer.push(xhr.responseText.charCodeAt(i) & 255);\r\n            }\r\n            return callback(null, typeof Uint8Array !== \"undefined\" ? new Uint8Array(buffer) : buffer);\r\n        }\r\n        return callback(null, xhr.responseText);\r\n    };\r\n\r\n    if (options.binary) {\r\n        // ref: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data#Receiving_binary_data_in_older_browsers\r\n        if (\"overrideMimeType\" in xhr)\r\n            xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\r\n        xhr.responseType = \"arraybuffer\";\r\n    }\r\n\r\n    xhr.open(\"GET\", filename);\r\n    xhr.send();\r\n};\r\n","\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n    // float: typed array\r\n    if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n        var f32 = new Float32Array([ -0 ]),\r\n            f8b = new Uint8Array(f32.buffer),\r\n            le  = f8b[3] === 128;\r\n\r\n        function writeFloat_f32_cpy(val, buf, pos) {\r\n            f32[0] = val;\r\n            buf[pos    ] = f8b[0];\r\n            buf[pos + 1] = f8b[1];\r\n            buf[pos + 2] = f8b[2];\r\n            buf[pos + 3] = f8b[3];\r\n        }\r\n\r\n        function writeFloat_f32_rev(val, buf, pos) {\r\n            f32[0] = val;\r\n            buf[pos    ] = f8b[3];\r\n            buf[pos + 1] = f8b[2];\r\n            buf[pos + 2] = f8b[1];\r\n            buf[pos + 3] = f8b[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n        /* istanbul ignore next */\r\n        exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n        function readFloat_f32_cpy(buf, pos) {\r\n            f8b[0] = buf[pos    ];\r\n            f8b[1] = buf[pos + 1];\r\n            f8b[2] = buf[pos + 2];\r\n            f8b[3] = buf[pos + 3];\r\n            return f32[0];\r\n        }\r\n\r\n        function readFloat_f32_rev(buf, pos) {\r\n            f8b[3] = buf[pos    ];\r\n            f8b[2] = buf[pos + 1];\r\n            f8b[1] = buf[pos + 2];\r\n            f8b[0] = buf[pos + 3];\r\n            return f32[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n        /* istanbul ignore next */\r\n        exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n    // float: ieee754\r\n    })(); else (function() {\r\n\r\n        function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n            var sign = val < 0 ? 1 : 0;\r\n            if (sign)\r\n                val = -val;\r\n            if (val === 0)\r\n                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n            else if (isNaN(val))\r\n                writeUint(2143289344, buf, pos);\r\n            else if (val > 3.4028234663852886e+38) // +-Infinity\r\n                writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n            else if (val < 1.1754943508222875e-38) // denormal\r\n                writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n            else {\r\n                var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n                    mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n                writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n            }\r\n        }\r\n\r\n        exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n        exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n        function readFloat_ieee754(readUint, buf, pos) {\r\n            var uint = readUint(buf, pos),\r\n                sign = (uint >> 31) * 2 + 1,\r\n                exponent = uint >>> 23 & 255,\r\n                mantissa = uint & 8388607;\r\n            return exponent === 255\r\n                ? mantissa\r\n                ? NaN\r\n                : sign * Infinity\r\n                : exponent === 0 // denormal\r\n                ? sign * 1.401298464324817e-45 * mantissa\r\n                : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n        }\r\n\r\n        exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n        exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n    })();\r\n\r\n    // double: typed array\r\n    if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n        var f64 = new Float64Array([-0]),\r\n            f8b = new Uint8Array(f64.buffer),\r\n            le  = f8b[7] === 128;\r\n\r\n        function writeDouble_f64_cpy(val, buf, pos) {\r\n            f64[0] = val;\r\n            buf[pos    ] = f8b[0];\r\n            buf[pos + 1] = f8b[1];\r\n            buf[pos + 2] = f8b[2];\r\n            buf[pos + 3] = f8b[3];\r\n            buf[pos + 4] = f8b[4];\r\n            buf[pos + 5] = f8b[5];\r\n            buf[pos + 6] = f8b[6];\r\n            buf[pos + 7] = f8b[7];\r\n        }\r\n\r\n        function writeDouble_f64_rev(val, buf, pos) {\r\n            f64[0] = val;\r\n            buf[pos    ] = f8b[7];\r\n            buf[pos + 1] = f8b[6];\r\n            buf[pos + 2] = f8b[5];\r\n            buf[pos + 3] = f8b[4];\r\n            buf[pos + 4] = f8b[3];\r\n            buf[pos + 5] = f8b[2];\r\n            buf[pos + 6] = f8b[1];\r\n            buf[pos + 7] = f8b[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n        /* istanbul ignore next */\r\n        exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n        function readDouble_f64_cpy(buf, pos) {\r\n            f8b[0] = buf[pos    ];\r\n            f8b[1] = buf[pos + 1];\r\n            f8b[2] = buf[pos + 2];\r\n            f8b[3] = buf[pos + 3];\r\n            f8b[4] = buf[pos + 4];\r\n            f8b[5] = buf[pos + 5];\r\n            f8b[6] = buf[pos + 6];\r\n            f8b[7] = buf[pos + 7];\r\n            return f64[0];\r\n        }\r\n\r\n        function readDouble_f64_rev(buf, pos) {\r\n            f8b[7] = buf[pos    ];\r\n            f8b[6] = buf[pos + 1];\r\n            f8b[5] = buf[pos + 2];\r\n            f8b[4] = buf[pos + 3];\r\n            f8b[3] = buf[pos + 4];\r\n            f8b[2] = buf[pos + 5];\r\n            f8b[1] = buf[pos + 6];\r\n            f8b[0] = buf[pos + 7];\r\n            return f64[0];\r\n        }\r\n\r\n        /* istanbul ignore next */\r\n        exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n        /* istanbul ignore next */\r\n        exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n    // double: ieee754\r\n    })(); else (function() {\r\n\r\n        function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n            var sign = val < 0 ? 1 : 0;\r\n            if (sign)\r\n                val = -val;\r\n            if (val === 0) {\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n            } else if (isNaN(val)) {\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint(2146959360, buf, pos + off1);\r\n            } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n                writeUint(0, buf, pos + off0);\r\n                writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n            } else {\r\n                var mantissa;\r\n                if (val < 2.2250738585072014e-308) { // denormal\r\n                    mantissa = val / 5e-324;\r\n                    writeUint(mantissa >>> 0, buf, pos + off0);\r\n                    writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n                } else {\r\n                    var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n                    if (exponent === 1024)\r\n                        exponent = 1023;\r\n                    mantissa = val * Math.pow(2, -exponent);\r\n                    writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n                    writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n                }\r\n            }\r\n        }\r\n\r\n        exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n        exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n        function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n            var lo = readUint(buf, pos + off0),\r\n                hi = readUint(buf, pos + off1);\r\n            var sign = (hi >> 31) * 2 + 1,\r\n                exponent = hi >>> 20 & 2047,\r\n                mantissa = 4294967296 * (hi & 1048575) + lo;\r\n            return exponent === 2047\r\n                ? mantissa\r\n                ? NaN\r\n                : sign * Infinity\r\n                : exponent === 0 // denormal\r\n                ? sign * 5e-324 * mantissa\r\n                : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n        }\r\n\r\n        exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n        exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n    })();\r\n\r\n    return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n    buf[pos    ] =  val        & 255;\r\n    buf[pos + 1] =  val >>> 8  & 255;\r\n    buf[pos + 2] =  val >>> 16 & 255;\r\n    buf[pos + 3] =  val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n    buf[pos    ] =  val >>> 24;\r\n    buf[pos + 1] =  val >>> 16 & 255;\r\n    buf[pos + 2] =  val >>> 8  & 255;\r\n    buf[pos + 3] =  val        & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n    return (buf[pos    ]\r\n          | buf[pos + 1] << 8\r\n          | buf[pos + 2] << 16\r\n          | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n    return (buf[pos    ] << 24\r\n          | buf[pos + 1] << 16\r\n          | buf[pos + 2] << 8\r\n          | buf[pos + 3]) >>> 0;\r\n}\r\n","\"use strict\";\nmodule.exports = inquire;\n\n/**\n * Requires a module only if available.\n * @memberof util\n * @param {string} moduleName Module to require\n * @returns {?Object} Required module if available and not empty, otherwise `null`\n */\nfunction inquire(moduleName) {\n    try {\n    \tif (self.trustedTypes && self.trustedTypes.createPolicy) {\n    \t\tconst escapeScriptPolicy = trustedTypes.createPolicy(\"myEscapePolicy\", {\n    \t\t\tcreateScript: (string) => \"require \" + string,\n    \t\t});\n    \t\tsafeScript = escapeScriptPolicy.createScript(moduleName);\n    \t\tvar mod = eval(safeScript);\n    \t} else {\n    \t\tvar mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\n    \t}\n\n        if (mod && (mod.length || Object.keys(mod).length))\n            return mod;\n    } catch (e) {} // eslint-disable-line no-empty\n    return null;\n}\n\n/*\n// maybe worth a shot to prevent renaming issues:\n// see: https://github.com/webpack/webpack/blob/master/lib/dependencies/CommonJsRequireDependencyParserPlugin.js\n// triggers on:\n// - expression require.cache\n// - expression require (???)\n// - call require\n// - call require:commonjs:item\n// - call require:commonjs:context\n\nObject.defineProperty(Function.prototype, \"__self\", { get: function() { return this; } });\nvar r = require.__self;\ndelete Function.prototype.__self;\n*/\n","\"use strict\";\r\n\r\n/**\r\n * A minimal path module to resolve Unix, Windows and URL paths alike.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar path = exports;\r\n\r\nvar isAbsolute =\r\n/**\r\n * Tests if the specified path is absolute.\r\n * @param {string} path Path to test\r\n * @returns {boolean} `true` if path is absolute\r\n */\r\npath.isAbsolute = function isAbsolute(path) {\r\n    return /^(?:\\/|\\w+:)/.test(path);\r\n};\r\n\r\nvar normalize =\r\n/**\r\n * Normalizes the specified path.\r\n * @param {string} path Path to normalize\r\n * @returns {string} Normalized path\r\n */\r\npath.normalize = function normalize(path) {\r\n    path = path.replace(/\\\\/g, \"/\")\r\n               .replace(/\\/{2,}/g, \"/\");\r\n    var parts    = path.split(\"/\"),\r\n        absolute = isAbsolute(path),\r\n        prefix   = \"\";\r\n    if (absolute)\r\n        prefix = parts.shift() + \"/\";\r\n    for (var i = 0; i < parts.length;) {\r\n        if (parts[i] === \"..\") {\r\n            if (i > 0 && parts[i - 1] !== \"..\")\r\n                parts.splice(--i, 2);\r\n            else if (absolute)\r\n                parts.splice(i, 1);\r\n            else\r\n                ++i;\r\n        } else if (parts[i] === \".\")\r\n            parts.splice(i, 1);\r\n        else\r\n            ++i;\r\n    }\r\n    return prefix + parts.join(\"/\");\r\n};\r\n\r\n/**\r\n * Resolves the specified include path against the specified origin path.\r\n * @param {string} originPath Path to the origin file\r\n * @param {string} includePath Include path relative to origin path\r\n * @param {boolean} [alreadyNormalized=false] `true` if both paths are already known to be normalized\r\n * @returns {string} Path to the include file\r\n */\r\npath.resolve = function resolve(originPath, includePath, alreadyNormalized) {\r\n    if (!alreadyNormalized)\r\n        includePath = normalize(includePath);\r\n    if (isAbsolute(includePath))\r\n        return includePath;\r\n    if (!alreadyNormalized)\r\n        originPath = normalize(originPath);\r\n    return (originPath = originPath.replace(/(?:\\/|^)[^/]+$/, \"\")).length ? normalize(originPath + \"/\" + includePath) : includePath;\r\n};\r\n","\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n    var SIZE   = size || 8192;\r\n    var MAX    = SIZE >>> 1;\r\n    var slab   = null;\r\n    var offset = SIZE;\r\n    return function pool_alloc(size) {\r\n        if (size < 1 || size > MAX)\r\n            return alloc(size);\r\n        if (offset + size > SIZE) {\r\n            slab = alloc(SIZE);\r\n            offset = 0;\r\n        }\r\n        var buf = slice.call(slab, offset, offset += size);\r\n        if (offset & 7) // align to 32 bit\r\n            offset = (offset | 7) + 1;\r\n        return buf;\r\n    };\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n    var len = 0,\r\n        c = 0;\r\n    for (var i = 0; i < string.length; ++i) {\r\n        c = string.charCodeAt(i);\r\n        if (c < 128)\r\n            len += 1;\r\n        else if (c < 2048)\r\n            len += 2;\r\n        else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n            ++i;\r\n            len += 4;\r\n        } else\r\n            len += 3;\r\n    }\r\n    return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n    var len = end - start;\r\n    if (len < 1)\r\n        return \"\";\r\n    var parts = null,\r\n        chunk = [],\r\n        i = 0, // char offset\r\n        t;     // temporary\r\n    while (start < end) {\r\n        t = buffer[start++];\r\n        if (t < 128)\r\n            chunk[i++] = t;\r\n        else if (t > 191 && t < 224)\r\n            chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n        else if (t > 239 && t < 365) {\r\n            t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n            chunk[i++] = 0xD800 + (t >> 10);\r\n            chunk[i++] = 0xDC00 + (t & 1023);\r\n        } else\r\n            chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n        if (i > 8191) {\r\n            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n            i = 0;\r\n        }\r\n    }\r\n    if (parts) {\r\n        if (i)\r\n            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n        return parts.join(\"\");\r\n    }\r\n    return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n    var start = offset,\r\n        c1, // character 1\r\n        c2; // character 2\r\n    for (var i = 0; i < string.length; ++i) {\r\n        c1 = string.charCodeAt(i);\r\n        if (c1 < 128) {\r\n            buffer[offset++] = c1;\r\n        } else if (c1 < 2048) {\r\n            buffer[offset++] = c1 >> 6       | 192;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n            c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n            ++i;\r\n            buffer[offset++] = c1 >> 18      | 240;\r\n            buffer[offset++] = c1 >> 12 & 63 | 128;\r\n            buffer[offset++] = c1 >> 6  & 63 | 128;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        } else {\r\n            buffer[offset++] = c1 >> 12      | 224;\r\n            buffer[offset++] = c1 >> 6  & 63 | 128;\r\n            buffer[offset++] = c1       & 63 | 128;\r\n        }\r\n    }\r\n    return offset - start;\r\n};\r\n","\"use strict\";\n/**\n * Runtime message from/to plain object converters.\n * @namespace\n */\nvar converter = exports;\n\nvar Enum = require(14),\n    util = require(33);\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 * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genValuePartial_fromObject(gen, field, fieldIndex, prop) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    if (field.resolvedType) {\n        if (field.resolvedType instanceof Enum) { gen\n            (\"switch(d%s){\", prop);\n            for (var values = field.resolvedType.values, keys = Object.keys(values), i = 0; i < keys.length; ++i) {\n                if (field.repeated && values[keys[i]] === field.typeDefault) gen\n                (\"default:\");\n                gen\n                (\"case%j:\", keys[i])\n                (\"case %i:\", values[keys[i]])\n                    (\"m%s=%j\", prop, values[keys[i]])\n                    (\"break\");\n            } gen\n            (\"}\");\n        } else gen\n            (\"if(typeof d%s!==\\\"object\\\")\", prop)\n                (\"throw TypeError(%j)\", field.fullName + \": object expected\")\n            (\"m%s=types[%i].fromObject(d%s)\", 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                isUnsigned = true;\n                // eslint-disable-line no-fallthrough\n            case \"int64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\": gen\n                (\"if(util.Long)\")\n                    (\"(m%s=util.Long.fromValue(d%s)).unsigned=%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)\", 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\"], mtype.name + \"$fromObject\")\n    (\"if(d instanceof this.ctor)\")\n        (\"return d\");\n    if (!fields.length) return gen\n    (\"return new this.ctor\");\n    gen\n    (\"var m=new this.ctor\");\n    for (var i = 0; i < fields.length; ++i) {\n        var field  = fields[i].resolve(),\n            prop   = util.safeProp(field.name);\n\n        // Map fields\n        if (field.map) { gen\n    (\"if(d%s){\", prop)\n        (\"if(typeof d%s!==\\\"object\\\")\", 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            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        (\"m%s=[]\", prop)\n        (\"for(var i=0;i<d%s.length;++i){\", prop);\n            genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + \"[i]\")\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        genValuePartial_fromObject(gen, field, /* not sorted */ i, prop);\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} prop Property reference\n * @returns {Codegen} Codegen instance\n * @ignore\n */\nfunction genValuePartial_toObject(gen, field, fieldIndex, prop) {\n    /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */\n    if (field.resolvedType) {\n        if (field.resolvedType instanceof Enum) gen\n            (\"d%s=o.enums===String?types[%i].values[m%s]:m%s\", prop, fieldIndex, prop, prop);\n        else gen\n            (\"d%s=types[%i].toObject(m%s,o)\", prop, fieldIndex, prop);\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\", prop, prop, prop, prop);\n                break;\n            case \"uint64\":\n                isUnsigned = true;\n                // eslint-disable-line no-fallthrough\n            case \"int64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\": gen\n            (\"if(typeof m%s===\\\"number\\\")\", prop)\n                (\"d%s=o.longs===String?String(m%s):m%s\", prop, prop, prop)\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\", prop, prop, prop, prop, isUnsigned ? \"true\": \"\", prop);\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\", prop, prop, prop, prop, prop);\n                break;\n            default: gen\n            (\"d%s=m%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 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\"], mtype.name + \"$toObject\")\n    (\"if(!o)\")\n        (\"o={}\")\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():n\", prop)\n        (\"}else\")\n            (\"d%s=o.longs===String?%j:%i\", prop, field.typeDefault.toString(), field.typeDefault.toNumber());\n            else if (field.bytes) {\n                var arrayDefault = \"[\" + Array.prototype.slice.call(field.typeDefault).join(\",\") + \"]\";\n                gen\n        (\"if(o.bytes===String)d%s=%j\", prop, String.fromCharCode.apply(String, field.typeDefault))\n        (\"else{\")\n            (\"d%s=%s\", prop, arrayDefault)\n            (\"if(o.bytes!==Array)d%s=util.newBuffer(d%s)\", prop, prop)\n        (\"}\");\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        (\"for(var j=0;j<ks2.length;++j){\");\n            genValuePartial_toObject(gen, field, /* sorted */ index, prop + \"[ks2[j]]\")\n        (\"}\");\n        } else if (field.repeated) { gen\n    (\"if(m%s&&m%s.length){\", prop, prop)\n        (\"d%s=[]\", 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&&m.hasOwnProperty(%j)){\", prop, field.name); // !== undefined && !== null\n        genValuePartial_toObject(gen, field, /* sorted */ index, prop);\n        if (field.partOf) 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\";\nmodule.exports = decoder;\n\nvar Enum    = require(14),\n    types   = require(32),\n    util    = require(33);\n\nfunction missing(field) {\n    return \"missing required '\" + field.name + \"'\";\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 gen = util.codegen([\"r\", \"l\"], mtype.name + \"$decode\")\n    (\"if(!(r instanceof Reader))\")\n        (\"r=Reader.create(r)\")\n    (\"var c=l===undefined?r.len:r.pos+l,m=new this.ctor\" + (mtype.fieldsArray.filter(function(field) { return field.map; }).length ? \",k,value\" : \"\"))\n    (\"while(r.pos<c){\")\n        (\"var t=r.uint32()\");\n    if (mtype.group) gen\n        (\"if((t&7)===4)\")\n            (\"break\");\n    gen\n        (\"switch(t>>>3){\");\n\n    var i = 0;\n    for (; 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); gen\n            (\"case %i:\", field.id);\n\n        // Map fields\n        if (field.map) { gen\n                (\"if(%s===util.emptyObject)\", ref)\n                    (\"%s={}\", ref)\n                (\"var c2 = r.uint32()+r.pos\");\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.defaults[type] !== undefined) gen\n                (\"value=%j\", types.defaults[type]);\n            else gen\n                (\"value=null\");\n\n            gen\n                (\"while(r.pos<c2){\")\n                    (\"var tag2=r.uint32()\")\n                    (\"switch(tag2>>>3){\")\n                        (\"case 1: k=r.%s(); break\", field.keyType)\n                        (\"case 2:\");\n\n            if (types.basic[type] === undefined) gen\n                            (\"value=types[%i].decode(r,r.uint32())\", i); // can't be groups\n            else gen\n                            (\"value=r.%s()\", type);\n\n            gen\n                            (\"break\")\n                        (\"default:\")\n                            (\"r.skipType(tag2&7)\")\n                            (\"break\")\n                    (\"}\")\n                (\"}\");\n\n            if (types.long[field.keyType] !== undefined) gen\n                (\"%s[typeof k===\\\"object\\\"?util.longToHash(k):k]=value\", ref);\n            else gen\n                (\"%s[k]=value\", ref);\n\n        // Repeated fields\n        } else if (field.repeated) { gen\n\n                (\"if(!(%s&&%s.length))\", ref, ref)\n                    (\"%s=[]\", ref);\n\n            // Packable (always check for forward and backward compatiblity)\n            if (types.packed[type] !== undefined) gen\n                (\"if((t&7)===2){\")\n                    (\"var c2=r.uint32()+r.pos\")\n                    (\"while(r.pos<c2)\")\n                        (\"%s.push(r.%s())\", ref, type)\n                (\"}else\");\n\n            // Non-packed\n            if (types.basic[type] === undefined) gen(field.resolvedType.group\n                    ? \"%s.push(types[%i].decode(r))\"\n                    : \"%s.push(types[%i].decode(r,r.uint32()))\", ref, i);\n            else gen\n                    (\"%s.push(r.%s())\", ref, type);\n\n        // Non-repeated\n        } else if (types.basic[type] === undefined) gen(field.resolvedType.group\n                ? \"%s=types[%i].decode(r)\"\n                : \"%s=types[%i].decode(r,r.uint32())\", ref, i);\n        else gen\n                (\"%s=r.%s()\", ref, type);\n        gen\n                (\"break\");\n    // Unknown fields\n    } gen\n            (\"default:\")\n                (\"r.skipType(t&7)\")\n                (\"break\")\n\n        (\"}\")\n    (\"}\");\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(!m.hasOwnProperty(%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 = encoder;\n\nvar Enum     = require(14),\n    types    = require(32),\n    util     = require(33);\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.resolvedType.group\n        ? gen(\"types[%i].encode(%s,w.uint32(%i)).uint32(%i)\", fieldIndex, ref, (field.id << 3 | 3) >>> 0, (field.id << 3 | 4) >>> 0)\n        : gen(\"types[%i].encode(%s,w.uint32(%i).fork()).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\"], mtype.name + \"$encode\")\n    (\"if(!w)\")\n        (\"w=Writer.create()\");\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            (\"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()).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).fork()\", (field.id << 3 | 2) >>> 0)\n        (\"for(var i=0;i<%s.length;++i)\", ref)\n            (\"w.%s(%s[i])\", type, ref)\n        (\"w.ldelim()\");\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.optional) gen\n    (\"if(%s!=null&&Object.hasOwnProperty.call(m,%j))\", ref, field.name); // !== undefined && !== null\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    (\"return w\");\n    /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */\n}\n","\"use strict\";\nmodule.exports = Enum;\n\n// extends ReflectionObject\nvar ReflectionObject = require(22);\n((Enum.prototype = Object.create(ReflectionObject.prototype)).constructor = Enum).className = \"Enum\";\n\nvar Namespace = require(21),\n    util = require(33);\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>} [comments] The value comments for this enum\n */\nfunction Enum(name, values, options, comment, comments) {\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 = {};\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>}\n     */\n    this.comments = comments || {};\n\n    /**\n     * Reserved ranges, if any.\n     * @type {Array.<number[]|string>}\n     */\n    this.reserved = 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 (typeof values[keys[i]] === \"number\") // use forward entries only\n                this.valuesById[ this.values[keys[i]] = values[keys[i]] ] = keys[i];\n}\n\n/**\n * Enum descriptor.\n * @interface IEnum\n * @property {Object.<string,number>} values Enum values\n * @property {Object.<string,*>} [options] Enum options\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);\n    enm.reserved = json.reserved;\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        \"options\"  , this.options,\n        \"values\"   , this.values,\n        \"reserved\" , this.reserved && this.reserved.length ? this.reserved : undefined,\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 * @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) {\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 (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    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\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 = Field;\n\n// extends ReflectionObject\nvar ReflectionObject = require(22);\n((Field.prototype = Object.create(ReflectionObject.prototype)).constructor = Field).className = \"Field\";\n\nvar Enum  = require(14),\n    types = require(32),\n    util  = require(33);\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    return new Field(name, json.id, json.type, json.rule, json.extend, json.options, json.comment);\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    if (rule === \"proto3_optional\") {\n        rule = \"optional\";\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 required.\n     * @type {boolean}\n     */\n    this.required = rule === \"required\";\n\n    /**\n     * Whether this field is optional.\n     * @type {boolean}\n     */\n    this.optional = !this.required;\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     * Internally remembers whether this field is packed.\n     * @type {boolean|null}\n     * @private\n     */\n    this._packed = null;\n\n    /**\n     * Comment for this field.\n     * @type {string|null}\n     */\n    this.comment = comment;\n}\n\n/**\n * Determines whether this field is packed. Only relevant when repeated and working with proto2.\n * @name Field#packed\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"packed\", {\n    get: function() {\n        // defaults to packed=true if not explicity set to false\n        if (this._packed === null)\n            this._packed = this.getOption(\"packed\") !== false;\n        return this._packed;\n    }\n});\n\n/**\n * @override\n */\nField.prototype.setOption = function setOption(name, value, ifNotSet) {\n    if (name === \"packed\") // clear cached before setting\n        this._packed = null;\n    return ReflectionObject.prototype.setOption.call(this, name, value, ifNotSet);\n};\n\n/**\n * Field descriptor.\n * @interface IField\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 */\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        \"rule\"    , this.rule !== \"optional\" && this.rule || undefined,\n        \"type\"    , this.type,\n        \"id\"      , this.id,\n        \"extend\"  , this.extend,\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    }\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 === true || 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        this.typeDefault = util.Long.fromNumber(this.typeDefault, this.type.charAt(0) === \"u\");\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 (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)\n        this.parent.ctor.prototype[this.name] = this.defaultValue;\n\n    return ReflectionObject.prototype.resolve.call(this);\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 */\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 */\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/**\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 */\n// like Field.d but without a default value\n\n// Sets up cyclic dependencies (called in index-light)\nField._configure = function configure(Type_) {\n    Type = Type_;\n};\n","\"use strict\";\nvar protobuf = module.exports = require(17);\n\nprotobuf.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 protobuf.Root();\n    } else if (!root)\n        root = new protobuf.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\nprotobuf.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 protobuf.Root();\n    return root.loadSync(filename);\n}\n\nprotobuf.loadSync = loadSync;\n\n// Serialization\nprotobuf.encoder          = require(13);\nprotobuf.decoder          = require(12);\nprotobuf.verifier         = require(36);\nprotobuf.converter        = require(11);\n\n// Reflection\nprotobuf.ReflectionObject = require(22);\nprotobuf.Namespace        = require(21);\nprotobuf.Root             = require(26);\nprotobuf.Enum             = require(14);\nprotobuf.Type             = require(31);\nprotobuf.Field            = require(15);\nprotobuf.OneOf            = require(23);\nprotobuf.MapField         = require(18);\nprotobuf.Service          = require(30);\nprotobuf.Method           = require(20);\n\n// Runtime\nprotobuf.Message          = require(19);\nprotobuf.wrappers         = require(37);\n\n// Utility\nprotobuf.types            = require(32);\nprotobuf.util             = require(33);\n\n// Set up possibly cyclic reflection dependencies\nprotobuf.ReflectionObject._configure(protobuf.Root);\nprotobuf.Namespace._configure(protobuf.Type, protobuf.Service, protobuf.Enum);\nprotobuf.Root._configure(protobuf.Type);\nprotobuf.Field._configure(protobuf.Type);\n","\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer       = require(38);\nprotobuf.BufferWriter = require(39);\nprotobuf.Reader       = require(24);\nprotobuf.BufferReader = require(25);\n\n// Utility\nprotobuf.util         = require(35);\nprotobuf.rpc          = require(28);\nprotobuf.roots        = require(27);\nprotobuf.configure    = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n    protobuf.util._configure();\n    protobuf.Writer._configure(protobuf.BufferWriter);\n    protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n","\"use strict\";\nmodule.exports = MapField;\n\n// extends Field\nvar Field = require(15);\n((MapField.prototype = Object.create(Field.prototype)).constructor = MapField).className = \"MapField\";\n\nvar types   = require(32),\n    util    = require(33);\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    return new MapField(name, json.id, json.keyType, json.type, json.options, json.comment);\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        \"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 */\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 = Message;\n\nvar util = require(35);\n\n/**\n * Constructs a new message instance.\n * @classdesc Abstract runtime message.\n * @constructor\n * @param {Properties<T>} [properties] Properties to set\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            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/*eslint-disable valid-jsdoc*/\n\n/**\n * Creates a new message of this type using the specified properties.\n * @param {Object.<string,*>} [properties] Properties to set\n * @returns {Message<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\n/*eslint-enable valid-jsdoc*/","\"use strict\";\nmodule.exports = Method;\n\n// extends ReflectionObject\nvar ReflectionObject = require(22);\n((Method.prototype = Object.create(ReflectionObject.prototype)).constructor = Method).className = \"Method\";\n\nvar util = require(33);\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 {Object.<string,*>} [parsedOptions] Declared options, properly parsed into an object\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 {boolean|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 {boolean|undefined}\n     */\n    this.responseStream = responseStream ? true : undefined; // toJSON\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 an object\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} comment Method comments\n * @property {Object.<string,*>} [parsedOptions] Method options properly parsed into an object\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    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 = Namespace;\n\n// extends ReflectionObject\nvar ReflectionObject = require(22);\n((Namespace.prototype = Object.create(ReflectionObject.prototype)).constructor = Namespace).className = \"Namespace\";\n\nvar Field    = require(15),\n    OneOf    = require(23),\n    util     = require(33);\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 * @returns {Namespace} Created namespace\n * @throws {TypeError} If arguments are invalid\n */\nNamespace.fromJSON = function fromJSON(name, json) {\n    return new Namespace(name, json.options).addJSON(json.nested);\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\nfunction clearCache(namespace) {\n    namespace._nestedArray = null;\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}\n */\n// ^ BEWARE: VSCode hangs forever when using more than 5 types (that's why AnyExtensionField exists in the first place)\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 * @returns {Namespace} `this`\n */\nNamespace.prototype.addJSON = function addJSON(nestedJson) {\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)\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 && 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 && 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 Enum || object instanceof Service || object instanceof Namespace || object instanceof OneOf))\n        throw TypeError(\"object must be a valid nested object\");\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    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    delete this.nested[object.name];\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\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    var nested = this.nestedArray, i = 0;\n    while (i < nested.length)\n        if (nested[i] instanceof Namespace)\n            nested[i++].resolveAll();\n        else\n            nested[i++].resolve();\n    return this.resolve();\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\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    // Start at root if path is absolute\n    if (path[0] === \"\")\n        return this.root.lookup(path.slice(1), filterTypes);\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    if (found) {\n        if (path.length === 1) {\n            if (!filterTypes || filterTypes.indexOf(found.constructor) > -1)\n                return found;\n        } else if (found instanceof Namespace && (found = found.lookup(path.slice(1), filterTypes, true)))\n            return found;\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].lookup(path, filterTypes, true)))\n                return found;\n\n    // If there hasn't been a match, try again at the parent\n    if (this.parent === null || parentAlreadyChecked)\n        return null;\n    return this.parent.lookup(path, filterTypes);\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 = ReflectionObject;\n\nReflectionObject.className = \"ReflectionObject\";\n\nvar util = require(33);\n\nvar Root; // cyclic\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     * 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 * @abstract\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 * 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)\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} [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 (!ifNotSet || !this.options || this.options[name] === undefined)\n        (this.options || (this.options = {}))[name] = value;\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 (!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            var newValue = opt[name];\n            util.setProperty(newValue, propName, value);\n        } else {\n            // otherwise, create a new option, set it's 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    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 * @returns {string} Class name[, space, full name]\n */\nReflectionObject.prototype.toString = 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\n// Sets up cyclic dependencies (called in index-light)\nReflectionObject._configure = function(Root_) {\n    Root = Root_;\n};\n","\"use strict\";\nmodule.exports = OneOf;\n\n// extends ReflectionObject\nvar ReflectionObject = require(22);\n((OneOf.prototype = Object.create(ReflectionObject.prototype)).constructor = OneOf).className = \"OneOf\";\n\nvar Field = require(15),\n    util  = require(33);\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 */\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 * 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 */\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 */\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 = Reader;\n\nvar util      = require(35);\n\nvar BufferReader; // cyclic\n\nvar LongBits  = util.LongBits,\n    utf8      = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n    return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n    /**\n     * Read buffer.\n     * @type {Uint8Array}\n     */\n    this.buf = buffer;\n\n    /**\n     * Read buffer position.\n     * @type {number}\n     */\n    this.pos = 0;\n\n    /**\n     * Read buffer length.\n     * @type {number}\n     */\n    this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n    ? function create_typed_array(buffer) {\n        if (buffer instanceof Uint8Array || Array.isArray(buffer))\n            return new Reader(buffer);\n        throw Error(\"illegal buffer\");\n    }\n    /* istanbul ignore next */\n    : function create_array(buffer) {\n        if (Array.isArray(buffer))\n            return new Reader(buffer);\n        throw Error(\"illegal buffer\");\n    };\n\nvar create = function create() {\n    return util.Buffer\n        ? function create_buffer_setup(buffer) {\n            return (Reader.create = function create_buffer(buffer) {\n                return util.Buffer.isBuffer(buffer)\n                    ? new BufferReader(buffer)\n                    /* istanbul ignore next */\n                    : create_array(buffer);\n            })(buffer);\n        }\n        /* istanbul ignore next */\n        : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n    var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n    return function read_uint32() {\n        value = (         this.buf[this.pos] & 127       ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) <<  7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] &  15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n        /* istanbul ignore if */\n        if ((this.pos += 5) > this.len) {\n            this.pos = this.len;\n            throw indexOutOfRange(this, 10);\n        }\n        return value;\n    };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n    return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n    var value = this.uint32();\n    return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n    // tends to deopt with local vars for octet etc.\n    var bits = new LongBits(0, 0);\n    var i = 0;\n    if (this.len - this.pos > 4) { // fast route (lo)\n        for (; i < 4; ++i) {\n            // 1st..4th\n            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n        // 5th\n        bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n        bits.hi = (bits.hi | (this.buf[this.pos] & 127) >>  4) >>> 0;\n        if (this.buf[this.pos++] < 128)\n            return bits;\n        i = 0;\n    } else {\n        for (; i < 3; ++i) {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n            // 1st..3th\n            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n        // 4th\n        bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n        return bits;\n    }\n    if (this.len - this.pos > 4) { // fast route (hi)\n        for (; i < 5; ++i) {\n            // 6th..10th\n            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n    } else {\n        for (; i < 5; ++i) {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n            // 6th..10th\n            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n    }\n    /* istanbul ignore next */\n    throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n    return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n    return (buf[end - 4]\n          | buf[end - 3] << 8\n          | buf[end - 2] << 16\n          | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n    /* istanbul ignore if */\n    if (this.pos + 8 > this.len)\n        throw indexOutOfRange(this, 8);\n\n    return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    var value = util.float.readFloatLE(this.buf, this.pos);\n    this.pos += 4;\n    return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n    /* istanbul ignore if */\n    if (this.pos + 8 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    var value = util.float.readDoubleLE(this.buf, this.pos);\n    this.pos += 8;\n    return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n    var length = this.uint32(),\n        start  = this.pos,\n        end    = this.pos + length;\n\n    /* istanbul ignore if */\n    if (end > this.len)\n        throw indexOutOfRange(this, length);\n\n    this.pos += length;\n    if (Array.isArray(this.buf)) // plain array\n        return this.buf.slice(start, end);\n    return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1\n        ? new this.buf.constructor(0)\n        : this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n    var bytes = this.bytes();\n    return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n    if (typeof length === \"number\") {\n        /* istanbul ignore if */\n        if (this.pos + length > this.len)\n            throw indexOutOfRange(this, length);\n        this.pos += length;\n    } else {\n        do {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n        } while (this.buf[this.pos++] & 128);\n    }\n    return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n    switch (wireType) {\n        case 0:\n            this.skip();\n            break;\n        case 1:\n            this.skip(8);\n            break;\n        case 2:\n            this.skip(this.uint32());\n            break;\n        case 3:\n            while ((wireType = this.uint32() & 7) !== 4) {\n                this.skipType(wireType);\n            }\n            break;\n        case 5:\n            this.skip(4);\n            break;\n\n        /* istanbul ignore next */\n        default:\n            throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n    }\n    return this;\n};\n\nReader._configure = function(BufferReader_) {\n    BufferReader = BufferReader_;\n    Reader.create = create();\n    BufferReader._configure();\n\n    var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n    util.merge(Reader.prototype, {\n\n        int64: function read_int64() {\n            return readLongVarint.call(this)[fn](false);\n        },\n\n        uint64: function read_uint64() {\n            return readLongVarint.call(this)[fn](true);\n        },\n\n        sint64: function read_sint64() {\n            return readLongVarint.call(this).zzDecode()[fn](false);\n        },\n\n        fixed64: function read_fixed64() {\n            return readFixed64.call(this)[fn](true);\n        },\n\n        sfixed64: function read_sfixed64() {\n            return readFixed64.call(this)[fn](false);\n        }\n\n    });\n};\n","\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(24);\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(35);\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n    Reader.call(this, buffer);\n\n    /**\n     * Read buffer.\n     * @name BufferReader#buf\n     * @type {Buffer}\n     */\n}\n\nBufferReader._configure = function () {\n    /* istanbul ignore else */\n    if (util.Buffer)\n        BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n    var len = this.uint32(); // modifies pos\n    return this.buf.utf8Slice\n        ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n        : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n","\"use strict\";\nmodule.exports = Root;\n\n// extends Namespace\nvar Namespace = require(21);\n((Root.prototype = Object.create(Namespace.prototype)).constructor = Root).className = \"Root\";\n\nvar Field   = require(15),\n    Enum    = require(14),\n    OneOf   = require(23),\n    util    = require(33);\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/**\n * Loads a namespace descriptor into a root namespace.\n * @param {INamespace} json Nameespace descriptor\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted\n * @returns {Root} Root namespace\n */\nRoot.fromJSON = function fromJSON(json, root) {\n    if (!root)\n        root = new Root();\n    if (json.options)\n        root.setOptions(json.options);\n    return root.addJSON(json.nested);\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    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        var cb = callback;\n        callback = null;\n        if (sync)\n            throw err;\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 (altname in common) return altname;\n        }\n        return null;\n    }\n\n    // Processes a single file\n    function process(filename, source) {\n        try {\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);\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);\n            }\n        } catch (err) {\n            finish(err);\n        }\n        if (!sync && !queued)\n            finish(null, self); // only once anyway\n    }\n\n    // Fetches a single file\n    function fetch(filename, weak) {\n\n        // Skip if already loaded / attempted\n        if (self.files.indexOf(filename) > -1)\n            return;\n        self.files.push(filename);\n\n        // Shortcut bundled definitions\n        if (filename in common) {\n            if (sync)\n                process(filename, common[filename]);\n            else {\n                ++queued;\n                setTimeout(function() {\n                    --queued;\n                    process(filename, common[filename]);\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);\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                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);\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    for (var i = 0, resolved; i < filename.length; ++i)\n        if (resolved = self.resolvePath(\"\", filename[i]))\n            fetch(resolved);\n\n    if (sync)\n        return self;\n    if (!queued)\n        finish(null, self);\n    return undefined;\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.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        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    // 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\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\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available accross modules.\n * @name roots\n * @type {Object.<string,Root>}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n","\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod<Message<{}>,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n *     if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n *         throw Error(\"no such method\");\n *     asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n *         callback(err, responseData);\n *     });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(29);\n","\"use strict\";\nmodule.exports = Service;\n\nvar util = require(35);\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\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 */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n    if (typeof rpcImpl !== \"function\")\n        throw TypeError(\"rpcImpl must be a function\");\n\n    util.EventEmitter.call(this);\n\n    /**\n     * RPC implementation. Becomes `null` once the service is ended.\n     * @type {RPCImpl|null}\n     */\n    this.rpcImpl = rpcImpl;\n\n    /**\n     * Whether requests are length-delimited.\n     * @type {boolean}\n     */\n    this.requestDelimited = Boolean(requestDelimited);\n\n    /**\n     * Whether responses are length-delimited.\n     * @type {boolean}\n     */\n    this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method\n * @param {Constructor<TReq>} requestCtor Request constructor\n * @param {Constructor<TRes>} responseCtor Response constructor\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n    if (!request)\n        throw TypeError(\"request must be specified\");\n\n    var self = this;\n    if (!callback)\n        return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n    if (!self.rpcImpl) {\n        setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n        return undefined;\n    }\n\n    try {\n        return self.rpcImpl(\n            method,\n            requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n            function rpcCallback(err, response) {\n\n                if (err) {\n                    self.emit(\"error\", err, method);\n                    return callback(err);\n                }\n\n                if (response === null) {\n                    self.end(/* endedByRPC */ true);\n                    return undefined;\n                }\n\n                if (!(response instanceof responseCtor)) {\n                    try {\n                        response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n                    } catch (err) {\n                        self.emit(\"error\", err, method);\n                        return callback(err);\n                    }\n                }\n\n                self.emit(\"data\", response, method);\n                return callback(null, response);\n            }\n        );\n    } catch (err) {\n        self.emit(\"error\", err, method);\n        setTimeout(function() { callback(err); }, 0);\n        return undefined;\n    }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n    if (this.rpcImpl) {\n        if (!endedByRPC) // signal end to rpcImpl\n            this.rpcImpl(null, null, null);\n        this.rpcImpl = null;\n        this.emit(\"end\").off();\n    }\n    return this;\n};\n","\"use strict\";\nmodule.exports = Service;\n\n// extends Namespace\nvar Namespace = require(21);\n((Service.prototype = Object.create(Namespace.prototype)).constructor = Service).className = \"Service\";\n\nvar Method = require(20),\n    util   = require(33),\n    rpc    = require(28);\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 {Object.<string,IMethod>} methods Method descriptors\n */\n\n/**\n * Constructs a service from a service descriptor.\n * @param {string} name Service name\n * @param {IService} json Service descriptor\n * @returns {Service} Created service\n * @throws {TypeError} If arguments are invalid\n */\nService.fromJSON = function fromJSON(name, json) {\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);\n    service.comment = json.comment;\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        \"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 this.methods[name]\n        || Namespace.prototype.get.call(this, name);\n};\n\n/**\n * @override\n */\nService.prototype.resolveAll = function resolveAll() {\n    var methods = this.methodsArray;\n    for (var i = 0; i < methods.length; ++i)\n        methods[i].resolve();\n    return Namespace.prototype.resolve.call(this);\n};\n\n/**\n * @override\n */\nService.prototype.add = function add(object) {\n\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        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] = util.codegen([\"r\",\"c\"], util.isReserved(methodName) ? methodName + \"_\" : methodName)(\"return this.rpcCall(m,q,s,r,c)\")({\n            m: method,\n            q: method.resolvedRequestType.ctor,\n            s: method.resolvedResponseType.ctor\n        });\n    }\n    return rpcService;\n};\n","\"use strict\";\nmodule.exports = Type;\n\n// extends Namespace\nvar Namespace = require(21);\n((Type.prototype = Object.create(Namespace.prototype)).constructor = Type).className = \"Type\";\n\nvar Enum      = require(14),\n    OneOf     = require(23),\n    Field     = require(15),\n    MapField  = require(18),\n    Service   = require(30),\n    Message   = require(19),\n    Reader    = require(24),\n    Writer    = require(38),\n    util      = require(33),\n    encoder   = require(13),\n    decoder   = require(12),\n    verifier  = require(36),\n    converter = require(11),\n    wrappers  = require(37);\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    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     * 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\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     * @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()).constructor = ctor;\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\n            // Messages have non-enumerable default values on their prototype\n            var i = 0;\n            for (; i < /* initializes */ this.fieldsArray.length; ++i)\n                this._fieldsArray[i].resolve(); // ensures a proper value\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\"], mtype.name);\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)\") // 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 = 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 {Object.<string,IOneOf>} [oneofs] Oneof descriptors\n * @property {Object.<string,IField>} fields Field descriptors\n * @property {number[][]} [extensions] Extension ranges\n * @property {number[][]} [reserved] Reserved ranges\n * @property {boolean} [group=false] Whether a legacy group or not\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 * @returns {Type} Created message type\n */\nType.fromJSON = function fromJSON(name, json) {\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)\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.comment)\n        type.comment = json.comment;\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        \"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        \"nested\"     , inherited && inherited.nested || undefined,\n        \"comment\"    , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * @override\n */\nType.prototype.resolveAll = function resolveAll() {\n    var fields = this.fieldsArray, i = 0;\n    while (i < fields.length)\n        fields[i++].resolve();\n    var oneofs = this.oneofsArray; i = 0;\n    while (i < oneofs.length)\n        oneofs[i++].resolve();\n    return Namespace.prototype.resolveAll.call(this);\n};\n\n/**\n * @override\n */\nType.prototype.get = function get(name) {\n    return this.fields[name]\n        || this.oneofs && this.oneofs[name]\n        || this.nested && this.nested[name]\n        || 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\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))\n            throw Error(\"name '\" + object.name + \"' is reserved in \" + 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 (!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 (!this.fields || this.fields[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.fields[object.name];\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 (!this.oneofs || this.oneofs[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.oneofs[object.name];\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 {Message<{}>} 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    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    });\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    });\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 originalThis = Object.create(this);\n        // if (wrapper.fromObject) {\n            originalThis.fromObject = this.fromObject;\n            this.fromObject = wrapper.fromObject.bind(originalThis);\n        // }\n        // if (wrapper.toObject) {\n            originalThis.toObject = this.toObject;\n            this.toObject = wrapper.toObject.bind(originalThis);\n        // }\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) {\n    return this.setup().encode(message, writer); // 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.len ? writer.fork() : writer).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 {Message<{}>} 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) {\n    return this.setup().decode(reader, length); // 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 {Message<{}>} 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) {\n    return this.setup().verify(message); // 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 {Message<{}>} Message instance\n */\nType.prototype.fromObject = function fromObject(object) {\n    return this.setup().fromObject(object);\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 `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) {\n    return this.setup().toObject(message, options);\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 */\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 */\nType.d = function decorateType(typeName) {\n    return function typeDecorator(target) {\n        util.decorateType(target, typeName);\n    };\n};\n","\"use strict\";\n\n/**\n * Common type constants.\n * @namespace\n */\nvar types = exports;\n\nvar util = require(33);\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 = {};\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\";\n\n/**\n * Various utility functions.\n * @namespace\n */\nvar util = module.exports = require(35);\n\nvar roots = require(27);\n\nvar Type, // cyclic\n    Enum;\n\nutil.codegen = require(3);\nutil.fetch   = require(5);\nutil.path    = require(8);\n\n/**\n * Node's fs module if available.\n * @type {Object.<string,*>}\n */\nutil.fs = util.inquire(\"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\nvar safePropBackslashRe = /\\\\/g,\n    safePropQuoteRe     = /\"/g;\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 /^(?: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)$/.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) || util.isReserved(prop))\n        return \"[\\\"\" + prop.replace(safePropBackslashRe, \"\\\\\\\\\").replace(safePropQuoteRe, \"\\\\\\\"\") + \"\\\"]\";\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 */\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 * 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 */\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(31);\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 */\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(14);\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 * @returns {Object.<string,*>} Destination object\n */\nutil.setProperty = function setProperty(dst, path, value) {\n    function setProp(dst, path, value) {\n        var part = path.shift();\n        if (path.length > 0) {\n            dst[part] = setProp(dst[part] || {}, path, value);\n        } else {\n            var prevValue = dst[part];\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    return setProp(dst, path, value);\n};\n\n/**\n * Decorator root (TypeScript).\n * @name util.decorateRoot\n * @type {Root}\n * @readonly\n */\nObject.defineProperty(util, \"decorateRoot\", {\n    get: function() {\n        return roots[\"decorated\"] || (roots[\"decorated\"] = new (require(26))());\n    }\n});\n","\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(35);\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n    // note that the casts below are theoretically unnecessary as of today, but older statically\n    // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n    /**\n     * Low bits.\n     * @type {number}\n     */\n    this.lo = lo >>> 0;\n\n    /**\n     * High bits.\n     * @type {number}\n     */\n    this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n    if (value === 0)\n        return zero;\n    var sign = value < 0;\n    if (sign)\n        value = -value;\n    var lo = value >>> 0,\n        hi = (value - lo) / 4294967296 >>> 0;\n    if (sign) {\n        hi = ~hi >>> 0;\n        lo = ~lo >>> 0;\n        if (++lo > 4294967295) {\n            lo = 0;\n            if (++hi > 4294967295)\n                hi = 0;\n        }\n    }\n    return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n    if (typeof value === \"number\")\n        return LongBits.fromNumber(value);\n    if (util.isString(value)) {\n        /* istanbul ignore else */\n        if (util.Long)\n            value = util.Long.fromString(value);\n        else\n            return LongBits.fromNumber(parseInt(value, 10));\n    }\n    return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n    if (!unsigned && this.hi >>> 31) {\n        var lo = ~this.lo + 1 >>> 0,\n            hi = ~this.hi     >>> 0;\n        if (!lo)\n            hi = hi + 1 >>> 0;\n        return -(lo + hi * 4294967296);\n    }\n    return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n    return util.Long\n        ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n        /* istanbul ignore next */\n        : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n    if (hash === zeroHash)\n        return zero;\n    return new LongBits(\n        ( charCodeAt.call(hash, 0)\n        | charCodeAt.call(hash, 1) << 8\n        | charCodeAt.call(hash, 2) << 16\n        | charCodeAt.call(hash, 3) << 24) >>> 0\n    ,\n        ( charCodeAt.call(hash, 4)\n        | charCodeAt.call(hash, 5) << 8\n        | charCodeAt.call(hash, 6) << 16\n        | charCodeAt.call(hash, 7) << 24) >>> 0\n    );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n    return String.fromCharCode(\n        this.lo        & 255,\n        this.lo >>> 8  & 255,\n        this.lo >>> 16 & 255,\n        this.lo >>> 24      ,\n        this.hi        & 255,\n        this.hi >>> 8  & 255,\n        this.hi >>> 16 & 255,\n        this.hi >>> 24\n    );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n    var mask =   this.hi >> 31;\n    this.hi  = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n    this.lo  = ( this.lo << 1                   ^ mask) >>> 0;\n    return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n    var mask = -(this.lo & 1);\n    this.lo  = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n    this.hi  = ( this.hi >>> 1                  ^ mask) >>> 0;\n    return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n    var part0 =  this.lo,\n        part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n        part2 =  this.hi >>> 24;\n    return part2 === 0\n         ? part1 === 0\n           ? part0 < 16384\n             ? part0 < 128 ? 1 : 2\n             : part0 < 2097152 ? 3 : 4\n           : part1 < 16384\n             ? part1 < 128 ? 5 : 6\n             : part1 < 2097152 ? 7 : 8\n         : part2 < 128 ? 9 : 10;\n};\n","\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(1);\n\n// converts to / from base64 encoded strings\nutil.base64 = require(2);\n\n// base class of rpc.Service\nutil.EventEmitter = require(4);\n\n// float handling accross browsers\nutil.float = require(6);\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(7);\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(10);\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(9);\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(34);\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n                   && global\n                   && global.process\n                   && global.process.versions\n                   && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n           || typeof window !== \"undefined\" && window\n           || typeof self   !== \"undefined\" && self\n           || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n    return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n    return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n    return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n    var value = obj[prop];\n    if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n        return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n    return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor<Buffer>}\n */\nutil.Buffer = (function() {\n    try {\n        var Buffer = util.inquire(\"buffer\").Buffer;\n        // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n        return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n    } catch (e) {\n        /* istanbul ignore next */\n        return null;\n    }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n    /* istanbul ignore next */\n    return typeof sizeOrArray === \"number\"\n        ? util.Buffer\n            ? util._Buffer_allocUnsafe(sizeOrArray)\n            : new util.Array(sizeOrArray)\n        : util.Buffer\n            ? util._Buffer_from(sizeOrArray)\n            : typeof Uint8Array === \"undefined\"\n                ? sizeOrArray\n                : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor<Uint8Array>}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor<Long>}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n         || /* istanbul ignore next */ util.global.Long\n         || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n    return value\n        ? util.LongBits.from(value).toHash()\n        : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n    var bits = util.LongBits.fromHash(hash);\n    if (util.Long)\n        return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n    return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.<string,*>} dst Destination object\n * @param {Object.<string,*>} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.<string,*>} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n    for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n        if (dst[keys[i]] === undefined || !ifNotSet)\n            dst[keys[i]] = src[keys[i]];\n    return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n    return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor<Error>} Custom error constructor\n */\nfunction newError(name) {\n\n    function CustomError(message, properties) {\n\n        if (!(this instanceof CustomError))\n            return new CustomError(message, properties);\n\n        // Error.call(this, message);\n        // ^ just returns a new error instance because the ctor can be called as a function\n\n        Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n        /* istanbul ignore next */\n        if (Error.captureStackTrace) // node\n            Error.captureStackTrace(this, CustomError);\n        else\n            Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n        if (properties)\n            merge(this, properties);\n    }\n\n    (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError;\n\n    Object.defineProperty(CustomError.prototype, \"name\", { get: function() { return name; } });\n\n    CustomError.prototype.toString = function toString() {\n        return this.name + \": \" + this.message;\n    };\n\n    return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message<T>\n * @constructor\n * @param {string} message Error message\n * @param {Object.<string,*>} [properties] Additional properties\n * @example\n * try {\n *     MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n *     if (e instanceof ProtocolError && e.instance)\n *         console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message<T>}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n    var fieldMap = {};\n    for (var i = 0; i < fieldNames.length; ++i)\n        fieldMap[fieldNames[i]] = 1;\n\n    /**\n     * @returns {string|undefined} Set field name, if any\n     * @this Object\n     * @ignore\n     */\n    return function() { // eslint-disable-line consistent-return\n        for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n            if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n                return keys[i];\n    };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n    /**\n     * @param {string} name Field name\n     * @returns {undefined}\n     * @this Object\n     * @ignore\n     */\n    return function(name) {\n        for (var i = 0; i < fieldNames.length; ++i)\n            if (fieldNames[i] !== name)\n                delete this[fieldNames[i]];\n    };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n    longs: String,\n    enums: String,\n    bytes: String,\n    json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n    var Buffer = util.Buffer;\n    /* istanbul ignore if */\n    if (!Buffer) {\n        util._Buffer_from = util._Buffer_allocUnsafe = null;\n        return;\n    }\n    // because node 4.x buffers are incompatible & immutable\n    // see: https://github.com/dcodeIO/protobuf.js/pull/665\n    util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n        /* istanbul ignore next */\n        function Buffer_from(value, encoding) {\n            return new Buffer(value, encoding);\n        };\n    util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n        /* istanbul ignore next */\n        function Buffer_allocUnsafe(size) {\n            return new Buffer(size);\n        };\n};\n","\"use strict\";\nmodule.exports = verifier;\n\nvar Enum      = require(14),\n    util      = require(33);\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    if (field.resolvedType) {\n        if (field.resolvedType instanceof Enum) { gen\n            (\"switch(%s){\", ref)\n                (\"default:\")\n                    (\"return%j\", invalid(field, \"enum value\"));\n            for (var keys = Object.keys(field.resolvedType.values), j = 0; j < keys.length; ++j) gen\n                (\"case %i:\", field.resolvedType.values[keys[j]]);\n            gen\n                    (\"break\")\n            (\"}\");\n        } else {\n            gen\n            (\"{\")\n                (\"var e=types[%i].verify(%s);\", 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\"], mtype.name + \"$verify\")\n    (\"if(typeof m!==\\\"object\\\"||m===null)\")\n        (\"return%j\", \"object expected\");\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&&m.hasOwnProperty(%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}","\"use strict\";\n\n/**\n * Wrappers for common types.\n * @type {Object.<string,IWrapper>}\n * @const\n */\nvar wrappers = exports;\n\nvar Message = require(19);\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) {\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);\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\"].substr(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)).finish()\n                });\n            }\n        }\n\n        return this.fromObject(object);\n    },\n\n    toObject: function(message, options) {\n\n        // Default prefix\n        var googleApi = \"type.googleapis.com/\";\n        var prefix = \"\";\n        var name = \"\";\n\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);\n            /* istanbul ignore else */\n            if (type)\n                message = type.decode(message.value);\n        }\n\n        // wrap value if unmapped\n        if (!(message instanceof this.ctor) && message instanceof Message) {\n            var object = message.$type.toObject(message, options);\n            var messageName = message.$type.fullName[0] === \".\" ?\n                message.$type.fullName.substr(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);\n    }\n};\n","\"use strict\";\nmodule.exports = Writer;\n\nvar util      = require(35);\n\nvar BufferWriter; // cyclic\n\nvar LongBits  = util.LongBits,\n    base64    = util.base64,\n    utf8      = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n    /**\n     * Function to call.\n     * @type {function(Uint8Array, number, *)}\n     */\n    this.fn = fn;\n\n    /**\n     * Value byte length.\n     * @type {number}\n     */\n    this.len = len;\n\n    /**\n     * Next operation.\n     * @type {Writer.Op|undefined}\n     */\n    this.next = undefined;\n\n    /**\n     * Value to write.\n     * @type {*}\n     */\n    this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n    /**\n     * Current head.\n     * @type {Writer.Op}\n     */\n    this.head = writer.head;\n\n    /**\n     * Current tail.\n     * @type {Writer.Op}\n     */\n    this.tail = writer.tail;\n\n    /**\n     * Current buffer length.\n     * @type {number}\n     */\n    this.len = writer.len;\n\n    /**\n     * Next state.\n     * @type {State|null}\n     */\n    this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n    /**\n     * Current length.\n     * @type {number}\n     */\n    this.len = 0;\n\n    /**\n     * Operations head.\n     * @type {Object}\n     */\n    this.head = new Op(noop, 0, 0);\n\n    /**\n     * Operations tail\n     * @type {Object}\n     */\n    this.tail = this.head;\n\n    /**\n     * Linked forked states.\n     * @type {Object|null}\n     */\n    this.states = null;\n\n    // When a value is written, the writer calculates its byte length and puts it into a linked\n    // list of operations to perform when finish() is called. This both allows us to allocate\n    // buffers of the exact required size and reduces the amount of work we have to do compared\n    // to first calculating over objects and then encoding over objects. In our case, the encoding\n    // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n    return util.Buffer\n        ? function create_buffer_setup() {\n            return (Writer.create = function create_buffer() {\n                return new BufferWriter();\n            })();\n        }\n        /* istanbul ignore next */\n        : function create_array() {\n            return new Writer();\n        };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n    return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n    Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n    this.tail = this.tail.next = new Op(fn, len, val);\n    this.len += len;\n    return this;\n};\n\nfunction writeByte(val, buf, pos) {\n    buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n    while (val > 127) {\n        buf[pos++] = val & 127 | 128;\n        val >>>= 7;\n    }\n    buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n    this.len = len;\n    this.next = undefined;\n    this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n    // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n    // uint32 is by far the most frequently used operation and benefits significantly from this.\n    this.len += (this.tail = this.tail.next = new VarintOp(\n        (value = value >>> 0)\n                < 128       ? 1\n        : value < 16384     ? 2\n        : value < 2097152   ? 3\n        : value < 268435456 ? 4\n        :                     5,\n    value)).len;\n    return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n    return value < 0\n        ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n        : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n    return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n    while (val.hi) {\n        buf[pos++] = val.lo & 127 | 128;\n        val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n        val.hi >>>= 7;\n    }\n    while (val.lo > 127) {\n        buf[pos++] = val.lo & 127 | 128;\n        val.lo = val.lo >>> 7;\n    }\n    buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n    var bits = LongBits.from(value);\n    return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n    var bits = LongBits.from(value).zzEncode();\n    return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n    return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n    buf[pos    ] =  val         & 255;\n    buf[pos + 1] =  val >>> 8   & 255;\n    buf[pos + 2] =  val >>> 16  & 255;\n    buf[pos + 3] =  val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n    return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n    var bits = LongBits.from(value);\n    return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n    return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n    return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n    ? function writeBytes_set(val, buf, pos) {\n        buf.set(val, pos); // also works for plain array values\n    }\n    /* istanbul ignore next */\n    : function writeBytes_for(val, buf, pos) {\n        for (var i = 0; i < val.length; ++i)\n            buf[pos + i] = val[i];\n    };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n    var len = value.length >>> 0;\n    if (!len)\n        return this._push(writeByte, 1, 0);\n    if (util.isString(value)) {\n        var buf = Writer.alloc(len = base64.length(value));\n        base64.decode(value, buf, 0);\n        value = buf;\n    }\n    return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n    var len = utf8.length(value);\n    return len\n        ? this.uint32(len)._push(utf8.write, len, value)\n        : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n    this.states = new State(this);\n    this.head = this.tail = new Op(noop, 0, 0);\n    this.len = 0;\n    return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n    if (this.states) {\n        this.head   = this.states.head;\n        this.tail   = this.states.tail;\n        this.len    = this.states.len;\n        this.states = this.states.next;\n    } else {\n        this.head = this.tail = new Op(noop, 0, 0);\n        this.len  = 0;\n    }\n    return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n    var head = this.head,\n        tail = this.tail,\n        len  = this.len;\n    this.reset().uint32(len);\n    if (len) {\n        this.tail.next = head.next; // skip noop\n        this.tail = tail;\n        this.len += len;\n    }\n    return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n    var head = this.head.next, // skip noop\n        buf  = this.constructor.alloc(this.len),\n        pos  = 0;\n    while (head) {\n        head.fn(head.val, buf, pos);\n        pos += head.len;\n        head = head.next;\n    }\n    // this.head = this.tail = null;\n    return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n    BufferWriter = BufferWriter_;\n    Writer.create = create();\n    BufferWriter._configure();\n};\n","\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(38);\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(35);\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n    Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n    /**\n     * Allocates a buffer of the specified size.\n     * @function\n     * @param {number} size Buffer size\n     * @returns {Buffer} Buffer\n     */\n    BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n    BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n        ? function writeBytesBuffer_set(val, buf, pos) {\n          buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n          // also works for plain array values\n        }\n        /* istanbul ignore next */\n        : function writeBytesBuffer_copy(val, buf, pos) {\n          if (val.copy) // Buffer values\n            val.copy(buf, pos, 0, val.length);\n          else for (var i = 0; i < val.length;) // plain array values\n            buf[pos++] = val[i++];\n        };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n    if (util.isString(value))\n        value = util._Buffer_from(value, \"base64\");\n    var len = value.length >>> 0;\n    this.uint32(len);\n    if (len)\n        this._push(BufferWriter.writeBytesBuffer, len, value);\n    return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n    if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n        util.utf8.write(val, buf, pos);\n    else if (buf.utf8Write)\n        buf.utf8Write(val, pos);\n    else\n        buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n    var len = util.Buffer.byteLength(value);\n    this.uint32(len);\n    if (len)\n        this._push(writeStringBuffer, len, value);\n    return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n"],"sourceRoot":"."}