// 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 _typeGlobChildrenReply = 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;
_typeGlobChildrenReply.kind = vdl.kind.UNION;
_typeGlobChildrenReply.name = "v.io/v23/naming.GlobChildrenReply";
_typeGlobChildrenReply.fields = [{name: "Name", type: vdl.types.STRING}, {name: "Error", type: _typeGlobError}];
_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();
_typeGlobChildrenReply.freeze();
_typeGlobError.freeze();
_typeGlobReply.freeze();
_typeMountEntry.freeze();
_typeMountFlag.freeze();
_typeMountedServer.freeze();
module.exports.GlobChildrenReply = (vdl.registry.lookupOrCreateConstructor(_typeGlobChildrenReply));
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:

   
 


