// 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');

module.exports = {};



// Types:
var _type1 = new vdl.Type();
var _typeGlobError = new vdl.Type();
var _typeGlobReply = new vdl.Type();
var _typeMountEntry = new vdl.Type();
var _typeMountFlag = new vdl.Type();
var _typeMountedServer = new vdl.Type();
_type1.kind = vdl.kind.LIST;
_type1.name = "";
_type1.elem = _typeMountedServer;
_typeGlobError.kind = vdl.kind.STRUCT;
_typeGlobError.name = "v.io/v23/naming.GlobError";
_typeGlobError.fields = [{name: "Name", type: vdl.types.STRING}, {name: "Error", type: vdl.types.ERROR}];
_typeGlobReply.kind = vdl.kind.UNION;
_typeGlobReply.name = "v.io/v23/naming.GlobReply";
_typeGlobReply.fields = [{name: "Entry", type: _typeMountEntry}, {name: "Error", type: _typeGlobError}];
_typeMountEntry.kind = vdl.kind.STRUCT;
_typeMountEntry.name = "v.io/v23/naming.MountEntry";
_typeMountEntry.fields = [{name: "Name", type: vdl.types.STRING}, {name: "Servers", type: _type1}, {name: "ServesMountTable", type: vdl.types.BOOL}, {name: "IsLeaf", type: vdl.types.BOOL}];
_typeMountFlag.kind = vdl.kind.UINT32;
_typeMountFlag.name = "v.io/v23/naming.MountFlag";
_typeMountedServer.kind = vdl.kind.STRUCT;
_typeMountedServer.name = "v.io/v23/naming.MountedServer";
_typeMountedServer.fields = [{name: "Server", type: vdl.types.STRING}, {name: "Deadline", type: new time.WireDeadline()._type}];
_type1.freeze();
_typeGlobError.freeze();
_typeGlobReply.freeze();
_typeMountEntry.freeze();
_typeMountFlag.freeze();
_typeMountedServer.freeze();
module.exports.GlobError = (vdl.registry.lookupOrCreateConstructor(_typeGlobError));
module.exports.GlobReply = (vdl.registry.lookupOrCreateConstructor(_typeGlobReply));
module.exports.MountEntry = (vdl.registry.lookupOrCreateConstructor(_typeMountEntry));
module.exports.MountFlag = (vdl.registry.lookupOrCreateConstructor(_typeMountFlag));
module.exports.MountedServer = (vdl.registry.lookupOrCreateConstructor(_typeMountedServer));




// Consts:

  module.exports.Replace = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeMountFlag))(1, true), _typeMountFlag);

  module.exports.MT = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeMountFlag))(2, true), _typeMountFlag);

  module.exports.Leaf = canonicalize.reduce(new (vdl.registry.lookupOrCreateConstructor(_typeMountFlag))(4, true), _typeMountFlag);



// Errors:



// Services:

   
 


