mirror of https://github.com/XTLS/Xray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
368 lines
15 KiB
368 lines
15 KiB
// Code generated by protoc-gen-go. DO NOT EDIT. |
|
// versions: |
|
// protoc-gen-go v1.35.1 |
|
// protoc v5.28.2 |
|
// source: core/config.proto |
|
|
|
package core |
|
|
|
import ( |
|
serial "github.com/xtls/xray-core/common/serial" |
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect" |
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl" |
|
reflect "reflect" |
|
sync "sync" |
|
) |
|
|
|
const ( |
|
// Verify that this generated code is sufficiently up-to-date. |
|
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) |
|
// Verify that runtime/protoimpl is sufficiently up-to-date. |
|
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) |
|
) |
|
|
|
// Config is the master config of Xray. Xray takes this config as input and |
|
// functions accordingly. |
|
type Config struct { |
|
state protoimpl.MessageState |
|
sizeCache protoimpl.SizeCache |
|
unknownFields protoimpl.UnknownFields |
|
|
|
// Inbound handler configurations. Must have at least one item. |
|
Inbound []*InboundHandlerConfig `protobuf:"bytes,1,rep,name=inbound,proto3" json:"inbound,omitempty"` |
|
// Outbound handler configurations. Must have at least one item. The first |
|
// item is used as default for routing. |
|
Outbound []*OutboundHandlerConfig `protobuf:"bytes,2,rep,name=outbound,proto3" json:"outbound,omitempty"` |
|
// App is for configurations of all features in Xray. A feature must |
|
// implement the Feature interface, and its config type must be registered |
|
// through common.RegisterConfig. |
|
App []*serial.TypedMessage `protobuf:"bytes,4,rep,name=app,proto3" json:"app,omitempty"` |
|
// Configuration for extensions. The config may not work if corresponding |
|
// extension is not loaded into Xray. Xray will ignore such config during |
|
// initialization. |
|
Extension []*serial.TypedMessage `protobuf:"bytes,6,rep,name=extension,proto3" json:"extension,omitempty"` |
|
} |
|
|
|
func (x *Config) Reset() { |
|
*x = Config{} |
|
mi := &file_core_config_proto_msgTypes[0] |
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
|
ms.StoreMessageInfo(mi) |
|
} |
|
|
|
func (x *Config) String() string { |
|
return protoimpl.X.MessageStringOf(x) |
|
} |
|
|
|
func (*Config) ProtoMessage() {} |
|
|
|
func (x *Config) ProtoReflect() protoreflect.Message { |
|
mi := &file_core_config_proto_msgTypes[0] |
|
if x != nil { |
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
|
if ms.LoadMessageInfo() == nil { |
|
ms.StoreMessageInfo(mi) |
|
} |
|
return ms |
|
} |
|
return mi.MessageOf(x) |
|
} |
|
|
|
// Deprecated: Use Config.ProtoReflect.Descriptor instead. |
|
func (*Config) Descriptor() ([]byte, []int) { |
|
return file_core_config_proto_rawDescGZIP(), []int{0} |
|
} |
|
|
|
func (x *Config) GetInbound() []*InboundHandlerConfig { |
|
if x != nil { |
|
return x.Inbound |
|
} |
|
return nil |
|
} |
|
|
|
func (x *Config) GetOutbound() []*OutboundHandlerConfig { |
|
if x != nil { |
|
return x.Outbound |
|
} |
|
return nil |
|
} |
|
|
|
func (x *Config) GetApp() []*serial.TypedMessage { |
|
if x != nil { |
|
return x.App |
|
} |
|
return nil |
|
} |
|
|
|
func (x *Config) GetExtension() []*serial.TypedMessage { |
|
if x != nil { |
|
return x.Extension |
|
} |
|
return nil |
|
} |
|
|
|
// InboundHandlerConfig is the configuration for inbound handler. |
|
type InboundHandlerConfig struct { |
|
state protoimpl.MessageState |
|
sizeCache protoimpl.SizeCache |
|
unknownFields protoimpl.UnknownFields |
|
|
|
// Tag of the inbound handler. The tag must be unique among all inbound |
|
// handlers |
|
Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` |
|
// Settings for how this inbound proxy is handled. |
|
ReceiverSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=receiver_settings,json=receiverSettings,proto3" json:"receiver_settings,omitempty"` |
|
// Settings for inbound proxy. Must be one of the inbound proxies. |
|
ProxySettings *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"` |
|
} |
|
|
|
func (x *InboundHandlerConfig) Reset() { |
|
*x = InboundHandlerConfig{} |
|
mi := &file_core_config_proto_msgTypes[1] |
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
|
ms.StoreMessageInfo(mi) |
|
} |
|
|
|
func (x *InboundHandlerConfig) String() string { |
|
return protoimpl.X.MessageStringOf(x) |
|
} |
|
|
|
func (*InboundHandlerConfig) ProtoMessage() {} |
|
|
|
func (x *InboundHandlerConfig) ProtoReflect() protoreflect.Message { |
|
mi := &file_core_config_proto_msgTypes[1] |
|
if x != nil { |
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
|
if ms.LoadMessageInfo() == nil { |
|
ms.StoreMessageInfo(mi) |
|
} |
|
return ms |
|
} |
|
return mi.MessageOf(x) |
|
} |
|
|
|
// Deprecated: Use InboundHandlerConfig.ProtoReflect.Descriptor instead. |
|
func (*InboundHandlerConfig) Descriptor() ([]byte, []int) { |
|
return file_core_config_proto_rawDescGZIP(), []int{1} |
|
} |
|
|
|
func (x *InboundHandlerConfig) GetTag() string { |
|
if x != nil { |
|
return x.Tag |
|
} |
|
return "" |
|
} |
|
|
|
func (x *InboundHandlerConfig) GetReceiverSettings() *serial.TypedMessage { |
|
if x != nil { |
|
return x.ReceiverSettings |
|
} |
|
return nil |
|
} |
|
|
|
func (x *InboundHandlerConfig) GetProxySettings() *serial.TypedMessage { |
|
if x != nil { |
|
return x.ProxySettings |
|
} |
|
return nil |
|
} |
|
|
|
// OutboundHandlerConfig is the configuration for outbound handler. |
|
type OutboundHandlerConfig struct { |
|
state protoimpl.MessageState |
|
sizeCache protoimpl.SizeCache |
|
unknownFields protoimpl.UnknownFields |
|
|
|
// Tag of this outbound handler. |
|
Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` |
|
// Settings for how to dial connection for this outbound handler. |
|
SenderSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=sender_settings,json=senderSettings,proto3" json:"sender_settings,omitempty"` |
|
// Settings for this outbound proxy. Must be one of the outbound proxies. |
|
ProxySettings *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"` |
|
// If not zero, this outbound will be expired in seconds. Not used for now. |
|
Expire int64 `protobuf:"varint,4,opt,name=expire,proto3" json:"expire,omitempty"` |
|
// Comment of this outbound handler. Not used for now. |
|
Comment string `protobuf:"bytes,5,opt,name=comment,proto3" json:"comment,omitempty"` |
|
} |
|
|
|
func (x *OutboundHandlerConfig) Reset() { |
|
*x = OutboundHandlerConfig{} |
|
mi := &file_core_config_proto_msgTypes[2] |
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
|
ms.StoreMessageInfo(mi) |
|
} |
|
|
|
func (x *OutboundHandlerConfig) String() string { |
|
return protoimpl.X.MessageStringOf(x) |
|
} |
|
|
|
func (*OutboundHandlerConfig) ProtoMessage() {} |
|
|
|
func (x *OutboundHandlerConfig) ProtoReflect() protoreflect.Message { |
|
mi := &file_core_config_proto_msgTypes[2] |
|
if x != nil { |
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) |
|
if ms.LoadMessageInfo() == nil { |
|
ms.StoreMessageInfo(mi) |
|
} |
|
return ms |
|
} |
|
return mi.MessageOf(x) |
|
} |
|
|
|
// Deprecated: Use OutboundHandlerConfig.ProtoReflect.Descriptor instead. |
|
func (*OutboundHandlerConfig) Descriptor() ([]byte, []int) { |
|
return file_core_config_proto_rawDescGZIP(), []int{2} |
|
} |
|
|
|
func (x *OutboundHandlerConfig) GetTag() string { |
|
if x != nil { |
|
return x.Tag |
|
} |
|
return "" |
|
} |
|
|
|
func (x *OutboundHandlerConfig) GetSenderSettings() *serial.TypedMessage { |
|
if x != nil { |
|
return x.SenderSettings |
|
} |
|
return nil |
|
} |
|
|
|
func (x *OutboundHandlerConfig) GetProxySettings() *serial.TypedMessage { |
|
if x != nil { |
|
return x.ProxySettings |
|
} |
|
return nil |
|
} |
|
|
|
func (x *OutboundHandlerConfig) GetExpire() int64 { |
|
if x != nil { |
|
return x.Expire |
|
} |
|
return 0 |
|
} |
|
|
|
func (x *OutboundHandlerConfig) GetComment() string { |
|
if x != nil { |
|
return x.Comment |
|
} |
|
return "" |
|
} |
|
|
|
var File_core_config_proto protoreflect.FileDescriptor |
|
|
|
var file_core_config_proto_rawDesc = []byte{ |
|
0x0a, 0x11, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, |
|
0x6f, 0x74, 0x6f, 0x12, 0x09, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x1a, 0x21, |
|
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, |
|
0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, |
|
0x6f, 0x22, 0xfb, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x07, |
|
0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, |
|
0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, |
|
0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, |
|
0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, |
|
0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x72, 0x61, 0x79, |
|
0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, |
|
0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x6f, 0x75, 0x74, |
|
0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x32, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, 0x04, 0x20, 0x03, |
|
0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, |
|
0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, |
|
0x73, 0x61, 0x67, 0x65, 0x52, 0x03, 0x61, 0x70, 0x70, 0x12, 0x3e, 0x0a, 0x09, 0x65, 0x78, 0x74, |
|
0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, |
|
0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, |
|
0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, |
|
0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, |
|
0xc0, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, |
|
0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, |
|
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x4d, 0x0a, 0x11, 0x72, 0x65, |
|
0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, |
|
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, |
|
0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, |
|
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, |
|
0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x70, 0x72, 0x6f, |
|
0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, |
|
0x0b, 0x32, 0x20, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, |
|
0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, |
|
0x61, 0x67, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, |
|
0x67, 0x73, 0x22, 0xef, 0x01, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, |
|
0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, |
|
0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x49, |
|
0x0a, 0x0f, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, |
|
0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, |
|
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, |
|
0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x73, 0x65, 0x6e, 0x64, 0x65, |
|
0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x70, 0x72, 0x6f, |
|
0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, |
|
0x0b, 0x32, 0x20, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, |
|
0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, |
|
0x61, 0x67, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, |
|
0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, |
|
0x28, 0x03, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, |
|
0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, |
|
0x6d, 0x65, 0x6e, 0x74, 0x42, 0x3d, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, |
|
0x2e, 0x63, 0x6f, 0x72, 0x65, 0x50, 0x01, 0x5a, 0x1e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, |
|
0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, |
|
0x72, 0x65, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0xaa, 0x02, 0x09, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x43, |
|
0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, |
|
} |
|
|
|
var ( |
|
file_core_config_proto_rawDescOnce sync.Once |
|
file_core_config_proto_rawDescData = file_core_config_proto_rawDesc |
|
) |
|
|
|
func file_core_config_proto_rawDescGZIP() []byte { |
|
file_core_config_proto_rawDescOnce.Do(func() { |
|
file_core_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_core_config_proto_rawDescData) |
|
}) |
|
return file_core_config_proto_rawDescData |
|
} |
|
|
|
var file_core_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) |
|
var file_core_config_proto_goTypes = []any{ |
|
(*Config)(nil), // 0: xray.core.Config |
|
(*InboundHandlerConfig)(nil), // 1: xray.core.InboundHandlerConfig |
|
(*OutboundHandlerConfig)(nil), // 2: xray.core.OutboundHandlerConfig |
|
(*serial.TypedMessage)(nil), // 3: xray.common.serial.TypedMessage |
|
} |
|
var file_core_config_proto_depIdxs = []int32{ |
|
1, // 0: xray.core.Config.inbound:type_name -> xray.core.InboundHandlerConfig |
|
2, // 1: xray.core.Config.outbound:type_name -> xray.core.OutboundHandlerConfig |
|
3, // 2: xray.core.Config.app:type_name -> xray.common.serial.TypedMessage |
|
3, // 3: xray.core.Config.extension:type_name -> xray.common.serial.TypedMessage |
|
3, // 4: xray.core.InboundHandlerConfig.receiver_settings:type_name -> xray.common.serial.TypedMessage |
|
3, // 5: xray.core.InboundHandlerConfig.proxy_settings:type_name -> xray.common.serial.TypedMessage |
|
3, // 6: xray.core.OutboundHandlerConfig.sender_settings:type_name -> xray.common.serial.TypedMessage |
|
3, // 7: xray.core.OutboundHandlerConfig.proxy_settings:type_name -> xray.common.serial.TypedMessage |
|
8, // [8:8] is the sub-list for method output_type |
|
8, // [8:8] is the sub-list for method input_type |
|
8, // [8:8] is the sub-list for extension type_name |
|
8, // [8:8] is the sub-list for extension extendee |
|
0, // [0:8] is the sub-list for field type_name |
|
} |
|
|
|
func init() { file_core_config_proto_init() } |
|
func file_core_config_proto_init() { |
|
if File_core_config_proto != nil { |
|
return |
|
} |
|
type x struct{} |
|
out := protoimpl.TypeBuilder{ |
|
File: protoimpl.DescBuilder{ |
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), |
|
RawDescriptor: file_core_config_proto_rawDesc, |
|
NumEnums: 0, |
|
NumMessages: 3, |
|
NumExtensions: 0, |
|
NumServices: 0, |
|
}, |
|
GoTypes: file_core_config_proto_goTypes, |
|
DependencyIndexes: file_core_config_proto_depIdxs, |
|
MessageInfos: file_core_config_proto_msgTypes, |
|
}.Build() |
|
File_core_config_proto = out.File |
|
file_core_config_proto_rawDesc = nil |
|
file_core_config_proto_goTypes = nil |
|
file_core_config_proto_depIdxs = nil |
|
}
|
|
|