// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This file was auto-generated by the vanadium vdl tool.
var vdl = require('../../../../vdl');
var canonicalize = require('../../../../vdl/canonicalize');





var time = require('./../vdlroot/time');
var security = require('./../security');
var vtrace = require('./../vtrace');

module.exports = {};



// Types:
var _type1 = new vdl.Type();
var _type2 = new vdl.Type();
var _typeBlessingsRequest = new vdl.Type();
var _typeRequest = new vdl.Type();
var _typeResponse = new vdl.Type();
_type1.kind = vdl.kind.OPTIONAL;
_type1.name = "";
_type1.elem = new security.WireBlessings()._type;
_type2.kind = vdl.kind.LIST;
_type2.name = "";
_type2.elem = new security.WireDischarge()._type;
_typeBlessingsRequest.kind = vdl.kind.STRUCT;
_typeBlessingsRequest.name = "v.io/v23/rpc.BlessingsRequest";
_typeBlessingsRequest.fields = [{name: "Key", type: vdl.types.UINT64}, {name: "Blessings", type: _type1}];
_typeRequest.kind = vdl.kind.STRUCT;
_typeRequest.name = "v.io/v23/rpc.Request";
_typeRequest.fields = [{name: "Suffix", type: vdl.types.STRING}, {name: "Method", type: vdl.types.STRING}, {name: "NumPosArgs", type: vdl.types.UINT64}, {name: "EndStreamArgs", type: vdl.types.BOOL}, {name: "Deadline", type: new time.WireDeadline()._type}, {name: "GrantedBlessings", type: new security.WireBlessings()._type}, {name: "Blessings", type: _typeBlessingsRequest}, {name: "Discharges", type: _type2}, {name: "TraceRequest", type: new vtrace.Request()._type}, {name: "Language", type: vdl.types.STRING}];
_typeResponse.kind = vdl.kind.STRUCT;
_typeResponse.name = "v.io/v23/rpc.Response";
_typeResponse.fields = [{name: "Error", type: vdl.types.ERROR}, {name: "EndStreamResults", type: vdl.types.BOOL}, {name: "NumPosResults", type: vdl.types.UINT64}, {name: "TraceResponse", type: new vtrace.Response()._type}, {name: "AckBlessings", type: vdl.types.BOOL}];
_type1.freeze();
_type2.freeze();
_typeBlessingsRequest.freeze();
_typeRequest.freeze();
_typeResponse.freeze();
module.exports.BlessingsRequest = (vdl.registry.lookupOrCreateConstructor(_typeBlessingsRequest));
module.exports.Request = (vdl.registry.lookupOrCreateConstructor(_typeRequest));
module.exports.Response = (vdl.registry.lookupOrCreateConstructor(_typeResponse));




// Consts:

  module.exports.GlobMethod = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(vdl.types.STRING))("__Glob", true), vdl.types.STRING);

  module.exports.ReservedSignature = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(vdl.types.STRING))("__Signature", true), vdl.types.STRING);

  module.exports.ReservedMethodSignature = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(vdl.types.STRING))("__MethodSignature", true), vdl.types.STRING);



// Errors:



// Services:

   
 


